diff --git a/.VERSION b/.VERSION index 1263e4764..a50b5ca72 100644 --- a/.VERSION +++ b/.VERSION @@ -1,6 +1,6 @@ $Format:%d%n%n$ # Fall back version, probably last release: -3.9.0 +3.9.1 # PSBLAS version file. # diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..999de8cf5 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,36 @@ +*.a export-ignore +*.o export-ignore +*.mod export-ignore +*.smod export-ignore +*~ export-ignore +.git* export-ignore +rsb export-ignore +rsb/ export-ignore +rsb/** export-ignore + + +Make.inc export-ignore +config export-ignore +config/ export-ignore +config/** export-ignore +configure.ac export-ignore +config.log export-ignore +config.status export-ignore +aclocal.m4 export-ignore +autogen.sh export-ignore +autom4te.cache export-ignore +Dockerfile export-ignore +.travis.yml export-ignore +# generated folder +./include/** export-ignore +./modules/** export-ignore +docs/src export-ignore +docs/doxypsb export-ignore +docs/Makefile export-ignore + +# the executable from tests +test/computational_routines export-ignore +test/computational_routines export-ignore +test/omp export-ignore +test/openacc export-ignore +test/torture export-ignore diff --git a/.gitignore b/.gitignore index a64bfaf4d..6775ecfb9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,11 @@ *.mtx *.smod *~ -*.log + +*.out +*.err +*.csv +leonardo_comm_script.sh # header files generated /cbind/*.h @@ -22,9 +26,7 @@ config.status docs/src/tmp autom4te.cache -build/ - - # the executable from tests runs +data diff --git a/CMakeLists.txt b/CMakeLists.txt index 6e94e127d..90685757e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -4,7 +4,8 @@ #----------------------------------- # Set oldest allowable CMake version #----------------------------------- -cmake_minimum_required(VERSION 3.20) +cmake_minimum_required(VERSION 3.11...4.2) +cmake_policy(VERSION 3.11.1...3.13.3) set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake") @@ -59,7 +60,8 @@ include(CheckOutOfSourceBuild) # Define coverage flags and report untested compilers #---------------------------------------------------- if ("${CMAKE_Fortran_COMPILER_ID}" MATCHES "GNU" ) - set(CMAKE_Fortran_COMPILER mpifort CACHE STRING "MPI Fortran compiler" FORCE) + set(gfortran_compiler true) + set(CMAKE_Fortran_COMPILER mpifort) set ( CMAKE_C_FLAGS_CODECOVERAGE "-fprofile-arcs -ftest-coverage -O0" CACHE STRING "Code coverage C compiler flags") @@ -130,6 +132,11 @@ include("${CMAKE_CURRENT_LIST_DIR}/cmake/CapitalizeString.cmake") message(STATUS "Using compiler ${CMAKE_C_COMPILER};") +# Find PSBLAS constants +include(${CMAKE_CURRENT_LIST_DIR}/cmake/readPSBConst.cmake) +_psb_read_const() +_psb_read_desc_const() + # Set default values for IPK_SIZE and LPK_SIZE set(DEFAULT_IPK_SIZE 4) set(DEFAULT_LPK_SIZE 8) @@ -303,95 +310,72 @@ if(HAVE_SAME_TYPE_AS) message(STATUS "-DPSB_HAVE_SAME_TYPE_AS") endif() -# ============================================================ -# Robust MPI configuration (C + Fortran) for PSBLAS -# Works with modern CMake, MPICH/OpenMPI, local servers, and CI -# ============================================================ - -find_package(MPI REQUIRED COMPONENTS C Fortran) +#---------------------------------------------------------------------------- +# MPI detection and configuration +#---------------------------------------------------------------------------- +find_package(MPI REQUIRED Fortran) if(MPI_FOUND) - message(STATUS ">>> MPI found successfully!") - message(STATUS "MPI version: ${MPI_VERSION}") - - # ------------------------------------------------------------ - # Extract include paths and library info from imported targets - # ------------------------------------------------------------ - if(TARGET MPI::MPI_Fortran) - get_target_property(_mpi_fortran_inc MPI::MPI_Fortran INTERFACE_INCLUDE_DIRECTORIES) - get_target_property(_mpi_fortran_lib MPI::MPI_Fortran IMPORTED_LOCATION) - get_target_property(_mpi_fortran_link MPI::MPI_Fortran INTERFACE_LINK_LIBRARIES) - - if(_mpi_fortran_inc) - include_directories(BEFORE ${_mpi_fortran_inc}) - message(STATUS "MPI Fortran include paths: ${_mpi_fortran_inc}") - endif() - endif() - - if(TARGET MPI::MPI_C) - get_target_property(_mpi_c_inc MPI::MPI_C INTERFACE_INCLUDE_DIRECTORIES) - get_target_property(_mpi_c_lib MPI::MPI_C IMPORTED_LOCATION) + message(STATUS ">>> MPI found: ${MPI_C_LIBRARIES} ${MPI_Fortran_LIBRARIES}") - if(_mpi_c_inc) - include_directories(BEFORE ${_mpi_c_inc}) - message(STATUS "MPI C include paths: ${_mpi_c_inc}") - endif() - endif() - - # ------------------------------------------------------------ + #----------------------------------------------- # Fedora-specific workaround for noexecstack flag - # ------------------------------------------------------------ + #----------------------------------------------- if((MPI_C_LINK_FLAGS MATCHES "noexecstack") OR (MPI_Fortran_LINK_FLAGS MATCHES "noexecstack")) message(WARNING - "The `noexecstack` linker flag was found in MPI__LINK_FLAGS.\n" - "This can cause segmentation faults in Fortran codes.\n" - "Replacing `noexecstack` with `execstack`." + "The `noexecstack` linker flag was found in the MPI__LINK_FLAGS variable. +This can cause segmentation faults in Fortran codes. +Replacing `noexecstack` with `execstack`." ) - string(REPLACE "noexecstack" "execstack" MPI_C_LINK_FLAGS "${MPI_C_LINK_FLAGS}") - string(REPLACE "noexecstack" "execstack" MPI_Fortran_LINK_FLAGS "${MPI_Fortran_LINK_FLAGS}") + string(REPLACE "noexecstack" "execstack" MPI_C_LINK_FLAGS_FIXED ${MPI_C_LINK_FLAGS}) + string(REPLACE "noexecstack" "execstack" MPI_Fortran_LINK_FLAGS_FIXED ${MPI_Fortran_LINK_FLAGS}) + set(MPI_C_LINK_FLAGS "${MPI_C_LINK_FLAGS_FIXED}" CACHE STRING "MPI C linking flags" FORCE) + set(MPI_Fortran_LINK_FLAGS "${MPI_Fortran_LINK_FLAGS_FIXED}" CACHE STRING "MPI Fortran linking flags" FORCE) endif() - # ------------------------------------------------------------ - # Compiler and linker flags - # ------------------------------------------------------------ + #----------------------------------------------- + # Compiler and linker flags setup + #----------------------------------------------- + list(REMOVE_DUPLICATES MPI_Fortran_INCLUDE_PATH) + include_directories(BEFORE ${MPI_C_INCLUDE_PATH} ${MPI_Fortran_INCLUDE_PATH}) + set(CMAKE_C_COMPILE_FLAGS "${CMAKE_C_COMPILE_FLAGS} ${MPI_C_COMPILE_FLAGS}") - set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS}") + set(CMAKE_C_LINK_FLAGS "${CMAKE_C_LINK_FLAGS} ${MPI_C_LINK_FLAGS}") set(CMAKE_Fortran_COMPILE_FLAGS "${CMAKE_Fortran_COMPILE_FLAGS} ${MPI_Fortran_COMPILE_FLAGS}") - set(CMAKE_Fortran_LINK_FLAGS "${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS}") + set(CMAKE_Fortran_LINK_FLAGS "${CMAKE_Fortran_LINK_FLAGS} ${MPI_Fortran_LINK_FLAGS}") + message(STATUS "MPI include paths: ${MPI_Fortran_INCLUDE_PATH}") message(STATUS "Fortran link flags: ${CMAKE_Fortran_LINK_FLAGS}") - # ------------------------------------------------------------ - # Ensure mpi.mod is available for Fortran (legacy fallback) - # ------------------------------------------------------------ + #----------------------------------------------- + # Ensure mpi.mod is available for CMake + #----------------------------------------------- set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/modules) file(MAKE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}) + # Try to copy mpi.mod or MPI.mod into module directory set(_mpi_mod_found FALSE) - if(_mpi_fortran_inc) - foreach(_mod_name mpi.mod MPI.mod) - foreach(_inc ${_mpi_fortran_inc}) - if(EXISTS "${_inc}/${_mod_name}") - file(COPY "${_inc}/${_mod_name}" DESTINATION "${CMAKE_Fortran_MODULE_DIRECTORY}") - message(STATUS "Copied ${_mod_name} from ${_inc}") - set(_mpi_mod_found TRUE) - break() - endif() - endforeach() - if(_mpi_mod_found) + foreach(_mpi_mod_name mpi.mod MPI.mod) + foreach(_mpi_inc ${MPI_Fortran_INCLUDE_PATH}) + if(EXISTS "${_mpi_inc}/${_mpi_mod_name}") + file(COPY "${_mpi_inc}/${_mpi_mod_name}" DESTINATION "${CMAKE_Fortran_MODULE_DIRECTORY}") + message(STATUS "Copied ${_mpi_mod_name} from ${_mpi_inc}") + set(_mpi_mod_found TRUE) break() endif() endforeach() - endif() + if(_mpi_mod_found) + break() + endif() + endforeach() if(NOT _mpi_mod_found) - message(FATAL "mpi.mod not found in MPI include paths; assuming mpifort provides it internally. Skipping copy.") + message(WARNING "mpi.mod not found in MPI include paths; assuming it is built-in to mpifort.") endif() - - # ------------------------------------------------------------ + #----------------------------------------------- # Enable MPI Fortran module support - # ------------------------------------------------------------ + #----------------------------------------------- if(MPI_Fortran_HAVE_F90_MODULE OR MPI_Fortran_HAVE_F08_MODULE) add_compile_options(-DPSB_MPI_MOD) message(STATUS "Defined: -DPSB_MPI_MOD") @@ -400,9 +384,9 @@ if(MPI_FOUND) set(PSB_SERIAL_MPI OFF) else() - # ------------------------------------------------------------ - # Fallback to serial mode - # ------------------------------------------------------------ + #----------------------------------------------- + # Fallback to serial mode (no MPI found) + #----------------------------------------------- message(WARNING ">>> MPI not found — building in serial mode") add_compile_options(-DPSB_SERIAL_MPI -DPSB_MPI_MOD) set(PSB_SERIAL_MPI ON) @@ -441,6 +425,7 @@ find_package(METIS) if(METIS_FOUND) + include(CheckTypeSize) message(STATUS "METIS PATH ${METIS_INCLUDES} and metis libraries ${METIS_LIBRARIES}") # Make sure this path is correct # set(METISINCFILE "metis.h") # Adjust this to your actual path @@ -458,6 +443,9 @@ if(METIS_FOUND) # Check for real sizes using try_compile include(CheckCSourceCompiles) + + +#[=====[ # Function to check the size of a type function(check_metis_real_type type_name) set(source_code " @@ -469,25 +457,42 @@ if(METIS_FOUND) }") # Create a temporary source file - file(WRITE "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/test_size.c" "${source_code}") + #file(WRITE "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/test_size.c" "${source_code}") # Try to compile it - try_compile(COMPILER_RESULT "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp" - "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/test_size.c") + #try_compile(COMPILER_RESULT "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp" + # "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/test_size.c") # Check the result and read the output - if (COMPILER_RESULT) + + set(test_file "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/test_metis_size.c") + file(WRITE "${test_file}" "${source_code}") + + # Use try_run to compile AND execute + try_run(RUN_RESULT COMPILE_RESULT + "${CMAKE_BINARY_DIR}" + "${test_file}" + CMAKE_FLAGS "-DINCLUDE_DIRECTORIES=${METIS_INCLUDES}" + RUN_OUTPUT_VARIABLE type_size + COMPILE_OUTPUT_VARIABLE compile_log + ) + + if(COMPILE_RESULT AND (RUN_RESULT EQUAL 0)) + # if (COMPILER_RESULT) execute_process(COMMAND "${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/test_size" OUTPUT_VARIABLE type_size) string(STRIP "${type_size}" type_size) + message(STATUS "Metis ?: ${type_size};") if (type_name STREQUAL "float") set(PSB_METIS_REAL_32 "${type_size}" PARENT_SCOPE) + message(STATUS "Metis 32: ${type_size}") # add_definitions(-DPSB_METIS_REAL_32) set(CREALMETIS "#define PSB_METIS_REAL_32" PARENT_SCOPE) elseif (type_name STREQUAL "double") set(PSB_METIS_REAL_64 "${type_size}" PARENT_SCOPE) #add_definitions(-DPSB_METIS_REAL_64) - set(CREALMETIS "#define PSB_METIS_REAL_64" PARENT_SCOPE) + set(CREALMETIS "#define PSB_METIS_REAL_64" PARENT_SCOPE) + message(STATUS "Metis 64: ${type_size}") endif() else() message(WARNING "Failed to compile test for type size: ${type_name}") @@ -497,44 +502,65 @@ if(METIS_FOUND) # Check for both float and double check_metis_real_type(float) check_metis_real_type(double) - +#]=====] # Set HAVE_METIS if METIS is found #add_compile_options(-DPSB_HAVE_METIS) # set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -DPSB_HAVE_METIS") - - - - - # Determine METIS_INDEX based on real type sizes - if(DEFINED PSB_METIS_REAL_32) - set(METIS_INDEX 32) - elseif(DEFINED PSB_METIS_REAL_64) - set(METIS_INDEX 64) - else() - message(WARNING "Neither METIS_REAL_32 nor METIS_REAL_64 is defined.") - set(METIS_INDEX 64) # Default to 64 if not defined - endif() - - # Check conditions for LPK_SIZE and METIS_INDEX - if(LPK_SIZE STREQUAL "4") - if(METIS_INDEX STREQUAL "64") - # Mismatch between METIS size and PSBLAS LPK - message(FATAL " Mismatch between metis ${METIS_INDEX} size and psblas LPK size ${LPK_SIZE}") - set(METIS_FOUND FALSE) + # 1. Tell CMake where to find metis.h for the check +set(CMAKE_EXTRA_INCLUDE_FILES "${METIS_INCLUDES}/metis.h") + +# 2. Check the size of Metis's own type: real_t +# This replaces checking 'float' and 'double' separately +check_type_size("real_t" METIS_REAL_SIZE) +check_type_size("idx_t" METIS_IDX_SIZE) + +# 3. Handle the result +if(METIS_IDX_SIZE) + if(METIS_IDX_SIZE EQUAL 4) + set(CINTMETIS "#define PSB_METIS_32") + message(STATUS "Metis detected as 32-bit (idx_t is 4 bytes)") + set(METIS_INDEX 32) + elseif(METIS_IDX_SIZE EQUAL 8) + set(CINTMETIS "#define PSB_METIS_64") + message(STATUS "Metis detected as 64-bit (idx_t is 8 bytes)") + set(METIS_INDEX 64) endif() - endif() - - if(LPK_SIZE STREQUAL "8") - if(METIS_INDEX STREQUAL "32") - # Mismatch between METIS size and PSBLAS LPK - message(FATAL " Mismatch between metis ${METIS_INDEX} size and psblas LPK size ${LPK_SIZE}") - set(METIS_FOUND FALSE) +else() + message(WARNING "Could not determine size of idx_t from metis.h. Check METIS_INCLUDES.") +endif() +# 3. Handle the result +if(METIS_REAL_SIZE) + if(METIS_REAL_SIZE EQUAL 4) + set(CREALMETIS "#define PSB_METIS_REAL_32") + message(STATUS "Metis detected as 32-bit (real_t is 4 bytes)") + elseif(METIS_REAL_SIZE EQUAL 8) + set(CREALMETIS "#define PSB_METIS_REAL_64") + message(STATUS "Metis detected as 64-bit (real_t is 8 bytes)") endif() - endif() +else() + message(WARNING "Could not determine size of real_t from metis.h. Check METIS_INCLUDES.") +endif() + +# clean the variable +set(CMAKE_EXTRA_INCLUDE_FILES "") + +# Mismatch Logic Below +if(LPK_SIZE STREQUAL "4" AND METIS_INDEX EQUAL 64) + message(WARNING "Mismatch: Metis IDX is 64-bit but PSBLAS LPK is 32-bit") + set(METIS_FOUND FALSE) + set(CREALMETIS "") + set(CINTMETIS "") +elseif(LPK_SIZE STREQUAL "8" AND METIS_INDEX EQUAL 32) + set(METIS_FOUND FALSE) + message(WARNING "Mismatch: Metis IDX is 32-bit but PSBLAS LPK is 64-bit") + set(CREALMETIS "") + set(CINTMETIS "") +endif() - if(METIS_FOUND) + +if(METIS_FOUND) # Make sure this path is correct set(METISINCFILE "metis.h") # Adjust this to your actual path @@ -553,7 +579,7 @@ if(METIS_FOUND) set(CHAVEMETIS "#define PSB_HAVE_METIS") - set(CINTMETIS "#define PSB_METIS_${METIS_INDEX}") +# set(CINTMETIS "#define PSB_METIS_${METIS_INDEX}") # set(CREALMETIS "#define PSB_METIS_REAL_${LPK_SIZE}") # Configure the header file configure_file(${HEADER_TEMPLATE} ${HEADER_OUTPUT} @ONLY) @@ -658,7 +684,7 @@ install(EXPORT ${CMAKE_PROJECT_NAME}-targets include(CMakePackageConfigHelpers) # standard CMake module write_basic_package_version_file( "${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_PROJECT_NAME}ConfigVersion.cmake" - VERSION "${psblas_VERSION}" + VERSION "${VERSION}" COMPATIBILITY SameMajorVersion ) @@ -825,7 +851,7 @@ set(CMAKE_Fortran_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/modules) -message(STATUS "fortran module direcotry ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}") +message(STATUS "fortran module directory ${CMAKE_BINARY_DIR}/${CMAKE_INSTALL_INCLUDEDIR}") include_directories(${MPI_Fortran_INCLUDE_PATH}) @@ -841,6 +867,7 @@ set_target_properties(base POSITION_INDEPENDENT_CODE TRUE OUTPUT_NAME psb_base LINKER_LANGUAGE Fortran + VERSION ${VERSION} SOVERSION ${SOVERSION} ) target_include_directories(base PUBLIC @@ -873,6 +900,7 @@ set_target_properties(prec POSITION_INDEPENDENT_CODE TRUE OUTPUT_NAME psb_prec LINKER_LANGUAGE Fortran + VERSION ${VERSION} SOVERSION ${SOVERSION} ) target_include_directories(prec PUBLIC $ @@ -888,6 +916,7 @@ set_target_properties(linsolve POSITION_INDEPENDENT_CODE TRUE OUTPUT_NAME psb_linsolve LINKER_LANGUAGE Fortran + VERSION ${VERSION} SOVERSION ${SOVERSION} ) target_include_directories(linsolve PUBLIC $ @@ -904,6 +933,7 @@ set_target_properties(ext POSITION_INDEPENDENT_CODE TRUE OUTPUT_NAME psb_ext LINKER_LANGUAGE Fortran + VERSION ${VERSION} SOVERSION ${SOVERSION} ) target_include_directories(ext PUBLIC $ @@ -923,7 +953,8 @@ if(WIN32) set_target_properties(psb_util_C PROPERTIES LINKER_LANGUAGE C - POSITION_INDEPENDENT_CODE TRUE) + POSITION_INDEPENDENT_CODE TRUE + VERSION ${VERSION} SOVERSION ${SOVERSION}) target_link_libraries(psb_util_C PUBLIC kernel32 user32 shell32) endif() @@ -949,6 +980,7 @@ set_target_properties(util POSITION_INDEPENDENT_CODE TRUE OUTPUT_NAME psb_util LINKER_LANGUAGE Fortran + VERSION ${VERSION} SOVERSION ${SOVERSION} ) target_include_directories(util PUBLIC $ @@ -1009,6 +1041,7 @@ set_target_properties(cbind POSITION_INDEPENDENT_CODE TRUE OUTPUT_NAME psb_cbind LINKER_LANGUAGE Fortran + VERSION ${VERSION} SOVERSION ${SOVERSION} ) #target_include_directories(cbind PUBLIC # $ @@ -1155,6 +1188,7 @@ if(PSB_BUILD_CUDA) PROPERTIES POSITION_INDEPENDENT_CODE TRUE OUTPUT_NAME psb_cuda + VERSION ${VERSION} SOVERSION ${SOVERSION} LINKER_LANGUAGE C) # Include directories for the CUDA library diff --git a/LICENSE b/LICENSE index a05485c3e..9aaec1626 100644 --- a/LICENSE +++ b/LICENSE @@ -1,7 +1,5 @@ - Parallel Sparse BLAS version 3.9 - (C) Copyright 2006-2025 - Salvatore Filippone - Alfredo Buttari + (C) Copyright 2025 Salvatore Filippone + (C) Copyright 2025 Alfredo Buttari Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions @@ -13,7 +11,7 @@ documentation and/or other materials provided with the distribution. 3. The name of the PSBLAS group or the names of its contributors may not be used to endorse or promote products derived from this - software without specific written permission. + software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/Make.inc.in b/Make.inc.in index ceba77b82..7df66de8c 100755 --- a/Make.inc.in +++ b/Make.inc.in @@ -70,16 +70,16 @@ UTILMODNAME=@UTILMODNAME@ CBINDLIBNAME=libpsb_cbind.a OACCD=@OACCD@ +OACCMODS=@OACCMODS@ OACCLD=@OACCLD@ FCOPENACC=@FCOPENACC@ CCOPENACC=@CCOPENACC@ CXXOPENACC=@CXXOPENACC@ CUDAD=@CUDAD@ +CUDAMODS=@CUDAMODS@ CUDALD=@CUDALD@ -LCUDA=@LCUDA@ - -SPGPU_LIBS=@SPGPU_LIBS@ +LPSB_CUDA=@LPSB_CUDA@ CUDA_DIR=@CUDA_DIR@ CUDA_INCLUDES=@CUDA_INCLUDES@ @@ -102,4 +102,4 @@ CUDEFINES=@CUDEFINES@ @PSBLASRULES@ -PSBGPULDLIBS=$(LCUDA) $(SPGPU_LIBS) $(CUDA_LIBS) $(PSBLDLIBS) $(LIBS) \ No newline at end of file +PSBGPULDLIBS=$(LPSB_CUDA) $(CUDA_LIBS) $(PSBLDLIBS) $(LIBS) \ No newline at end of file diff --git a/Makefile b/Makefile index fd18a38c9..d3c36e25c 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ include Make.inc -all: dirs based precd linslvd utild cbindd extd $(CUDAD) $(OACCD) libd +all: dirs mods objs libd @echo "=====================================" @echo "PSBLAS libraries Compilation Successful." @@ -9,13 +9,35 @@ dirs: (if test ! -d include ; then mkdir include; fi; $(INSTALL_DATA) Make.inc include/Make.inc.psblas) (if test ! -d modules ; then mkdir modules; fi;) -precd: based -utild: based -linslvd: precd -extd: based -cudad: extd -oaccd: extd -cbindd: based precd linslvd utild +mods: basemods utilmods precmods linslvmods cbindmods extmods $(CUDAMODS) $(OACCMODS) + +basemods: + $(MAKE) -C base mods +precmods: basemods + $(MAKE) -C prec mods +linslvmods: precmods + $(MAKE) -C linsolve mods +utilmods: basemods + $(MAKE) -C util mods +cbindmods: basemods precmods linslvmods utilmods extmods $(CUDAMODS) + $(MAKE) -C cbind objs +extmods: basemods + $(MAKE) -C ext mods +cudamods: extmods + $(MAKE) -C cuda mods +oaccmods: extmods + $(MAKE) -C openacc mods + + +objs: mods based precd linslvd utild cbindd extd $(CUDAD) $(OACCD) +based: basemods +precd: precmods +utild: utilmods +linslvd: linslvmods +extd: extmods +cudad: cudamods +oaccd: oaccmods +cbindd: cbindmods libd: based precd linslvd utild cbindd extd $(CUDALD) $(OACCLD) $(MAKE) -C base lib @@ -42,9 +64,9 @@ cbindd: $(MAKE) -C cbind objs extd: $(MAKE) -C ext objs -cudad: +cudad: cudamods $(MAKE) -C cuda objs -oaccd: +oaccd: oaccmods $(MAKE) -C openacc objs diff --git a/README.md b/README.md index 34b2aff87..fd7c63ca2 100644 --- a/README.md +++ b/README.md @@ -51,14 +51,13 @@ The main reference for the serial sparse BLAS is: ## Installing -To compile and run our software you will need the following -prerequisites (see also SERIAL below): + To compile (using configure/make/make install) and run our software + you will need the following + prerequisites (see also SERIAL below): -1. A working version of MPI + 1. A working version of MPI. -2. A version of the BLAS; if you don't have a specific version for your - platform you may try ATLAS available from - http://math-atlas.sourceforge.net/ +2. A version of the BLAS; you can specify a specific version with `--with-blas` 3. We have had good results with the METIS library, from https://github.com/KarypisLab/METIS. @@ -70,12 +69,20 @@ prerequisites (see also SERIAL below): We use the C interface to AMD. 6. If you have CUDA available, use - --enable-cuda to compile CUDA-enabled methods - --with-cudadir= to specify the CUDA toolkit location - --with-cudacc=XX,YY,ZZ to specify a list of target CCs (compute - capabilities) to compile the CUDA code for. - -The configure script will generate a Make.inc file suitable for building + - `--enable-cuda` to compile CUDA-enabled methods + - `--with-cudadir=` to specify the CUDA toolkit location + - `--with-cudacc=XX,YY,ZZ` to specify a list of target CCs (compute + capabilities). + CUDA versions have specific compatibility requirements; + for example: + - CUDA version 11.8 supports GNU compilers up to version 11 + - CUDA versions 12.3 through 12.6 support GNU compilers up to version 13 + - CUDA versions 12.8 and 12.9 support GNU compilers up to version 14 + - CUDA version 13.0 supports GNU compilers up to version 15 + For further information please refer to the CUDA documentation at + https://developer.nvidia.com/cuda/gpus + +The configure script will generate a `Make.inc` file suitable for building the library. The script is capable of recognizing the needed libraries with their default names; if they are in unusual places consider adding the paths with `--with-libs`, or explicitly specifying the names in @@ -94,7 +101,7 @@ the paths with `--with-libs`, or explicitly specifying the names in > (see [http://modules.sourceforge.net/](http://modules.sourceforge.net/)), and load the relevant > variables with (e.g.) > ``` -> module load gcc/13.2.0 openmpi/4.1.6 +> module load gcc/14.2.0 openmpi/5.0.8 > ``` > This will delegate to the modules setup to make sure that the version of > openmpi in use is the one compiled with the gnu46 compilers. After the @@ -106,11 +113,20 @@ After you have Make.inc fixed, run make ``` to compile the library; go to the test directory and its subdirectories -to get test programs done. If you specify `--prefix=/path` you can do make -install and the libraries will be installed under `/path/lib`, while the -module files will be installed under `/path/modules`. The regular and -experimental C interface header files are under `/path/include`. - +to get test programs done. +You can then install with + ``` + make install + ``` + We recommend specifying `--prefix=/path` in the configure step, so that + the libraries will be installed under `/path/lib`, + the module files will be installed under `/path/modules`, the documentation under `/path/docs` and so on. +The C interface header files are under `/path/include`. +If `/path` is a system directory, you may need + ``` + sudo make install + ``` +If you do not specifye `--with-prefix` the usual default of `/usr` applies. ### Packaging changes, CUDA and GPU support This version of PSBLAS incorporates into a single package three @@ -121,12 +137,12 @@ entities that were previously separated: | PSBLAS-EXT | a library providing additional storage formats for matrices and vectors | | SPGPU | a package of kernels for NVIDIA GPUs originally written by Davide Barbieri and Salvatore Filippone; see the license file [cuda/License-spgpu.md](cuda/License-spgpu.md) | -Moreover, the module and library previously called psb_krylovv are now called +Moreover, the module and library previously called psb_krylov are now called psb_linsolve, but their usage is otherwise unchanged. ### OpenACC There is a highly experimental version of an OpenACC interface, -you can access it by speficifying +you can compile it by speficifying ```bash --enable-openacc --with-extraopenacc="-foffload=nvptx-none=-march=sm_70" ``` @@ -144,7 +160,7 @@ cover what we use internally, it's not a complete replacement). ### Integers We have two kind of integers: IPK for local indices, and LPK for -global indices. They can be specified independently at configure time, +global indices. Their size can be specified at configure time, e.g. ```bash --with-ipk=4 --with-lpk=8 @@ -153,18 +169,75 @@ which is asking for 4-bytes local indices, and 8-bytes global indices (this is the default). ## CMAKE -There is initial support for building with CMAKE. As of this time, it does not compile the CUDA part. +PSBLAS supports building with CMake (version 3.11 or higher). This method handles the automatic detection of compilers, MPI, and linear algebra libraries. +Standard Compilation (Without CUDA) +To perform a standard compilation, run: +### 1. Create and enter a dedicated build directory +``` +mkdir build +cd build +``` +### 2. Configure the project +``` +cmake .. +``` +### 3. Compile the libraries +``` +make +``` +If you wish to install PSBLAS in a specific location (similar to using the --prefix option in the legacy configure script), you must define the CMAKE_INSTALL_PREFIX variable. +To set a custom installation path, run the configuration command as follows: +#### Example: Installing PSBLAS to a specific folder in your home directory +``` +cmake -DCMAKE_INSTALL_PREFIX=/home/user/psblas_install +``` +### Compiling with CUDA Support +To enable GPU support via CUDA, you must set the PSB_BUILD_CUDA option to ON during the configuration step. +Important Compatibility Note: CUDA support is strictly incompatible with 8-byte local integers. If you manually set CMAKE_PSB_IPK to 8, CUDA support will be automatically disabled by the system. +To build with CUDA enabled: -## LLVM -The library has been successfully compiled and tested with LLVM version 20.1.0-rc2. +``` +cmake -DPSB_BUILD_CUDA=ON .. +``` +The compilation then proceed as before through make +When this flag is active, CMake will search for the CUDAToolkit, enable the CUDA language, and define necessary macros such as PSB_HAVE_CUDA. + +### Customizing Integer Sizes +You can override the default integer sizes (4-byte local IPK and 8-byte global LPK) using the following variables: +Example: Using 8-byte global integers (default) and 4-byte local integers +``` +cmake -DCMAKE_PSB_IPK=4 -DCMAKE_PSB_LPK=8 .. +``` + +### 4. Installation +To install the libraries, header files, and Fortran modules to your system (or a custom path defined by -DCMAKE_INSTALL_PREFIX), run: +``` +make install +``` +The files will be organized into the lib, include, and modules subdirectories within the installation prefix, same as the configure build. +## MPI and Compilers + The library has been successfully compiled and tested with multiple compilers + and MPI implementations; this release has been successfully tested with: + - MPICH 4.2.3, 4.3.0, 4.3.2 + - OpenMPI 4.1.8. 5.0.7, 5.0.8, 5.0.9 + + combined with + + - GNU compilers 10.5.0, 11.5.0, 12.5.0, 13.3.0, 14.2.0 14.3.0, 15.2.0 + - LLVM 20.1.0 and 21.1.0 (except OpenMPI 4.1.8 which does not build with LLVM) + + Moreover, it has been tested with the Intel OneAPI toolchain versions 2025.2 and 2025.3 + + As of this release, the NVIDIA compiler 25.7 fails to handle our code. + Cray, IBM and NAg compilers have been used for testing in the past, but not on this version. ## Documentation Further information on installation and configuration can be found in the documentation. See [docs/psblas-3.9.pdf](docs/psblas-3.9.pdf); an HTML version of the same document is available in docs/html. Please consult the sample programs, especially -- [test/pargen/psb_s_pde2d.F90](test/pargen/psb_s_pde2d.F90) [test/pargen/psb_d_pde2d.F90](test/pargen/psb_d_pde2d.F90) -- [test/pargen/psb_s_pde2d.F90](test/pargen/psb_s_pde3d.F90) [test/pargen/psb_d_pde2d.F90](test/pargen/psb_d_pde3d.F90) +- [test/pdegen/psb_s_pde2d.F90](test/pdegen/psb_s_pde2d.F90) [test/pdegen/psb_d_pde2d.F90](test/pdegen/psb_d_pde2d.F90) +- [test/pdegen/psb_s_pde2d.F90](test/pdegen/psb_s_pde3d.F90) [test/pdegen/psb_d_pde2d.F90](test/pdegens/psb_d_pde3d.F90) which contain examples for the solution of linear systems obtained by the discretization of a generic second-order differential equation in two: ```math @@ -208,18 +281,19 @@ Salvatore Filippone **Contributors** (_roughly reverse cronological order_): +- Fabio Durastante - Luca Pepè Sciarria - Theophane Loloum -- Fabio Durastante - Dimitri Walther +- Pasqua D'Ambra - Andea Di Iorio - Stefano Petrilli - Soren Rasmussen - Zaak Beekman - Ambra Abdullahi Hassan -- Pasqua D'Ambra - Alfredo Buttari - Daniela di Serafino +- Thomas Amestoy - Michele Martone - Michele Colajanni - Fabio Cerioni diff --git a/ReleaseNews b/ReleaseNews index e1d7a2b80..cf60dc524 100644 --- a/ReleaseNews +++ b/ReleaseNews @@ -2,10 +2,13 @@ WHAT'S NEW Version 3.9 1. PSBLAS3-EXT has been folded into the main library 2. Renamed GPU into CUDA. - 3. Highly experimental OpenACC support. + 3. Highly experimental OpenACC support. Requires a Fortran compiler which + supports SUBMODULES, e.g GNU Fortran version 12 or later 4. The iterative solvers are now defined in psb_linsolve_mod and implemented in libpsb_linsolve.a; existing code using - Krylov methods will work with no changes. + Krylov methods will work with no changes. + 5. In the linsolve directory we now have an interface for + Richardson interations Version 3.8.0-2 1. CTXT is now an opaque object. diff --git a/base/CMakeLists.txt b/base/CMakeLists.txt index c2b1fe8f0..ec1ff4db8 100644 --- a/base/CMakeLists.txt +++ b/base/CMakeLists.txt @@ -1,9 +1,9 @@ set(PSB_base_source_files comm/psb_dovrl_a.f90 comm/psb_dovrl.f90 -# comm/psb_i2halo_a.f90 + comm/psb_i2halo_a.f90 comm/internals/psi_zswaptran.F90 -# comm/internals/psi_i2ovrl_upd_a.f90 + comm/internals/psi_i2ovrl_upd_a.f90 comm/internals/psi_lovrl_save.f90 comm/internals/psi_movrl_save_a.f90 comm/internals/psi_sovrl_restr_a.f90 @@ -16,7 +16,8 @@ set(PSB_base_source_files comm/internals/psi_lovrl_upd.f90 comm/internals/psi_dswapdata_a.F90 comm/internals/psi_movrl_upd_a.f90 -# comm/internals/psi_i2swaptran_a.F90 + modules/comm/comm_schemes/psb_comm_rma_mod.F90 + comm/internals/psi_i2swaptran_a.F90 comm/internals/psi_dswaptran.F90 comm/internals/psi_covrl_save_a.f90 comm/internals/psi_eovrl_restr_a.f90 @@ -31,7 +32,7 @@ set(PSB_base_source_files comm/internals/psi_sswaptran.F90 comm/internals/psi_lswaptran.F90 comm/internals/psi_mswaptran_a.F90 -# comm/internals/psi_i2ovrl_restr_a.f90 + comm/internals/psi_i2ovrl_restr_a.f90 comm/internals/psi_covrl_restr.f90 comm/internals/psi_mswapdata_a.F90 comm/internals/psi_zovrl_restr_a.f90 @@ -49,14 +50,14 @@ set(PSB_base_source_files comm/internals/psi_zswapdata_a.F90 comm/internals/psi_dovrl_save.f90 comm/internals/psi_covrl_save.f90 -# comm/internals/psi_i2swapdata_a.F90 + comm/internals/psi_i2swapdata_a.F90 comm/internals/psi_dovrl_upd.f90 comm/internals/psi_eovrl_save_a.f90 comm/internals/psi_zovrl_upd_a.f90 comm/internals/psi_zswapdata.F90 comm/internals/psi_covrl_upd.f90 comm/internals/psi_cswaptran.F90 -# comm/internals/psi_i2ovrl_save_a.f90 + comm/internals/psi_i2ovrl_save_a.f90 comm/internals/psi_sovrl_upd.f90 comm/internals/psi_eswapdata_a.F90 comm/internals/psi_movrl_restr_a.f90 @@ -82,9 +83,9 @@ set(PSB_base_source_files comm/psb_zhalo.f90 comm/psb_movrl_a.f90 comm/psb_chalo_a.f90 -# comm/psb_i2scatter_a.F90 + comm/psb_i2scatter_a.F90 comm/psb_sgather_a.f90 -# comm/psb_i2ovrl_a.f90 + comm/psb_i2ovrl_a.f90 comm/psb_zovrl_a.f90 comm/psb_covrl.f90 comm/psb_shalo.f90 @@ -100,7 +101,7 @@ set(PSB_base_source_files comm/psb_zhalo_a.f90 comm/psb_sscatter_a.F90 comm/psb_lscatter.F90 -# comm/psb_i2gather_a.f90 + comm/psb_i2gather_a.f90 comm/psb_ihalo.f90 comm/psb_iovrl.f90 comm/psb_zspgather.F90 @@ -122,29 +123,29 @@ set(PSB_base_source_files comm/psb_mgather_a.f90 comm/psb_dgather.f90 comm/psb_lhalo.f90 - internals/psi_bld_glb_dep_list.F90 - internals/psi_graph_fnd_owner.F90 - internals/psi_sort_dl.f90 - internals/psi_indx_map_fnd_owner.F90 - internals/psi_fnd_owner.F90 - internals/psi_bld_tmpovrl.f90 - internals/psi_symm_dep_list.F90 - internals/psi_desc_impl.f90 -### internals/psi_compute_size.f90 - internals/psi_hash_impl.f90 - internals/psi_crea_ovr_elem.f90 - internals/psi_a2a_fnd_owner.F90 - internals/psi_bld_tmphalo.f90 - internals/psi_crea_bnd_elem.f90 - internals/psi_desc_index.F90 - internals/psi_xtr_loc_dl.F90 - internals/psi_crea_index.f90 - internals/psi_srtlist.f90 - internals/psi_adjcncy_fnd_owner.F90 + auxil/psi_bld_glb_dep_list.F90 + auxil/psi_graph_fnd_owner.F90 + auxil/psi_sort_dl.f90 + auxil/psi_indx_map_fnd_owner.F90 + auxil/psi_fnd_owner.F90 + auxil/psi_bld_tmpovrl.f90 + auxil/psi_symm_dep_list.F90 + auxil/psi_desc_impl.f90 +### auxil/psi_compute_size.f90 + auxil/psi_hash_impl.f90 + auxil/psi_crea_ovr_elem.f90 + auxil/psi_a2a_fnd_owner.F90 + auxil/psi_bld_tmphalo.f90 + auxil/psi_crea_bnd_elem.f90 + auxil/psi_desc_index.F90 + auxil/psi_xtr_loc_dl.F90 + auxil/psi_crea_index.f90 + auxil/psi_srtlist.f90 + auxil/psi_adjcncy_fnd_owner.F90 tools/psb_sins.f90 tools/psb_zspasb.f90 tools/psb_zspalloc.f90 -# tools/psb_i2_remote_vect.F90 + tools/psb_i2_remote_vect.F90 tools/psb_sfree_a.f90 tools/psb_cdprt.f90 tools/psb_c_glob_transpose.F90 @@ -160,7 +161,7 @@ set(PSB_base_source_files tools/psb_zallc_a.f90 tools/psb_d_map.f90 tools/psb_lfree.f90 -# tools/psb_i2ins_a.f90 + tools/psb_i2ins_a.f90 tools/psb_s_remap.F90 tools/psb_cspalloc.f90 tools/psb_glob_to_loc.f90 @@ -177,9 +178,9 @@ set(PSB_base_source_files tools/psb_sgetelem.f90 tools/psb_cspfree.f90 tools/psb_cins.f90 -# tools/psb_i2free_a.f90 + tools/psb_i2free_a.f90 tools/psb_dspins.F90 -# tools/psb_i2asb_a.f90 + tools/psb_i2asb_a.f90 tools/psb_dsphalo.F90 tools/psb_d_glob_transpose.F90 tools/psb_c_par_csr_spspmm.f90 @@ -265,14 +266,18 @@ set(PSB_base_source_files tools/psb_zspins.F90 tools/psb_zins_a.f90 tools/psb_cdcpy.F90 -# tools/psb_i2allc_a.f90 + tools/psb_i2allc_a.f90 tools/psb_dallc.f90 tools/psb_cd_renum_block.F90 tools/psb_dasb_a.f90 tools/psb_zsprn.f90 tools/psb_get_overlap.f90 - serial/psb_crwextd.f90 - serial/psb_zspspmm.f90 + serial/psb_saplusat.f90 + serial/psb_daplusat.f90 + serial/psb_caplusat.f90 + serial/psb_zaplusat.f90 + serial/psb_crwextd.f90 + serial/psb_zspspmm.F90 serial/psb_drwextd.f90 serial/psb_dnumbmm.f90 serial/psb_damax_s.f90 @@ -343,14 +348,14 @@ set(PSB_base_source_files serial/psb_dsymbmm.f90 serial/psb_samax_s.f90 serial/psb_lsame.f90 - serial/psb_dspspmm.f90 + serial/psb_dspspmm.F90 serial/psb_ssymbmm.f90 serial/psb_cgeprt.f90 serial/psb_sgeprt.f90 -# serial/psi_i2_serial_impl.F90 + serial/psi_i2_serial_impl.F90 serial/psi_e_serial_impl.F90 serial/psb_zsymbmm.f90 - serial/psb_cspspmm.f90 + serial/psb_cspspmm.F90 serial/psb_aspxpby.f90 serial/psi_s_serial_impl.F90 serial/psb_zamax_s.f90 @@ -359,7 +364,7 @@ set(PSB_base_source_files serial/psb_casum_s.f90 serial/psi_d_serial_impl.F90 serial/psi_c_serial_impl.F90 - serial/psb_sspspmm.f90 + serial/psb_sspspmm.F90 serial/psb_cnumbmm.f90 psblas/psb_damax.f90 psblas/psb_dspmm.f90 @@ -426,14 +431,15 @@ set(PSB_base_source_files psblas/psb_cinv_vect.f90 psblas/psb_zasum.f90 modules/comm/psi_z_comm_v_mod.f90 -# modules/comm/psb_i2_comm_a_mod.f90 - modules/comm/psb_m_comm_a_mod.f90 + modules/comm/psb_m_comm_a_mod.f90 modules/comm/psb_z_linmap_mod.f90 modules/comm/psi_s_comm_a_mod.f90 -# modules/comm/psi_i2_comm_a_mod.f90 + modules/comm/psb_i2_comm_a_mod.f90 + modules/comm/psi_i2_comm_a_mod.f90 + modules/comm/psi_i2_comm_v_mod.f90 modules/comm/psi_m_comm_a_mod.f90 modules/comm/psi_l_comm_v_mod.f90 - modules/comm/psb_comm_mod.f90 + modules/comm/psb_comm_mod.F90 modules/comm/psb_l_comm_mod.f90 modules/comm/psb_d_linmap_mod.f90 modules/comm/psi_d_comm_v_mod.f90 @@ -458,7 +464,7 @@ set(PSB_base_source_files modules/comm/psb_linmap_mod.f90 modules/comm/psb_z_comm_a_mod.f90 modules/comm/psi_c_comm_a_mod.f90 -# modules/auxil/psb_i2_isort_mod.f90 + modules/auxil/psb_i2_isort_mod.f90 modules/auxil/psb_z_ip_reord_mod.F90 modules/auxil/psi_s_serial_mod.f90 modules/auxil/psb_s_hsort_x_mod.f90 @@ -466,7 +472,7 @@ set(PSB_base_source_files modules/auxil/psb_d_hsort_mod.f90 modules/auxil/psi_alcx_mod.f90 modules/auxil/psb_e_ip_reord_mod.F90 -# modules/auxil/psb_i2_msort_mod.f90 + modules/auxil/psb_i2_msort_mod.f90 modules/auxil/psb_rb_idx_tree_mod.f90 modules/auxil/psb_m_isort_mod.f90 modules/auxil/psb_e_msort_mod.f90 @@ -485,14 +491,15 @@ set(PSB_base_source_files modules/auxil/psb_z_isort_mod.f90 modules/auxil/psb_e_hsort_mod.f90 modules/auxil/psi_m_serial_mod.f90 -# modules/auxil/psi_i2_serial_mod.f90 + modules/auxil/psi_i2_serial_mod.f90 + modules/auxil/psb_i2_hsort_x_mod.f90 modules/auxil/psb_s_isort_mod.f90 modules/auxil/psb_e_realloc_mod.F90 modules/auxil/psb_c_hsort_mod.f90 modules/auxil/psb_z_msort_mod.f90 modules/auxil/psi_d_serial_mod.f90 modules/auxil/psb_z_qsort_mod.f90 -# modules/auxil/psb_i2_hsort_mod.f90 + modules/auxil/psb_i2_hsort_mod.f90 modules/auxil/psb_m_msort_mod.f90 modules/auxil/psb_m_ip_reord_mod.F90 modules/auxil/psb_string_mod.f90 @@ -505,14 +512,14 @@ set(PSB_base_source_files modules/auxil/psb_m_hsort_mod.f90 modules/auxil/psb_z_realloc_mod.F90 modules/auxil/psb_z_rb_idx_tree_mod.f90 -# modules/auxil/psb_i2_ip_reord_mod.F90 -# modules/auxil/psb_i2_realloc_mod.F90 + modules/auxil/psb_i2_ip_reord_mod.F90 + modules/auxil/psb_i2_realloc_mod.F90 modules/auxil/psb_s_rb_idx_tree_mod.f90 modules/auxil/psb_c_hsort_x_mod.f90 modules/auxil/psb_s_ip_reord_mod.F90 modules/auxil/psb_d_isort_mod.f90 modules/auxil/psi_z_serial_mod.f90 -# modules/auxil/psb_i2_qsort_mod.f90 + modules/auxil/psb_i2_qsort_mod.f90 modules/auxil/psb_d_msort_mod.f90 modules/auxil/psb_c_qsort_mod.f90 modules/auxil/psb_z_hsort_x_mod.f90 @@ -529,7 +536,7 @@ set(PSB_base_source_files modules/psi_l_mod.F90 modules/penv/psi_d_collective_mod.F90 modules/penv/psi_m_p2p_mod.F90 -# modules/penv/psi_i2_collective_mod.F90 + modules/penv/psi_i2_collective_mod.F90 modules/penv/psi_s_p2p_mod.F90 modules/penv/psi_e_p2p_mod.F90 modules/penv/psi_m_collective_mod.F90 @@ -539,7 +546,7 @@ set(PSB_base_source_files modules/penv/psi_z_p2p_mod.F90 modules/penv/psi_c_collective_mod.F90 modules/penv/psi_collective_mod.F90 -# modules/penv/psi_i2_p2p_mod.F90 + modules/penv/psi_i2_p2p_mod.F90 modules/penv/psi_c_p2p_mod.F90 modules/penv/psi_e_collective_mod.F90 modules/penv/psi_z_collective_mod.F90 @@ -558,7 +565,7 @@ set(PSB_base_source_files modules/tools/psb_d_tools_mod.F90 modules/tools/psb_c_tools_mod.F90 modules/tools/psb_e_tools_a_mod.f90 -# modules/tools/psb_i2_tools_a_mod.f90 + modules/tools/psb_i2_tools_a_mod.f90 modules/tools/psb_c_tools_a_mod.f90 modules/tools/psb_z_tools_mod.F90 modules/tools/psb_l_tools_mod.F90 @@ -584,6 +591,7 @@ set(PSB_base_source_files modules/serial/psb_s_base_mat_mod.F90 modules/serial/psb_base_mat_mod.F90 modules/serial/psb_i_base_vect_mod.F90 + modules/serial/psb_i2_base_vect_mod.F90 modules/serial/psb_s_vect_mod.F90 modules/serial/psb_s_base_vect_mod.F90 modules/serial/psb_d_base_vect_mod.F90 @@ -592,7 +600,8 @@ set(PSB_base_source_files modules/serial/psb_c_vect_mod.F90 modules/serial/psb_d_mat_mod.F90 modules/serial/psb_s_mat_mod.F90 - modules/serial/psb_i_vect_mod.F90 + modules/serial/psb_i2_vect_mod.F90 + modules/serial/psb_i_vect_mod.F90 modules/serial/psb_d_vect_mod.F90 modules/serial/psb_c_base_vect_mod.F90 modules/serial/psb_vect_mod.f90 @@ -612,6 +621,7 @@ set(PSB_base_source_files modules/psb_penv_mod.F90 modules/psb_error_mod.F90 modules/psb_timers_mod.f90 + modules/psi_i2_mod.F90 modules/psi_i_mod.F90 modules/psi_z_mod.F90 modules/desc/psb_desc_const_mod.f90 diff --git a/base/Makefile b/base/Makefile index 3348013f3..56b09fecb 100644 --- a/base/Makefile +++ b/base/Makefile @@ -6,18 +6,18 @@ INCDIR=../include MODDIR=../modules LIBNAME=$(BASELIBNAME) -objs: mods sr cm in pb tl +objs: mods sr cm ax pb tl lib: objs $(MAKE) -C modules lib LIBNAME=$(BASELIBNAME) F90="$(MPF90)" F90COPT="$(F90COPT) $(MPI_OPT)" $(MAKE) -C serial lib LIBNAME=$(BASELIBNAME) $(MAKE) -C comm lib LIBNAME=$(BASELIBNAME) - $(MAKE) -C internals lib LIBNAME=$(BASELIBNAME) + $(MAKE) -C auxil lib LIBNAME=$(BASELIBNAME) $(MAKE) -C psblas lib LIBNAME=$(BASELIBNAME) $(MAKE) -C tools lib LIBNAME=$(BASELIBNAME) /bin/cp -p $(CPUPDFLAG) $(HERE)/$(LIBNAME) $(LIBDIR) -sr cm in pb tl: mods +sr cm ax pb tl: mods mods: $(MAKE) -C modules objs F90="$(MPF90)" F90COPT="$(F90COPT) $(MPI_OPT)" @@ -25,8 +25,8 @@ sr: $(MAKE) -C serial objs cm: $(MAKE) -C comm objs -in: - $(MAKE) -C internals objs +ax: + $(MAKE) -C auxil objs pb: $(MAKE) -C psblas objs tl: @@ -35,7 +35,7 @@ tl: clean: ($(MAKE) -C modules clean) ($(MAKE) -C comm clean) - ($(MAKE) -C internals clean) + ($(MAKE) -C auxil clean) ($(MAKE) -C tools clean) ($(MAKE) -C serial clean) ($(MAKE) -C psblas clean) diff --git a/base/internals/Makefile b/base/auxil/Makefile similarity index 92% rename from base/internals/Makefile rename to base/auxil/Makefile index 1bb3f1056..9e8597e60 100644 --- a/base/internals/Makefile +++ b/base/auxil/Makefile @@ -16,7 +16,7 @@ MODDIR=../modules FINCLUDES=$(FMFLAG). $(FMFLAG)$(MODDIR) $(FMFLAG)$(INCDIR) CINCLUDES=-I. -objs: mpfobjs $(FOBJS) $(FOBJS2) $(COBJS) $(MPFOBJS2) $(MPFOBJS) +objs: mpfobjs $(FOBJS) $(FOBJS2) $(COBJS) $(MPFOBJS2) lib: objs $(AR) $(LIBDIR)/$(LIBNAME) $(MPFOBJS) $(MPFOBJS2) $(FOBJS) $(FOBJS2) $(COBJS) $(RANLIB) $(LIBDIR)/$(LIBNAME) diff --git a/base/internals/psi_a2a_fnd_owner.F90 b/base/auxil/psi_a2a_fnd_owner.F90 similarity index 98% rename from base/internals/psi_a2a_fnd_owner.F90 rename to base/auxil/psi_a2a_fnd_owner.F90 index 9c7a2e650..91aa146cb 100644 --- a/base/internals/psi_a2a_fnd_owner.F90 +++ b/base/auxil/psi_a2a_fnd_owner.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -90,7 +90,7 @@ subroutine psi_a2a_fnd_owner(idx,iprc,idxmap,info,samesize) call psb_erractionsave(err_act) ctxt = idxmap%get_ctxt() - icomm = idxmap%get_mpic() + icomm = ctxt%get_mpic() mglob = idxmap%get_gr() n_row = idxmap%get_lr() n_col = idxmap%get_lc() diff --git a/base/internals/psi_adjcncy_fnd_owner.F90 b/base/auxil/psi_adjcncy_fnd_owner.F90 similarity index 99% rename from base/internals/psi_adjcncy_fnd_owner.F90 rename to base/auxil/psi_adjcncy_fnd_owner.F90 index 4af374938..3ee5b3e49 100644 --- a/base/internals/psi_adjcncy_fnd_owner.F90 +++ b/base/auxil/psi_adjcncy_fnd_owner.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -100,7 +100,7 @@ subroutine psi_adjcncy_fnd_owner(idx,iprc,adj,idxmap,info) call psb_erractionsave(err_act) ctxt = idxmap%get_ctxt() - icomm = idxmap%get_mpic() + icomm = ctxt%get_mpic() mglob = idxmap%get_gr() n_row = idxmap%get_lr() n_col = idxmap%get_lc() diff --git a/base/internals/psi_bld_glb_dep_list.F90 b/base/auxil/psi_bld_glb_dep_list.F90 similarity index 98% rename from base/internals/psi_bld_glb_dep_list.F90 rename to base/auxil/psi_bld_glb_dep_list.F90 index ea5349c4e..bd7337b28 100644 --- a/base/internals/psi_bld_glb_dep_list.F90 +++ b/base/auxil/psi_bld_glb_dep_list.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/internals/psi_bld_tmphalo.f90 b/base/auxil/psi_bld_tmphalo.f90 similarity index 98% rename from base/internals/psi_bld_tmphalo.f90 rename to base/auxil/psi_bld_tmphalo.f90 index 9d3fb7aba..b9e07dfae 100644 --- a/base/internals/psi_bld_tmphalo.f90 +++ b/base/auxil/psi_bld_tmphalo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -71,7 +71,7 @@ subroutine psi_bld_tmphalo(desc,info) call psb_erractionsave(err_act) ctxt = desc%get_context() - icomm = desc%get_mpic() + icomm = ctxt%get_mpic() n_row = desc%get_local_rows() n_col = desc%get_local_cols() diff --git a/base/internals/psi_bld_tmpovrl.f90 b/base/auxil/psi_bld_tmpovrl.f90 similarity index 98% rename from base/internals/psi_bld_tmpovrl.f90 rename to base/auxil/psi_bld_tmpovrl.f90 index e34b64639..4c3c823fa 100644 --- a/base/internals/psi_bld_tmpovrl.f90 +++ b/base/auxil/psi_bld_tmpovrl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -78,7 +78,7 @@ subroutine psi_i_bld_tmpovrl(iv,desc,info) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() ctxt = desc%get_context() - icomm = desc%get_mpic() + icomm = ctxt%get_mpic() ! check on blacs grid call psb_info(ctxt, me, np) diff --git a/base/internals/psi_compute_size.f90 b/base/auxil/psi_compute_size.f90 similarity index 98% rename from base/internals/psi_compute_size.f90 rename to base/auxil/psi_compute_size.f90 index 1820cfecb..85de7cc4f 100644 --- a/base/internals/psi_compute_size.f90 +++ b/base/auxil/psi_compute_size.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/internals/psi_crea_bnd_elem.f90 b/base/auxil/psi_crea_bnd_elem.f90 similarity index 98% rename from base/internals/psi_crea_bnd_elem.f90 rename to base/auxil/psi_crea_bnd_elem.f90 index d537dc296..08cd578e3 100644 --- a/base/internals/psi_crea_bnd_elem.f90 +++ b/base/auxil/psi_crea_bnd_elem.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/internals/psi_crea_index.f90 b/base/auxil/psi_crea_index.f90 similarity index 99% rename from base/internals/psi_crea_index.f90 rename to base/auxil/psi_crea_index.f90 index bbef054ed..d865d6b5c 100644 --- a/base/internals/psi_crea_index.f90 +++ b/base/auxil/psi_crea_index.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/internals/psi_crea_ovr_elem.f90 b/base/auxil/psi_crea_ovr_elem.f90 similarity index 98% rename from base/internals/psi_crea_ovr_elem.f90 rename to base/auxil/psi_crea_ovr_elem.f90 index bf9eeee4d..22c56672e 100644 --- a/base/internals/psi_crea_ovr_elem.f90 +++ b/base/auxil/psi_crea_ovr_elem.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/internals/psi_desc_impl.f90 b/base/auxil/psi_desc_impl.f90 similarity index 99% rename from base/internals/psi_desc_impl.f90 rename to base/auxil/psi_desc_impl.f90 index a6859678b..5743f97bc 100644 --- a/base/internals/psi_desc_impl.f90 +++ b/base/auxil/psi_desc_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/internals/psi_desc_index.F90 b/base/auxil/psi_desc_index.F90 similarity index 99% rename from base/internals/psi_desc_index.F90 rename to base/auxil/psi_desc_index.F90 index ec16afbec..338b860de 100644 --- a/base/internals/psi_desc_index.F90 +++ b/base/auxil/psi_desc_index.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -151,7 +151,7 @@ subroutine psi_i_desc_index(desc,index_in,dep_list,& debug_level = psb_get_debug_level() ctxt = desc%get_context() - icomm = desc%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt,me,np) if (np == -1) then info = psb_err_context_error_ diff --git a/base/internals/psi_fnd_owner.F90 b/base/auxil/psi_fnd_owner.F90 similarity index 97% rename from base/internals/psi_fnd_owner.F90 rename to base/auxil/psi_fnd_owner.F90 index f19b4b1f3..47ecc3573 100644 --- a/base/internals/psi_fnd_owner.F90 +++ b/base/auxil/psi_fnd_owner.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,7 +85,7 @@ subroutine psi_fnd_owner(nv,idx,iprc,desc,info) call psb_erractionsave(err_act) ctxt = desc%get_context() - icomm = desc%get_mpic() + icomm = ctxt%get_mpic() n_row = desc%get_local_rows() n_col = desc%get_local_cols() diff --git a/base/internals/psi_graph_fnd_owner.F90 b/base/auxil/psi_graph_fnd_owner.F90 similarity index 99% rename from base/internals/psi_graph_fnd_owner.F90 rename to base/auxil/psi_graph_fnd_owner.F90 index de5d5915a..b748d24c1 100644 --- a/base/internals/psi_graph_fnd_owner.F90 +++ b/base/auxil/psi_graph_fnd_owner.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -121,7 +121,7 @@ subroutine psi_graph_fnd_owner(idx,iprc,ladj,idxmap,info) call psb_erractionsave(err_act) ctxt = idxmap%get_ctxt() - icomm = idxmap%get_mpic() + icomm = ctxt%get_mpic() mglob = idxmap%get_gr() n_row = idxmap%get_lr() n_col = idxmap%get_lc() diff --git a/base/internals/psi_hash_impl.f90 b/base/auxil/psi_hash_impl.f90 similarity index 99% rename from base/internals/psi_hash_impl.f90 rename to base/auxil/psi_hash_impl.f90 index ed650e624..685f89e72 100644 --- a/base/internals/psi_hash_impl.f90 +++ b/base/auxil/psi_hash_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/internals/psi_indx_map_fnd_owner.F90 b/base/auxil/psi_indx_map_fnd_owner.F90 similarity index 98% rename from base/internals/psi_indx_map_fnd_owner.F90 rename to base/auxil/psi_indx_map_fnd_owner.F90 index 30777cdf4..593c93564 100644 --- a/base/internals/psi_indx_map_fnd_owner.F90 +++ b/base/auxil/psi_indx_map_fnd_owner.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -88,7 +88,7 @@ subroutine psi_indx_map_fnd_owner(idx,iprc,idxmap,info,adj) call psb_erractionsave(err_act) ctxt = idxmap%get_ctxt() - icomm = idxmap%get_mpic() + icomm = ctxt%get_mpic() mglob = idxmap%get_gr() call psb_info(ctxt, me, np) diff --git a/base/internals/psi_sort_dl.f90 b/base/auxil/psi_sort_dl.f90 similarity index 99% rename from base/internals/psi_sort_dl.f90 rename to base/auxil/psi_sort_dl.f90 index a5c0b3749..1cef53184 100644 --- a/base/internals/psi_sort_dl.f90 +++ b/base/auxil/psi_sort_dl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/internals/psi_srtlist.f90 b/base/auxil/psi_srtlist.f90 similarity index 99% rename from base/internals/psi_srtlist.f90 rename to base/auxil/psi_srtlist.f90 index 375dc8857..fb72d8f6a 100644 --- a/base/internals/psi_srtlist.f90 +++ b/base/auxil/psi_srtlist.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/internals/psi_symm_dep_list.F90 b/base/auxil/psi_symm_dep_list.F90 similarity index 98% rename from base/internals/psi_symm_dep_list.F90 rename to base/auxil/psi_symm_dep_list.F90 index f88eda91d..e88185cea 100644 --- a/base/internals/psi_symm_dep_list.F90 +++ b/base/auxil/psi_symm_dep_list.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/internals/psi_xtr_loc_dl.F90 b/base/auxil/psi_xtr_loc_dl.F90 similarity index 99% rename from base/internals/psi_xtr_loc_dl.F90 rename to base/auxil/psi_xtr_loc_dl.F90 index 26751dc9c..09f5d3c7b 100644 --- a/base/internals/psi_xtr_loc_dl.F90 +++ b/base/auxil/psi_xtr_loc_dl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/Makefile b/base/comm/Makefile index dfa1bed8b..b7fcdeeab 100644 --- a/base/comm/Makefile +++ b/base/comm/Makefile @@ -8,6 +8,7 @@ OBJS = psb_dgather.o psb_dhalo.o psb_dovrl.o \ psb_zgather.o psb_zhalo.o psb_zovrl.o \ psb_dgather_a.o psb_dhalo_a.o psb_dovrl_a.o \ psb_sgather_a.o psb_shalo_a.o psb_sovrl_a.o \ + psb_i2gather_a.o psb_i2halo_a.o psb_i2ovrl_a.o \ psb_mgather_a.o psb_mhalo_a.o psb_movrl_a.o \ psb_egather_a.o psb_ehalo_a.o psb_eovrl_a.o \ psb_cgather_a.o psb_chalo_a.o psb_covrl_a.o \ @@ -18,7 +19,7 @@ MPFOBJS=psb_dscatter.o psb_zscatter.o \ psb_iscatter.o psb_lscatter.o \ psb_cscatter.o psb_sscatter.o \ psb_dscatter_a.o psb_zscatter_a.o \ - psb_mscatter_a.o psb_escatter_a.o \ + psb_mscatter_a.o psb_escatter_a.o psb_i2scatter_a.o \ psb_cscatter_a.o psb_sscatter_a.o \ psb_dspgather.o psb_sspgather.o \ psb_zspgather.o psb_cspgather.o diff --git a/base/comm/internals/Makefile b/base/comm/internals/Makefile index 695f20650..a896a4d9b 100644 --- a/base/comm/internals/Makefile +++ b/base/comm/internals/Makefile @@ -6,6 +6,7 @@ FOBJS = psi_iovrl_restr.o psi_iovrl_save.o psi_iovrl_upd.o \ psi_dovrl_restr.o psi_dovrl_save.o psi_dovrl_upd.o \ psi_covrl_restr.o psi_covrl_save.o psi_covrl_upd.o \ psi_zovrl_restr.o psi_zovrl_save.o psi_zovrl_upd.o \ + psi_i2ovrl_restr_a.o psi_i2ovrl_save_a.o psi_i2ovrl_upd_a.o \ psi_movrl_restr_a.o psi_movrl_save_a.o psi_movrl_upd_a.o \ psi_eovrl_restr_a.o psi_eovrl_save_a.o psi_eovrl_upd_a.o \ psi_sovrl_restr_a.o psi_sovrl_save_a.o psi_sovrl_upd_a.o \ @@ -21,6 +22,7 @@ MPFOBJS = psi_dswapdata.o psi_dswaptran.o\ psi_zswapdata.o psi_zswaptran.o \ psi_dswapdata_a.o psi_dswaptran_a.o \ psi_sswapdata_a.o psi_sswaptran_a.o \ + psi_i2swapdata_a.o psi_i2swaptran_a.o \ psi_mswapdata_a.o psi_mswaptran_a.o \ psi_eswapdata_a.o psi_eswaptran_a.o \ psi_cswapdata_a.o psi_cswaptran_a.o \ @@ -31,16 +33,16 @@ MODDIR=../../modules FINCLUDES=$(FMFLAG). $(FMFLAG)$(MODDIR) $(FMFLAG)$(INCDIR) CINCLUDES=-I. -objs: mpfobjs $(FOBJS) $(MPFOBJS) +objs: mpfobjs $(FOBJS) lib: objs $(AR) $(LIBDIR)/$(LIBNAME) $(MPFOBJS) $(MPFOBJS2) $(FOBJS) $(FOBJS2) $(COBJS) $(RANLIB) $(LIBDIR)/$(LIBNAME) $(FOBJS) $(FBOJS2): $(MODDIR)/psi_mod.o -mpfobjs: - (make $(MPFOBJS) FC="$(MPFC)" ) +mpfobjs: $(MODDIR)/psi_mod.o + (make $(MPFOBJS) FC="$(MPFC)" ) clean: - /bin/rm -f $(MPFOBJS) $(FOBJS) $(COBJS) $(FOBJS2) $(MPFOBJS2) *$(.mod) + /bin/rm -f $(MPFOBJS) $(FOBJS) $(COBJS) $(FOBJS2) $(MPFOBJS2) *$(.mod) *.smod veryclean: clean diff --git a/base/comm/internals/psi_covrl_restr.f90 b/base/comm/internals/psi_covrl_restr.f90 index 9a0ecbed4..26eebae95 100644 --- a/base/comm/internals/psi_covrl_restr.f90 +++ b/base/comm/internals/psi_covrl_restr.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,90 +35,90 @@ ! ! ! -subroutine psi_covrl_restr_vect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_covrl_restr_vect - use psb_c_base_vect_mod - - implicit none - - class(psb_c_base_vect_type) :: x - complex(psb_spk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_covrl_restr_vect' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,czero) - - call psb_erractionrestore(err_act) - return +submodule (psi_c_comm_v_mod) psi_c_ovrl_restr_v_impl + use psb_base_mod +contains + module subroutine psi_covrl_restr_vect(x,xs,desc_a,info) + + implicit none + + class(psb_c_base_vect_type) :: x + complex(psb_spk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_covrl_restr_vect' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,czero) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_covrl_restr_vect + return + end subroutine psi_covrl_restr_vect -subroutine psi_covrl_restr_multivect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_covrl_restr_multivect - use psb_c_base_vect_mod + module subroutine psi_covrl_restr_multivect(x,xs,desc_a,info) - implicit none + implicit none - class(psb_c_base_multivect_type) :: x - complex(psb_spk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + class(psb_c_base_multivect_type) :: x + complex(psb_spk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz,nc - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz,nc + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err - name='psi_covrl_restr_mv' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_covrl_restr_mv' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) - call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,czero) + isz = size(desc_a%ovrlap_elem,1) + call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,czero) - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_covrl_restr_multivect + return + end subroutine psi_covrl_restr_multivect +end submodule psi_c_ovrl_restr_v_impl diff --git a/base/comm/internals/psi_covrl_restr_a.f90 b/base/comm/internals/psi_covrl_restr_a.f90 index 0ad657533..79bc92c73 100644 --- a/base/comm/internals/psi_covrl_restr_a.f90 +++ b/base/comm/internals/psi_covrl_restr_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,98 +34,100 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_covrl_restrr1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_covrl_restrr1 - - implicit none - - complex(psb_spk_), intent(inout) :: x(:) - complex(psb_spk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_covrl_restrr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx) = xs(i) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_c_comm_a_mod) psi_c_ovrl_restr_a_impl + use psb_base_mod +contains + module subroutine psi_covrl_restrr1(x,xs,desc_a,info) + + implicit none + + complex(psb_spk_), intent(inout) :: x(:) + complex(psb_spk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_covrl_restrr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx) = xs(i) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_covrl_restrr1 + return + end subroutine psi_covrl_restrr1 -subroutine psi_covrl_restrr2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_covrl_restrr2 + module subroutine psi_covrl_restrr2(x,xs,desc_a,info) - implicit none + implicit none - complex(psb_spk_), intent(inout) :: x(:,:) - complex(psb_spk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + complex(psb_spk_), intent(inout) :: x(:,:) + complex(psb_spk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err - name='psi_covrl_restrr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_covrl_restrr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if (size(x,2) /= size(xs,2)) then - info = psb_err_internal_error_ - call psb_errpush(info,name, a_err='Mismacth columns X vs XS') - goto 9999 - endif + if (size(x,2) /= size(xs,2)) then + info = psb_err_internal_error_ + call psb_errpush(info,name, a_err='Mismacth columns X vs XS') + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) + isz = size(desc_a%ovrlap_elem,1) - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx,:) = xs(i,:) - end do + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx,:) = xs(i,:) + end do - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_covrl_restrr2 + return + end subroutine psi_covrl_restrr2 +end submodule psi_c_ovrl_restr_a_impl diff --git a/base/comm/internals/psi_covrl_save.f90 b/base/comm/internals/psi_covrl_save.f90 index 42f2ae3a2..d2583fb04 100644 --- a/base/comm/internals/psi_covrl_save.f90 +++ b/base/comm/internals/psi_covrl_save.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,103 +34,101 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_covrl_save_vect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_covrl_save_vect - use psb_realloc_mod - use psb_c_base_vect_mod - - implicit none - - class(psb_c_base_vect_type) :: x - complex(psb_spk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) - - call psb_erractionrestore(err_act) - return +submodule (psi_c_comm_v_mod) psi_c_ovrl_save_v_impl + use psb_base_mod +contains + module subroutine psi_covrl_save_vect(x,xs,desc_a,info) + + implicit none + + class(psb_c_base_vect_type) :: x + complex(psb_spk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_covrl_save_vect - -subroutine psi_covrl_save_multivect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_covrl_save_multivect - use psb_realloc_mod - use psb_c_base_vect_mod - - implicit none - - class(psb_c_base_multivect_type) :: x - complex(psb_spk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, nc - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = x%get_ncols() - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_covrl_save_vect + + module subroutine psi_covrl_save_multivect(x,xs,desc_a,info) + + implicit none + + class(psb_c_base_multivect_type) :: x + complex(psb_spk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, nc + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = x%get_ncols() + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_covrl_save_multivect + return + end subroutine psi_covrl_save_multivect +end submodule psi_c_ovrl_save_v_impl diff --git a/base/comm/internals/psi_covrl_save_a.f90 b/base/comm/internals/psi_covrl_save_a.f90 index 6910a2a46..3da176a3e 100644 --- a/base/comm/internals/psi_covrl_save_a.f90 +++ b/base/comm/internals/psi_covrl_save_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,108 +34,104 @@ ! These subroutines save the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap. ! -subroutine psi_covrl_saver1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_covrl_saver1 - - use psb_realloc_mod - - implicit none - - complex(psb_spk_), intent(inout) :: x(:) - complex(psb_spk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_covrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i) = x(idx) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_c_comm_a_mod) psi_c_ovrl_save_a_impl + use psb_base_mod +contains + module subroutine psi_covrl_saver1(x,xs,desc_a,info) + implicit none + + complex(psb_spk_), intent(inout) :: x(:) + complex(psb_spk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_covrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i) = x(idx) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_covrl_saver1 - - -subroutine psi_covrl_saver2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_covrl_saver2 - - use psb_realloc_mod - - implicit none - - complex(psb_spk_), intent(inout) :: x(:,:) - complex(psb_spk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc - character(len=20) :: name, ch_err - - name='psi_covrl_saver2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = size(x,2) - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i,:) = x(idx,:) - end do - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_covrl_saver1 + + + module subroutine psi_covrl_saver2(x,xs,desc_a,info) + implicit none + + complex(psb_spk_), intent(inout) :: x(:,:) + complex(psb_spk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc + character(len=20) :: name, ch_err + + name='psi_covrl_saver2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = size(x,2) + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i,:) = x(idx,:) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_covrl_saver2 + return + end subroutine psi_covrl_saver2 +end submodule psi_c_ovrl_save_a_impl diff --git a/base/comm/internals/psi_covrl_upd.f90 b/base/comm/internals/psi_covrl_upd.f90 index 8212895c6..43841f5d5 100644 --- a/base/comm/internals/psi_covrl_upd.f90 +++ b/base/comm/internals/psi_covrl_upd.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -36,169 +36,167 @@ ! ! ! -subroutine psi_covrl_upd_vect(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_covrl_upd_vect - use psb_realloc_mod - use psb_c_base_vect_mod - - implicit none - - class(psb_c_base_vect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - complex(psb_spk_), allocatable :: xs(:) - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, nx, ndm - integer(psb_ipk_) :: err_act, i, idx - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - - name='psi_covrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - nx = size(desc_a%ovrlap_elem,1) - call psb_realloc(nx,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_Dealloc_ - call psb_errpush(info,name) - goto 9999 - end if - - if (update /= psb_sum_) then - call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) - ! switch on update type - - select case (update) - case(psb_square_root_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i) = xs(i)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i) = xs(i)/real(ndm) - end do - case(psb_setzero_) - do i=1,nx - if (me /= desc_a%ovrlap_elem(i,3))& - & xs(i) = czero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) +submodule (psi_c_comm_v_mod) psi_c_ovrl_upd_v_impl + use psb_base_mod +contains + module subroutine psi_covrl_upd_vect(x,desc_a,update,info) + + implicit none + + class(psb_c_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + complex(psb_spk_), allocatable :: xs(:) + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, nx, ndm + integer(psb_ipk_) :: err_act, i, idx + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + + name='psi_covrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end select - call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,czero) - end if - - call psb_erractionrestore(err_act) - return + endif + nx = size(desc_a%ovrlap_elem,1) + call psb_realloc(nx,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_Dealloc_ + call psb_errpush(info,name) + goto 9999 + end if + + if (update /= psb_sum_) then + call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) + ! switch on update type + + select case (update) + case(psb_square_root_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i) = xs(i)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i) = xs(i)/real(ndm) + end do + case(psb_setzero_) + do i=1,nx + if (me /= desc_a%ovrlap_elem(i,3))& + & xs(i) = czero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,czero) + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_covrl_upd_vect - -subroutine psi_covrl_upd_multivect(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_covrl_upd_multivect - use psb_realloc_mod - use psb_c_base_vect_mod - - implicit none - - class(psb_c_base_multivect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - complex(psb_spk_), allocatable :: xs(:,:) - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, ndm, nx, nc - integer(psb_ipk_) :: err_act, i, idx - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - - name='psi_covrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - nx = size(desc_a%ovrlap_elem,1) - nc = x%get_ncols() - call psb_realloc(nx,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_Dealloc_ - call psb_errpush(info,name) - goto 9999 - end if - - if (update /= psb_sum_) then - call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) - ! switch on update type - - select case (update) - case(psb_square_root_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i,:) = xs(i,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i,:) = xs(i,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,nx - if (me /= desc_a%ovrlap_elem(i,3))& - & xs(i,:) = czero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) + return + end subroutine psi_covrl_upd_vect + + module subroutine psi_covrl_upd_multivect(x,desc_a,update,info) + + implicit none + + class(psb_c_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + complex(psb_spk_), allocatable :: xs(:,:) + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, ndm, nx, nc + integer(psb_ipk_) :: err_act, i, idx + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + + name='psi_covrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end select - call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,czero) - end if - - call psb_erractionrestore(err_act) - return + endif + nx = size(desc_a%ovrlap_elem,1) + nc = x%get_ncols() + call psb_realloc(nx,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_Dealloc_ + call psb_errpush(info,name) + goto 9999 + end if + + if (update /= psb_sum_) then + call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) + ! switch on update type + + select case (update) + case(psb_square_root_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i,:) = xs(i,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i,:) = xs(i,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,nx + if (me /= desc_a%ovrlap_elem(i,3))& + & xs(i,:) = czero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,czero) + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_covrl_upd_multivect + return + end subroutine psi_covrl_upd_multivect +end submodule psi_c_ovrl_upd_v_impl diff --git a/base/comm/internals/psi_covrl_upd_a.f90 b/base/comm/internals/psi_covrl_upd_a.f90 index 813cd88b7..7e53fe66a 100644 --- a/base/comm/internals/psi_covrl_upd_a.f90 +++ b/base/comm/internals/psi_covrl_upd_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -32,143 +32,143 @@ ! Subroutine: psi_covrl_update ! These subroutines update the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap, -! or for the application of Additive Schwarz preconditioners. +! or for the application of Additive Schwarz preconditioners. ! ! -subroutine psi_covrl_updr1(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_covrl_updr1 - - implicit none - - complex(psb_spk_), intent(inout), target :: x(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_covrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx) = czero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return +submodule (psi_c_comm_a_mod) psi_c_ovrl_upd_a_impl + use psb_base_mod +contains + module subroutine psi_covrl_updr1(x,desc_a,update,info) + implicit none + + complex(psb_spk_), intent(inout), target :: x(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_covrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx) = czero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_covrl_updr1 - -subroutine psi_covrl_updr2(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_covrl_updr2 - - implicit none - - complex(psb_spk_), intent(inout), target :: x(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_covrl_updr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx,:) = czero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_covrl_updr1 + + module subroutine psi_covrl_updr2(x,desc_a,update,info) + implicit none + + complex(psb_spk_), intent(inout), target :: x(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_covrl_updr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx,:) = czero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_covrl_updr2 + return + end subroutine psi_covrl_updr2 +end submodule psi_c_ovrl_upd_a_impl diff --git a/base/comm/internals/psi_cswapdata.F90 b/base/comm/internals/psi_cswapdata.F90 index db76d16e7..f008b2b46 100644 --- a/base/comm/internals/psi_cswapdata.F90 +++ b/base/comm/internals/psi_cswapdata.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,7 +41,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D complex(psb_spk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -53,32 +53,22 @@ ! is scattered in the owned indices, and BETA=1. ! The first routine picks the desired exchange index list and passes it to the second. ! This version works on encapsulated vectors, and uses their methods to do GTH and SCT, -! so that special versions (i.e. GPU vectors can override them +! so that special versions (i.e. GPU vectors can override them) ! ! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) +! swap_status - integer Swap status selector. +! It is interpreted as a communication status: +! psb_comm_status_start_ -> START phase +! psb_comm_status_wait_ -> WAIT phase +! psb_comm_status_unknown_ -> START+WAIT +! The communication scheme is selected from +! y%comm_handle%comm_type. ! ! ! n - integer Number of columns in Y -! beta - complex Choose overwrite or sum. +! beta - real Choose overwrite or sum. ! y - type(psb_@x@_vect_type) The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - complex Buffer space. If not sufficient, will do -! our own internal allocation. +! desc_a - type(psb_desc_type). The communication descriptor. ! info - integer. return code. ! data - integer which list is to be used to exchange data ! default psb_comm_halo_ @@ -89,101 +79,156 @@ ! ! ! -subroutine psi_cswapdata_vect(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_cswapdata_vect - use psb_c_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +submodule (psi_c_comm_v_mod) psi_c_swapdata_impl + use psb_desc_const_mod, only: psb_swap_start_, psb_swap_wait_ + use psb_base_mod + use psb_error_mod, only: psb_get_debug_level, psb_get_debug_unit, psb_debug_ext_ + use psb_comm_schemes_mod, only: psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_, psb_comm_rma_pull_, psb_comm_rma_push_, & + & psb_comm_handle_type + use psb_comm_rma_mod, only: psb_comm_rma_handle + use psb_comm_factory_mod + +contains + + module subroutine psi_cswapdata_vect(swap_status,beta,y,desc_a,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_vect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_), target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + integer(psb_ipk_), intent(in) :: swap_status + class(psb_c_base_vect_type), intent(inout) :: y + complex(psb_spk_), intent(in) :: beta + type(psb_desc_type), target :: desc_a ! TODO: should this be intent(in)? + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, data_, err_act - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, my_rank, total_send, total_recv, num_neighbors, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + ! communication scheme/status selectors + logical :: baseline, ineighbor_a2av, ineighbor_a2av_persistent - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif + ! error handling variables + integer(psb_ipk_) :: err_act + character(len=30) :: name + logical :: debug - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if + info = psb_success_ + name = 'psi_cswapdata_vect' + call psb_erractionsave(err_act) - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if + debug = .false. - call psi_swapdata(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 + ctxt = desc_a%get_context() - call psb_erractionrestore(err_act) - return + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='desc_a%get_list_p') + goto 9999 + end if + + + if( (swap_status /= psb_comm_status_start_).and.(swap_status /= psb_comm_status_wait_)& + & .and.(swap_status /= psb_comm_status_sync_) ) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + ! Set the normalized swap status on the comm handle + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + if(debug .eqv. .true.) then + write(0,'(a,i0,a,i0)') 'DBG_DISPATCH comm_type=',y%comm_handle%comm_type,' desc_a%comm_type=',desc_a%comm_type + endif + select case(y%comm_handle%comm_type) + case(psb_comm_isend_irecv_) + call psi_cswap_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline swap') + goto 9999 + end if + case(psb_comm_ineighbor_alltoallv_) + call psi_cswap_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,& + & total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor nonblocking swap') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_cswap_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,& + & total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor persistent swap') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_cswap_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull swap') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_cswap_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push swap') + goto 9999 + end if + case default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Incompatible swap_status settings: no valid communication mode selected') + goto 9999 + end select + + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_cswapdata_vect + end subroutine psi_cswapdata_vect -! -! -! Subroutine: psi_cswap_vidx_vect -! Data exchange among processes. -! -! Takes care of Y an exanspulated vector. Relies on the gather/scatter methods -! of vectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_cswap_vidx_vect(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_cswap_vidx_vect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_c_base_vect_mod + subroutine psi_cswap_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -192,336 +237,1416 @@ subroutine psi_cswap_vidx_vect(ctxt,icomm,flag,beta,y,idx, & include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_vect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size),& + & iret, nesd, nerv + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti, n + logical :: do_send,do_recv + logical, parameter :: usersend=.false. + logical :: debug + character(len=20) :: name + + info = psb_success_ + name = 'psi_cswap_baseline_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - ! locals - integer(psb_mpk_) :: np, me - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size),& - & iret, nesd, nerv - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti, n - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + icomm = ctxt%get_mpic() - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline swap') + goto 9999 + end select - totrcv_ = totrcv * n - totsnd_ = totsnd * n - call idx%sync() + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') + goto 9999 + end if - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then + n=1 + do_send = (swap_status == psb_comm_status_start_).or.(swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_).or.(swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + call comm_indexes%sync() + + if (debug) write(*,*) my_rank,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Unfinished communication? Something is wrong....') + goto 9999 + end if + end if + call y%new_buffer(ione*size(comm_indexes%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + + rcv_pt = 1+pnti+psb_n_elem_recv_ + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= my_rank)) then + if (debug) write(*,*) my_rank,'Posting receive from',prcid(i),rcv_pt + p2ptag = psb_double_swap_tag + call mpi_irecv(y%combuf(rcv_pt),nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + pnti = pnti + nerv + nesd + 3 + end do + if (debug) write(*,*) my_rank,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = snd_pt + if ((idx_pt < 1) .or. (nesd < 0) .or. (idx_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((idx_pt < 1) .or. (nesd < 0) .or. (idx_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(idx_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait + ! + call y%device_wait() + + if (debug) write(*,*) my_rank,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((nesd>0).and.(proc_to_comm /= my_rank)) then + call mpi_isend(y%combuf(snd_pt),nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) my_rank,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then ! - ! Unfinished communication? Something is wrong.... + ! No matching send? Something is wrong.... ! info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) my_rank,' wait' + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (proc_to_comm /= my_rank)then + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == my_rank) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) my_rank,' scatter' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((idx_pt < 1) .or. (nerv < 0) .or. (idx_pt+max(0,nerv)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter metadata out of bounds') + goto 9999 + end if + if ((rcv_pt < 1) .or. (nerv < 0) .or. (rcv_pt+max(0,nerv)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter combuf bounds error') + goto 9999 + end if + + if (debug) write(*,*)my_rank,' Received from: ',prcid(i),& + & y%combuf(rcv_pt:rcv_pt+nerv-1) + call y%sct(rcv_pt,nerv,comm_indexes,beta) + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Waited for everybody, clean up + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) my_rank,' wait' + call y%device_wait() + if (debug) write(*,*) my_rank,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call y%comm_handle%free(info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) my_rank,' done' end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - rcv_pt = 1+pnti+psb_n_elem_recv_ - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - p2ptag = psb_complex_swap_tag - call mpi_irecv(y%combuf(rcv_pt),nerv,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_cswap_baseline_vect + + + + subroutine psi_cswap_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical :: debug + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + info = psb_success_ + name = 'psi_cswap_neighbor_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor swap') + goto 9999 + end select + + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') + goto 9999 + end if + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (nonblocking)' + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(snd_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + else + neighbor_comm_handle%comm_request = mpi_request_null end if - pnti = pnti + nerv + nesd + 3 - end do - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - idx_pt = snd_pt - call y%gth(idx_pt,nesd,idx) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Then wait - ! - call y%device_wait() + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Ineighbor_alltoallv' + if (buffer_size > 0) then + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (baseline/positional layout) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs_v, & ! positional displacements (match gth layout) + & psb_mpi_r_spk_, & + & y%combuf(1), & ! recv buffer (baseline/positional layout) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs_v, & ! positional displacements (match sct layout) + & psb_mpi_r_spk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + ! Valid no-op exchange: nothing was posted in START and nothing to wait/scatter. + neighbor_comm_handle%comm_request = mpi_request_null + else + if (neighbor_comm_handle%comm_request == mpi_request_null) then + write(psb_err_unit,*) my_rank, 'DBG: neighbor WAIT but comm_request is NULL; is_initialized=', & + & neighbor_comm_handle%is_initialized + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - p2ptag = psb_complex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + ! Only wait and scatter if there's data + if ((topology_total_send + topology_total_recv) > 0) then + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if - if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),nesd,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) + ! Scatter received data to local vector positions (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((1+pnti+psb_n_elem_recv_ < 1) .or. (nerv < 0) .or. & + & (1+pnti+psb_n_elem_recv_+max(0,nerv)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter metadata out of bounds') + goto 9999 + end if + if ((rcv_pt < 1) .or. (nerv < 0) .or. (rcv_pt+max(0,nerv)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter combuf bounds error') + goto 9999 + end if + call y%sct(rcv_pt,nerv,comm_indexes,beta) + pnti = pnti + nerv + nesd + 3 + end do + else + ! nothing to wait/scatter end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) goto 9999 end if + if (debug) write(*,*) my_rank,' nbr_vect: done' - pnti = pnti + nerv + nesd + 3 - end do - end if + end if ! do_wait - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_cswap_neighbor_topology_vect + + + + subroutine psi_cswap_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical :: debug + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + info = psb_success_ + debug = .false. + name = 'psi_cswap_neighbor_persistent_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor swap') + goto 9999 + end select + + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') goto 9999 end if - call psb_realloc(totxch,prcid,info) - if (debug) write(*,*) me,' wait' - pnti = 1 - p2ptag = psb_complex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (proc_to_comm /= me)then - if (nesd>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (persistent)' + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid START: persistent neighbor request already in flight') + goto 9999 + end if + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < ione*size(comm_indexes%v)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) goto 9999 end if end if - if (nerv>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Gather send data into combuf using baseline-style gth calls + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data (baseline layout),', topology_total_send,' elems' + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') goto 9999 end if + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(snd_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Lazy persistent-init: build the request once, then reuse with START/WAIT. + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Neighbor_alltoallv_init' + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & ! send buffer + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs_v, & ! positional (baseline layout) + & psb_mpi_r_dpk_, & + & y%combuf(1), & ! recv buffer (baseline layout) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs_v, & ! positional (baseline layout) + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 end if - y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. end if - pnti = pnti + nerv + nesd + 3 - end do - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + end if ! do_start - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(rcv_pt:rcv_pt+nerv-1) - call y%sct(rcv_pt,nerv,idx,beta) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Waited for everybody, clean up - ! - y%comid = mpi_request_null + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + ! Valid no-op exchange: nothing was posted in START and nothing to wait/scatter. + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + ! Only wait and scatter if there's data + if ((topology_total_send + topology_total_recv) > 0) then + ! Wait for the persistent collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on persistent MPI request' + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Scatter received data to local vector positions (baseline-style sct) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data (baseline layout),', topology_total_recv,' elems' + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + rcv_pt = 1+pnti+psb_n_elem_recv_ + if (nerv > 0) then + call y%sct(rcv_pt,nerv,comm_indexes,beta) + end if + pnti = pnti + nerv + nesd + 3 + end do + end if + + call y%device_wait() + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_cswap_neighbor_persistent_topology_vect + + + subroutine psi_cswap_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + + info = psb_success_ + name = 'psi_cswap_rma_pull_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - if (debug) write(*,*) me,' done' - end if + icomm = ctxt%get_mpic() + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for pull mode') + goto 9999 + end select + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) - call psb_erractionrestore(err_act) - return + call comm_indexes%sync() + + ! START phase: build the layout once, prepare the exposed buffer, then issue RMA. + if (do_start) then + buffer_size = total_send + total_recv + + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA pull rank cache allocation') + goto 9999 + end if + end if + + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA pull init_memory_buffer_layout failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + ! Need a larger exposed memory area: recreate the RMA window first, + ! then reallocate combuf and lazily create a new window below. + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + ! Expose combuf once and keep the window around until the descriptor changes. + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send)) + end if + call y%device_wait() + + ! Pull data from each peer with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = total_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA pull') + goto 9999 + end if + if ((recv_pos < 1) .or. (recv_count < 0) .or. (recv_pos+max(0,recv_count)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull local receive bounds error') + goto 9999 + end if + + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count, psb_mpi_r_spk_, prc_rank, remote_disp, recv_count, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter received data into Y. + if (do_wait) then + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send+1:total_send+total_recv), beta) + end if + + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_cswap_rma_pull_vect - return -end subroutine psi_cswap_vidx_vect -! -! -! Subroutine: psi_cswapdata_multivect -! Data exchange among processes. -! -! Takes care of Y an encaspulated multivector. -! -! -subroutine psi_cswapdata_multivect(flag,beta,y,desc_a,work,info,data) + subroutine psi_cswap_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_cswap_rma_push_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for push mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! START phase: identical layout handling, but the remote metadata describes the receive side. + if (do_start) then + buffer_size = total_send + total_recv + + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA put rank cache allocation') + goto 9999 + end if + end if + + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA put ini_memory_buffer_layout') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + ! Need a larger exposed memory area: recreate the RMA window first, + ! then reallocate combuf and lazily create a new window below. + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + ! Keep the window alive across repetitions: it is created once and reused. + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window (prevents isend/irecv ordering issues). + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + ! Push data to each peer; after flush send a P2P notification so target knows data arrived. + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = total_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA push') + goto 9999 + end if + if ((send_pos < 1) .or. (send_count < 0) .or. (send_pos+max(0,send_count)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push local send bounds error') + goto 9999 + end if + + if (send_count > 0) then + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count, psb_mpi_r_spk_, prc_rank, remote_disp, send_count, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send+1:total_send+total_recv), beta) + end if + + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_cswap_rma_push_vect + - use psi_mod, psb_protect_name => psi_cswapdata_multivect - use psb_c_base_multivect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + + ! + ! + ! Subroutine: psi_cswapdata_multivect + ! Data exchange among processes. + ! + ! Takes care of Y an encaspulated multivector. + ! + ! + module subroutine psi_cswapdata_multivect(swap_status,beta,y,desc_a,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_multivect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_), target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + integer(psb_ipk_), intent(in) :: swap_status + class(psb_c_base_multivect_type), intent(inout) :: y + complex(psb_spk_), intent(in) :: beta + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, data_, err_act - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) + ! communication scheme/status selectors + logical :: baseline, ineighbor_a2av, ineighbor_a2av_persistent - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, my_rank, total_send, total_recv, num_neighbors, data_, err_act + integer(psb_mpk_) :: n, total_send_, total_recv_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=30) :: name - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif + + info = psb_success_ + name = 'psi_cswapdata_multivect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if - call psi_swapdata(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 + if ((swap_status /= psb_comm_status_start_) .and. (swap_status /= psb_comm_status_wait_) & + & .and. (swap_status /= psb_comm_status_unknown_)) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + baseline = .false. + ineighbor_a2av = .false. + ineighbor_a2av_persistent = .false. + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + ineighbor_a2av = .true. + case(psb_comm_persistent_ineighbor_alltoallv_) + ineighbor_a2av_persistent = .true. + case(psb_comm_rma_pull_) + call psi_cswap_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull swap') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_cswap_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push swap') + goto 9999 + end if + case default + baseline = .true. + end select + + if (baseline) then + call psi_cswap_baseline_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline swap') + goto 9999 + end if + else if (ineighbor_a2av) then + call psi_cswap_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor nonblocking swap') + goto 9999 + end if + else if (ineighbor_a2av_persistent) then + call psi_cswap_neighbor_topology_multivect_persistent(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor persistent swap') + goto 9999 + end if + else + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Incompatible swap_status settings: no valid communication mode selected') + goto 9999 + end if - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_cswapdata_multivect + end subroutine psi_cswapdata_multivect -! -! -! Subroutine: psi_cswap_vidx_multivect -! Data exchange among processes. -! -! Takes care of Y an encapsulated multivector. Relies on the gather/scatter methods -! of multivectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_cswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_cswap_vidx_multivect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_c_base_multivect_mod + + +subroutine psi_cswap_baseline_multivect(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -530,100 +1655,107 @@ subroutine psi_cswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_multivect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name + logical :: do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name - info=psb_success_ - name='psi_swap_datav' + info = psb_success_ + name = 'psi_cswap_baseline_multivect' call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) + call psb_info(ctxt,my_rank,np) if (np == -1) then - info=psb_err_context_error_ + info = psb_err_context_error_ call psb_errpush(info,name) goto 9999 endif n = y%get_ncols() - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline multivect swap') + goto 9999 + end select + + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) - totrcv_ = totrcv * n - totsnd_ = totsnd * n + total_recv_ = total_recv * n + total_send_ = total_send * n - call idx%sync() + call comm_indexes%sync() - if (debug) write(*,*) me,'Internal buffer' + if (debug) write(*,*) my_rank,'Internal buffer' if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + info = psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) + if (debug) write(*,*) my_rank,'do_send start' + call y%new_buffer(total_send_+total_recv_,info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) ! First I post all the non blocking receives pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - p2ptag = psb_complex_swap_tag - call mpi_irecv(y%combuf(rcv_pt),n*nerv,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) + if ((nerv>0).and.(proc_to_comm /= my_rank)) then + if (debug) write(*,*) my_rank,'Posting receive from',prcid(i),rcv_pt + p2ptag = psb_double_swap_tag + call mpi_irecv(y%combuf(rcv_pt),n*nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) end if rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do - if (debug) write(*,*) me,' Gather ' + if (debug) write(*,*) my_rank,' Gather ' ! ! Then gather for sending. ! pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call y%gth(idx_pt,snd_pt,nesd,idx) + call y%gth(idx_pt,snd_pt,nesd,comm_indexes) rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 @@ -634,24 +1766,24 @@ subroutine psi_cswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & ! call y%device_wait() - if (debug) write(*,*) me,' isend' + if (debug) write(*,*) my_rank,' isend' ! ! Then send ! pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - p2ptag = psb_complex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),n*nesd,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + + if ((nesd>0).and.(proc_to_comm /= my_rank)) then + call mpi_isend(y%combuf(snd_pt),n*nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) end if if(iret /= mpi_success) then @@ -666,8 +1798,8 @@ subroutine psi_cswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & end if if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then + if (debug) write(*,*) my_rank,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then ! ! No matching send? Something is wrong.... ! @@ -675,20 +1807,20 @@ subroutine psi_cswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if - call psb_realloc(totxch,prcid,info) + call psb_realloc(num_neighbors,prcid,info) - if (debug) write(*,*) me,' wait' + if (debug) write(*,*) my_rank,' wait' pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - p2ptag = psb_complex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm /= me)then + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + if (proc_to_comm /= my_rank)then if (nesd>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) if(iret /= mpi_success) then info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/iret/)) @@ -696,14 +1828,14 @@ subroutine psi_cswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & end if end if if (nerv>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) if(iret /= mpi_success) then info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/iret/)) goto 9999 end if end if - else if (proc_to_comm == me) then + else if (proc_to_comm == my_rank) then if (nesd /= nerv) then write(psb_err_unit,*) & & 'Fatal error in swapdata: mismatch on self send',& @@ -716,19 +1848,19 @@ subroutine psi_cswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & pnti = pnti + nerv + nesd + 3 end do - if (debug) write(*,*) me,' scatter' + if (debug) write(*,*) my_rank,' scatter' pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+psb_n_elem_recv_ - if (debug) write(0,*)me,' Received from: ',prcid(i),& + if (debug) write(0,*)my_rank,' Received from: ',prcid(i),& & y%combuf(rcv_pt:rcv_pt+n*nerv-1) - call y%sct(idx_pt,rcv_pt,nerv,idx,beta) + call y%sct(idx_pt,rcv_pt,nerv,comm_indexes,beta) rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 @@ -736,21 +1868,23 @@ subroutine psi_cswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & ! ! Waited for com, cleanup comid ! - y%comid = mpi_request_null + baseline_comm_handle%comid = mpi_request_null ! ! Then wait for device ! - if (debug) write(*,*) me,' wait' + if (debug) write(*,*) my_rank,' wait' call y%device_wait() - if (debug) write(*,*) me,' free buffer' + if (debug) write(*,*) my_rank,' free buffer' call y%free_buffer(info) - if (info == 0) call y%free_comid(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if if (info /= 0) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - if (debug) write(*,*) me,' done' + if (debug) write(*,*) my_rank,' done' end if @@ -760,5 +1894,859 @@ subroutine psi_cswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_cswap_vidx_multivect +end subroutine psi_cswap_baseline_multivect + + + +subroutine psi_cswap_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, n + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_cswap_neighbor_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor multivect swap') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (nonblocking)' + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, & + & ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! Gather send data into contiguous send buffer (polymorphic for GPU) + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data,', topology_total_send,' elems' + call y%gth(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(1:total_send_)) + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Ineighbor_alltoallv' + if (buffer_size > 0) then + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(total_send_ + 1), & ! recv buffer + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if ((topology_total_send + topology_total_recv) > 0) then + if (neighbor_comm_handle%comm_request == mpi_request_null) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if ((topology_total_send + topology_total_recv) > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + end if + + ! Scatter received data to local vector positions (polymorphic for GPU) + if ((topology_total_send + topology_total_recv) > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + call y%sct(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(total_send_+1:total_send_+total_recv_), & + & beta) + end if + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return +end subroutine psi_cswap_neighbor_topology_multivect + + + +subroutine psi_cswap_neighbor_topology_multivect_persistent(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, n + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_cswap_neighbor_topology_multivect_persistent' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor multivect swap') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (persistent)' + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid START: persistent neighbor request already in flight') + goto 9999 + end if + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, & + & ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Gather send data into contiguous send buffer (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data,', topology_total_send,' elems' + call y%gth(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(1:total_send_)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Neighbor_alltoallv_init' + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & ! send buffer + & n*neighbor_comm_handle%send_counts, & + & n*neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(total_send_ + 1), & ! recv buffer + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) > 0) then + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + + ! Wait for the persistent collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on persistent MPI request' + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Scatter received data to local vector positions (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + call y%sct(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(total_send_+1:total_send_+total_recv_), & + & beta) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + call y%device_wait() + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return +end subroutine psi_cswap_neighbor_topology_multivect_persistent + + + subroutine psi_cswap_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, total_send_, total_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_cswap_rma_pull_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for pull mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_send_ + total_recv_ + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA pull rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA pull init_memory_buffer_layout failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send_)) + end if + call y%device_wait() + + ! Pull data from each peer with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA pull') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int((remote_base - 1) * n, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count*n, psb_mpi_r_spk_, prc_rank, remote_disp, recv_count*n, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter received data into Y. + if (do_wait) then + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send_+1:total_send_+total_recv_), beta) + end if + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_cswap_rma_pull_multivect + + + subroutine psi_cswap_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, total_send_, total_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_cswap_rma_push_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for push mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_send_ + total_recv_ + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA put rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA put ini_memory_buffer_layout') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send_)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA push') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int((remote_base - 1) * n, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count*n, psb_mpi_r_spk_, prc_rank, remote_disp, send_count*n, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send_+1:total_send_+total_recv_), beta) + end if + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_cswap_rma_push_multivect + + +end submodule psi_c_swapdata_impl diff --git a/base/comm/internals/psi_cswapdata_a.F90 b/base/comm/internals/psi_cswapdata_a.F90 index 8b1373972..726ee872a 100644 --- a/base/comm/internals/psi_cswapdata_a.F90 +++ b/base/comm/internals/psi_cswapdata_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -39,7 +39,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D complex(psb_spk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -70,10 +70,10 @@ ! ! ! n - integer Number of columns in Y -! beta - complex Choose overwrite or sum. -! y(:,:) - complex The data area +! beta - real Choose overwrite or sum. +! y(:,:) - real The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - complex Buffer space. If not sufficient, will do +! work(:) - real Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -84,912 +84,903 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_cswapdatam(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_c_comm_a_mod) psi_c_swapdata_a_impl + use psb_base_mod +contains + module subroutine psi_cswapdatam(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_cswapdatam - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:,:), beta - complex(psb_spk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + complex(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swapdata(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_cswapdatam + end subroutine psi_cswapdatam -subroutine psi_cswapidxm(ctxt,icomm,flag,n,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + module subroutine psi_cswapidxm(ctxt,flag,n,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) - use psi_mod, psb_protect_name => psi_cswapidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:,:), beta - complex(psb_spk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - complex(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:,:) + complex(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + +complex(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_r_spk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_r_spk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),n*nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),n*nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*)& + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + - ! prepare info for communications + else if (swap_send) then - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + else if (swap_recv) then - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + end if - else - allocate(rvhd(totxch),prcid(totxch),stat=info) + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if if(info /= psb_success_) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(albf) deallocate(sndbuf,rcvbuf,stat=info) if(info /= psb_success_) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - albf=.true. - end if - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_c_spk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_c_spk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - - else if (swap_sync) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm < me) then - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_complex_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_complex_swap_tag - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),n*nesd,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),n*nesd,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag,icomm,iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_complex_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*)& - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_cswapidxm - -! -! -! Subroutine: psi_cswapdatav -! Implements the data exchange among processes. Essentially this is doing -! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - complex Choose overwrite or sum. -! y(:) - complex The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - complex Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_cswapdatav(flag,beta,y,desc_a,work,info,data) + end subroutine psi_cswapidxm + + ! + ! + ! Subroutine: psi_cswapdatav + ! Implements the data exchange among processes. Essentially this is doing + ! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D complex(psb_spk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_cswapdatav(flag,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_cswapdatav - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:), beta - complex(psb_spk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + complex(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_cswapdatav + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_cswapdataidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_cswapidxv(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + call psi_swapdata(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return - use psi_mod, psb_protect_name => psi_cswapidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_cswapdatav + + + ! + ! + ! Subroutine: psi_cswapdataidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_cswapidxv(ctxt,flag,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) + + use psb_error_mod + use psb_desc_mod + use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:), beta - complex(psb_spk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - complex(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:) + complex(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + complex(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+nesd-1)) - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_c_spk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_c_spk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+nesd-1)) + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_r_spk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_r_spk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm < me) then + else if (swap_send) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_snd(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_rcv(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_complex_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),nerv,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_complex_swap_tag - - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),nesd,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),nesd,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag,icomm,iret) - end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_complex_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + end if + + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_cswapidxv + end subroutine psi_cswapidxv +end submodule psi_c_swapdata_a_impl diff --git a/base/comm/internals/psi_cswaptran.F90 b/base/comm/internals/psi_cswaptran.F90 index 28b356c8d..13d42e9d3 100644 --- a/base/comm/internals/psi_cswaptran.F90 +++ b/base/comm/internals/psi_cswaptran.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -43,7 +43,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D complex(psb_spk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -59,12 +59,12 @@ ! ! ! Arguments: -! flag - integer Choose the algorithm for data exchange: +! swap_status - integer Choose the algorithm for data exchange: ! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 +! swap_mpi = iand(swap_status,psb_swap_mpi_) /= 0 +! swap_sync = iand(swap_status,psb_swap_sync_) /= 0 +! swap_send = iand(swap_status,psb_swap_send_) /= 0 +! swap_recv = iand(swap_status,psb_swap_recv_) /= 0 ! if (swap_mpi): use underlying MPI_ALLTOALLV. ! if (swap_sync): use PSB_SND and PSB_RCV in ! synchronized pairs @@ -77,10 +77,9 @@ ! ! ! n - integer Number of columns in Y -! beta - complex Choose overwrite or sum. -! y - type(psb_c_vect_type) The data area +! beta - real Choose overwrite or sum. +! y - type(psb_d_vect_type) The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - complex Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -91,13 +90,980 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_cswaptran_vect(flag,beta,y,desc_a,work,info,data) +submodule (psi_c_comm_v_mod) psi_c_swaptran_impl + use psb_base_mod + use psb_comm_factory_mod +contains + module subroutine psi_cswaptran_vect(swap_status,beta,y,desc_a,info,data) - use psi_mod, psb_protect_name => psi_cswaptran_vect - use psb_c_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + type(psb_desc_type),target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, total_send, total_recv, num_neighbors, err_act, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=20) :: name + + info = psb_success_ + name = 'psi_cswaptran_vect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + if( (swap_status /= psb_comm_status_start_).and.(swap_status /= psb_comm_status_wait_)& + & .and.(swap_status /= psb_comm_status_sync_) ) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + ! Set the normalized swap status on the comm handle + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + call psi_ctran_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor a2av tran') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_ctran_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='persistent neighbor tran') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_ctran_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull tran') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_ctran_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push tran') + goto 9999 + end if + case default + call psi_ctran_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline tran') + goto 9999 + end if + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_cswaptran_vect + + ! + ! + ! Subroutine: psi_ctran_baseline_vect + ! Data exchange among processes. + ! + ! Takes care of Y an encapsulated vector. Relies on the gather/scatter methods + ! of vectors. + ! + ! The real workhorse: the outer routine will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_ctran_baseline_vect(ctxt,swap_status,beta,y,idx,& + & num_neighbors,total_send,total_recv,comm_handle,info) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_) :: icomm + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name + + info = psb_success_ + name = 'psi_ctran_baseline_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline swaptran') + goto 9999 + end select + + n=1 + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + + call idx%sync() + + if (debug) write(*,*) me,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + end if + if (debug) write(*,*) me,'do_send start' + call y%new_buffer(ione*size(idx%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt + call mpi_irecv(y%combuf(snd_pt),nesd,& + & psb_mpi_c_spk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + snd_pt = 1 + do i=1, num_neighbors + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + idx_pt = rcv_pt + call y%gth(idx_pt,nerv,idx) + + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait + ! + call y%device_wait() + + if (debug) write(*,*) me,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((nerv>0).and.(proc_to_comm /= me)) then + call mpi_isend(y%combuf(rcv_pt),nerv,& + & psb_mpi_c_spk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) me,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then + ! + ! No matching send? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) me,' wait' + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (proc_to_comm /= me)then + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' scatter' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (debug) write(0,*)me,' Received from: ',prcid(i),& + & y%combuf(snd_pt:snd_pt+nesd-1) + call y%sct(snd_pt,nesd,idx,beta) + pnti = pnti + nerv + nesd + 3 + end do + ! + ! Waited for everybody, clean up + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) me,' wait' + call y%device_wait() + if (debug) write(*,*) me,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) me,' done' + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psi_ctran_baseline_vect + + + + + subroutine psi_ctran_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_ctran_neighbor_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor swaptran') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) me,' nbr_vect: starting data exchange' + ! Lazy initialization: build the topology on first call + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) me,' nbr_vect: building topology' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, & + & a_err='neighbor_topology_init') + goto 9999 + end if + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! For transpose exchange: gather recv area first (we will send "recv" data) + if (debug) write(*,*) me,' nbr_tran_vect: gathering recv data,', topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv swapping send/recv arrays + if (debug) write(*,*) me,' nbr_tran_vect: posting MPI_Ineighbor_alltoallv (swapped)' + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (recv_indexes gathered) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_c_spk_, & + & y%combuf(topology_total_recv + 1), & ! recv buffer (will contain send_indexes data) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_c_spk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if (neighbor_comm_handle%comm_request == mpi_request_null) then + ! No matching start? Something is wrong + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) me,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! For transpose exchange: scatter the data that correspond to peers' send area + if (debug) write(*,*) me,' nbr_tran_vect: scattering send-index data,', topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) me,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_ctran_neighbor_topology_vect + + + + + ! + ! + ! + ! + ! Subroutine: psi_cswaptran_multivect + ! Data exchange among processes. + ! + ! Takes care of Y an encaspulated multivector. + ! + ! + module subroutine psi_cswaptran_multivect(swap_status,beta,y,desc_a,info,data) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_multivect_type), intent(inout) :: y + type(psb_desc_type),target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, total_send, total_recv, num_neighbors, err_act, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=20) :: name + + integer(psb_ipk_) :: setflag + + + info = psb_success_ + name = 'psi_cswaptran_multivect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + setflag = swap_status + if (swap_status == psb_swap_start_) then + setflag = psb_comm_status_start_ + else if (swap_status == psb_swap_wait_) then + setflag = psb_comm_status_wait_ + else if ((iand(swap_status, psb_swap_send_) /= 0) .or. (iand(swap_status, psb_swap_recv_) /= 0) .or. & + & (iand(swap_status, psb_swap_mpi_) /= 0) .or. (iand(swap_status, psb_swap_sync_) /= 0)) then + setflag = psb_comm_status_sync_ + end if + + if ((setflag /= psb_comm_status_start_) .and. (setflag /= psb_comm_status_wait_) .and. & + & (setflag /= psb_comm_status_sync_)) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + call y%comm_handle%set_swap_status(setflag, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + call psi_ctran_neighbor_topology_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor a2av tran') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_ctran_neighbor_persistent_topology_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='persistent neighbor tran') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_ctran_rma_pull_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull tran') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_ctran_rma_push_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push tran') + goto 9999 + end if + case default + call psi_ctran_baseline_multivect(ctxt,setflag,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline tran') + goto 9999 + end if + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_cswaptran_multivect + + subroutine psi_ctran_baseline_multivect(ctxt,swap_status,beta,y,idx,& + & num_neighbors,total_send,total_recv,comm_handle,info) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_c_base_multivect_type), intent(inout) :: y + complex(psb_spk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_) :: icomm + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name + + info = psb_success_ + name = 'psi_ctran_vidx_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline multivect swaptran') + goto 9999 + end select + + n = y%get_ncols() + + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + + call idx%sync() + + if (debug) write(*,*) me,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + end if + if (debug) write(*,*) me,'do_send start' + call y%new_buffer(ione*size(idx%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt + call mpi_irecv(y%combuf(snd_pt),n*nesd,& + & psb_mpi_c_spk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + do i=1, num_neighbors + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call y%gth(idx_pt,rcv_pt,nerv,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait for device + ! + call y%device_wait() + + if (debug) write(*,*) me,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + if ((nerv>0).and.(proc_to_comm /= me)) then + call mpi_isend(y%combuf(rcv_pt),n*nerv,& + & psb_mpi_c_spk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) me,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then + ! + ! No matching send? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) me,' wait' + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + if (proc_to_comm /= me)then + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' scatter' + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + + if (debug) write(0,*)me,' Received from: ',prcid(i),& + & y%combuf(snd_pt:snd_pt+n*nesd-1) + call y%sct(idx_pt,snd_pt,nesd,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! + ! Waited for com, cleanup comid + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) me,' wait' + call y%device_wait() + if (debug) write(*,*) me,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) me,' done' + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psi_ctran_baseline_multivect + + + subroutine psi_ctran_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -106,85 +1072,170 @@ subroutine psi_cswaptran_vect(flag,beta,y,desc_a,work,info,data) include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_vect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_ctran_neighbor_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor multivect swaptran') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) me,' nbr_vect: starting data exchange' + ! Lazy initialization: build the topology on first call + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) me,' nbr_vect: building topology' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, & + & a_err='neighbor_topology_init') + goto 9999 + end if + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! For transpose exchange: gather recv area first (we will send "recv" data) + if (debug) write(*,*) me,' nbr_tran_vect: gathering recv data,', topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv swapping send/recv arrays + if (debug) write(*,*) me,' nbr_tran_vect: posting MPI_Ineighbor_alltoallv (swapped)' + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (recv_indexes gathered) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_c_spk_, & + & y%combuf(topology_total_recv + 1), & ! recv buffer (will contain send_indexes data) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_c_spk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if (neighbor_comm_handle%comm_request == mpi_request_null) then + ! No matching start? Something is wrong + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) me,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! For transpose exchange: scatter the data that correspond to peers' send area + if (debug) write(*,*) me,' nbr_tran_vect: scattering send-index data,', topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) me,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_cswaptran_vect + end subroutine psi_ctran_neighbor_topology_multivect -! -! -! Subroutine: psi_ctran_vidx_vect -! Data exchange among processes. -! -! Takes care of Y an encapsulated vector. Relies on the gather/scatter methods -! of vectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_ctran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_ctran_vidx_vect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_c_base_vect_mod + + + subroutine psi_ctran_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -193,345 +1244,661 @@ subroutine psi_ctran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_vect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - call idx%sync() - - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) - goto 9999 - end if + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: icomm, np, my_rank, iret + integer(psb_mpk_) :: p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + info = psb_success_ + name = 'psi_ctran_neighbor_persistent_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor swaptran') + goto 9999 + end select + + if (swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='psb_comm_status_unknown_ not allowed in persistent neighbor swaptran') + goto 9999 end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - p2ptag = psb_complex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - call mpi_irecv(y%combuf(snd_pt),nesd,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) - end if - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - idx_pt = rcv_pt - call y%gth(idx_pt,nerv,idx) - - pnti = pnti + nerv + nesd + 3 - end do - - ! - ! Then wait - ! - call y%device_wait() - - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - p2ptag = psb_complex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),nerv,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid START: persistent neighbor request already in flight') goto 9999 end if + if (.not. neighbor_comm_handle%is_initialized) then + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Transpose: gather from recv_indexes (we "send" recv data) + if (debug) write(*,*) my_rank,' tran_persistent_vect: gathering recv data,',topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if - pnti = pnti + nerv + nesd + 3 - end do - end if + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + ! Transpose: swap send/recv counts in alltoallv_init + ! send = recv_indexes data with recv_counts/displs + ! recv = into send_indexes area with send_counts/displs + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_c_spk_, & + & y%combuf(topology_total_recv + 1), & + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_c_spk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + end if ! do_start + + if (do_wait) then + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + if ((topology_total_send + topology_total_recv) > 0) then + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Transpose: scatter to send_indexes + if (debug) write(*,*) my_rank,' tran_persistent_vect: scattering to send_indexes,',topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + end if + + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ctran_neighbor_persistent_topology_vect + + + subroutine psi_ctran_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! Effective sizes for transpose: + ! eff_send = total_recv (we expose recv_indexes data) + ! eff_recv = total_send (we GET into the send_indexes area) + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_ctran_rma_pull_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - call psb_realloc(totxch,prcid,info) - - if (debug) write(*,*) me,' wait' - pnti = 1 - p2ptag = psb_complex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (proc_to_comm /= me)then - if (nerv>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + icomm = ctxt%get_mpic() + eff_send = total_recv + eff_recv = total_send + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran pull') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = eff_send + eff_recv + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran pull rank cache allocation') goto 9999 end if end if - if (nesd>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran pull init_memory_buffer_layout_tran failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+nesd-1) - call y%sct(snd_pt,nesd,idx,beta) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Waited for everybody, clean up - ! - y%comid = mpi_request_null - - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if (debug) write(*,*) me,' done' - end if - + end if - call psb_erractionrestore(err_act) - return + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + ! Transpose: gather recv_indexes data into combuf(1:eff_send) + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:eff_send)) + end if + call y%device_wait() + + ! Pull from each peer's recv_indexes area with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = eff_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran pull') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count, psb_mpi_r_spk_, prc_rank, remote_disp, recv_count, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if ! do_start - return + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter into send_indexes. + if (do_wait) then + ! Transpose: scatter to send_indexes (peer_recv_indexes in tran init = actual send_indexes) + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(eff_send+1:eff_send+eff_recv), beta) + end if + call y%device_wait() + end if ! do_wait -end subroutine psi_ctran_vidx_vect + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ctran_rma_pull_vect -! -! -! -! -! Subroutine: psi_cswaptran_multivect -! Data exchange among processes. -! -! Takes care of Y an encaspulated multivector. -! -! -subroutine psi_cswaptran_multivect(flag,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_cswaptran_multivect - use psb_c_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + subroutine psi_ctran_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_multivect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_ctran_rma_push_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + eff_send = total_recv + eff_recv = total_send + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran push') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = eff_send + eff_recv + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran push rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran push init_memory_buffer_layout_tran failure') + goto 9999 + end if + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + ! Transpose: gather recv_indexes data into combuf(1:eff_send) + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:eff_send)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + ! Push our recv_indexes data to each peer's send_indexes area; notify after flush. + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = eff_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran push') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count, psb_mpi_r_spk_, prc_rank, remote_disp, send_count, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter into send_indexes. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + ! Transpose: scatter to send_indexes (peer_recv_indexes in tran init = actual send_indexes) + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(eff_send+1:eff_send+eff_recv), beta) + end if + call y%device_wait() + end if ! do_wait + call psb_erractionrestore(err_act) return - end subroutine psi_cswaptran_multivect +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ctran_rma_push_vect -! -! -! Subroutine: psi_ctran_vidx_multivect -! Data exchange among processes. -! -! Takes care of Y an encapsulated multivector. Relies on the gather/scatter methods -! of multivectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_ctran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_ctran_vidx_multivect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_c_base_multivect_mod + + subroutine psi_ctran_neighbor_persistent_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -540,243 +1907,661 @@ subroutine psi_ctran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_multivect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n = y%get_ncols() - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - call idx%sync() - - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) - goto 9999 - end if + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: icomm, np, my_rank, iret, n + integer(psb_mpk_) :: p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + info = psb_success_ + name = 'psi_ctran_neighbor_persistent_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor multivect swaptran') + goto 9999 + end select + + if (swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='psb_comm_status_unknown_ not allowed in persistent neighbor multivect swaptran') + goto 9999 end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_complex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt - call mpi_irecv(y%combuf(snd_pt),n*nesd,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call y%gth(idx_pt,rcv_pt,nerv,idx) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - ! - ! Then wait for device - ! - call y%device_wait() - - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! - - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_complex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),n*nerv,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid START: persistent neighbor request already in flight') goto 9999 end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - end if - - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + if (.not. neighbor_comm_handle%is_initialized) then + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Transpose: gather from recv_indexes + if (debug) write(*,*) my_rank,' tran_persistent_mv: gathering recv data,',topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:total_recv_)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + ! Transpose: swap send/recv in alltoallv_init + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_c_spk_, & + & y%combuf(total_recv_ + 1), & + & n*neighbor_comm_handle%send_counts, & + & n*neighbor_comm_handle%send_displs, & + & psb_mpi_c_spk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + end if ! do_start + + if (do_wait) then + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + + if ((topology_total_send + topology_total_recv) == 0) then + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + if ((topology_total_send + topology_total_recv) > 0) then + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Transpose: scatter to send_indexes + if (debug) write(*,*) my_rank,' tran_persistent_mv: scattering to send_indexes,',topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(total_recv_+1:total_recv_+total_send_), & + & beta) + end if + + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ctran_neighbor_persistent_topology_multivect + + + subroutine psi_ctran_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv, total_eff_send_, total_eff_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_ctran_rma_pull_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - call psb_realloc(totxch,prcid,info) - - if (debug) write(*,*) me,' wait' - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_complex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm /= me)then - if (nerv>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + icomm = ctxt%get_mpic() + n = y%get_ncols() + eff_send = total_recv + eff_recv = total_send + total_eff_send_ = eff_send * n + total_eff_recv_ = eff_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran pull multivect') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_eff_send_ + total_eff_recv_ + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran pull multivect rank allocation') goto 9999 end if end if - if (nesd>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran pull multivect init_memory_buffer_layout_tran') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+n*nesd-1) - call y%sct(idx_pt,snd_pt,nesd,idx,beta) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! - ! Waited for com, cleanup comid - ! - y%comid = mpi_request_null - - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_eff_send_)) + end if + call y%device_wait() + + ! Pull from each peer's recv_indexes area with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_eff_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran pull multivect') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int((remote_base - 1)*n, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count*n, psb_mpi_r_spk_, prc_rank, remote_disp, recv_count*n, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran pull multivect self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter into send_indexes. + if (do_wait) then + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, & + & y%combuf(total_eff_send_+1:total_eff_send_+total_eff_recv_), beta) + end if + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ctran_rma_pull_multivect + + + subroutine psi_ctran_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv, total_eff_send_, total_eff_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_ctran_rma_push_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - if (debug) write(*,*) me,' done' - end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + eff_send = total_recv + eff_recv = total_send + total_eff_send_ = eff_send * n + total_eff_recv_ = eff_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran push multivect') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_eff_send_ + total_eff_recv_ + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran push multivect rank allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran push multivect init_memory_buffer_layout_tran') + goto 9999 + end if + end if + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if - call psb_erractionrestore(err_act) - return + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_eff_send_)) + end if + call y%device_wait() - return + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do -end subroutine psi_ctran_vidx_multivect + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_eff_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran push multivect') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int((remote_base - 1)*n, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count*n, psb_mpi_r_spk_, prc_rank, remote_disp, send_count*n, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran push multivect self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter into send_indexes. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, & + & y%combuf(total_eff_send_+1:total_eff_send_+total_eff_recv_), beta) + end if + call y%device_wait() + end if ! do_wait + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ctran_rma_push_multivect +end submodule psi_c_swaptran_impl diff --git a/base/comm/internals/psi_cswaptran_a.F90 b/base/comm/internals/psi_cswaptran_a.F90 index 3fa61d946..8391761de 100644 --- a/base/comm/internals/psi_cswaptran_a.F90 +++ b/base/comm/internals/psi_cswaptran_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,7 +30,7 @@ ! ! ! -! File: psi_cswaptran.F90 +! File: psi_cswaptran_a.F90 ! ! Subroutine: psi_cswaptranm ! Implements the data exchange among processes. This is similar to Xswapdata, but @@ -43,7 +43,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D complex(psb_spk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -74,10 +74,10 @@ ! ! ! n - integer Number of columns in Y -! beta - complex Choose overwrite or sum. -! y(:,:) - complex The data area +! beta - real Choose overwrite or sum. +! y(:,:) - real The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - complex Buffer space. If not sufficient, will do +! work(:) - real Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -88,922 +88,913 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_cswaptranm(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_c_comm_a_mod) psi_c_swaptran_a_impl + use psb_base_mod +contains + module subroutine psi_cswaptranm(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_cswaptranm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:,:), beta - complex(psb_spk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + complex(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swaptran(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + call psb_erractionrestore(err_act) return -end subroutine psi_cswaptranm -subroutine psi_ctranidxm(ctxt,icomm,flag,n,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_cswaptranm - use psi_mod, psb_protect_name => psi_ctranidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + module subroutine psi_ctranidxm(ctxt,flag,n,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:,:), beta - complex(psb_spk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - complex(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + complex(psb_spk_), intent(inout) :: y(:,:) + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + complex(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if - ! prepare info for communications + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + if (do_send) then - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 end if - albf=.true. - end if - if (do_send) then - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) + ! Case SWAP_MPI + if (swap_mpi) then - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_r_spk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_r_spk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),n*nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send',& + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - ! Case SWAP_MPI - if (swap_mpi) then + else if (swap_send) then - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_c_spk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_c_spk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 - else if (swap_sync) then + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_recv) then - if (proc_to_comm < me) then - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_complex_swap_tag - call mpi_irecv(sndbuf(snd_pt),n*nesd,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_complex_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag,icomm,iret) - end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 + end if - end do + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_complex_swap_tag + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send',& - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_ctranidxm -! -! -! Subroutine: psi_cswaptranv -! Implements the data exchange among processes. This is similar to Xswapdata, but -! the list is read "in reverse", i.e. indices that are normally SENT are used -! for the RECEIVE part and vice-versa. This is the basic data exchange operation -! for doing the product of a sparse matrix by a vector. -! Essentially this is doing a variable all-to-all data exchange -! (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - complex Choose overwrite or sum. -! y(:) - complex The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - complex Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_cswaptranv(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_cswaptranv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + end subroutine psi_ctranidxm + ! + ! + ! Subroutine: psi_cswaptranv + ! Implements the data exchange among processes. This is similar to Xswapdata, but + ! the list is read "in reverse", i.e. indices that are normally SENT are used + ! for the RECEIVE part and vice-versa. This is the basic data exchange operation + ! for doing the product of a sparse matrix by a vector. + ! Essentially this is doing a variable all-to-all data exchange + ! (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D complex(psb_spk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_cswaptranv(flag,beta,y,desc_a,work,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:), beta - complex(psb_spk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + complex(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tranv' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_cswaptranv + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_ctranidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_ctranidxv(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) + call psi_swaptran(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) - use psi_mod, psb_protect_name => psi_ctranidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + return + end subroutine psi_cswaptranv + + + ! + ! + ! Subroutine: psi_ctranidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_ctranidxv(ctxt,flag,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:), beta - complex(psb_spk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - complex(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + complex(psb_spk_), intent(inout) :: y(:) + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + + complex(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) - - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_c_spk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_c_spk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) + + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_r_spk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_r_spk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag, icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag, icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_send) then - if (proc_to_comm < me) then + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_snd(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_complex_swap_tag - call mpi_irecv(sndbuf(snd_pt),nesd,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_complex_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),nerv,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag, icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),nerv,& - & psb_mpi_c_spk_,prcid(i),& - & p2ptag, icomm,iret) - end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_complex_swap_tag - - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + end if + + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_ctranidxv + end subroutine psi_ctranidxv +end submodule psi_c_swaptran_a_impl diff --git a/base/comm/internals/psi_dovrl_restr.f90 b/base/comm/internals/psi_dovrl_restr.f90 index bbcab4f36..03e7a6209 100644 --- a/base/comm/internals/psi_dovrl_restr.f90 +++ b/base/comm/internals/psi_dovrl_restr.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,90 +35,90 @@ ! ! ! -subroutine psi_dovrl_restr_vect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_dovrl_restr_vect - use psb_d_base_vect_mod - - implicit none - - class(psb_d_base_vect_type) :: x - real(psb_dpk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_restr_vect' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,dzero) - - call psb_erractionrestore(err_act) - return +submodule (psi_d_comm_v_mod) psi_d_ovrl_restr_v_impl + use psb_base_mod +contains + module subroutine psi_dovrl_restr_vect(x,xs,desc_a,info) + + implicit none + + class(psb_d_base_vect_type) :: x + real(psb_dpk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_restr_vect' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,dzero) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_dovrl_restr_vect + return + end subroutine psi_dovrl_restr_vect -subroutine psi_dovrl_restr_multivect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_dovrl_restr_multivect - use psb_d_base_vect_mod + module subroutine psi_dovrl_restr_multivect(x,xs,desc_a,info) - implicit none + implicit none - class(psb_d_base_multivect_type) :: x - real(psb_dpk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + class(psb_d_base_multivect_type) :: x + real(psb_dpk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz,nc - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz,nc + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err - name='psi_dovrl_restr_mv' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_dovrl_restr_mv' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) - call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,dzero) + isz = size(desc_a%ovrlap_elem,1) + call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,dzero) - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_dovrl_restr_multivect + return + end subroutine psi_dovrl_restr_multivect +end submodule psi_d_ovrl_restr_v_impl diff --git a/base/comm/internals/psi_dovrl_restr_a.f90 b/base/comm/internals/psi_dovrl_restr_a.f90 index 768f6b262..39a644864 100644 --- a/base/comm/internals/psi_dovrl_restr_a.f90 +++ b/base/comm/internals/psi_dovrl_restr_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,98 +34,100 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_dovrl_restrr1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_dovrl_restrr1 - - implicit none - - real(psb_dpk_), intent(inout) :: x(:) - real(psb_dpk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_dovrl_restrr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx) = xs(i) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_d_comm_a_mod) psi_d_ovrl_restr_a_impl + use psb_base_mod +contains + module subroutine psi_dovrl_restrr1(x,xs,desc_a,info) + + implicit none + + real(psb_dpk_), intent(inout) :: x(:) + real(psb_dpk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_dovrl_restrr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx) = xs(i) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_dovrl_restrr1 + return + end subroutine psi_dovrl_restrr1 -subroutine psi_dovrl_restrr2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_dovrl_restrr2 + module subroutine psi_dovrl_restrr2(x,xs,desc_a,info) - implicit none + implicit none - real(psb_dpk_), intent(inout) :: x(:,:) - real(psb_dpk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + real(psb_dpk_), intent(inout) :: x(:,:) + real(psb_dpk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err - name='psi_dovrl_restrr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_dovrl_restrr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if (size(x,2) /= size(xs,2)) then - info = psb_err_internal_error_ - call psb_errpush(info,name, a_err='Mismacth columns X vs XS') - goto 9999 - endif + if (size(x,2) /= size(xs,2)) then + info = psb_err_internal_error_ + call psb_errpush(info,name, a_err='Mismacth columns X vs XS') + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) + isz = size(desc_a%ovrlap_elem,1) - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx,:) = xs(i,:) - end do + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx,:) = xs(i,:) + end do - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_dovrl_restrr2 + return + end subroutine psi_dovrl_restrr2 +end submodule psi_d_ovrl_restr_a_impl diff --git a/base/comm/internals/psi_dovrl_save.f90 b/base/comm/internals/psi_dovrl_save.f90 index f7bc3dd1a..b191d788c 100644 --- a/base/comm/internals/psi_dovrl_save.f90 +++ b/base/comm/internals/psi_dovrl_save.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,103 +34,101 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_dovrl_save_vect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_dovrl_save_vect - use psb_realloc_mod - use psb_d_base_vect_mod - - implicit none - - class(psb_d_base_vect_type) :: x - real(psb_dpk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) - - call psb_erractionrestore(err_act) - return +submodule (psi_d_comm_v_mod) psi_d_ovrl_save_v_impl + use psb_base_mod +contains + module subroutine psi_dovrl_save_vect(x,xs,desc_a,info) + + implicit none + + class(psb_d_base_vect_type) :: x + real(psb_dpk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_dovrl_save_vect - -subroutine psi_dovrl_save_multivect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_dovrl_save_multivect - use psb_realloc_mod - use psb_d_base_vect_mod - - implicit none - - class(psb_d_base_multivect_type) :: x - real(psb_dpk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, nc - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = x%get_ncols() - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_dovrl_save_vect + + module subroutine psi_dovrl_save_multivect(x,xs,desc_a,info) + + implicit none + + class(psb_d_base_multivect_type) :: x + real(psb_dpk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, nc + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = x%get_ncols() + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_dovrl_save_multivect + return + end subroutine psi_dovrl_save_multivect +end submodule psi_d_ovrl_save_v_impl diff --git a/base/comm/internals/psi_dovrl_save_a.f90 b/base/comm/internals/psi_dovrl_save_a.f90 index 25c821b82..a6950076a 100644 --- a/base/comm/internals/psi_dovrl_save_a.f90 +++ b/base/comm/internals/psi_dovrl_save_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,108 +34,104 @@ ! These subroutines save the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap. ! -subroutine psi_dovrl_saver1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_dovrl_saver1 - - use psb_realloc_mod - - implicit none - - real(psb_dpk_), intent(inout) :: x(:) - real(psb_dpk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i) = x(idx) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_d_comm_a_mod) psi_d_ovrl_save_a_impl + use psb_base_mod +contains + module subroutine psi_dovrl_saver1(x,xs,desc_a,info) + implicit none + + real(psb_dpk_), intent(inout) :: x(:) + real(psb_dpk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i) = x(idx) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_dovrl_saver1 - - -subroutine psi_dovrl_saver2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_dovrl_saver2 - - use psb_realloc_mod - - implicit none - - real(psb_dpk_), intent(inout) :: x(:,:) - real(psb_dpk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc - character(len=20) :: name, ch_err - - name='psi_dovrl_saver2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = size(x,2) - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i,:) = x(idx,:) - end do - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_dovrl_saver1 + + + module subroutine psi_dovrl_saver2(x,xs,desc_a,info) + implicit none + + real(psb_dpk_), intent(inout) :: x(:,:) + real(psb_dpk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc + character(len=20) :: name, ch_err + + name='psi_dovrl_saver2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = size(x,2) + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i,:) = x(idx,:) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_dovrl_saver2 + return + end subroutine psi_dovrl_saver2 +end submodule psi_d_ovrl_save_a_impl diff --git a/base/comm/internals/psi_dovrl_upd.f90 b/base/comm/internals/psi_dovrl_upd.f90 index 4ca995d9f..a3f54e098 100644 --- a/base/comm/internals/psi_dovrl_upd.f90 +++ b/base/comm/internals/psi_dovrl_upd.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -36,169 +36,167 @@ ! ! ! -subroutine psi_dovrl_upd_vect(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_dovrl_upd_vect - use psb_realloc_mod - use psb_d_base_vect_mod - - implicit none - - class(psb_d_base_vect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - real(psb_dpk_), allocatable :: xs(:) - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, nx, ndm - integer(psb_ipk_) :: err_act, i, idx - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - - name='psi_dovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - nx = size(desc_a%ovrlap_elem,1) - call psb_realloc(nx,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_Dealloc_ - call psb_errpush(info,name) - goto 9999 - end if - - if (update /= psb_sum_) then - call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) - ! switch on update type - - select case (update) - case(psb_square_root_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i) = xs(i)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i) = xs(i)/real(ndm) - end do - case(psb_setzero_) - do i=1,nx - if (me /= desc_a%ovrlap_elem(i,3))& - & xs(i) = dzero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) +submodule (psi_d_comm_v_mod) psi_d_ovrl_upd_v_impl + use psb_base_mod +contains + module subroutine psi_dovrl_upd_vect(x,desc_a,update,info) + + implicit none + + class(psb_d_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + real(psb_dpk_), allocatable :: xs(:) + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, nx, ndm + integer(psb_ipk_) :: err_act, i, idx + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + + name='psi_dovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end select - call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,dzero) - end if - - call psb_erractionrestore(err_act) - return + endif + nx = size(desc_a%ovrlap_elem,1) + call psb_realloc(nx,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_Dealloc_ + call psb_errpush(info,name) + goto 9999 + end if + + if (update /= psb_sum_) then + call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) + ! switch on update type + + select case (update) + case(psb_square_root_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i) = xs(i)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i) = xs(i)/real(ndm) + end do + case(psb_setzero_) + do i=1,nx + if (me /= desc_a%ovrlap_elem(i,3))& + & xs(i) = dzero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,dzero) + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_dovrl_upd_vect - -subroutine psi_dovrl_upd_multivect(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_dovrl_upd_multivect - use psb_realloc_mod - use psb_d_base_vect_mod - - implicit none - - class(psb_d_base_multivect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - real(psb_dpk_), allocatable :: xs(:,:) - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, ndm, nx, nc - integer(psb_ipk_) :: err_act, i, idx - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - - name='psi_dovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - nx = size(desc_a%ovrlap_elem,1) - nc = x%get_ncols() - call psb_realloc(nx,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_Dealloc_ - call psb_errpush(info,name) - goto 9999 - end if - - if (update /= psb_sum_) then - call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) - ! switch on update type - - select case (update) - case(psb_square_root_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i,:) = xs(i,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i,:) = xs(i,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,nx - if (me /= desc_a%ovrlap_elem(i,3))& - & xs(i,:) = dzero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) + return + end subroutine psi_dovrl_upd_vect + + module subroutine psi_dovrl_upd_multivect(x,desc_a,update,info) + + implicit none + + class(psb_d_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + real(psb_dpk_), allocatable :: xs(:,:) + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, ndm, nx, nc + integer(psb_ipk_) :: err_act, i, idx + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + + name='psi_dovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end select - call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,dzero) - end if - - call psb_erractionrestore(err_act) - return + endif + nx = size(desc_a%ovrlap_elem,1) + nc = x%get_ncols() + call psb_realloc(nx,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_Dealloc_ + call psb_errpush(info,name) + goto 9999 + end if + + if (update /= psb_sum_) then + call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) + ! switch on update type + + select case (update) + case(psb_square_root_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i,:) = xs(i,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i,:) = xs(i,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,nx + if (me /= desc_a%ovrlap_elem(i,3))& + & xs(i,:) = dzero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,dzero) + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_dovrl_upd_multivect + return + end subroutine psi_dovrl_upd_multivect +end submodule psi_d_ovrl_upd_v_impl diff --git a/base/comm/internals/psi_dovrl_upd_a.f90 b/base/comm/internals/psi_dovrl_upd_a.f90 index 9678d3e30..a3e99bb6e 100644 --- a/base/comm/internals/psi_dovrl_upd_a.f90 +++ b/base/comm/internals/psi_dovrl_upd_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -32,143 +32,143 @@ ! Subroutine: psi_dovrl_update ! These subroutines update the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap, -! or for the application of Additive Schwarz preconditioners. +! or for the application of Additive Schwarz preconditioners. ! ! -subroutine psi_dovrl_updr1(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_dovrl_updr1 - - implicit none - - real(psb_dpk_), intent(inout), target :: x(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_dovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx) = dzero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return +submodule (psi_d_comm_a_mod) psi_d_ovrl_upd_a_impl + use psb_base_mod +contains + module subroutine psi_dovrl_updr1(x,desc_a,update,info) + implicit none + + real(psb_dpk_), intent(inout), target :: x(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_dovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx) = dzero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_dovrl_updr1 - -subroutine psi_dovrl_updr2(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_dovrl_updr2 - - implicit none - - real(psb_dpk_), intent(inout), target :: x(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_dovrl_updr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx,:) = dzero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_dovrl_updr1 + + module subroutine psi_dovrl_updr2(x,desc_a,update,info) + implicit none + + real(psb_dpk_), intent(inout), target :: x(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_dovrl_updr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx,:) = dzero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_dovrl_updr2 + return + end subroutine psi_dovrl_updr2 +end submodule psi_d_ovrl_upd_a_impl diff --git a/base/comm/internals/psi_dswapdata.F90 b/base/comm/internals/psi_dswapdata.F90 index fb1924be5..02db23d84 100644 --- a/base/comm/internals/psi_dswapdata.F90 +++ b/base/comm/internals/psi_dswapdata.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -53,32 +53,22 @@ ! is scattered in the owned indices, and BETA=1. ! The first routine picks the desired exchange index list and passes it to the second. ! This version works on encapsulated vectors, and uses their methods to do GTH and SCT, -! so that special versions (i.e. GPU vectors can override them +! so that special versions (i.e. GPU vectors can override them) ! ! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) +! swap_status - integer Swap status selector. +! It is interpreted as a communication status: +! psb_comm_status_start_ -> START phase +! psb_comm_status_wait_ -> WAIT phase +! psb_comm_status_unknown_ -> START+WAIT +! The communication scheme is selected from +! y%comm_handle%comm_type. ! ! ! n - integer Number of columns in Y -! beta - real Choose overwrite or sum. +! beta - real Choose overwrite or sum. ! y - type(psb_@x@_vect_type) The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - real Buffer space. If not sufficient, will do -! our own internal allocation. +! desc_a - type(psb_desc_type). The communication descriptor. ! info - integer. return code. ! data - integer which list is to be used to exchange data ! default psb_comm_halo_ @@ -89,101 +79,156 @@ ! ! ! -subroutine psi_dswapdata_vect(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_dswapdata_vect - use psb_d_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +submodule (psi_d_comm_v_mod) psi_d_swapdata_impl + use psb_desc_const_mod, only: psb_swap_start_, psb_swap_wait_ + use psb_base_mod + use psb_error_mod, only: psb_get_debug_level, psb_get_debug_unit, psb_debug_ext_ + use psb_comm_schemes_mod, only: psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_, psb_comm_rma_pull_, psb_comm_rma_push_, & + & psb_comm_handle_type + use psb_comm_rma_mod, only: psb_comm_rma_handle + use psb_comm_factory_mod + +contains + + module subroutine psi_dswapdata_vect(swap_status,beta,y,desc_a,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_vect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_), target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + integer(psb_ipk_), intent(in) :: swap_status + class(psb_d_base_vect_type), intent(inout) :: y + real(psb_dpk_), intent(in) :: beta + type(psb_desc_type), target :: desc_a ! TODO: should this be intent(in)? + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, data_, err_act - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, my_rank, total_send, total_recv, num_neighbors, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + ! communication scheme/status selectors + logical :: baseline, ineighbor_a2av, ineighbor_a2av_persistent - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif + ! error handling variables + integer(psb_ipk_) :: err_act + character(len=30) :: name + logical :: debug - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if + info = psb_success_ + name = 'psi_dswapdata_vect' + call psb_erractionsave(err_act) - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if + debug = .false. - call psi_swapdata(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 + ctxt = desc_a%get_context() - call psb_erractionrestore(err_act) - return + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='desc_a%get_list_p') + goto 9999 + end if + + + if( (swap_status /= psb_comm_status_start_).and.(swap_status /= psb_comm_status_wait_)& + & .and.(swap_status /= psb_comm_status_sync_) ) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + ! Set the normalized swap status on the comm handle + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + if(debug .eqv. .true.) then + write(0,'(a,i0,a,i0)') 'DBG_DISPATCH comm_type=',y%comm_handle%comm_type,' desc_a%comm_type=',desc_a%comm_type + endif + select case(y%comm_handle%comm_type) + case(psb_comm_isend_irecv_) + call psi_dswap_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline swap') + goto 9999 + end if + case(psb_comm_ineighbor_alltoallv_) + call psi_dswap_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,& + & total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor nonblocking swap') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_dswap_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,& + & total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor persistent swap') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_dswap_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull swap') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_dswap_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push swap') + goto 9999 + end if + case default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Incompatible swap_status settings: no valid communication mode selected') + goto 9999 + end select + + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_dswapdata_vect + end subroutine psi_dswapdata_vect -! -! -! Subroutine: psi_dswap_vidx_vect -! Data exchange among processes. -! -! Takes care of Y an exanspulated vector. Relies on the gather/scatter methods -! of vectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_dswap_vidx_vect(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_dswap_vidx_vect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_d_base_vect_mod + subroutine psi_dswap_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -192,336 +237,1416 @@ subroutine psi_dswap_vidx_vect(ctxt,icomm,flag,beta,y,idx, & include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_vect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size),& + & iret, nesd, nerv + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti, n + logical :: do_send,do_recv + logical, parameter :: usersend=.false. + logical :: debug + character(len=20) :: name + + info = psb_success_ + name = 'psi_dswap_baseline_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - ! locals - integer(psb_mpk_) :: np, me - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size),& - & iret, nesd, nerv - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti, n - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + icomm = ctxt%get_mpic() - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline swap') + goto 9999 + end select - totrcv_ = totrcv * n - totsnd_ = totsnd * n - call idx%sync() + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') + goto 9999 + end if - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then + n=1 + do_send = (swap_status == psb_comm_status_start_).or.(swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_).or.(swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + call comm_indexes%sync() + + if (debug) write(*,*) my_rank,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Unfinished communication? Something is wrong....') + goto 9999 + end if + end if + call y%new_buffer(ione*size(comm_indexes%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + + rcv_pt = 1+pnti+psb_n_elem_recv_ + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= my_rank)) then + if (debug) write(*,*) my_rank,'Posting receive from',prcid(i),rcv_pt + p2ptag = psb_double_swap_tag + call mpi_irecv(y%combuf(rcv_pt),nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + pnti = pnti + nerv + nesd + 3 + end do + if (debug) write(*,*) my_rank,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = snd_pt + if ((idx_pt < 1) .or. (nesd < 0) .or. (idx_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((idx_pt < 1) .or. (nesd < 0) .or. (idx_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(idx_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait + ! + call y%device_wait() + + if (debug) write(*,*) my_rank,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((nesd>0).and.(proc_to_comm /= my_rank)) then + call mpi_isend(y%combuf(snd_pt),nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) my_rank,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then ! - ! Unfinished communication? Something is wrong.... + ! No matching send? Something is wrong.... ! info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) my_rank,' wait' + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (proc_to_comm /= my_rank)then + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == my_rank) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) my_rank,' scatter' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((idx_pt < 1) .or. (nerv < 0) .or. (idx_pt+max(0,nerv)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter metadata out of bounds') + goto 9999 + end if + if ((rcv_pt < 1) .or. (nerv < 0) .or. (rcv_pt+max(0,nerv)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter combuf bounds error') + goto 9999 + end if + + if (debug) write(*,*)my_rank,' Received from: ',prcid(i),& + & y%combuf(rcv_pt:rcv_pt+nerv-1) + call y%sct(rcv_pt,nerv,comm_indexes,beta) + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Waited for everybody, clean up + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) my_rank,' wait' + call y%device_wait() + if (debug) write(*,*) my_rank,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call y%comm_handle%free(info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) my_rank,' done' end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - rcv_pt = 1+pnti+psb_n_elem_recv_ - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - p2ptag = psb_double_swap_tag - call mpi_irecv(y%combuf(rcv_pt),nerv,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_dswap_baseline_vect + + + + subroutine psi_dswap_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical :: debug + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + info = psb_success_ + name = 'psi_dswap_neighbor_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor swap') + goto 9999 + end select + + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') + goto 9999 + end if + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (nonblocking)' + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(snd_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + else + neighbor_comm_handle%comm_request = mpi_request_null end if - pnti = pnti + nerv + nesd + 3 - end do - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - idx_pt = snd_pt - call y%gth(idx_pt,nesd,idx) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Then wait - ! - call y%device_wait() + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Ineighbor_alltoallv' + if (buffer_size > 0) then + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (baseline/positional layout) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs_v, & ! positional displacements (match gth layout) + & psb_mpi_r_dpk_, & + & y%combuf(1), & ! recv buffer (baseline/positional layout) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs_v, & ! positional displacements (match sct layout) + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + ! Valid no-op exchange: nothing was posted in START and nothing to wait/scatter. + neighbor_comm_handle%comm_request = mpi_request_null + else + if (neighbor_comm_handle%comm_request == mpi_request_null) then + write(psb_err_unit,*) my_rank, 'DBG: neighbor WAIT but comm_request is NULL; is_initialized=', & + & neighbor_comm_handle%is_initialized + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - p2ptag = psb_double_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),nesd,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) + ! Only wait and scatter if there's data + if ((topology_total_send + topology_total_recv) > 0) then + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! Scatter received data to local vector positions (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((1+pnti+psb_n_elem_recv_ < 1) .or. (nerv < 0) .or. & + & (1+pnti+psb_n_elem_recv_+max(0,nerv)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter metadata out of bounds') + goto 9999 + end if + if ((rcv_pt < 1) .or. (nerv < 0) .or. (rcv_pt+max(0,nerv)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter combuf bounds error') + goto 9999 + end if + call y%sct(rcv_pt,nerv,comm_indexes,beta) + pnti = pnti + nerv + nesd + 3 + end do + else + ! nothing to wait/scatter end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) goto 9999 end if + if (debug) write(*,*) my_rank,' nbr_vect: done' - pnti = pnti + nerv + nesd + 3 - end do - end if + end if ! do_wait - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_dswap_neighbor_topology_vect + + + + subroutine psi_dswap_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical :: debug + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + info = psb_success_ + debug = .false. + name = 'psi_dswap_neighbor_persistent_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor swap') + goto 9999 + end select + + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') goto 9999 end if - call psb_realloc(totxch,prcid,info) - if (debug) write(*,*) me,' wait' - pnti = 1 - p2ptag = psb_double_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (proc_to_comm /= me)then - if (nesd>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (persistent)' + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid START: persistent neighbor request already in flight') + goto 9999 + end if + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < ione*size(comm_indexes%v)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) goto 9999 end if end if - if (nerv>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Gather send data into combuf using baseline-style gth calls + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data (baseline layout),', topology_total_send,' elems' + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(snd_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Lazy persistent-init: build the request once, then reuse with START/WAIT. + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Neighbor_alltoallv_init' + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & ! send buffer + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs_v, & ! positional (baseline layout) + & psb_mpi_r_dpk_, & + & y%combuf(1), & ! recv buffer (baseline layout) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs_v, & ! positional (baseline layout) + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) goto 9999 end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 end if - y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. end if - pnti = pnti + nerv + nesd + 3 - end do - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + end if ! do_start - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(rcv_pt:rcv_pt+nerv-1) - call y%sct(rcv_pt,nerv,idx,beta) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Waited for everybody, clean up - ! - y%comid = mpi_request_null + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + ! Valid no-op exchange: nothing was posted in START and nothing to wait/scatter. + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + ! Only wait and scatter if there's data + if ((topology_total_send + topology_total_recv) > 0) then + ! Wait for the persistent collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on persistent MPI request' + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Scatter received data to local vector positions (baseline-style sct) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data (baseline layout),', topology_total_recv,' elems' + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + rcv_pt = 1+pnti+psb_n_elem_recv_ + if (nerv > 0) then + call y%sct(rcv_pt,nerv,comm_indexes,beta) + end if + pnti = pnti + nerv + nesd + 3 + end do + end if + + call y%device_wait() + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_dswap_neighbor_persistent_topology_vect + + + subroutine psi_dswap_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + + info = psb_success_ + name = 'psi_dswap_rma_pull_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - if (debug) write(*,*) me,' done' - end if + icomm = ctxt%get_mpic() + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for pull mode') + goto 9999 + end select + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) - call psb_erractionrestore(err_act) - return + call comm_indexes%sync() + + ! START phase: build the layout once, prepare the exposed buffer, then issue RMA. + if (do_start) then + buffer_size = total_send + total_recv + + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA pull rank cache allocation') + goto 9999 + end if + end if + + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA pull init_memory_buffer_layout failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + ! Need a larger exposed memory area: recreate the RMA window first, + ! then reallocate combuf and lazily create a new window below. + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + ! Expose combuf once and keep the window around until the descriptor changes. + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send)) + end if + call y%device_wait() + + ! Pull data from each peer with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = total_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA pull') + goto 9999 + end if + if ((recv_pos < 1) .or. (recv_count < 0) .or. (recv_pos+max(0,recv_count)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull local receive bounds error') + goto 9999 + end if + + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count, psb_mpi_r_dpk_, prc_rank, remote_disp, recv_count, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter received data into Y. + if (do_wait) then + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send+1:total_send+total_recv), beta) + end if + + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_dswap_rma_pull_vect - return -end subroutine psi_dswap_vidx_vect -! -! -! Subroutine: psi_dswapdata_multivect -! Data exchange among processes. -! -! Takes care of Y an encaspulated multivector. -! -! -subroutine psi_dswapdata_multivect(flag,beta,y,desc_a,work,info,data) + subroutine psi_dswap_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_dswap_rma_push_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for push mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! START phase: identical layout handling, but the remote metadata describes the receive side. + if (do_start) then + buffer_size = total_send + total_recv + + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA put rank cache allocation') + goto 9999 + end if + end if - use psi_mod, psb_protect_name => psi_dswapdata_multivect - use psb_d_base_multivect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA put ini_memory_buffer_layout') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + ! Need a larger exposed memory area: recreate the RMA window first, + ! then reallocate combuf and lazily create a new window below. + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + ! Keep the window alive across repetitions: it is created once and reused. + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window (prevents isend/irecv ordering issues). + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + ! Push data to each peer; after flush send a P2P notification so target knows data arrived. + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = total_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA push') + goto 9999 + end if + if ((send_pos < 1) .or. (send_count < 0) .or. (send_pos+max(0,send_count)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push local send bounds error') + goto 9999 + end if + + if (send_count > 0) then + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count, psb_mpi_r_dpk_, prc_rank, remote_disp, send_count, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send+1:total_send+total_recv), beta) + end if + + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_dswap_rma_push_vect + + + + ! + ! + ! Subroutine: psi_dswapdata_multivect + ! Data exchange among processes. + ! + ! Takes care of Y an encaspulated multivector. + ! + ! + module subroutine psi_dswapdata_multivect(swap_status,beta,y,desc_a,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_multivect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_), target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + integer(psb_ipk_), intent(in) :: swap_status + class(psb_d_base_multivect_type), intent(inout) :: y + real(psb_dpk_), intent(in) :: beta + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, data_, err_act - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) + ! communication scheme/status selectors + logical :: baseline, ineighbor_a2av, ineighbor_a2av_persistent - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, my_rank, total_send, total_recv, num_neighbors, data_, err_act + integer(psb_mpk_) :: n, total_send_, total_recv_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=30) :: name - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif + + info = psb_success_ + name = 'psi_dswapdata_multivect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if - call psi_swapdata(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + if ((swap_status /= psb_comm_status_start_) .and. (swap_status /= psb_comm_status_wait_) & + & .and. (swap_status /= psb_comm_status_unknown_)) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + baseline = .false. + ineighbor_a2av = .false. + ineighbor_a2av_persistent = .false. + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + ineighbor_a2av = .true. + case(psb_comm_persistent_ineighbor_alltoallv_) + ineighbor_a2av_persistent = .true. + case(psb_comm_rma_pull_) + call psi_dswap_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull swap') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_dswap_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push swap') + goto 9999 + end if + case default + baseline = .true. + end select + + if (baseline) then + call psi_dswap_baseline_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline swap') + goto 9999 + end if + else if (ineighbor_a2av) then + call psi_dswap_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor nonblocking swap') + goto 9999 + end if + else if (ineighbor_a2av_persistent) then + call psi_dswap_neighbor_topology_multivect_persistent(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor persistent swap') + goto 9999 + end if + else + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Incompatible swap_status settings: no valid communication mode selected') + goto 9999 + end if - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_dswapdata_multivect + end subroutine psi_dswapdata_multivect -! -! -! Subroutine: psi_dswap_vidx_multivect -! Data exchange among processes. -! -! Takes care of Y an encapsulated multivector. Relies on the gather/scatter methods -! of multivectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_dswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_dswap_vidx_multivect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_d_base_multivect_mod + + +subroutine psi_dswap_baseline_multivect(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -530,100 +1655,107 @@ subroutine psi_dswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_multivect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name + logical :: do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name - info=psb_success_ - name='psi_swap_datav' + info = psb_success_ + name = 'psi_dswap_baseline_multivect' call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) + call psb_info(ctxt,my_rank,np) if (np == -1) then - info=psb_err_context_error_ + info = psb_err_context_error_ call psb_errpush(info,name) goto 9999 endif n = y%get_ncols() - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline multivect swap') + goto 9999 + end select + + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) - totrcv_ = totrcv * n - totsnd_ = totsnd * n + total_recv_ = total_recv * n + total_send_ = total_send * n - call idx%sync() + call comm_indexes%sync() - if (debug) write(*,*) me,'Internal buffer' + if (debug) write(*,*) my_rank,'Internal buffer' if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + info = psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) + if (debug) write(*,*) my_rank,'do_send start' + call y%new_buffer(total_send_+total_recv_,info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) ! First I post all the non blocking receives pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt + if ((nerv>0).and.(proc_to_comm /= my_rank)) then + if (debug) write(*,*) my_rank,'Posting receive from',prcid(i),rcv_pt p2ptag = psb_double_swap_tag - call mpi_irecv(y%combuf(rcv_pt),n*nerv,& + call mpi_irecv(y%combuf(rcv_pt),n*nerv,& & psb_mpi_r_dpk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) end if rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do - if (debug) write(*,*) me,' Gather ' + if (debug) write(*,*) my_rank,' Gather ' ! ! Then gather for sending. ! pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call y%gth(idx_pt,snd_pt,nesd,idx) + call y%gth(idx_pt,snd_pt,nesd,comm_indexes) rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 @@ -634,24 +1766,24 @@ subroutine psi_dswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & ! call y%device_wait() - if (debug) write(*,*) me,' isend' + if (debug) write(*,*) my_rank,' isend' ! ! Then send ! pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 p2ptag = psb_double_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) - if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),n*nesd,& + if ((nesd>0).and.(proc_to_comm /= my_rank)) then + call mpi_isend(y%combuf(snd_pt),n*nesd,& & psb_mpi_r_dpk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) end if if(iret /= mpi_success) then @@ -666,8 +1798,8 @@ subroutine psi_dswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & end if if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then + if (debug) write(*,*) my_rank,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then ! ! No matching send? Something is wrong.... ! @@ -675,20 +1807,20 @@ subroutine psi_dswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if - call psb_realloc(totxch,prcid,info) + call psb_realloc(num_neighbors,prcid,info) - if (debug) write(*,*) me,' wait' + if (debug) write(*,*) my_rank,' wait' pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 p2ptag = psb_double_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm /= me)then + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + if (proc_to_comm /= my_rank)then if (nesd>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) if(iret /= mpi_success) then info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/iret/)) @@ -696,14 +1828,14 @@ subroutine psi_dswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & end if end if if (nerv>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) if(iret /= mpi_success) then info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/iret/)) goto 9999 end if end if - else if (proc_to_comm == me) then + else if (proc_to_comm == my_rank) then if (nesd /= nerv) then write(psb_err_unit,*) & & 'Fatal error in swapdata: mismatch on self send',& @@ -716,19 +1848,19 @@ subroutine psi_dswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & pnti = pnti + nerv + nesd + 3 end do - if (debug) write(*,*) me,' scatter' + if (debug) write(*,*) my_rank,' scatter' pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+psb_n_elem_recv_ - if (debug) write(0,*)me,' Received from: ',prcid(i),& + if (debug) write(0,*)my_rank,' Received from: ',prcid(i),& & y%combuf(rcv_pt:rcv_pt+n*nerv-1) - call y%sct(idx_pt,rcv_pt,nerv,idx,beta) + call y%sct(idx_pt,rcv_pt,nerv,comm_indexes,beta) rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 @@ -736,21 +1868,23 @@ subroutine psi_dswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & ! ! Waited for com, cleanup comid ! - y%comid = mpi_request_null + baseline_comm_handle%comid = mpi_request_null ! ! Then wait for device ! - if (debug) write(*,*) me,' wait' + if (debug) write(*,*) my_rank,' wait' call y%device_wait() - if (debug) write(*,*) me,' free buffer' + if (debug) write(*,*) my_rank,' free buffer' call y%free_buffer(info) - if (info == 0) call y%free_comid(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if if (info /= 0) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - if (debug) write(*,*) me,' done' + if (debug) write(*,*) my_rank,' done' end if @@ -760,5 +1894,859 @@ subroutine psi_dswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_dswap_vidx_multivect +end subroutine psi_dswap_baseline_multivect + + + +subroutine psi_dswap_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, n + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_dswap_neighbor_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor multivect swap') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (nonblocking)' + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, & + & ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! Gather send data into contiguous send buffer (polymorphic for GPU) + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data,', topology_total_send,' elems' + call y%gth(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(1:total_send_)) + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Ineighbor_alltoallv' + if (buffer_size > 0) then + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(total_send_ + 1), & ! recv buffer + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if ((topology_total_send + topology_total_recv) > 0) then + if (neighbor_comm_handle%comm_request == mpi_request_null) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if ((topology_total_send + topology_total_recv) > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + end if + + ! Scatter received data to local vector positions (polymorphic for GPU) + if ((topology_total_send + topology_total_recv) > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + call y%sct(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(total_send_+1:total_send_+total_recv_), & + & beta) + end if + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return +end subroutine psi_dswap_neighbor_topology_multivect + + + +subroutine psi_dswap_neighbor_topology_multivect_persistent(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, n + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_dswap_neighbor_topology_multivect_persistent' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor multivect swap') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (persistent)' + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid START: persistent neighbor request already in flight') + goto 9999 + end if + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, & + & ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Gather send data into contiguous send buffer (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data,', topology_total_send,' elems' + call y%gth(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(1:total_send_)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Neighbor_alltoallv_init' + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & ! send buffer + & n*neighbor_comm_handle%send_counts, & + & n*neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(total_send_ + 1), & ! recv buffer + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) > 0) then + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + + ! Wait for the persistent collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on persistent MPI request' + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Scatter received data to local vector positions (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + call y%sct(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(total_send_+1:total_send_+total_recv_), & + & beta) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + call y%device_wait() + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return +end subroutine psi_dswap_neighbor_topology_multivect_persistent + + + subroutine psi_dswap_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, total_send_, total_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_dswap_rma_pull_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for pull mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_send_ + total_recv_ + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA pull rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA pull init_memory_buffer_layout failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send_)) + end if + call y%device_wait() + + ! Pull data from each peer with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA pull') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int((remote_base - 1) * n, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count*n, psb_mpi_r_dpk_, prc_rank, remote_disp, recv_count*n, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter received data into Y. + if (do_wait) then + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send_+1:total_send_+total_recv_), beta) + end if + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_dswap_rma_pull_multivect + + + subroutine psi_dswap_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, total_send_, total_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_dswap_rma_push_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for push mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_send_ + total_recv_ + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA put rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA put ini_memory_buffer_layout') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send_)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA push') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int((remote_base - 1) * n, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count*n, psb_mpi_r_dpk_, prc_rank, remote_disp, send_count*n, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send_+1:total_send_+total_recv_), beta) + end if + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_dswap_rma_push_multivect + + +end submodule psi_d_swapdata_impl diff --git a/base/comm/internals/psi_dswapdata_a.F90 b/base/comm/internals/psi_dswapdata_a.F90 index 6f1d4a10c..f5a8bcf9b 100644 --- a/base/comm/internals/psi_dswapdata_a.F90 +++ b/base/comm/internals/psi_dswapdata_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -84,912 +84,903 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_dswapdatam(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_d_comm_a_mod) psi_d_swapdata_a_impl + use psb_base_mod +contains + module subroutine psi_dswapdatam(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_dswapdatam - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:,:), beta - real(psb_dpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + real(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swapdata(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_dswapdatam + end subroutine psi_dswapdatam -subroutine psi_dswapidxm(ctxt,icomm,flag,n,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + module subroutine psi_dswapidxm(ctxt,flag,n,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) - use psi_mod, psb_protect_name => psi_dswapidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:,:), beta - real(psb_dpk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - real(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:,:) + real(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + +real(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if - ! prepare info for communications + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + end if - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_r_dpk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_r_dpk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - albf=.true. - end if - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_r_dpk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_r_dpk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),n*nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),n*nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*)& + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - else if (swap_sync) then - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_send) then - if (proc_to_comm < me) then + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_snd(ctxt,& & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_rcv(ctxt,& & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - end do + end if + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - else if (swap_send .and. swap_recv) then + end if - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_double_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_double_swap_tag - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),n*nesd,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),n*nesd,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag,icomm,iret) - end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_double_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*)& - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_dswapidxm + end subroutine psi_dswapidxm + + ! + ! + ! Subroutine: psi_dswapdatav + ! Implements the data exchange among processes. Essentially this is doing + ! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D real(psb_dpk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_dswapdatav(flag,beta,y,desc_a,work,info,data) -! -! -! Subroutine: psi_dswapdatav -! Implements the data exchange among processes. Essentially this is doing -! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - real Choose overwrite or sum. -! y(:) - real The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - real Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_dswapdatav(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_dswapdatav - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:), beta - real(psb_dpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + real(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_dswapdatav + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_dswapdataidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_dswapidxv(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + call psi_swapdata(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) - use psi_mod, psb_protect_name => psi_dswapidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + return + end subroutine psi_dswapdatav + + + ! + ! + ! Subroutine: psi_dswapdataidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_dswapidxv(ctxt,flag,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) + + use psb_error_mod + use psb_desc_mod + use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:), beta - real(psb_dpk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - real(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:) + real(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + real(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+nesd-1)) - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_r_dpk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_r_dpk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - else if (swap_sync) then - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + if (do_send) then - if (proc_to_comm < me) then - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+nesd-1)) + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_r_dpk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_r_dpk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - else if (swap_send .and. swap_recv) then - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_double_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),nerv,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_double_swap_tag + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),nesd,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),nesd,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag,icomm,iret) + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) end if + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_double_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + + else if (swap_send) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_dswapidxv + end subroutine psi_dswapidxv +end submodule psi_d_swapdata_a_impl diff --git a/base/comm/internals/psi_dswaptran.F90 b/base/comm/internals/psi_dswaptran.F90 index 25cd82767..31fb1e0cf 100644 --- a/base/comm/internals/psi_dswaptran.F90 +++ b/base/comm/internals/psi_dswaptran.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -59,12 +59,12 @@ ! ! ! Arguments: -! flag - integer Choose the algorithm for data exchange: +! swap_status - integer Choose the algorithm for data exchange: ! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 +! swap_mpi = iand(swap_status,psb_swap_mpi_) /= 0 +! swap_sync = iand(swap_status,psb_swap_sync_) /= 0 +! swap_send = iand(swap_status,psb_swap_send_) /= 0 +! swap_recv = iand(swap_status,psb_swap_recv_) /= 0 ! if (swap_mpi): use underlying MPI_ALLTOALLV. ! if (swap_sync): use PSB_SND and PSB_RCV in ! synchronized pairs @@ -80,7 +80,6 @@ ! beta - real Choose overwrite or sum. ! y - type(psb_d_vect_type) The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - real Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -91,13 +90,980 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_dswaptran_vect(flag,beta,y,desc_a,work,info,data) +submodule (psi_d_comm_v_mod) psi_d_swaptran_impl + use psb_base_mod + use psb_comm_factory_mod +contains + module subroutine psi_dswaptran_vect(swap_status,beta,y,desc_a,info,data) - use psi_mod, psb_protect_name => psi_dswaptran_vect - use psb_d_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + type(psb_desc_type),target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, total_send, total_recv, num_neighbors, err_act, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=20) :: name + + info = psb_success_ + name = 'psi_dswaptran_vect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + if( (swap_status /= psb_comm_status_start_).and.(swap_status /= psb_comm_status_wait_)& + & .and.(swap_status /= psb_comm_status_sync_) ) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + ! Set the normalized swap status on the comm handle + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + call psi_dtran_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor a2av tran') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_dtran_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='persistent neighbor tran') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_dtran_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull tran') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_dtran_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push tran') + goto 9999 + end if + case default + call psi_dtran_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline tran') + goto 9999 + end if + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_dswaptran_vect + + ! + ! + ! Subroutine: psi_dtran_baseline_vect + ! Data exchange among processes. + ! + ! Takes care of Y an encapsulated vector. Relies on the gather/scatter methods + ! of vectors. + ! + ! The real workhorse: the outer routine will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_dtran_baseline_vect(ctxt,swap_status,beta,y,idx,& + & num_neighbors,total_send,total_recv,comm_handle,info) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_) :: icomm + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name + + info = psb_success_ + name = 'psi_dtran_baseline_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline swaptran') + goto 9999 + end select + + n=1 + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + + call idx%sync() + + if (debug) write(*,*) me,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + end if + if (debug) write(*,*) me,'do_send start' + call y%new_buffer(ione*size(idx%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt + call mpi_irecv(y%combuf(snd_pt),nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + snd_pt = 1 + do i=1, num_neighbors + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + idx_pt = rcv_pt + call y%gth(idx_pt,nerv,idx) + + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait + ! + call y%device_wait() + + if (debug) write(*,*) me,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((nerv>0).and.(proc_to_comm /= me)) then + call mpi_isend(y%combuf(rcv_pt),nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) me,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then + ! + ! No matching send? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) me,' wait' + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (proc_to_comm /= me)then + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' scatter' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (debug) write(0,*)me,' Received from: ',prcid(i),& + & y%combuf(snd_pt:snd_pt+nesd-1) + call y%sct(snd_pt,nesd,idx,beta) + pnti = pnti + nerv + nesd + 3 + end do + ! + ! Waited for everybody, clean up + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) me,' wait' + call y%device_wait() + if (debug) write(*,*) me,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) me,' done' + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psi_dtran_baseline_vect + + + + + subroutine psi_dtran_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_dtran_neighbor_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor swaptran') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) me,' nbr_vect: starting data exchange' + ! Lazy initialization: build the topology on first call + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) me,' nbr_vect: building topology' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, & + & a_err='neighbor_topology_init') + goto 9999 + end if + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! For transpose exchange: gather recv area first (we will send "recv" data) + if (debug) write(*,*) me,' nbr_tran_vect: gathering recv data,', topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv swapping send/recv arrays + if (debug) write(*,*) me,' nbr_tran_vect: posting MPI_Ineighbor_alltoallv (swapped)' + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (recv_indexes gathered) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(topology_total_recv + 1), & ! recv buffer (will contain send_indexes data) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if (neighbor_comm_handle%comm_request == mpi_request_null) then + ! No matching start? Something is wrong + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) me,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! For transpose exchange: scatter the data that correspond to peers' send area + if (debug) write(*,*) me,' nbr_tran_vect: scattering send-index data,', topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) me,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_dtran_neighbor_topology_vect + + + + + ! + ! + ! + ! + ! Subroutine: psi_dswaptran_multivect + ! Data exchange among processes. + ! + ! Takes care of Y an encaspulated multivector. + ! + ! + module subroutine psi_dswaptran_multivect(swap_status,beta,y,desc_a,info,data) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_multivect_type), intent(inout) :: y + type(psb_desc_type),target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, total_send, total_recv, num_neighbors, err_act, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=20) :: name + + integer(psb_ipk_) :: setflag + + + info = psb_success_ + name = 'psi_dswaptran_multivect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + setflag = swap_status + if (swap_status == psb_swap_start_) then + setflag = psb_comm_status_start_ + else if (swap_status == psb_swap_wait_) then + setflag = psb_comm_status_wait_ + else if ((iand(swap_status, psb_swap_send_) /= 0) .or. (iand(swap_status, psb_swap_recv_) /= 0) .or. & + & (iand(swap_status, psb_swap_mpi_) /= 0) .or. (iand(swap_status, psb_swap_sync_) /= 0)) then + setflag = psb_comm_status_sync_ + end if + + if ((setflag /= psb_comm_status_start_) .and. (setflag /= psb_comm_status_wait_) .and. & + & (setflag /= psb_comm_status_sync_)) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + call y%comm_handle%set_swap_status(setflag, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + call psi_dtran_neighbor_topology_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor a2av tran') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_dtran_neighbor_persistent_topology_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='persistent neighbor tran') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_dtran_rma_pull_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull tran') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_dtran_rma_push_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push tran') + goto 9999 + end if + case default + call psi_dtran_baseline_multivect(ctxt,setflag,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline tran') + goto 9999 + end if + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_dswaptran_multivect + + subroutine psi_dtran_baseline_multivect(ctxt,swap_status,beta,y,idx,& + & num_neighbors,total_send,total_recv,comm_handle,info) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_d_base_multivect_type), intent(inout) :: y + real(psb_dpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_) :: icomm + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name + + info = psb_success_ + name = 'psi_dtran_vidx_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline multivect swaptran') + goto 9999 + end select + + n = y%get_ncols() + + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + + call idx%sync() + + if (debug) write(*,*) me,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + end if + if (debug) write(*,*) me,'do_send start' + call y%new_buffer(ione*size(idx%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt + call mpi_irecv(y%combuf(snd_pt),n*nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + do i=1, num_neighbors + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call y%gth(idx_pt,rcv_pt,nerv,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait for device + ! + call y%device_wait() + + if (debug) write(*,*) me,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + if ((nerv>0).and.(proc_to_comm /= me)) then + call mpi_isend(y%combuf(rcv_pt),n*nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) me,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then + ! + ! No matching send? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) me,' wait' + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + if (proc_to_comm /= me)then + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' scatter' + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + + if (debug) write(0,*)me,' Received from: ',prcid(i),& + & y%combuf(snd_pt:snd_pt+n*nesd-1) + call y%sct(idx_pt,snd_pt,nesd,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! + ! Waited for com, cleanup comid + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) me,' wait' + call y%device_wait() + if (debug) write(*,*) me,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) me,' done' + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psi_dtran_baseline_multivect + + + subroutine psi_dtran_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -106,85 +1072,170 @@ subroutine psi_dswaptran_vect(flag,beta,y,desc_a,work,info,data) include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_vect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_dtran_neighbor_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor multivect swaptran') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) me,' nbr_vect: starting data exchange' + ! Lazy initialization: build the topology on first call + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) me,' nbr_vect: building topology' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, & + & a_err='neighbor_topology_init') + goto 9999 + end if + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! For transpose exchange: gather recv area first (we will send "recv" data) + if (debug) write(*,*) me,' nbr_tran_vect: gathering recv data,', topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv swapping send/recv arrays + if (debug) write(*,*) me,' nbr_tran_vect: posting MPI_Ineighbor_alltoallv (swapped)' + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (recv_indexes gathered) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(topology_total_recv + 1), & ! recv buffer (will contain send_indexes data) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if (neighbor_comm_handle%comm_request == mpi_request_null) then + ! No matching start? Something is wrong + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) me,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! For transpose exchange: scatter the data that correspond to peers' send area + if (debug) write(*,*) me,' nbr_tran_vect: scattering send-index data,', topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) me,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_dswaptran_vect + end subroutine psi_dtran_neighbor_topology_multivect -! -! -! Subroutine: psi_dtran_vidx_vect -! Data exchange among processes. -! -! Takes care of Y an encapsulated vector. Relies on the gather/scatter methods -! of vectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_dtran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_dtran_vidx_vect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_d_base_vect_mod + + + subroutine psi_dtran_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -193,345 +1244,661 @@ subroutine psi_dtran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_vect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - call idx%sync() - - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) - goto 9999 - end if + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: icomm, np, my_rank, iret + integer(psb_mpk_) :: p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + info = psb_success_ + name = 'psi_dtran_neighbor_persistent_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor swaptran') + goto 9999 + end select + + if (swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='psb_comm_status_unknown_ not allowed in persistent neighbor swaptran') + goto 9999 end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - p2ptag = psb_double_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - call mpi_irecv(y%combuf(snd_pt),nesd,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) - end if - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - idx_pt = rcv_pt - call y%gth(idx_pt,nerv,idx) - - pnti = pnti + nerv + nesd + 3 - end do - - ! - ! Then wait - ! - call y%device_wait() - - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - p2ptag = psb_double_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),nerv,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid START: persistent neighbor request already in flight') goto 9999 end if + if (.not. neighbor_comm_handle%is_initialized) then + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Transpose: gather from recv_indexes (we "send" recv data) + if (debug) write(*,*) my_rank,' tran_persistent_vect: gathering recv data,',topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if - pnti = pnti + nerv + nesd + 3 - end do - end if + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + ! Transpose: swap send/recv counts in alltoallv_init + ! send = recv_indexes data with recv_counts/displs + ! recv = into send_indexes area with send_counts/displs + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(topology_total_recv + 1), & + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + end if ! do_start + + if (do_wait) then + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + if ((topology_total_send + topology_total_recv) > 0) then + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Transpose: scatter to send_indexes + if (debug) write(*,*) my_rank,' tran_persistent_vect: scattering to send_indexes,',topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + end if + + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_dtran_neighbor_persistent_topology_vect + + + subroutine psi_dtran_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! Effective sizes for transpose: + ! eff_send = total_recv (we expose recv_indexes data) + ! eff_recv = total_send (we GET into the send_indexes area) + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_dtran_rma_pull_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - call psb_realloc(totxch,prcid,info) - - if (debug) write(*,*) me,' wait' - pnti = 1 - p2ptag = psb_double_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (proc_to_comm /= me)then - if (nerv>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + icomm = ctxt%get_mpic() + eff_send = total_recv + eff_recv = total_send + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran pull') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = eff_send + eff_recv + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran pull rank cache allocation') goto 9999 end if end if - if (nesd>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran pull init_memory_buffer_layout_tran failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+nesd-1) - call y%sct(snd_pt,nesd,idx,beta) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Waited for everybody, clean up - ! - y%comid = mpi_request_null - - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if (debug) write(*,*) me,' done' - end if - + end if - call psb_erractionrestore(err_act) - return + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + ! Transpose: gather recv_indexes data into combuf(1:eff_send) + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:eff_send)) + end if + call y%device_wait() + + ! Pull from each peer's recv_indexes area with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = eff_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran pull') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count, psb_mpi_r_dpk_, prc_rank, remote_disp, recv_count, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if ! do_start - return + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter into send_indexes. + if (do_wait) then + ! Transpose: scatter to send_indexes (peer_recv_indexes in tran init = actual send_indexes) + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(eff_send+1:eff_send+eff_recv), beta) + end if + call y%device_wait() + end if ! do_wait -end subroutine psi_dtran_vidx_vect + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_dtran_rma_pull_vect -! -! -! -! -! Subroutine: psi_dswaptran_multivect -! Data exchange among processes. -! -! Takes care of Y an encaspulated multivector. -! -! -subroutine psi_dswaptran_multivect(flag,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_dswaptran_multivect - use psb_d_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + subroutine psi_dtran_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_multivect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_dtran_rma_push_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + eff_send = total_recv + eff_recv = total_send + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran push') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = eff_send + eff_recv + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran push rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran push init_memory_buffer_layout_tran failure') + goto 9999 + end if + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + ! Transpose: gather recv_indexes data into combuf(1:eff_send) + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:eff_send)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + ! Push our recv_indexes data to each peer's send_indexes area; notify after flush. + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = eff_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran push') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count, psb_mpi_r_dpk_, prc_rank, remote_disp, send_count, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter into send_indexes. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + ! Transpose: scatter to send_indexes (peer_recv_indexes in tran init = actual send_indexes) + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(eff_send+1:eff_send+eff_recv), beta) + end if + call y%device_wait() + end if ! do_wait + call psb_erractionrestore(err_act) return - end subroutine psi_dswaptran_multivect +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_dtran_rma_push_vect -! -! -! Subroutine: psi_dtran_vidx_multivect -! Data exchange among processes. -! -! Takes care of Y an encapsulated multivector. Relies on the gather/scatter methods -! of multivectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_dtran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_dtran_vidx_multivect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_d_base_multivect_mod + + subroutine psi_dtran_neighbor_persistent_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -540,243 +1907,661 @@ subroutine psi_dtran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_multivect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n = y%get_ncols() - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - call idx%sync() - - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) - goto 9999 - end if + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: icomm, np, my_rank, iret, n + integer(psb_mpk_) :: p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + info = psb_success_ + name = 'psi_dtran_neighbor_persistent_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor multivect swaptran') + goto 9999 + end select + + if (swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='psb_comm_status_unknown_ not allowed in persistent neighbor multivect swaptran') + goto 9999 end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_double_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt - call mpi_irecv(y%combuf(snd_pt),n*nesd,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call y%gth(idx_pt,rcv_pt,nerv,idx) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - ! - ! Then wait for device - ! - call y%device_wait() - - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! - - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_double_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),n*nerv,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid START: persistent neighbor request already in flight') goto 9999 end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - end if - - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + if (.not. neighbor_comm_handle%is_initialized) then + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Transpose: gather from recv_indexes + if (debug) write(*,*) my_rank,' tran_persistent_mv: gathering recv data,',topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:total_recv_)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + ! Transpose: swap send/recv in alltoallv_init + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(total_recv_ + 1), & + & n*neighbor_comm_handle%send_counts, & + & n*neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + end if ! do_start + + if (do_wait) then + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + + if ((topology_total_send + topology_total_recv) == 0) then + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + if ((topology_total_send + topology_total_recv) > 0) then + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Transpose: scatter to send_indexes + if (debug) write(*,*) my_rank,' tran_persistent_mv: scattering to send_indexes,',topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(total_recv_+1:total_recv_+total_send_), & + & beta) + end if + + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_dtran_neighbor_persistent_topology_multivect + + + subroutine psi_dtran_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv, total_eff_send_, total_eff_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_dtran_rma_pull_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - call psb_realloc(totxch,prcid,info) - - if (debug) write(*,*) me,' wait' - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_double_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm /= me)then - if (nerv>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + icomm = ctxt%get_mpic() + n = y%get_ncols() + eff_send = total_recv + eff_recv = total_send + total_eff_send_ = eff_send * n + total_eff_recv_ = eff_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran pull multivect') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_eff_send_ + total_eff_recv_ + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran pull multivect rank allocation') goto 9999 end if end if - if (nesd>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran pull multivect init_memory_buffer_layout_tran') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+n*nesd-1) - call y%sct(idx_pt,snd_pt,nesd,idx,beta) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! - ! Waited for com, cleanup comid - ! - y%comid = mpi_request_null - - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_eff_send_)) + end if + call y%device_wait() + + ! Pull from each peer's recv_indexes area with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_eff_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran pull multivect') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int((remote_base - 1)*n, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count*n, psb_mpi_r_dpk_, prc_rank, remote_disp, recv_count*n, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran pull multivect self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter into send_indexes. + if (do_wait) then + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, & + & y%combuf(total_eff_send_+1:total_eff_send_+total_eff_recv_), beta) + end if + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_dtran_rma_pull_multivect + + + subroutine psi_dtran_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv, total_eff_send_, total_eff_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_dtran_rma_push_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - if (debug) write(*,*) me,' done' - end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + eff_send = total_recv + eff_recv = total_send + total_eff_send_ = eff_send * n + total_eff_recv_ = eff_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran push multivect') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_eff_send_ + total_eff_recv_ + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran push multivect rank allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran push multivect init_memory_buffer_layout_tran') + goto 9999 + end if + end if + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if - call psb_erractionrestore(err_act) - return + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_eff_send_)) + end if + call y%device_wait() - return + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do -end subroutine psi_dtran_vidx_multivect + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_eff_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran push multivect') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int((remote_base - 1)*n, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count*n, psb_mpi_r_dpk_, prc_rank, remote_disp, send_count*n, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran push multivect self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter into send_indexes. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, & + & y%combuf(total_eff_send_+1:total_eff_send_+total_eff_recv_), beta) + end if + call y%device_wait() + end if ! do_wait + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_dtran_rma_push_multivect +end submodule psi_d_swaptran_impl diff --git a/base/comm/internals/psi_dswaptran_a.F90 b/base/comm/internals/psi_dswaptran_a.F90 index df04c3914..458c34099 100644 --- a/base/comm/internals/psi_dswaptran_a.F90 +++ b/base/comm/internals/psi_dswaptran_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,7 +30,7 @@ ! ! ! -! File: psi_dswaptran.F90 +! File: psi_dswaptran_a.F90 ! ! Subroutine: psi_dswaptranm ! Implements the data exchange among processes. This is similar to Xswapdata, but @@ -88,922 +88,913 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_dswaptranm(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_d_comm_a_mod) psi_d_swaptran_a_impl + use psb_base_mod +contains + module subroutine psi_dswaptranm(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_dswaptranm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:,:), beta - real(psb_dpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + real(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swaptran(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + call psb_erractionrestore(err_act) return -end subroutine psi_dswaptranm -subroutine psi_dtranidxm(ctxt,icomm,flag,n,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) +9999 call psb_error_handler(ctxt,err_act) - use psi_mod, psb_protect_name => psi_dtranidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + return + end subroutine psi_dswaptranm + + module subroutine psi_dtranidxm(ctxt,flag,n,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:,:), beta - real(psb_dpk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - real(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + real(psb_dpk_), intent(inout) :: y(:,:) + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + real(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if - ! prepare info for communications + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + if (do_send) then - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 end if - albf=.true. - end if - if (do_send) then - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) + ! Case SWAP_MPI + if (swap_mpi) then - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_r_dpk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_r_dpk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - end if + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),n*nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - ! Case SWAP_MPI - if (swap_mpi) then + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_r_dpk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_r_dpk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - - else if (swap_sync) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag - if (proc_to_comm < me) then - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send',& + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do + pnti = pnti + nerv + nesd + 3 + end do - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_double_swap_tag - call mpi_irecv(sndbuf(snd_pt),n*nesd,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + else if (swap_send) then + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_recv) then - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_double_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag,icomm,iret) - end if + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 + end if - end do + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_double_swap_tag + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send',& - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_dtranidxm -! -! -! Subroutine: psi_dswaptranv -! Implements the data exchange among processes. This is similar to Xswapdata, but -! the list is read "in reverse", i.e. indices that are normally SENT are used -! for the RECEIVE part and vice-versa. This is the basic data exchange operation -! for doing the product of a sparse matrix by a vector. -! Essentially this is doing a variable all-to-all data exchange -! (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - real Choose overwrite or sum. -! y(:) - real The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - real Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_dswaptranv(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_dswaptranv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + end subroutine psi_dtranidxm + ! + ! + ! Subroutine: psi_dswaptranv + ! Implements the data exchange among processes. This is similar to Xswapdata, but + ! the list is read "in reverse", i.e. indices that are normally SENT are used + ! for the RECEIVE part and vice-versa. This is the basic data exchange operation + ! for doing the product of a sparse matrix by a vector. + ! Essentially this is doing a variable all-to-all data exchange + ! (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D real(psb_dpk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_dswaptranv(flag,beta,y,desc_a,work,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:), beta - real(psb_dpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + real(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tranv' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_dswaptranv + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_dtranidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_dtranidxv(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) + call psi_swaptran(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 - use psi_mod, psb_protect_name => psi_dtranidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_dswaptranv + + + ! + ! + ! Subroutine: psi_dtranidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_dtranidxv(ctxt,flag,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:), beta - real(psb_dpk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - real(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + real(psb_dpk_), intent(inout) :: y(:) + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + + real(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) - - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_r_dpk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_r_dpk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) + + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_r_dpk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_r_dpk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm < me) then + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_snd(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_double_swap_tag - call mpi_irecv(sndbuf(snd_pt),nesd,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + end if - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_double_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),nerv,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag, icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),nerv,& - & psb_mpi_r_dpk_,prcid(i),& - & p2ptag, icomm,iret) - end if + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_double_swap_tag - - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_dtranidxv + end subroutine psi_dtranidxv +end submodule psi_d_swaptran_a_impl diff --git a/base/comm/internals/psi_eovrl_restr_a.f90 b/base/comm/internals/psi_eovrl_restr_a.f90 index cfd089363..960ebb4d1 100644 --- a/base/comm/internals/psi_eovrl_restr_a.f90 +++ b/base/comm/internals/psi_eovrl_restr_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,98 +34,100 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_eovrl_restrr1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_eovrl_restrr1 - - implicit none - - integer(psb_epk_), intent(inout) :: x(:) - integer(psb_epk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_eovrl_restrr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx) = xs(i) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_e_comm_a_mod) psi_e_ovrl_restr_a_impl + use psb_base_mod +contains + module subroutine psi_eovrl_restrr1(x,xs,desc_a,info) + + implicit none + + integer(psb_epk_), intent(inout) :: x(:) + integer(psb_epk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_eovrl_restrr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx) = xs(i) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_eovrl_restrr1 + return + end subroutine psi_eovrl_restrr1 -subroutine psi_eovrl_restrr2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_eovrl_restrr2 + module subroutine psi_eovrl_restrr2(x,xs,desc_a,info) - implicit none + implicit none - integer(psb_epk_), intent(inout) :: x(:,:) - integer(psb_epk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + integer(psb_epk_), intent(inout) :: x(:,:) + integer(psb_epk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err - name='psi_eovrl_restrr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_eovrl_restrr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if (size(x,2) /= size(xs,2)) then - info = psb_err_internal_error_ - call psb_errpush(info,name, a_err='Mismacth columns X vs XS') - goto 9999 - endif + if (size(x,2) /= size(xs,2)) then + info = psb_err_internal_error_ + call psb_errpush(info,name, a_err='Mismacth columns X vs XS') + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) + isz = size(desc_a%ovrlap_elem,1) - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx,:) = xs(i,:) - end do + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx,:) = xs(i,:) + end do - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_eovrl_restrr2 + return + end subroutine psi_eovrl_restrr2 +end submodule psi_e_ovrl_restr_a_impl diff --git a/base/comm/internals/psi_eovrl_save_a.f90 b/base/comm/internals/psi_eovrl_save_a.f90 index adcb981ad..23cae9220 100644 --- a/base/comm/internals/psi_eovrl_save_a.f90 +++ b/base/comm/internals/psi_eovrl_save_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,108 +34,104 @@ ! These subroutines save the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap. ! -subroutine psi_eovrl_saver1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_eovrl_saver1 - - use psb_realloc_mod - - implicit none - - integer(psb_epk_), intent(inout) :: x(:) - integer(psb_epk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_eovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i) = x(idx) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_e_comm_a_mod) psi_e_ovrl_save_a_impl + use psb_base_mod +contains + module subroutine psi_eovrl_saver1(x,xs,desc_a,info) + implicit none + + integer(psb_epk_), intent(inout) :: x(:) + integer(psb_epk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_eovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i) = x(idx) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_eovrl_saver1 - - -subroutine psi_eovrl_saver2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_eovrl_saver2 - - use psb_realloc_mod - - implicit none - - integer(psb_epk_), intent(inout) :: x(:,:) - integer(psb_epk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc - character(len=20) :: name, ch_err - - name='psi_eovrl_saver2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = size(x,2) - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i,:) = x(idx,:) - end do - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_eovrl_saver1 + + + module subroutine psi_eovrl_saver2(x,xs,desc_a,info) + implicit none + + integer(psb_epk_), intent(inout) :: x(:,:) + integer(psb_epk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc + character(len=20) :: name, ch_err + + name='psi_eovrl_saver2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = size(x,2) + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i,:) = x(idx,:) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_eovrl_saver2 + return + end subroutine psi_eovrl_saver2 +end submodule psi_e_ovrl_save_a_impl diff --git a/base/comm/internals/psi_eovrl_upd_a.f90 b/base/comm/internals/psi_eovrl_upd_a.f90 index c14275476..d3caaae33 100644 --- a/base/comm/internals/psi_eovrl_upd_a.f90 +++ b/base/comm/internals/psi_eovrl_upd_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -32,143 +32,143 @@ ! Subroutine: psi_eovrl_update ! These subroutines update the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap, -! or for the application of Additive Schwarz preconditioners. +! or for the application of Additive Schwarz preconditioners. ! ! -subroutine psi_eovrl_updr1(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_eovrl_updr1 - - implicit none - - integer(psb_epk_), intent(inout), target :: x(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_eovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx) = ezero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return +submodule (psi_e_comm_a_mod) psi_e_ovrl_upd_a_impl + use psb_base_mod +contains + module subroutine psi_eovrl_updr1(x,desc_a,update,info) + implicit none + + integer(psb_epk_), intent(inout), target :: x(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_eovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx) = ezero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_eovrl_updr1 - -subroutine psi_eovrl_updr2(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_eovrl_updr2 - - implicit none - - integer(psb_epk_), intent(inout), target :: x(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_eovrl_updr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx,:) = ezero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_eovrl_updr1 + + module subroutine psi_eovrl_updr2(x,desc_a,update,info) + implicit none + + integer(psb_epk_), intent(inout), target :: x(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_eovrl_updr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx,:) = ezero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_eovrl_updr2 + return + end subroutine psi_eovrl_updr2 +end submodule psi_e_ovrl_upd_a_impl diff --git a/base/comm/internals/psi_eswapdata_a.F90 b/base/comm/internals/psi_eswapdata_a.F90 index 6e2d95578..f1a1fd602 100644 --- a/base/comm/internals/psi_eswapdata_a.F90 +++ b/base/comm/internals/psi_eswapdata_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -39,7 +39,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D integer(psb_epk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -70,10 +70,10 @@ ! ! ! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y(:,:) - integer The data area +! beta - real Choose overwrite or sum. +! y(:,:) - real The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do +! work(:) - real Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -84,912 +84,903 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_eswapdatam(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_e_comm_a_mod) psi_e_swapdata_a_impl + use psb_base_mod +contains + module subroutine psi_eswapdatam(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_eswapdatam - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:,:), beta - integer(psb_epk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + integer(psb_epk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swapdata(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_eswapdatam + end subroutine psi_eswapdatam -subroutine psi_eswapidxm(ctxt,icomm,flag,n,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + module subroutine psi_eswapidxm(ctxt,flag,n,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) - use psi_mod, psb_protect_name => psi_eswapidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:,:), beta - integer(psb_epk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - integer(psb_epk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:,:) + integer(psb_epk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + +integer(psb_epk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if - ! prepare info for communications + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + end if - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_epk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_epk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_epk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),n*nesd,& + & psb_mpi_epk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),n*nesd,& + & psb_mpi_epk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*)& + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if - else - allocate(rvhd(totxch),prcid(totxch),stat=info) + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if if(info /= psb_success_) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(albf) deallocate(sndbuf,rcvbuf,stat=info) if(info /= psb_success_) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - albf=.true. - end if - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_epk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_epk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - - else if (swap_sync) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm < me) then - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int8_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_epk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_int8_swap_tag - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),n*nesd,& - & psb_mpi_epk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),n*nesd,& - & psb_mpi_epk_,prcid(i),& - & p2ptag,icomm,iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_int8_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*)& - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_eswapidxm + end subroutine psi_eswapidxm + + ! + ! + ! Subroutine: psi_eswapdatav + ! Implements the data exchange among processes. Essentially this is doing + ! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D integer(psb_epk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_eswapdatav(flag,beta,y,desc_a,work,info,data) -! -! -! Subroutine: psi_eswapdatav -! Implements the data exchange among processes. Essentially this is doing -! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y(:) - integer The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_eswapdatav(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_eswapdatav - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:), beta - integer(psb_epk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + integer(psb_epk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_eswapdatav + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_eswapdataidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_eswapidxv(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + call psi_swapdata(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 - use psi_mod, psb_protect_name => psi_eswapidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_eswapdatav + + + ! + ! + ! Subroutine: psi_eswapdataidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_eswapidxv(ctxt,flag,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) + + use psb_error_mod + use psb_desc_mod + use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:), beta - integer(psb_epk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - integer(psb_epk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:) + integer(psb_epk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + integer(psb_epk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+nesd-1)) - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_epk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_epk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+nesd-1)) + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_epk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_epk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),nerv,& + & psb_mpi_epk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),nesd,& + & psb_mpi_epk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),nesd,& + & psb_mpi_epk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send) then - if (proc_to_comm < me) then + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_snd(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_rcv(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int8_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),nerv,& - & psb_mpi_epk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - p2ptag = psb_int8_swap_tag + end if - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),nesd,& - & psb_mpi_epk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),nesd,& - & psb_mpi_epk_,prcid(i),& - & p2ptag,icomm,iret) - end if + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_int8_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_eswapidxv + end subroutine psi_eswapidxv +end submodule psi_e_swapdata_a_impl diff --git a/base/comm/internals/psi_eswaptran_a.F90 b/base/comm/internals/psi_eswaptran_a.F90 index e105c88b6..7cd94cdbe 100644 --- a/base/comm/internals/psi_eswaptran_a.F90 +++ b/base/comm/internals/psi_eswaptran_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,7 +30,7 @@ ! ! ! -! File: psi_eswaptran.F90 +! File: psi_eswaptran_a.F90 ! ! Subroutine: psi_eswaptranm ! Implements the data exchange among processes. This is similar to Xswapdata, but @@ -43,7 +43,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D integer(psb_epk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -74,10 +74,10 @@ ! ! ! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y(:,:) - integer The data area +! beta - real Choose overwrite or sum. +! y(:,:) - real The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do +! work(:) - real Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -88,922 +88,913 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_eswaptranm(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_e_comm_a_mod) psi_e_swaptran_a_impl + use psb_base_mod +contains + module subroutine psi_eswaptranm(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_eswaptranm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:,:), beta - integer(psb_epk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + integer(psb_epk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swaptran(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) return -end subroutine psi_eswaptranm -subroutine psi_etranidxm(ctxt,icomm,flag,n,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_eswaptranm - use psi_mod, psb_protect_name => psi_etranidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + module subroutine psi_etranidxm(ctxt,flag,n,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:,:), beta - integer(psb_epk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - integer(psb_epk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_epk_), intent(inout) :: y(:,:) + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + integer(psb_epk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if - ! prepare info for communications + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + if (do_send) then - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 end if - albf=.true. - end if - if (do_send) then - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) + ! Case SWAP_MPI + if (swap_mpi) then - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_epk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_epk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),n*nesd,& + & psb_mpi_epk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_epk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_epk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send',& + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - ! Case SWAP_MPI - if (swap_mpi) then + else if (swap_send) then - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_epk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_epk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 - else if (swap_sync) then + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_recv) then - if (proc_to_comm < me) then - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm > me) then + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int8_swap_tag - call mpi_irecv(sndbuf(snd_pt),n*nesd,& - & psb_mpi_epk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int8_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_epk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_epk_,prcid(i),& - & p2ptag,icomm,iret) - end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 + end if - end do + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_int8_swap_tag + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send',& - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_etranidxm -! -! -! Subroutine: psi_eswaptranv -! Implements the data exchange among processes. This is similar to Xswapdata, but -! the list is read "in reverse", i.e. indices that are normally SENT are used -! for the RECEIVE part and vice-versa. This is the basic data exchange operation -! for doing the product of a sparse matrix by a vector. -! Essentially this is doing a variable all-to-all data exchange -! (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y(:) - integer The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_eswaptranv(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_eswaptranv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + end subroutine psi_etranidxm + ! + ! + ! Subroutine: psi_eswaptranv + ! Implements the data exchange among processes. This is similar to Xswapdata, but + ! the list is read "in reverse", i.e. indices that are normally SENT are used + ! for the RECEIVE part and vice-versa. This is the basic data exchange operation + ! for doing the product of a sparse matrix by a vector. + ! Essentially this is doing a variable all-to-all data exchange + ! (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D integer(psb_epk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_eswaptranv(flag,beta,y,desc_a,work,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:), beta - integer(psb_epk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + integer(psb_epk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tranv' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_eswaptranv + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_etranidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_etranidxv(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) + call psi_swaptran(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return - use psi_mod, psb_protect_name => psi_etranidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_eswaptranv + + + ! + ! + ! Subroutine: psi_etranidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_etranidxv(ctxt,flag,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:), beta - integer(psb_epk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - integer(psb_epk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_epk_), intent(inout) :: y(:) + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + + integer(psb_epk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) - - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_epk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_epk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) + + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_epk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_epk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),nesd,& + & psb_mpi_epk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),nerv,& + & psb_mpi_epk_,prcid(i),& + & p2ptag, icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),nerv,& + & psb_mpi_epk_,prcid(i),& + & p2ptag, icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - if (proc_to_comm < me) then + + else if (swap_send) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_snd(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int8_swap_tag - call mpi_irecv(sndbuf(snd_pt),nesd,& - & psb_mpi_epk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int8_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),nerv,& - & psb_mpi_epk_,prcid(i),& - & p2ptag, icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),nerv,& - & psb_mpi_epk_,prcid(i),& - & p2ptag, icomm,iret) - end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_int8_swap_tag - - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + end if + + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_etranidxv + end subroutine psi_etranidxv +end submodule psi_e_swaptran_a_impl diff --git a/base/comm/internals/psi_i2ovrl_restr_a.f90 b/base/comm/internals/psi_i2ovrl_restr_a.f90 index acb6b25d3..8272e68b9 100644 --- a/base/comm/internals/psi_i2ovrl_restr_a.f90 +++ b/base/comm/internals/psi_i2ovrl_restr_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,98 +34,100 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_i2ovrl_restrr1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_i2ovrl_restrr1 - - implicit none - - integer(psb_i2pk_), intent(inout) :: x(:) - integer(psb_i2pk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_i2ovrl_restrr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx) = xs(i) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_i2_comm_a_mod) psi_i2_ovrl_restr_a_impl + use psb_base_mod +contains + module subroutine psi_i2ovrl_restrr1(x,xs,desc_a,info) + + implicit none + + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_i2pk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_i2ovrl_restrr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx) = xs(i) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_i2ovrl_restrr1 + return + end subroutine psi_i2ovrl_restrr1 -subroutine psi_i2ovrl_restrr2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_i2ovrl_restrr2 + module subroutine psi_i2ovrl_restrr2(x,xs,desc_a,info) - implicit none + implicit none - integer(psb_i2pk_), intent(inout) :: x(:,:) - integer(psb_i2pk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + integer(psb_i2pk_), intent(inout) :: x(:,:) + integer(psb_i2pk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err - name='psi_i2ovrl_restrr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_i2ovrl_restrr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if (size(x,2) /= size(xs,2)) then - info = psb_err_internal_error_ - call psb_errpush(info,name, a_err='Mismacth columns X vs XS') - goto 9999 - endif + if (size(x,2) /= size(xs,2)) then + info = psb_err_internal_error_ + call psb_errpush(info,name, a_err='Mismacth columns X vs XS') + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) + isz = size(desc_a%ovrlap_elem,1) - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx,:) = xs(i,:) - end do + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx,:) = xs(i,:) + end do - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_i2ovrl_restrr2 + return + end subroutine psi_i2ovrl_restrr2 +end submodule psi_i2_ovrl_restr_a_impl diff --git a/base/comm/internals/psi_i2ovrl_save_a.f90 b/base/comm/internals/psi_i2ovrl_save_a.f90 index dc0b3f547..ca81d36d0 100644 --- a/base/comm/internals/psi_i2ovrl_save_a.f90 +++ b/base/comm/internals/psi_i2ovrl_save_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,108 +34,104 @@ ! These subroutines save the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap. ! -subroutine psi_i2ovrl_saver1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_i2ovrl_saver1 - - use psb_realloc_mod - - implicit none - - integer(psb_i2pk_), intent(inout) :: x(:) - integer(psb_i2pk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_i2ovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i) = x(idx) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_i2_comm_a_mod) psi_i2_ovrl_save_a_impl + use psb_base_mod +contains + module subroutine psi_i2ovrl_saver1(x,xs,desc_a,info) + implicit none + + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_i2pk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_i2ovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i) = x(idx) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_i2ovrl_saver1 - - -subroutine psi_i2ovrl_saver2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_i2ovrl_saver2 - - use psb_realloc_mod - - implicit none - - integer(psb_i2pk_), intent(inout) :: x(:,:) - integer(psb_i2pk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc - character(len=20) :: name, ch_err - - name='psi_i2ovrl_saver2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = size(x,2) - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i,:) = x(idx,:) - end do - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_i2ovrl_saver1 + + + module subroutine psi_i2ovrl_saver2(x,xs,desc_a,info) + implicit none + + integer(psb_i2pk_), intent(inout) :: x(:,:) + integer(psb_i2pk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc + character(len=20) :: name, ch_err + + name='psi_i2ovrl_saver2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = size(x,2) + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i,:) = x(idx,:) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_i2ovrl_saver2 + return + end subroutine psi_i2ovrl_saver2 +end submodule psi_i2_ovrl_save_a_impl diff --git a/base/comm/internals/psi_i2ovrl_upd_a.f90 b/base/comm/internals/psi_i2ovrl_upd_a.f90 index 973ffa8e4..2d9f57b85 100644 --- a/base/comm/internals/psi_i2ovrl_upd_a.f90 +++ b/base/comm/internals/psi_i2ovrl_upd_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -32,143 +32,143 @@ ! Subroutine: psi_i2ovrl_update ! These subroutines update the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap, -! or for the application of Additive Schwarz preconditioners. +! or for the application of Additive Schwarz preconditioners. ! ! -subroutine psi_i2ovrl_updr1(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_i2ovrl_updr1 - - implicit none - - integer(psb_i2pk_), intent(inout), target :: x(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_i2ovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx) = i2zero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return +submodule (psi_i2_comm_a_mod) psi_i2_ovrl_upd_a_impl + use psb_base_mod +contains + module subroutine psi_i2ovrl_updr1(x,desc_a,update,info) + implicit none + + integer(psb_i2pk_), intent(inout), target :: x(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_i2ovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx) = i2zero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_i2ovrl_updr1 - -subroutine psi_i2ovrl_updr2(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_i2ovrl_updr2 - - implicit none - - integer(psb_i2pk_), intent(inout), target :: x(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_i2ovrl_updr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx,:) = i2zero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_i2ovrl_updr1 + + module subroutine psi_i2ovrl_updr2(x,desc_a,update,info) + implicit none + + integer(psb_i2pk_), intent(inout), target :: x(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_i2ovrl_updr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx,:) = i2zero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_i2ovrl_updr2 + return + end subroutine psi_i2ovrl_updr2 +end submodule psi_i2_ovrl_upd_a_impl diff --git a/base/comm/internals/psi_i2swapdata_a.F90 b/base/comm/internals/psi_i2swapdata_a.F90 index 4acdbc9e5..99c48fdcc 100644 --- a/base/comm/internals/psi_i2swapdata_a.F90 +++ b/base/comm/internals/psi_i2swapdata_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -39,7 +39,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D integer(psb_i2pk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -70,10 +70,10 @@ ! ! ! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y(:,:) - integer The data area +! beta - real Choose overwrite or sum. +! y(:,:) - real The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do +! work(:) - real Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -84,912 +84,903 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_i2swapdatam(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_i2_comm_a_mod) psi_i2_swapdata_a_impl + use psb_base_mod +contains + module subroutine psi_i2swapdatam(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_i2swapdatam - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:,:), beta - integer(psb_i2pk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + integer(psb_i2pk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swapdata(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_i2swapdatam + end subroutine psi_i2swapdatam -subroutine psi_i2swapidxm(ctxt,icomm,flag,n,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + module subroutine psi_i2swapidxm(ctxt,flag,n,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) - use psi_mod, psb_protect_name => psi_i2swapidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:,:), beta - integer(psb_i2pk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - integer(psb_i2pk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:,:) + integer(psb_i2pk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + +integer(psb_i2pk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if - ! prepare info for communications + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + end if - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_i2pk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_i2pk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_i2pk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),n*nesd,& + & psb_mpi_i2pk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),n*nesd,& + & psb_mpi_i2pk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*)& + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if - else - allocate(rvhd(totxch),prcid(totxch),stat=info) + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if if(info /= psb_success_) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(albf) deallocate(sndbuf,rcvbuf,stat=info) if(info /= psb_success_) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - albf=.true. - end if - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_i2pk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_i2pk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - - else if (swap_sync) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm < me) then - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int2_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_i2pk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_int2_swap_tag - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),n*nesd,& - & psb_mpi_i2pk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),n*nesd,& - & psb_mpi_i2pk_,prcid(i),& - & p2ptag,icomm,iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_int2_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*)& - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_i2swapidxm + end subroutine psi_i2swapidxm + + ! + ! + ! Subroutine: psi_i2swapdatav + ! Implements the data exchange among processes. Essentially this is doing + ! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D integer(psb_i2pk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_i2swapdatav(flag,beta,y,desc_a,work,info,data) -! -! -! Subroutine: psi_i2swapdatav -! Implements the data exchange among processes. Essentially this is doing -! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y(:) - integer The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_i2swapdatav(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_i2swapdatav - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:), beta - integer(psb_i2pk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + integer(psb_i2pk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_i2swapdatav + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_i2swapdataidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_i2swapidxv(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + call psi_swapdata(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 - use psi_mod, psb_protect_name => psi_i2swapidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_i2swapdatav + + + ! + ! + ! Subroutine: psi_i2swapdataidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_i2swapidxv(ctxt,flag,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) + + use psb_error_mod + use psb_desc_mod + use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:), beta - integer(psb_i2pk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - integer(psb_i2pk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:) + integer(psb_i2pk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + integer(psb_i2pk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+nesd-1)) - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_i2pk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_i2pk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+nesd-1)) + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_i2pk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_i2pk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),nerv,& + & psb_mpi_i2pk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),nesd,& + & psb_mpi_i2pk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),nesd,& + & psb_mpi_i2pk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send) then - if (proc_to_comm < me) then + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_snd(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_rcv(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int2_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),nerv,& - & psb_mpi_i2pk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - p2ptag = psb_int2_swap_tag + end if - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),nesd,& - & psb_mpi_i2pk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),nesd,& - & psb_mpi_i2pk_,prcid(i),& - & p2ptag,icomm,iret) - end if + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_int2_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_i2swapidxv + end subroutine psi_i2swapidxv +end submodule psi_i2_swapdata_a_impl diff --git a/base/comm/internals/psi_i2swaptran_a.F90 b/base/comm/internals/psi_i2swaptran_a.F90 index f879702cf..729f3df16 100644 --- a/base/comm/internals/psi_i2swaptran_a.F90 +++ b/base/comm/internals/psi_i2swaptran_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,7 +30,7 @@ ! ! ! -! File: psi_i2swaptran.F90 +! File: psi_i2swaptran_a.F90 ! ! Subroutine: psi_i2swaptranm ! Implements the data exchange among processes. This is similar to Xswapdata, but @@ -43,7 +43,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D integer(psb_i2pk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -74,10 +74,10 @@ ! ! ! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y(:,:) - integer The data area +! beta - real Choose overwrite or sum. +! y(:,:) - real The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do +! work(:) - real Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -88,922 +88,913 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_i2swaptranm(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_i2_comm_a_mod) psi_i2_swaptran_a_impl + use psb_base_mod +contains + module subroutine psi_i2swaptranm(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_i2swaptranm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:,:), beta - integer(psb_i2pk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + integer(psb_i2pk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swaptran(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) return -end subroutine psi_i2swaptranm -subroutine psi_i2tranidxm(ctxt,icomm,flag,n,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_i2swaptranm - use psi_mod, psb_protect_name => psi_i2tranidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + module subroutine psi_i2tranidxm(ctxt,flag,n,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:,:), beta - integer(psb_i2pk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - integer(psb_i2pk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_i2pk_), intent(inout) :: y(:,:) + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + integer(psb_i2pk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if - ! prepare info for communications + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + if (do_send) then - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 end if - albf=.true. - end if - if (do_send) then - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) + ! Case SWAP_MPI + if (swap_mpi) then - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_i2pk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_i2pk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),n*nesd,& + & psb_mpi_i2pk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_i2pk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_i2pk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send',& + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - ! Case SWAP_MPI - if (swap_mpi) then + else if (swap_send) then - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_i2pk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_i2pk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 - else if (swap_sync) then + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_recv) then - if (proc_to_comm < me) then - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm > me) then + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int2_swap_tag - call mpi_irecv(sndbuf(snd_pt),n*nesd,& - & psb_mpi_i2pk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int2_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_i2pk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_i2pk_,prcid(i),& - & p2ptag,icomm,iret) - end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 + end if - end do + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_int2_swap_tag + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send',& - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_i2tranidxm -! -! -! Subroutine: psi_i2swaptranv -! Implements the data exchange among processes. This is similar to Xswapdata, but -! the list is read "in reverse", i.e. indices that are normally SENT are used -! for the RECEIVE part and vice-versa. This is the basic data exchange operation -! for doing the product of a sparse matrix by a vector. -! Essentially this is doing a variable all-to-all data exchange -! (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y(:) - integer The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_i2swaptranv(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_i2swaptranv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + end subroutine psi_i2tranidxm + ! + ! + ! Subroutine: psi_i2swaptranv + ! Implements the data exchange among processes. This is similar to Xswapdata, but + ! the list is read "in reverse", i.e. indices that are normally SENT are used + ! for the RECEIVE part and vice-versa. This is the basic data exchange operation + ! for doing the product of a sparse matrix by a vector. + ! Essentially this is doing a variable all-to-all data exchange + ! (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D integer(psb_i2pk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_i2swaptranv(flag,beta,y,desc_a,work,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:), beta - integer(psb_i2pk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + integer(psb_i2pk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tranv' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_i2swaptranv + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_i2tranidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_i2tranidxv(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) + call psi_swaptran(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return - use psi_mod, psb_protect_name => psi_i2tranidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_i2swaptranv + + + ! + ! + ! Subroutine: psi_i2tranidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_i2tranidxv(ctxt,flag,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:), beta - integer(psb_i2pk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - integer(psb_i2pk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_i2pk_), intent(inout) :: y(:) + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + + integer(psb_i2pk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) - - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_i2pk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_i2pk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) + + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_i2pk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_i2pk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),nesd,& + & psb_mpi_i2pk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),nerv,& + & psb_mpi_i2pk_,prcid(i),& + & p2ptag, icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),nerv,& + & psb_mpi_i2pk_,prcid(i),& + & p2ptag, icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - if (proc_to_comm < me) then + + else if (swap_send) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_snd(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int2_swap_tag - call mpi_irecv(sndbuf(snd_pt),nesd,& - & psb_mpi_i2pk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int2_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),nerv,& - & psb_mpi_i2pk_,prcid(i),& - & p2ptag, icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),nerv,& - & psb_mpi_i2pk_,prcid(i),& - & p2ptag, icomm,iret) - end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_int2_swap_tag - - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + end if + + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_i2tranidxv + end subroutine psi_i2tranidxv +end submodule psi_i2_swaptran_a_impl diff --git a/base/comm/internals/psi_iovrl_restr.f90 b/base/comm/internals/psi_iovrl_restr.f90 index 599a986e4..21d8b23bf 100644 --- a/base/comm/internals/psi_iovrl_restr.f90 +++ b/base/comm/internals/psi_iovrl_restr.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,90 +35,90 @@ ! ! ! -subroutine psi_iovrl_restr_vect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_iovrl_restr_vect - use psb_i_base_vect_mod - - implicit none - - class(psb_i_base_vect_type) :: x - integer(psb_ipk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_iovrl_restr_vect' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,izero) - - call psb_erractionrestore(err_act) - return +submodule (psi_i_comm_v_mod) psi_i_ovrl_restr_v_impl + use psb_base_mod +contains + module subroutine psi_iovrl_restr_vect(x,xs,desc_a,info) + + implicit none + + class(psb_i_base_vect_type) :: x + integer(psb_ipk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_iovrl_restr_vect' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,izero) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_iovrl_restr_vect + return + end subroutine psi_iovrl_restr_vect -subroutine psi_iovrl_restr_multivect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_iovrl_restr_multivect - use psb_i_base_vect_mod + module subroutine psi_iovrl_restr_multivect(x,xs,desc_a,info) - implicit none + implicit none - class(psb_i_base_multivect_type) :: x - integer(psb_ipk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + class(psb_i_base_multivect_type) :: x + integer(psb_ipk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz,nc - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz,nc + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err - name='psi_iovrl_restr_mv' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_iovrl_restr_mv' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) - call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,izero) + isz = size(desc_a%ovrlap_elem,1) + call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,izero) - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_iovrl_restr_multivect + return + end subroutine psi_iovrl_restr_multivect +end submodule psi_i_ovrl_restr_v_impl diff --git a/base/comm/internals/psi_iovrl_save.f90 b/base/comm/internals/psi_iovrl_save.f90 index eb7a7ffb6..21eae3510 100644 --- a/base/comm/internals/psi_iovrl_save.f90 +++ b/base/comm/internals/psi_iovrl_save.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,103 +34,101 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_iovrl_save_vect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_iovrl_save_vect - use psb_realloc_mod - use psb_i_base_vect_mod - - implicit none - - class(psb_i_base_vect_type) :: x - integer(psb_ipk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) - - call psb_erractionrestore(err_act) - return +submodule (psi_i_comm_v_mod) psi_i_ovrl_save_v_impl + use psb_base_mod +contains + module subroutine psi_iovrl_save_vect(x,xs,desc_a,info) + + implicit none + + class(psb_i_base_vect_type) :: x + integer(psb_ipk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_iovrl_save_vect - -subroutine psi_iovrl_save_multivect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_iovrl_save_multivect - use psb_realloc_mod - use psb_i_base_vect_mod - - implicit none - - class(psb_i_base_multivect_type) :: x - integer(psb_ipk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, nc - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = x%get_ncols() - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_iovrl_save_vect + + module subroutine psi_iovrl_save_multivect(x,xs,desc_a,info) + + implicit none + + class(psb_i_base_multivect_type) :: x + integer(psb_ipk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, nc + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = x%get_ncols() + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_iovrl_save_multivect + return + end subroutine psi_iovrl_save_multivect +end submodule psi_i_ovrl_save_v_impl diff --git a/base/comm/internals/psi_iovrl_upd.f90 b/base/comm/internals/psi_iovrl_upd.f90 index cf3c201b5..d77747b73 100644 --- a/base/comm/internals/psi_iovrl_upd.f90 +++ b/base/comm/internals/psi_iovrl_upd.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -36,169 +36,167 @@ ! ! ! -subroutine psi_iovrl_upd_vect(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_iovrl_upd_vect - use psb_realloc_mod - use psb_i_base_vect_mod - - implicit none - - class(psb_i_base_vect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - integer(psb_ipk_), allocatable :: xs(:) - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, nx, ndm - integer(psb_ipk_) :: err_act, i, idx - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - - name='psi_iovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - nx = size(desc_a%ovrlap_elem,1) - call psb_realloc(nx,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_Dealloc_ - call psb_errpush(info,name) - goto 9999 - end if - - if (update /= psb_sum_) then - call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) - ! switch on update type - - select case (update) - case(psb_square_root_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i) = xs(i)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i) = xs(i)/real(ndm) - end do - case(psb_setzero_) - do i=1,nx - if (me /= desc_a%ovrlap_elem(i,3))& - & xs(i) = izero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) +submodule (psi_i_comm_v_mod) psi_i_ovrl_upd_v_impl + use psb_base_mod +contains + module subroutine psi_iovrl_upd_vect(x,desc_a,update,info) + + implicit none + + class(psb_i_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_ipk_), allocatable :: xs(:) + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, nx, ndm + integer(psb_ipk_) :: err_act, i, idx + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + + name='psi_iovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end select - call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,izero) - end if - - call psb_erractionrestore(err_act) - return + endif + nx = size(desc_a%ovrlap_elem,1) + call psb_realloc(nx,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_Dealloc_ + call psb_errpush(info,name) + goto 9999 + end if + + if (update /= psb_sum_) then + call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) + ! switch on update type + + select case (update) + case(psb_square_root_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i) = xs(i)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i) = xs(i)/real(ndm) + end do + case(psb_setzero_) + do i=1,nx + if (me /= desc_a%ovrlap_elem(i,3))& + & xs(i) = izero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,izero) + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_iovrl_upd_vect - -subroutine psi_iovrl_upd_multivect(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_iovrl_upd_multivect - use psb_realloc_mod - use psb_i_base_vect_mod - - implicit none - - class(psb_i_base_multivect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - integer(psb_ipk_), allocatable :: xs(:,:) - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, ndm, nx, nc - integer(psb_ipk_) :: err_act, i, idx - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - - name='psi_iovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - nx = size(desc_a%ovrlap_elem,1) - nc = x%get_ncols() - call psb_realloc(nx,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_Dealloc_ - call psb_errpush(info,name) - goto 9999 - end if - - if (update /= psb_sum_) then - call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) - ! switch on update type - - select case (update) - case(psb_square_root_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i,:) = xs(i,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i,:) = xs(i,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,nx - if (me /= desc_a%ovrlap_elem(i,3))& - & xs(i,:) = izero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) + return + end subroutine psi_iovrl_upd_vect + + module subroutine psi_iovrl_upd_multivect(x,desc_a,update,info) + + implicit none + + class(psb_i_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_ipk_), allocatable :: xs(:,:) + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, ndm, nx, nc + integer(psb_ipk_) :: err_act, i, idx + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + + name='psi_iovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end select - call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,izero) - end if - - call psb_erractionrestore(err_act) - return + endif + nx = size(desc_a%ovrlap_elem,1) + nc = x%get_ncols() + call psb_realloc(nx,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_Dealloc_ + call psb_errpush(info,name) + goto 9999 + end if + + if (update /= psb_sum_) then + call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) + ! switch on update type + + select case (update) + case(psb_square_root_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i,:) = xs(i,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i,:) = xs(i,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,nx + if (me /= desc_a%ovrlap_elem(i,3))& + & xs(i,:) = izero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,izero) + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_iovrl_upd_multivect + return + end subroutine psi_iovrl_upd_multivect +end submodule psi_i_ovrl_upd_v_impl diff --git a/base/comm/internals/psi_iswapdata.F90 b/base/comm/internals/psi_iswapdata.F90 index d73277efe..98fca246f 100644 --- a/base/comm/internals/psi_iswapdata.F90 +++ b/base/comm/internals/psi_iswapdata.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,7 +41,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D integer(psb_ipk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -53,32 +53,22 @@ ! is scattered in the owned indices, and BETA=1. ! The first routine picks the desired exchange index list and passes it to the second. ! This version works on encapsulated vectors, and uses their methods to do GTH and SCT, -! so that special versions (i.e. GPU vectors can override them +! so that special versions (i.e. GPU vectors can override them) ! ! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) +! swap_status - integer Swap status selector. +! It is interpreted as a communication status: +! psb_comm_status_start_ -> START phase +! psb_comm_status_wait_ -> WAIT phase +! psb_comm_status_unknown_ -> START+WAIT +! The communication scheme is selected from +! y%comm_handle%comm_type. ! ! ! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. +! beta - real Choose overwrite or sum. ! y - type(psb_@x@_vect_type) The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do -! our own internal allocation. +! desc_a - type(psb_desc_type). The communication descriptor. ! info - integer. return code. ! data - integer which list is to be used to exchange data ! default psb_comm_halo_ @@ -89,101 +79,156 @@ ! ! ! -subroutine psi_iswapdata_vect(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_iswapdata_vect - use psb_i_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +submodule (psi_i_comm_v_mod) psi_i_swapdata_impl + use psb_desc_const_mod, only: psb_swap_start_, psb_swap_wait_ + use psb_base_mod + use psb_error_mod, only: psb_get_debug_level, psb_get_debug_unit, psb_debug_ext_ + use psb_comm_schemes_mod, only: psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_, psb_comm_rma_pull_, psb_comm_rma_push_, & + & psb_comm_handle_type + use psb_comm_rma_mod, only: psb_comm_rma_handle + use psb_comm_factory_mod + +contains + + module subroutine psi_iswapdata_vect(swap_status,beta,y,desc_a,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_vect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_), target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + integer(psb_ipk_), intent(in) :: swap_status + class(psb_i_base_vect_type), intent(inout) :: y + integer(psb_ipk_), intent(in) :: beta + type(psb_desc_type), target :: desc_a ! TODO: should this be intent(in)? + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, data_, err_act - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, my_rank, total_send, total_recv, num_neighbors, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + ! communication scheme/status selectors + logical :: baseline, ineighbor_a2av, ineighbor_a2av_persistent - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif + ! error handling variables + integer(psb_ipk_) :: err_act + character(len=30) :: name + logical :: debug - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if + info = psb_success_ + name = 'psi_iswapdata_vect' + call psb_erractionsave(err_act) - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if + debug = .false. - call psi_swapdata(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 + ctxt = desc_a%get_context() - call psb_erractionrestore(err_act) - return + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='desc_a%get_list_p') + goto 9999 + end if + + + if( (swap_status /= psb_comm_status_start_).and.(swap_status /= psb_comm_status_wait_)& + & .and.(swap_status /= psb_comm_status_sync_) ) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + ! Set the normalized swap status on the comm handle + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + if(debug .eqv. .true.) then + write(0,'(a,i0,a,i0)') 'DBG_DISPATCH comm_type=',y%comm_handle%comm_type,' desc_a%comm_type=',desc_a%comm_type + endif + select case(y%comm_handle%comm_type) + case(psb_comm_isend_irecv_) + call psi_iswap_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline swap') + goto 9999 + end if + case(psb_comm_ineighbor_alltoallv_) + call psi_iswap_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,& + & total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor nonblocking swap') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_iswap_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,& + & total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor persistent swap') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_iswap_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull swap') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_iswap_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push swap') + goto 9999 + end if + case default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Incompatible swap_status settings: no valid communication mode selected') + goto 9999 + end select + + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_iswapdata_vect + end subroutine psi_iswapdata_vect -! -! -! Subroutine: psi_iswap_vidx_vect -! Data exchange among processes. -! -! Takes care of Y an exanspulated vector. Relies on the gather/scatter methods -! of vectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_iswap_vidx_vect(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_iswap_vidx_vect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_i_base_vect_mod + subroutine psi_iswap_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -192,336 +237,1416 @@ subroutine psi_iswap_vidx_vect(ctxt,icomm,flag,beta,y,idx, & include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_vect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size),& + & iret, nesd, nerv + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti, n + logical :: do_send,do_recv + logical, parameter :: usersend=.false. + logical :: debug + character(len=20) :: name + + info = psb_success_ + name = 'psi_iswap_baseline_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - ! locals - integer(psb_mpk_) :: np, me - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size),& - & iret, nesd, nerv - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti, n - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + icomm = ctxt%get_mpic() - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline swap') + goto 9999 + end select - totrcv_ = totrcv * n - totsnd_ = totsnd * n - call idx%sync() + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') + goto 9999 + end if - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then + n=1 + do_send = (swap_status == psb_comm_status_start_).or.(swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_).or.(swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + call comm_indexes%sync() + + if (debug) write(*,*) my_rank,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Unfinished communication? Something is wrong....') + goto 9999 + end if + end if + call y%new_buffer(ione*size(comm_indexes%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + + rcv_pt = 1+pnti+psb_n_elem_recv_ + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= my_rank)) then + if (debug) write(*,*) my_rank,'Posting receive from',prcid(i),rcv_pt + p2ptag = psb_double_swap_tag + call mpi_irecv(y%combuf(rcv_pt),nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + pnti = pnti + nerv + nesd + 3 + end do + if (debug) write(*,*) my_rank,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = snd_pt + if ((idx_pt < 1) .or. (nesd < 0) .or. (idx_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((idx_pt < 1) .or. (nesd < 0) .or. (idx_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(idx_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait + ! + call y%device_wait() + + if (debug) write(*,*) my_rank,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((nesd>0).and.(proc_to_comm /= my_rank)) then + call mpi_isend(y%combuf(snd_pt),nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) my_rank,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then ! - ! Unfinished communication? Something is wrong.... + ! No matching send? Something is wrong.... ! info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) my_rank,' wait' + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (proc_to_comm /= my_rank)then + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == my_rank) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) my_rank,' scatter' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((idx_pt < 1) .or. (nerv < 0) .or. (idx_pt+max(0,nerv)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter metadata out of bounds') + goto 9999 + end if + if ((rcv_pt < 1) .or. (nerv < 0) .or. (rcv_pt+max(0,nerv)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter combuf bounds error') + goto 9999 + end if + + if (debug) write(*,*)my_rank,' Received from: ',prcid(i),& + & y%combuf(rcv_pt:rcv_pt+nerv-1) + call y%sct(rcv_pt,nerv,comm_indexes,beta) + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Waited for everybody, clean up + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) my_rank,' wait' + call y%device_wait() + if (debug) write(*,*) my_rank,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call y%comm_handle%free(info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) my_rank,' done' end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - rcv_pt = 1+pnti+psb_n_elem_recv_ - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - p2ptag = psb_int_swap_tag - call mpi_irecv(y%combuf(rcv_pt),nerv,& - & psb_mpi_ipk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_iswap_baseline_vect + + + + subroutine psi_iswap_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical :: debug + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + info = psb_success_ + name = 'psi_iswap_neighbor_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor swap') + goto 9999 + end select + + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') + goto 9999 + end if + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (nonblocking)' + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(snd_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + else + neighbor_comm_handle%comm_request = mpi_request_null end if - pnti = pnti + nerv + nesd + 3 - end do - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - idx_pt = snd_pt - call y%gth(idx_pt,nesd,idx) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Then wait - ! - call y%device_wait() + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Ineighbor_alltoallv' + if (buffer_size > 0) then + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (baseline/positional layout) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs_v, & ! positional displacements (match gth layout) + & psb_mpi_ipk_, & + & y%combuf(1), & ! recv buffer (baseline/positional layout) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs_v, & ! positional displacements (match sct layout) + & psb_mpi_ipk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + ! Valid no-op exchange: nothing was posted in START and nothing to wait/scatter. + neighbor_comm_handle%comm_request = mpi_request_null + else + if (neighbor_comm_handle%comm_request == mpi_request_null) then + write(psb_err_unit,*) my_rank, 'DBG: neighbor WAIT but comm_request is NULL; is_initialized=', & + & neighbor_comm_handle%is_initialized + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - p2ptag = psb_int_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + ! Only wait and scatter if there's data + if ((topology_total_send + topology_total_recv) > 0) then + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if - if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),nesd,& - & psb_mpi_ipk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) + ! Scatter received data to local vector positions (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((1+pnti+psb_n_elem_recv_ < 1) .or. (nerv < 0) .or. & + & (1+pnti+psb_n_elem_recv_+max(0,nerv)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter metadata out of bounds') + goto 9999 + end if + if ((rcv_pt < 1) .or. (nerv < 0) .or. (rcv_pt+max(0,nerv)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter combuf bounds error') + goto 9999 + end if + call y%sct(rcv_pt,nerv,comm_indexes,beta) + pnti = pnti + nerv + nesd + 3 + end do + else + ! nothing to wait/scatter end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) goto 9999 end if + if (debug) write(*,*) my_rank,' nbr_vect: done' - pnti = pnti + nerv + nesd + 3 - end do - end if + end if ! do_wait - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_iswap_neighbor_topology_vect + + + + subroutine psi_iswap_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical :: debug + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + info = psb_success_ + debug = .false. + name = 'psi_iswap_neighbor_persistent_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor swap') + goto 9999 + end select + + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') goto 9999 end if - call psb_realloc(totxch,prcid,info) - if (debug) write(*,*) me,' wait' - pnti = 1 - p2ptag = psb_int_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (proc_to_comm /= me)then - if (nesd>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (persistent)' + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid START: persistent neighbor request already in flight') + goto 9999 + end if + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < ione*size(comm_indexes%v)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) goto 9999 end if end if - if (nerv>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Gather send data into combuf using baseline-style gth calls + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data (baseline layout),', topology_total_send,' elems' + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') goto 9999 end if + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(snd_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Lazy persistent-init: build the request once, then reuse with START/WAIT. + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Neighbor_alltoallv_init' + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & ! send buffer + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs_v, & ! positional (baseline layout) + & psb_mpi_r_dpk_, & + & y%combuf(1), & ! recv buffer (baseline layout) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs_v, & ! positional (baseline layout) + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 end if - y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. end if - pnti = pnti + nerv + nesd + 3 - end do - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + end if ! do_start - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(rcv_pt:rcv_pt+nerv-1) - call y%sct(rcv_pt,nerv,idx,beta) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Waited for everybody, clean up - ! - y%comid = mpi_request_null + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + ! Valid no-op exchange: nothing was posted in START and nothing to wait/scatter. + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + ! Only wait and scatter if there's data + if ((topology_total_send + topology_total_recv) > 0) then + ! Wait for the persistent collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on persistent MPI request' + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Scatter received data to local vector positions (baseline-style sct) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data (baseline layout),', topology_total_recv,' elems' + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + rcv_pt = 1+pnti+psb_n_elem_recv_ + if (nerv > 0) then + call y%sct(rcv_pt,nerv,comm_indexes,beta) + end if + pnti = pnti + nerv + nesd + 3 + end do + end if + + call y%device_wait() + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_iswap_neighbor_persistent_topology_vect + + + subroutine psi_iswap_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + + info = psb_success_ + name = 'psi_iswap_rma_pull_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - if (debug) write(*,*) me,' done' - end if + icomm = ctxt%get_mpic() + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for pull mode') + goto 9999 + end select + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) - call psb_erractionrestore(err_act) - return + call comm_indexes%sync() + + ! START phase: build the layout once, prepare the exposed buffer, then issue RMA. + if (do_start) then + buffer_size = total_send + total_recv + + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA pull rank cache allocation') + goto 9999 + end if + end if + + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA pull init_memory_buffer_layout failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + ! Need a larger exposed memory area: recreate the RMA window first, + ! then reallocate combuf and lazily create a new window below. + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + ! Expose combuf once and keep the window around until the descriptor changes. + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send)) + end if + call y%device_wait() + + ! Pull data from each peer with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = total_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA pull') + goto 9999 + end if + if ((recv_pos < 1) .or. (recv_count < 0) .or. (recv_pos+max(0,recv_count)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull local receive bounds error') + goto 9999 + end if + + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count, psb_mpi_ipk_, prc_rank, remote_disp, recv_count, psb_mpi_ipk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter received data into Y. + if (do_wait) then + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send+1:total_send+total_recv), beta) + end if + + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_iswap_rma_pull_vect - return -end subroutine psi_iswap_vidx_vect -! -! -! Subroutine: psi_iswapdata_multivect -! Data exchange among processes. -! -! Takes care of Y an encaspulated multivector. -! -! -subroutine psi_iswapdata_multivect(flag,beta,y,desc_a,work,info,data) + subroutine psi_iswap_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_iswap_rma_push_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for push mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! START phase: identical layout handling, but the remote metadata describes the receive side. + if (do_start) then + buffer_size = total_send + total_recv + + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA put rank cache allocation') + goto 9999 + end if + end if + + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA put ini_memory_buffer_layout') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + ! Need a larger exposed memory area: recreate the RMA window first, + ! then reallocate combuf and lazily create a new window below. + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + ! Keep the window alive across repetitions: it is created once and reused. + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window (prevents isend/irecv ordering issues). + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + ! Push data to each peer; after flush send a P2P notification so target knows data arrived. + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = total_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA push') + goto 9999 + end if + if ((send_pos < 1) .or. (send_count < 0) .or. (send_pos+max(0,send_count)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push local send bounds error') + goto 9999 + end if + + if (send_count > 0) then + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count, psb_mpi_ipk_, prc_rank, remote_disp, send_count, psb_mpi_ipk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send+1:total_send+total_recv), beta) + end if + + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_iswap_rma_push_vect + - use psi_mod, psb_protect_name => psi_iswapdata_multivect - use psb_i_base_multivect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + + ! + ! + ! Subroutine: psi_iswapdata_multivect + ! Data exchange among processes. + ! + ! Takes care of Y an encaspulated multivector. + ! + ! + module subroutine psi_iswapdata_multivect(swap_status,beta,y,desc_a,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_multivect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_), target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + integer(psb_ipk_), intent(in) :: swap_status + class(psb_i_base_multivect_type), intent(inout) :: y + integer(psb_ipk_), intent(in) :: beta + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, data_, err_act - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) + ! communication scheme/status selectors + logical :: baseline, ineighbor_a2av, ineighbor_a2av_persistent - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, my_rank, total_send, total_recv, num_neighbors, data_, err_act + integer(psb_mpk_) :: n, total_send_, total_recv_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=30) :: name - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif + + info = psb_success_ + name = 'psi_iswapdata_multivect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if - call psi_swapdata(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 + if ((swap_status /= psb_comm_status_start_) .and. (swap_status /= psb_comm_status_wait_) & + & .and. (swap_status /= psb_comm_status_unknown_)) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + baseline = .false. + ineighbor_a2av = .false. + ineighbor_a2av_persistent = .false. + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + ineighbor_a2av = .true. + case(psb_comm_persistent_ineighbor_alltoallv_) + ineighbor_a2av_persistent = .true. + case(psb_comm_rma_pull_) + call psi_iswap_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull swap') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_iswap_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push swap') + goto 9999 + end if + case default + baseline = .true. + end select + + if (baseline) then + call psi_iswap_baseline_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline swap') + goto 9999 + end if + else if (ineighbor_a2av) then + call psi_iswap_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor nonblocking swap') + goto 9999 + end if + else if (ineighbor_a2av_persistent) then + call psi_iswap_neighbor_topology_multivect_persistent(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor persistent swap') + goto 9999 + end if + else + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Incompatible swap_status settings: no valid communication mode selected') + goto 9999 + end if - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_iswapdata_multivect + end subroutine psi_iswapdata_multivect -! -! -! Subroutine: psi_iswap_vidx_multivect -! Data exchange among processes. -! -! Takes care of Y an encapsulated multivector. Relies on the gather/scatter methods -! of multivectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_iswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_iswap_vidx_multivect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_i_base_multivect_mod + + +subroutine psi_iswap_baseline_multivect(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -530,100 +1655,107 @@ subroutine psi_iswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_multivect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name + logical :: do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name - info=psb_success_ - name='psi_swap_datav' + info = psb_success_ + name = 'psi_iswap_baseline_multivect' call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) + call psb_info(ctxt,my_rank,np) if (np == -1) then - info=psb_err_context_error_ + info = psb_err_context_error_ call psb_errpush(info,name) goto 9999 endif n = y%get_ncols() - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline multivect swap') + goto 9999 + end select + + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) - totrcv_ = totrcv * n - totsnd_ = totsnd * n + total_recv_ = total_recv * n + total_send_ = total_send * n - call idx%sync() + call comm_indexes%sync() - if (debug) write(*,*) me,'Internal buffer' + if (debug) write(*,*) my_rank,'Internal buffer' if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + info = psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) + if (debug) write(*,*) my_rank,'do_send start' + call y%new_buffer(total_send_+total_recv_,info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) ! First I post all the non blocking receives pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - p2ptag = psb_int_swap_tag - call mpi_irecv(y%combuf(rcv_pt),n*nerv,& - & psb_mpi_ipk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) + if ((nerv>0).and.(proc_to_comm /= my_rank)) then + if (debug) write(*,*) my_rank,'Posting receive from',prcid(i),rcv_pt + p2ptag = psb_double_swap_tag + call mpi_irecv(y%combuf(rcv_pt),n*nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) end if rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do - if (debug) write(*,*) me,' Gather ' + if (debug) write(*,*) my_rank,' Gather ' ! ! Then gather for sending. ! pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call y%gth(idx_pt,snd_pt,nesd,idx) + call y%gth(idx_pt,snd_pt,nesd,comm_indexes) rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 @@ -634,24 +1766,24 @@ subroutine psi_iswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & ! call y%device_wait() - if (debug) write(*,*) me,' isend' + if (debug) write(*,*) my_rank,' isend' ! ! Then send ! pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - p2ptag = psb_int_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),n*nesd,& - & psb_mpi_ipk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + + if ((nesd>0).and.(proc_to_comm /= my_rank)) then + call mpi_isend(y%combuf(snd_pt),n*nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) end if if(iret /= mpi_success) then @@ -666,8 +1798,8 @@ subroutine psi_iswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & end if if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then + if (debug) write(*,*) my_rank,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then ! ! No matching send? Something is wrong.... ! @@ -675,20 +1807,20 @@ subroutine psi_iswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if - call psb_realloc(totxch,prcid,info) + call psb_realloc(num_neighbors,prcid,info) - if (debug) write(*,*) me,' wait' + if (debug) write(*,*) my_rank,' wait' pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - p2ptag = psb_int_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm /= me)then + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + if (proc_to_comm /= my_rank)then if (nesd>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) if(iret /= mpi_success) then info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/iret/)) @@ -696,14 +1828,14 @@ subroutine psi_iswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & end if end if if (nerv>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) if(iret /= mpi_success) then info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/iret/)) goto 9999 end if end if - else if (proc_to_comm == me) then + else if (proc_to_comm == my_rank) then if (nesd /= nerv) then write(psb_err_unit,*) & & 'Fatal error in swapdata: mismatch on self send',& @@ -716,19 +1848,19 @@ subroutine psi_iswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & pnti = pnti + nerv + nesd + 3 end do - if (debug) write(*,*) me,' scatter' + if (debug) write(*,*) my_rank,' scatter' pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+psb_n_elem_recv_ - if (debug) write(0,*)me,' Received from: ',prcid(i),& + if (debug) write(0,*)my_rank,' Received from: ',prcid(i),& & y%combuf(rcv_pt:rcv_pt+n*nerv-1) - call y%sct(idx_pt,rcv_pt,nerv,idx,beta) + call y%sct(idx_pt,rcv_pt,nerv,comm_indexes,beta) rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 @@ -736,21 +1868,23 @@ subroutine psi_iswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & ! ! Waited for com, cleanup comid ! - y%comid = mpi_request_null + baseline_comm_handle%comid = mpi_request_null ! ! Then wait for device ! - if (debug) write(*,*) me,' wait' + if (debug) write(*,*) my_rank,' wait' call y%device_wait() - if (debug) write(*,*) me,' free buffer' + if (debug) write(*,*) my_rank,' free buffer' call y%free_buffer(info) - if (info == 0) call y%free_comid(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if if (info /= 0) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - if (debug) write(*,*) me,' done' + if (debug) write(*,*) my_rank,' done' end if @@ -760,5 +1894,859 @@ subroutine psi_iswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_iswap_vidx_multivect +end subroutine psi_iswap_baseline_multivect + + + +subroutine psi_iswap_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, n + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_iswap_neighbor_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor multivect swap') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (nonblocking)' + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, & + & ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! Gather send data into contiguous send buffer (polymorphic for GPU) + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data,', topology_total_send,' elems' + call y%gth(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(1:total_send_)) + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Ineighbor_alltoallv' + if (buffer_size > 0) then + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(total_send_ + 1), & ! recv buffer + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if ((topology_total_send + topology_total_recv) > 0) then + if (neighbor_comm_handle%comm_request == mpi_request_null) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if ((topology_total_send + topology_total_recv) > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + end if + + ! Scatter received data to local vector positions (polymorphic for GPU) + if ((topology_total_send + topology_total_recv) > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + call y%sct(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(total_send_+1:total_send_+total_recv_), & + & beta) + end if + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return +end subroutine psi_iswap_neighbor_topology_multivect + + + +subroutine psi_iswap_neighbor_topology_multivect_persistent(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, n + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_iswap_neighbor_topology_multivect_persistent' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor multivect swap') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (persistent)' + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid START: persistent neighbor request already in flight') + goto 9999 + end if + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, & + & ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Gather send data into contiguous send buffer (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data,', topology_total_send,' elems' + call y%gth(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(1:total_send_)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Neighbor_alltoallv_init' + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & ! send buffer + & n*neighbor_comm_handle%send_counts, & + & n*neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(total_send_ + 1), & ! recv buffer + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) > 0) then + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + + ! Wait for the persistent collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on persistent MPI request' + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Scatter received data to local vector positions (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + call y%sct(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(total_send_+1:total_send_+total_recv_), & + & beta) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + call y%device_wait() + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return +end subroutine psi_iswap_neighbor_topology_multivect_persistent + + + subroutine psi_iswap_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, total_send_, total_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_iswap_rma_pull_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for pull mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_send_ + total_recv_ + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA pull rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA pull init_memory_buffer_layout failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send_)) + end if + call y%device_wait() + + ! Pull data from each peer with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA pull') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int((remote_base - 1) * n, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count*n, psb_mpi_ipk_, prc_rank, remote_disp, recv_count*n, psb_mpi_ipk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter received data into Y. + if (do_wait) then + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send_+1:total_send_+total_recv_), beta) + end if + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_iswap_rma_pull_multivect + + + subroutine psi_iswap_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, total_send_, total_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_iswap_rma_push_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for push mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_send_ + total_recv_ + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA put rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA put ini_memory_buffer_layout') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send_)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA push') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int((remote_base - 1) * n, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count*n, psb_mpi_ipk_, prc_rank, remote_disp, send_count*n, psb_mpi_ipk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send_+1:total_send_+total_recv_), beta) + end if + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_iswap_rma_push_multivect + + +end submodule psi_i_swapdata_impl diff --git a/base/comm/internals/psi_iswaptran.F90 b/base/comm/internals/psi_iswaptran.F90 index 9f58455a8..bf04fd574 100644 --- a/base/comm/internals/psi_iswaptran.F90 +++ b/base/comm/internals/psi_iswaptran.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -43,7 +43,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D integer(psb_ipk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -59,12 +59,12 @@ ! ! ! Arguments: -! flag - integer Choose the algorithm for data exchange: +! swap_status - integer Choose the algorithm for data exchange: ! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 +! swap_mpi = iand(swap_status,psb_swap_mpi_) /= 0 +! swap_sync = iand(swap_status,psb_swap_sync_) /= 0 +! swap_send = iand(swap_status,psb_swap_send_) /= 0 +! swap_recv = iand(swap_status,psb_swap_recv_) /= 0 ! if (swap_mpi): use underlying MPI_ALLTOALLV. ! if (swap_sync): use PSB_SND and PSB_RCV in ! synchronized pairs @@ -77,10 +77,9 @@ ! ! ! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y - type(psb_i_vect_type) The data area +! beta - real Choose overwrite or sum. +! y - type(psb_d_vect_type) The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -91,13 +90,980 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_iswaptran_vect(flag,beta,y,desc_a,work,info,data) +submodule (psi_i_comm_v_mod) psi_i_swaptran_impl + use psb_base_mod + use psb_comm_factory_mod +contains + module subroutine psi_iswaptran_vect(swap_status,beta,y,desc_a,info,data) - use psi_mod, psb_protect_name => psi_iswaptran_vect - use psb_i_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + type(psb_desc_type),target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, total_send, total_recv, num_neighbors, err_act, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=20) :: name + + info = psb_success_ + name = 'psi_iswaptran_vect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + if( (swap_status /= psb_comm_status_start_).and.(swap_status /= psb_comm_status_wait_)& + & .and.(swap_status /= psb_comm_status_sync_) ) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + ! Set the normalized swap status on the comm handle + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + call psi_itran_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor a2av tran') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_itran_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='persistent neighbor tran') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_itran_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull tran') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_itran_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push tran') + goto 9999 + end if + case default + call psi_itran_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline tran') + goto 9999 + end if + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_iswaptran_vect + + ! + ! + ! Subroutine: psi_itran_baseline_vect + ! Data exchange among processes. + ! + ! Takes care of Y an encapsulated vector. Relies on the gather/scatter methods + ! of vectors. + ! + ! The real workhorse: the outer routine will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_itran_baseline_vect(ctxt,swap_status,beta,y,idx,& + & num_neighbors,total_send,total_recv,comm_handle,info) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_) :: icomm + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name + + info = psb_success_ + name = 'psi_itran_baseline_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline swaptran') + goto 9999 + end select + + n=1 + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + + call idx%sync() + + if (debug) write(*,*) me,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + end if + if (debug) write(*,*) me,'do_send start' + call y%new_buffer(ione*size(idx%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt + call mpi_irecv(y%combuf(snd_pt),nesd,& + & psb_mpi_ipk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + snd_pt = 1 + do i=1, num_neighbors + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + idx_pt = rcv_pt + call y%gth(idx_pt,nerv,idx) + + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait + ! + call y%device_wait() + + if (debug) write(*,*) me,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((nerv>0).and.(proc_to_comm /= me)) then + call mpi_isend(y%combuf(rcv_pt),nerv,& + & psb_mpi_ipk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) me,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then + ! + ! No matching send? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) me,' wait' + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (proc_to_comm /= me)then + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' scatter' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (debug) write(0,*)me,' Received from: ',prcid(i),& + & y%combuf(snd_pt:snd_pt+nesd-1) + call y%sct(snd_pt,nesd,idx,beta) + pnti = pnti + nerv + nesd + 3 + end do + ! + ! Waited for everybody, clean up + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) me,' wait' + call y%device_wait() + if (debug) write(*,*) me,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) me,' done' + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psi_itran_baseline_vect + + + + + subroutine psi_itran_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_itran_neighbor_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor swaptran') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) me,' nbr_vect: starting data exchange' + ! Lazy initialization: build the topology on first call + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) me,' nbr_vect: building topology' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, & + & a_err='neighbor_topology_init') + goto 9999 + end if + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! For transpose exchange: gather recv area first (we will send "recv" data) + if (debug) write(*,*) me,' nbr_tran_vect: gathering recv data,', topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv swapping send/recv arrays + if (debug) write(*,*) me,' nbr_tran_vect: posting MPI_Ineighbor_alltoallv (swapped)' + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (recv_indexes gathered) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_ipk_, & + & y%combuf(topology_total_recv + 1), & ! recv buffer (will contain send_indexes data) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_ipk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if (neighbor_comm_handle%comm_request == mpi_request_null) then + ! No matching start? Something is wrong + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) me,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! For transpose exchange: scatter the data that correspond to peers' send area + if (debug) write(*,*) me,' nbr_tran_vect: scattering send-index data,', topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) me,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_itran_neighbor_topology_vect + + + + + ! + ! + ! + ! + ! Subroutine: psi_iswaptran_multivect + ! Data exchange among processes. + ! + ! Takes care of Y an encaspulated multivector. + ! + ! + module subroutine psi_iswaptran_multivect(swap_status,beta,y,desc_a,info,data) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_multivect_type), intent(inout) :: y + type(psb_desc_type),target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, total_send, total_recv, num_neighbors, err_act, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=20) :: name + + integer(psb_ipk_) :: setflag + + + info = psb_success_ + name = 'psi_iswaptran_multivect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + setflag = swap_status + if (swap_status == psb_swap_start_) then + setflag = psb_comm_status_start_ + else if (swap_status == psb_swap_wait_) then + setflag = psb_comm_status_wait_ + else if ((iand(swap_status, psb_swap_send_) /= 0) .or. (iand(swap_status, psb_swap_recv_) /= 0) .or. & + & (iand(swap_status, psb_swap_mpi_) /= 0) .or. (iand(swap_status, psb_swap_sync_) /= 0)) then + setflag = psb_comm_status_sync_ + end if + + if ((setflag /= psb_comm_status_start_) .and. (setflag /= psb_comm_status_wait_) .and. & + & (setflag /= psb_comm_status_sync_)) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + call y%comm_handle%set_swap_status(setflag, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + call psi_itran_neighbor_topology_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor a2av tran') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_itran_neighbor_persistent_topology_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='persistent neighbor tran') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_itran_rma_pull_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull tran') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_itran_rma_push_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push tran') + goto 9999 + end if + case default + call psi_itran_baseline_multivect(ctxt,setflag,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline tran') + goto 9999 + end if + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_iswaptran_multivect + + subroutine psi_itran_baseline_multivect(ctxt,swap_status,beta,y,idx,& + & num_neighbors,total_send,total_recv,comm_handle,info) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_i_base_multivect_type), intent(inout) :: y + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_) :: icomm + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name + + info = psb_success_ + name = 'psi_itran_vidx_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline multivect swaptran') + goto 9999 + end select + + n = y%get_ncols() + + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + + call idx%sync() + + if (debug) write(*,*) me,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + end if + if (debug) write(*,*) me,'do_send start' + call y%new_buffer(ione*size(idx%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt + call mpi_irecv(y%combuf(snd_pt),n*nesd,& + & psb_mpi_ipk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + do i=1, num_neighbors + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call y%gth(idx_pt,rcv_pt,nerv,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait for device + ! + call y%device_wait() + + if (debug) write(*,*) me,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + if ((nerv>0).and.(proc_to_comm /= me)) then + call mpi_isend(y%combuf(rcv_pt),n*nerv,& + & psb_mpi_ipk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) me,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then + ! + ! No matching send? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) me,' wait' + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + if (proc_to_comm /= me)then + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' scatter' + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + + if (debug) write(0,*)me,' Received from: ',prcid(i),& + & y%combuf(snd_pt:snd_pt+n*nesd-1) + call y%sct(idx_pt,snd_pt,nesd,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! + ! Waited for com, cleanup comid + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) me,' wait' + call y%device_wait() + if (debug) write(*,*) me,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) me,' done' + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psi_itran_baseline_multivect + + + subroutine psi_itran_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -106,85 +1072,170 @@ subroutine psi_iswaptran_vect(flag,beta,y,desc_a,work,info,data) include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_vect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_itran_neighbor_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor multivect swaptran') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) me,' nbr_vect: starting data exchange' + ! Lazy initialization: build the topology on first call + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) me,' nbr_vect: building topology' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, & + & a_err='neighbor_topology_init') + goto 9999 + end if + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! For transpose exchange: gather recv area first (we will send "recv" data) + if (debug) write(*,*) me,' nbr_tran_vect: gathering recv data,', topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv swapping send/recv arrays + if (debug) write(*,*) me,' nbr_tran_vect: posting MPI_Ineighbor_alltoallv (swapped)' + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (recv_indexes gathered) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_ipk_, & + & y%combuf(topology_total_recv + 1), & ! recv buffer (will contain send_indexes data) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_ipk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if (neighbor_comm_handle%comm_request == mpi_request_null) then + ! No matching start? Something is wrong + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) me,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! For transpose exchange: scatter the data that correspond to peers' send area + if (debug) write(*,*) me,' nbr_tran_vect: scattering send-index data,', topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) me,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_iswaptran_vect + end subroutine psi_itran_neighbor_topology_multivect -! -! -! Subroutine: psi_itran_vidx_vect -! Data exchange among processes. -! -! Takes care of Y an encapsulated vector. Relies on the gather/scatter methods -! of vectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_itran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_itran_vidx_vect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_i_base_vect_mod + + + subroutine psi_itran_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -193,345 +1244,661 @@ subroutine psi_itran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_vect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - call idx%sync() - - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) - goto 9999 - end if + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: icomm, np, my_rank, iret + integer(psb_mpk_) :: p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + info = psb_success_ + name = 'psi_itran_neighbor_persistent_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor swaptran') + goto 9999 + end select + + if (swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='psb_comm_status_unknown_ not allowed in persistent neighbor swaptran') + goto 9999 end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - p2ptag = psb_int_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - call mpi_irecv(y%combuf(snd_pt),nesd,& - & psb_mpi_ipk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) - end if - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - idx_pt = rcv_pt - call y%gth(idx_pt,nerv,idx) - - pnti = pnti + nerv + nesd + 3 - end do - - ! - ! Then wait - ! - call y%device_wait() - - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - p2ptag = psb_int_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),nerv,& - & psb_mpi_ipk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid START: persistent neighbor request already in flight') goto 9999 end if + if (.not. neighbor_comm_handle%is_initialized) then + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Transpose: gather from recv_indexes (we "send" recv data) + if (debug) write(*,*) my_rank,' tran_persistent_vect: gathering recv data,',topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if - pnti = pnti + nerv + nesd + 3 - end do - end if + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + ! Transpose: swap send/recv counts in alltoallv_init + ! send = recv_indexes data with recv_counts/displs + ! recv = into send_indexes area with send_counts/displs + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_ipk_, & + & y%combuf(topology_total_recv + 1), & + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_ipk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + end if ! do_start + + if (do_wait) then + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + if ((topology_total_send + topology_total_recv) > 0) then + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Transpose: scatter to send_indexes + if (debug) write(*,*) my_rank,' tran_persistent_vect: scattering to send_indexes,',topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + end if + + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_itran_neighbor_persistent_topology_vect + + + subroutine psi_itran_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! Effective sizes for transpose: + ! eff_send = total_recv (we expose recv_indexes data) + ! eff_recv = total_send (we GET into the send_indexes area) + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_itran_rma_pull_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - call psb_realloc(totxch,prcid,info) - - if (debug) write(*,*) me,' wait' - pnti = 1 - p2ptag = psb_int_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (proc_to_comm /= me)then - if (nerv>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + icomm = ctxt%get_mpic() + eff_send = total_recv + eff_recv = total_send + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran pull') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = eff_send + eff_recv + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran pull rank cache allocation') goto 9999 end if end if - if (nesd>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran pull init_memory_buffer_layout_tran failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+nesd-1) - call y%sct(snd_pt,nesd,idx,beta) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Waited for everybody, clean up - ! - y%comid = mpi_request_null - - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if (debug) write(*,*) me,' done' - end if - + end if - call psb_erractionrestore(err_act) - return + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + ! Transpose: gather recv_indexes data into combuf(1:eff_send) + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:eff_send)) + end if + call y%device_wait() + + ! Pull from each peer's recv_indexes area with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = eff_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran pull') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count, psb_mpi_ipk_, prc_rank, remote_disp, recv_count, psb_mpi_ipk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if ! do_start - return + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter into send_indexes. + if (do_wait) then + ! Transpose: scatter to send_indexes (peer_recv_indexes in tran init = actual send_indexes) + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(eff_send+1:eff_send+eff_recv), beta) + end if + call y%device_wait() + end if ! do_wait -end subroutine psi_itran_vidx_vect + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_itran_rma_pull_vect -! -! -! -! -! Subroutine: psi_iswaptran_multivect -! Data exchange among processes. -! -! Takes care of Y an encaspulated multivector. -! -! -subroutine psi_iswaptran_multivect(flag,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_iswaptran_multivect - use psb_i_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + subroutine psi_itran_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_multivect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_itran_rma_push_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + eff_send = total_recv + eff_recv = total_send + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran push') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = eff_send + eff_recv + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran push rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran push init_memory_buffer_layout_tran failure') + goto 9999 + end if + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + ! Transpose: gather recv_indexes data into combuf(1:eff_send) + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:eff_send)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + ! Push our recv_indexes data to each peer's send_indexes area; notify after flush. + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = eff_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran push') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count, psb_mpi_ipk_, prc_rank, remote_disp, send_count, psb_mpi_ipk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter into send_indexes. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + ! Transpose: scatter to send_indexes (peer_recv_indexes in tran init = actual send_indexes) + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(eff_send+1:eff_send+eff_recv), beta) + end if + call y%device_wait() + end if ! do_wait + call psb_erractionrestore(err_act) return - end subroutine psi_iswaptran_multivect +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_itran_rma_push_vect -! -! -! Subroutine: psi_itran_vidx_multivect -! Data exchange among processes. -! -! Takes care of Y an encapsulated multivector. Relies on the gather/scatter methods -! of multivectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_itran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_itran_vidx_multivect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_i_base_multivect_mod + + subroutine psi_itran_neighbor_persistent_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -540,243 +1907,661 @@ subroutine psi_itran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_multivect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n = y%get_ncols() - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - call idx%sync() - - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) - goto 9999 - end if + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: icomm, np, my_rank, iret, n + integer(psb_mpk_) :: p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + info = psb_success_ + name = 'psi_itran_neighbor_persistent_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor multivect swaptran') + goto 9999 + end select + + if (swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='psb_comm_status_unknown_ not allowed in persistent neighbor multivect swaptran') + goto 9999 end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_int_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt - call mpi_irecv(y%combuf(snd_pt),n*nesd,& - & psb_mpi_ipk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call y%gth(idx_pt,rcv_pt,nerv,idx) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - ! - ! Then wait for device - ! - call y%device_wait() - - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! - - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_int_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),n*nerv,& - & psb_mpi_ipk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid START: persistent neighbor request already in flight') goto 9999 end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - end if - - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + if (.not. neighbor_comm_handle%is_initialized) then + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Transpose: gather from recv_indexes + if (debug) write(*,*) my_rank,' tran_persistent_mv: gathering recv data,',topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:total_recv_)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + ! Transpose: swap send/recv in alltoallv_init + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_ipk_, & + & y%combuf(total_recv_ + 1), & + & n*neighbor_comm_handle%send_counts, & + & n*neighbor_comm_handle%send_displs, & + & psb_mpi_ipk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + end if ! do_start + + if (do_wait) then + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + + if ((topology_total_send + topology_total_recv) == 0) then + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + if ((topology_total_send + topology_total_recv) > 0) then + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Transpose: scatter to send_indexes + if (debug) write(*,*) my_rank,' tran_persistent_mv: scattering to send_indexes,',topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(total_recv_+1:total_recv_+total_send_), & + & beta) + end if + + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_itran_neighbor_persistent_topology_multivect + + + subroutine psi_itran_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv, total_eff_send_, total_eff_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_itran_rma_pull_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - call psb_realloc(totxch,prcid,info) - - if (debug) write(*,*) me,' wait' - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_int_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm /= me)then - if (nerv>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + icomm = ctxt%get_mpic() + n = y%get_ncols() + eff_send = total_recv + eff_recv = total_send + total_eff_send_ = eff_send * n + total_eff_recv_ = eff_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran pull multivect') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_eff_send_ + total_eff_recv_ + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran pull multivect rank allocation') goto 9999 end if end if - if (nesd>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran pull multivect init_memory_buffer_layout_tran') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+n*nesd-1) - call y%sct(idx_pt,snd_pt,nesd,idx,beta) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! - ! Waited for com, cleanup comid - ! - y%comid = mpi_request_null - - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_eff_send_)) + end if + call y%device_wait() + + ! Pull from each peer's recv_indexes area with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_eff_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran pull multivect') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int((remote_base - 1)*n, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count*n, psb_mpi_ipk_, prc_rank, remote_disp, recv_count*n, psb_mpi_ipk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran pull multivect self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter into send_indexes. + if (do_wait) then + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, & + & y%combuf(total_eff_send_+1:total_eff_send_+total_eff_recv_), beta) + end if + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_itran_rma_pull_multivect + + + subroutine psi_itran_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv, total_eff_send_, total_eff_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_itran_rma_push_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - if (debug) write(*,*) me,' done' - end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + eff_send = total_recv + eff_recv = total_send + total_eff_send_ = eff_send * n + total_eff_recv_ = eff_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran push multivect') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_eff_send_ + total_eff_recv_ + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran push multivect rank allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran push multivect init_memory_buffer_layout_tran') + goto 9999 + end if + end if + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if - call psb_erractionrestore(err_act) - return + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_eff_send_)) + end if + call y%device_wait() - return + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do -end subroutine psi_itran_vidx_multivect + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_eff_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran push multivect') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int((remote_base - 1)*n, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count*n, psb_mpi_ipk_, prc_rank, remote_disp, send_count*n, psb_mpi_ipk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran push multivect self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter into send_indexes. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, & + & y%combuf(total_eff_send_+1:total_eff_send_+total_eff_recv_), beta) + end if + call y%device_wait() + end if ! do_wait + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_itran_rma_push_multivect +end submodule psi_i_swaptran_impl diff --git a/base/comm/internals/psi_lovrl_restr.f90 b/base/comm/internals/psi_lovrl_restr.f90 index d3f6c9137..dd2b77dd7 100644 --- a/base/comm/internals/psi_lovrl_restr.f90 +++ b/base/comm/internals/psi_lovrl_restr.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,90 +35,90 @@ ! ! ! -subroutine psi_lovrl_restr_vect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_lovrl_restr_vect - use psb_l_base_vect_mod - - implicit none - - class(psb_l_base_vect_type) :: x - integer(psb_lpk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_lovrl_restr_vect' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,lzero) - - call psb_erractionrestore(err_act) - return +submodule (psi_l_comm_v_mod) psi_l_ovrl_restr_v_impl + use psb_base_mod +contains + module subroutine psi_lovrl_restr_vect(x,xs,desc_a,info) + + implicit none + + class(psb_l_base_vect_type) :: x + integer(psb_lpk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_lovrl_restr_vect' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,lzero) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_lovrl_restr_vect + return + end subroutine psi_lovrl_restr_vect -subroutine psi_lovrl_restr_multivect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_lovrl_restr_multivect - use psb_l_base_vect_mod + module subroutine psi_lovrl_restr_multivect(x,xs,desc_a,info) - implicit none + implicit none - class(psb_l_base_multivect_type) :: x - integer(psb_lpk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + class(psb_l_base_multivect_type) :: x + integer(psb_lpk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz,nc - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz,nc + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err - name='psi_lovrl_restr_mv' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_lovrl_restr_mv' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) - call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,lzero) + isz = size(desc_a%ovrlap_elem,1) + call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,lzero) - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_lovrl_restr_multivect + return + end subroutine psi_lovrl_restr_multivect +end submodule psi_l_ovrl_restr_v_impl diff --git a/base/comm/internals/psi_lovrl_save.f90 b/base/comm/internals/psi_lovrl_save.f90 index 0eb623dac..2b5b53779 100644 --- a/base/comm/internals/psi_lovrl_save.f90 +++ b/base/comm/internals/psi_lovrl_save.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,103 +34,101 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_lovrl_save_vect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_lovrl_save_vect - use psb_realloc_mod - use psb_l_base_vect_mod - - implicit none - - class(psb_l_base_vect_type) :: x - integer(psb_lpk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) - - call psb_erractionrestore(err_act) - return +submodule (psi_l_comm_v_mod) psi_l_ovrl_save_v_impl + use psb_base_mod +contains + module subroutine psi_lovrl_save_vect(x,xs,desc_a,info) + + implicit none + + class(psb_l_base_vect_type) :: x + integer(psb_lpk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_lovrl_save_vect - -subroutine psi_lovrl_save_multivect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_lovrl_save_multivect - use psb_realloc_mod - use psb_l_base_vect_mod - - implicit none - - class(psb_l_base_multivect_type) :: x - integer(psb_lpk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, nc - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = x%get_ncols() - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_lovrl_save_vect + + module subroutine psi_lovrl_save_multivect(x,xs,desc_a,info) + + implicit none + + class(psb_l_base_multivect_type) :: x + integer(psb_lpk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, nc + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = x%get_ncols() + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_lovrl_save_multivect + return + end subroutine psi_lovrl_save_multivect +end submodule psi_l_ovrl_save_v_impl diff --git a/base/comm/internals/psi_lovrl_upd.f90 b/base/comm/internals/psi_lovrl_upd.f90 index 1371e02b2..a14f418b6 100644 --- a/base/comm/internals/psi_lovrl_upd.f90 +++ b/base/comm/internals/psi_lovrl_upd.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -36,169 +36,167 @@ ! ! ! -subroutine psi_lovrl_upd_vect(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_lovrl_upd_vect - use psb_realloc_mod - use psb_l_base_vect_mod - - implicit none - - class(psb_l_base_vect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - integer(psb_lpk_), allocatable :: xs(:) - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, nx, ndm - integer(psb_ipk_) :: err_act, i, idx - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - - name='psi_lovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - nx = size(desc_a%ovrlap_elem,1) - call psb_realloc(nx,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_Dealloc_ - call psb_errpush(info,name) - goto 9999 - end if - - if (update /= psb_sum_) then - call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) - ! switch on update type - - select case (update) - case(psb_square_root_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i) = xs(i)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i) = xs(i)/real(ndm) - end do - case(psb_setzero_) - do i=1,nx - if (me /= desc_a%ovrlap_elem(i,3))& - & xs(i) = lzero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) +submodule (psi_l_comm_v_mod) psi_l_ovrl_upd_v_impl + use psb_base_mod +contains + module subroutine psi_lovrl_upd_vect(x,desc_a,update,info) + + implicit none + + class(psb_l_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_lpk_), allocatable :: xs(:) + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, nx, ndm + integer(psb_ipk_) :: err_act, i, idx + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + + name='psi_lovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end select - call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,lzero) - end if - - call psb_erractionrestore(err_act) - return + endif + nx = size(desc_a%ovrlap_elem,1) + call psb_realloc(nx,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_Dealloc_ + call psb_errpush(info,name) + goto 9999 + end if + + if (update /= psb_sum_) then + call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) + ! switch on update type + + select case (update) + case(psb_square_root_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i) = xs(i)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i) = xs(i)/real(ndm) + end do + case(psb_setzero_) + do i=1,nx + if (me /= desc_a%ovrlap_elem(i,3))& + & xs(i) = lzero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,lzero) + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_lovrl_upd_vect - -subroutine psi_lovrl_upd_multivect(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_lovrl_upd_multivect - use psb_realloc_mod - use psb_l_base_vect_mod - - implicit none - - class(psb_l_base_multivect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - integer(psb_lpk_), allocatable :: xs(:,:) - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, ndm, nx, nc - integer(psb_ipk_) :: err_act, i, idx - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - - name='psi_lovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - nx = size(desc_a%ovrlap_elem,1) - nc = x%get_ncols() - call psb_realloc(nx,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_Dealloc_ - call psb_errpush(info,name) - goto 9999 - end if - - if (update /= psb_sum_) then - call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) - ! switch on update type - - select case (update) - case(psb_square_root_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i,:) = xs(i,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i,:) = xs(i,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,nx - if (me /= desc_a%ovrlap_elem(i,3))& - & xs(i,:) = lzero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) + return + end subroutine psi_lovrl_upd_vect + + module subroutine psi_lovrl_upd_multivect(x,desc_a,update,info) + + implicit none + + class(psb_l_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_lpk_), allocatable :: xs(:,:) + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, ndm, nx, nc + integer(psb_ipk_) :: err_act, i, idx + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + + name='psi_lovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end select - call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,lzero) - end if - - call psb_erractionrestore(err_act) - return + endif + nx = size(desc_a%ovrlap_elem,1) + nc = x%get_ncols() + call psb_realloc(nx,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_Dealloc_ + call psb_errpush(info,name) + goto 9999 + end if + + if (update /= psb_sum_) then + call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) + ! switch on update type + + select case (update) + case(psb_square_root_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i,:) = xs(i,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i,:) = xs(i,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,nx + if (me /= desc_a%ovrlap_elem(i,3))& + & xs(i,:) = lzero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,lzero) + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_lovrl_upd_multivect + return + end subroutine psi_lovrl_upd_multivect +end submodule psi_l_ovrl_upd_v_impl diff --git a/base/comm/internals/psi_lswapdata.F90 b/base/comm/internals/psi_lswapdata.F90 index 2d819ae9e..7eddab1ce 100644 --- a/base/comm/internals/psi_lswapdata.F90 +++ b/base/comm/internals/psi_lswapdata.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,7 +41,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D integer(psb_lpk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -53,32 +53,22 @@ ! is scattered in the owned indices, and BETA=1. ! The first routine picks the desired exchange index list and passes it to the second. ! This version works on encapsulated vectors, and uses their methods to do GTH and SCT, -! so that special versions (i.e. GPU vectors can override them +! so that special versions (i.e. GPU vectors can override them) ! ! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) +! swap_status - integer Swap status selector. +! It is interpreted as a communication status: +! psb_comm_status_start_ -> START phase +! psb_comm_status_wait_ -> WAIT phase +! psb_comm_status_unknown_ -> START+WAIT +! The communication scheme is selected from +! y%comm_handle%comm_type. ! ! ! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. +! beta - real Choose overwrite or sum. ! y - type(psb_@x@_vect_type) The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do -! our own internal allocation. +! desc_a - type(psb_desc_type). The communication descriptor. ! info - integer. return code. ! data - integer which list is to be used to exchange data ! default psb_comm_halo_ @@ -89,101 +79,156 @@ ! ! ! -subroutine psi_lswapdata_vect(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_lswapdata_vect - use psb_l_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +submodule (psi_l_comm_v_mod) psi_l_swapdata_impl + use psb_desc_const_mod, only: psb_swap_start_, psb_swap_wait_ + use psb_base_mod + use psb_error_mod, only: psb_get_debug_level, psb_get_debug_unit, psb_debug_ext_ + use psb_comm_schemes_mod, only: psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_, psb_comm_rma_pull_, psb_comm_rma_push_, & + & psb_comm_handle_type + use psb_comm_rma_mod, only: psb_comm_rma_handle + use psb_comm_factory_mod + +contains + + module subroutine psi_lswapdata_vect(swap_status,beta,y,desc_a,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_vect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_), target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + integer(psb_ipk_), intent(in) :: swap_status + class(psb_l_base_vect_type), intent(inout) :: y + integer(psb_lpk_), intent(in) :: beta + type(psb_desc_type), target :: desc_a ! TODO: should this be intent(in)? + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, data_, err_act - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, my_rank, total_send, total_recv, num_neighbors, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + ! communication scheme/status selectors + logical :: baseline, ineighbor_a2av, ineighbor_a2av_persistent - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif + ! error handling variables + integer(psb_ipk_) :: err_act + character(len=30) :: name + logical :: debug - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if + info = psb_success_ + name = 'psi_lswapdata_vect' + call psb_erractionsave(err_act) - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if + debug = .false. - call psi_swapdata(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 + ctxt = desc_a%get_context() - call psb_erractionrestore(err_act) - return + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='desc_a%get_list_p') + goto 9999 + end if + + + if( (swap_status /= psb_comm_status_start_).and.(swap_status /= psb_comm_status_wait_)& + & .and.(swap_status /= psb_comm_status_sync_) ) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + ! Set the normalized swap status on the comm handle + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + if(debug .eqv. .true.) then + write(0,'(a,i0,a,i0)') 'DBG_DISPATCH comm_type=',y%comm_handle%comm_type,' desc_a%comm_type=',desc_a%comm_type + endif + select case(y%comm_handle%comm_type) + case(psb_comm_isend_irecv_) + call psi_lswap_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline swap') + goto 9999 + end if + case(psb_comm_ineighbor_alltoallv_) + call psi_lswap_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,& + & total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor nonblocking swap') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_lswap_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,& + & total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor persistent swap') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_lswap_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull swap') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_lswap_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push swap') + goto 9999 + end if + case default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Incompatible swap_status settings: no valid communication mode selected') + goto 9999 + end select + + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_lswapdata_vect + end subroutine psi_lswapdata_vect -! -! -! Subroutine: psi_lswap_vidx_vect -! Data exchange among processes. -! -! Takes care of Y an exanspulated vector. Relies on the gather/scatter methods -! of vectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_lswap_vidx_vect(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_lswap_vidx_vect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_l_base_vect_mod + subroutine psi_lswap_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -192,336 +237,1416 @@ subroutine psi_lswap_vidx_vect(ctxt,icomm,flag,beta,y,idx, & include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_vect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size),& + & iret, nesd, nerv + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti, n + logical :: do_send,do_recv + logical, parameter :: usersend=.false. + logical :: debug + character(len=20) :: name + + info = psb_success_ + name = 'psi_lswap_baseline_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - ! locals - integer(psb_mpk_) :: np, me - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size),& - & iret, nesd, nerv - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti, n - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + icomm = ctxt%get_mpic() - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline swap') + goto 9999 + end select - totrcv_ = totrcv * n - totsnd_ = totsnd * n - call idx%sync() + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') + goto 9999 + end if - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then + n=1 + do_send = (swap_status == psb_comm_status_start_).or.(swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_).or.(swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + call comm_indexes%sync() + + if (debug) write(*,*) my_rank,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Unfinished communication? Something is wrong....') + goto 9999 + end if + end if + call y%new_buffer(ione*size(comm_indexes%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + + rcv_pt = 1+pnti+psb_n_elem_recv_ + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= my_rank)) then + if (debug) write(*,*) my_rank,'Posting receive from',prcid(i),rcv_pt + p2ptag = psb_double_swap_tag + call mpi_irecv(y%combuf(rcv_pt),nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + pnti = pnti + nerv + nesd + 3 + end do + if (debug) write(*,*) my_rank,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = snd_pt + if ((idx_pt < 1) .or. (nesd < 0) .or. (idx_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((idx_pt < 1) .or. (nesd < 0) .or. (idx_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(idx_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait + ! + call y%device_wait() + + if (debug) write(*,*) my_rank,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((nesd>0).and.(proc_to_comm /= my_rank)) then + call mpi_isend(y%combuf(snd_pt),nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) my_rank,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then ! - ! Unfinished communication? Something is wrong.... + ! No matching send? Something is wrong.... ! info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) my_rank,' wait' + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (proc_to_comm /= my_rank)then + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == my_rank) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) my_rank,' scatter' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((idx_pt < 1) .or. (nerv < 0) .or. (idx_pt+max(0,nerv)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter metadata out of bounds') + goto 9999 + end if + if ((rcv_pt < 1) .or. (nerv < 0) .or. (rcv_pt+max(0,nerv)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter combuf bounds error') + goto 9999 + end if + + if (debug) write(*,*)my_rank,' Received from: ',prcid(i),& + & y%combuf(rcv_pt:rcv_pt+nerv-1) + call y%sct(rcv_pt,nerv,comm_indexes,beta) + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Waited for everybody, clean up + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) my_rank,' wait' + call y%device_wait() + if (debug) write(*,*) my_rank,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call y%comm_handle%free(info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) my_rank,' done' end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - rcv_pt = 1+pnti+psb_n_elem_recv_ - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - p2ptag = psb_long_swap_tag - call mpi_irecv(y%combuf(rcv_pt),nerv,& - & psb_mpi_lpk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_lswap_baseline_vect + + + + subroutine psi_lswap_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical :: debug + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + info = psb_success_ + name = 'psi_lswap_neighbor_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor swap') + goto 9999 + end select + + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') + goto 9999 + end if + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (nonblocking)' + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(snd_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + else + neighbor_comm_handle%comm_request = mpi_request_null end if - pnti = pnti + nerv + nesd + 3 - end do - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - idx_pt = snd_pt - call y%gth(idx_pt,nesd,idx) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Then wait - ! - call y%device_wait() + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Ineighbor_alltoallv' + if (buffer_size > 0) then + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (baseline/positional layout) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs_v, & ! positional displacements (match gth layout) + & psb_mpi_lpk_, & + & y%combuf(1), & ! recv buffer (baseline/positional layout) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs_v, & ! positional displacements (match sct layout) + & psb_mpi_lpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + ! Valid no-op exchange: nothing was posted in START and nothing to wait/scatter. + neighbor_comm_handle%comm_request = mpi_request_null + else + if (neighbor_comm_handle%comm_request == mpi_request_null) then + write(psb_err_unit,*) my_rank, 'DBG: neighbor WAIT but comm_request is NULL; is_initialized=', & + & neighbor_comm_handle%is_initialized + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - p2ptag = psb_long_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + ! Only wait and scatter if there's data + if ((topology_total_send + topology_total_recv) > 0) then + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if - if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),nesd,& - & psb_mpi_lpk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) + ! Scatter received data to local vector positions (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((1+pnti+psb_n_elem_recv_ < 1) .or. (nerv < 0) .or. & + & (1+pnti+psb_n_elem_recv_+max(0,nerv)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter metadata out of bounds') + goto 9999 + end if + if ((rcv_pt < 1) .or. (nerv < 0) .or. (rcv_pt+max(0,nerv)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter combuf bounds error') + goto 9999 + end if + call y%sct(rcv_pt,nerv,comm_indexes,beta) + pnti = pnti + nerv + nesd + 3 + end do + else + ! nothing to wait/scatter end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) goto 9999 end if + if (debug) write(*,*) my_rank,' nbr_vect: done' - pnti = pnti + nerv + nesd + 3 - end do - end if + end if ! do_wait - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_lswap_neighbor_topology_vect + + + + subroutine psi_lswap_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical :: debug + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + info = psb_success_ + debug = .false. + name = 'psi_lswap_neighbor_persistent_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor swap') + goto 9999 + end select + + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') goto 9999 end if - call psb_realloc(totxch,prcid,info) - if (debug) write(*,*) me,' wait' - pnti = 1 - p2ptag = psb_long_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (proc_to_comm /= me)then - if (nesd>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (persistent)' + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid START: persistent neighbor request already in flight') + goto 9999 + end if + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < ione*size(comm_indexes%v)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) goto 9999 end if end if - if (nerv>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Gather send data into combuf using baseline-style gth calls + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data (baseline layout),', topology_total_send,' elems' + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') goto 9999 end if + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(snd_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Lazy persistent-init: build the request once, then reuse with START/WAIT. + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Neighbor_alltoallv_init' + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & ! send buffer + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs_v, & ! positional (baseline layout) + & psb_mpi_r_dpk_, & + & y%combuf(1), & ! recv buffer (baseline layout) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs_v, & ! positional (baseline layout) + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 end if - y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. end if - pnti = pnti + nerv + nesd + 3 - end do - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + end if ! do_start - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(rcv_pt:rcv_pt+nerv-1) - call y%sct(rcv_pt,nerv,idx,beta) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Waited for everybody, clean up - ! - y%comid = mpi_request_null + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + ! Valid no-op exchange: nothing was posted in START and nothing to wait/scatter. + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + ! Only wait and scatter if there's data + if ((topology_total_send + topology_total_recv) > 0) then + ! Wait for the persistent collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on persistent MPI request' + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Scatter received data to local vector positions (baseline-style sct) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data (baseline layout),', topology_total_recv,' elems' + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + rcv_pt = 1+pnti+psb_n_elem_recv_ + if (nerv > 0) then + call y%sct(rcv_pt,nerv,comm_indexes,beta) + end if + pnti = pnti + nerv + nesd + 3 + end do + end if + + call y%device_wait() + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_lswap_neighbor_persistent_topology_vect + + + subroutine psi_lswap_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + + info = psb_success_ + name = 'psi_lswap_rma_pull_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - if (debug) write(*,*) me,' done' - end if + icomm = ctxt%get_mpic() + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for pull mode') + goto 9999 + end select + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) - call psb_erractionrestore(err_act) - return + call comm_indexes%sync() + + ! START phase: build the layout once, prepare the exposed buffer, then issue RMA. + if (do_start) then + buffer_size = total_send + total_recv + + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA pull rank cache allocation') + goto 9999 + end if + end if + + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA pull init_memory_buffer_layout failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + ! Need a larger exposed memory area: recreate the RMA window first, + ! then reallocate combuf and lazily create a new window below. + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + ! Expose combuf once and keep the window around until the descriptor changes. + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send)) + end if + call y%device_wait() + + ! Pull data from each peer with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = total_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA pull') + goto 9999 + end if + if ((recv_pos < 1) .or. (recv_count < 0) .or. (recv_pos+max(0,recv_count)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull local receive bounds error') + goto 9999 + end if + + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count, psb_mpi_lpk_, prc_rank, remote_disp, recv_count, psb_mpi_lpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter received data into Y. + if (do_wait) then + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send+1:total_send+total_recv), beta) + end if + + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_lswap_rma_pull_vect - return -end subroutine psi_lswap_vidx_vect -! -! -! Subroutine: psi_lswapdata_multivect -! Data exchange among processes. -! -! Takes care of Y an encaspulated multivector. -! -! -subroutine psi_lswapdata_multivect(flag,beta,y,desc_a,work,info,data) + subroutine psi_lswap_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_lswap_rma_push_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for push mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! START phase: identical layout handling, but the remote metadata describes the receive side. + if (do_start) then + buffer_size = total_send + total_recv + + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA put rank cache allocation') + goto 9999 + end if + end if + + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA put ini_memory_buffer_layout') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + ! Need a larger exposed memory area: recreate the RMA window first, + ! then reallocate combuf and lazily create a new window below. + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + ! Keep the window alive across repetitions: it is created once and reused. + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window (prevents isend/irecv ordering issues). + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + ! Push data to each peer; after flush send a P2P notification so target knows data arrived. + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = total_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA push') + goto 9999 + end if + if ((send_pos < 1) .or. (send_count < 0) .or. (send_pos+max(0,send_count)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push local send bounds error') + goto 9999 + end if + + if (send_count > 0) then + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count, psb_mpi_lpk_, prc_rank, remote_disp, send_count, psb_mpi_lpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send+1:total_send+total_recv), beta) + end if + + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_lswap_rma_push_vect + - use psi_mod, psb_protect_name => psi_lswapdata_multivect - use psb_l_base_multivect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + + ! + ! + ! Subroutine: psi_lswapdata_multivect + ! Data exchange among processes. + ! + ! Takes care of Y an encaspulated multivector. + ! + ! + module subroutine psi_lswapdata_multivect(swap_status,beta,y,desc_a,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_multivect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_), target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + integer(psb_ipk_), intent(in) :: swap_status + class(psb_l_base_multivect_type), intent(inout) :: y + integer(psb_lpk_), intent(in) :: beta + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, data_, err_act - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) + ! communication scheme/status selectors + logical :: baseline, ineighbor_a2av, ineighbor_a2av_persistent - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, my_rank, total_send, total_recv, num_neighbors, data_, err_act + integer(psb_mpk_) :: n, total_send_, total_recv_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=30) :: name - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif + + info = psb_success_ + name = 'psi_lswapdata_multivect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if - call psi_swapdata(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 + if ((swap_status /= psb_comm_status_start_) .and. (swap_status /= psb_comm_status_wait_) & + & .and. (swap_status /= psb_comm_status_unknown_)) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + baseline = .false. + ineighbor_a2av = .false. + ineighbor_a2av_persistent = .false. + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + ineighbor_a2av = .true. + case(psb_comm_persistent_ineighbor_alltoallv_) + ineighbor_a2av_persistent = .true. + case(psb_comm_rma_pull_) + call psi_lswap_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull swap') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_lswap_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push swap') + goto 9999 + end if + case default + baseline = .true. + end select + + if (baseline) then + call psi_lswap_baseline_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline swap') + goto 9999 + end if + else if (ineighbor_a2av) then + call psi_lswap_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor nonblocking swap') + goto 9999 + end if + else if (ineighbor_a2av_persistent) then + call psi_lswap_neighbor_topology_multivect_persistent(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor persistent swap') + goto 9999 + end if + else + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Incompatible swap_status settings: no valid communication mode selected') + goto 9999 + end if - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_lswapdata_multivect + end subroutine psi_lswapdata_multivect -! -! -! Subroutine: psi_lswap_vidx_multivect -! Data exchange among processes. -! -! Takes care of Y an encapsulated multivector. Relies on the gather/scatter methods -! of multivectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_lswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_lswap_vidx_multivect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_l_base_multivect_mod + + +subroutine psi_lswap_baseline_multivect(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -530,100 +1655,107 @@ subroutine psi_lswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_multivect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name + logical :: do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name - info=psb_success_ - name='psi_swap_datav' + info = psb_success_ + name = 'psi_lswap_baseline_multivect' call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) + call psb_info(ctxt,my_rank,np) if (np == -1) then - info=psb_err_context_error_ + info = psb_err_context_error_ call psb_errpush(info,name) goto 9999 endif n = y%get_ncols() - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline multivect swap') + goto 9999 + end select + + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) - totrcv_ = totrcv * n - totsnd_ = totsnd * n + total_recv_ = total_recv * n + total_send_ = total_send * n - call idx%sync() + call comm_indexes%sync() - if (debug) write(*,*) me,'Internal buffer' + if (debug) write(*,*) my_rank,'Internal buffer' if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + info = psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) + if (debug) write(*,*) my_rank,'do_send start' + call y%new_buffer(total_send_+total_recv_,info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) ! First I post all the non blocking receives pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - p2ptag = psb_long_swap_tag - call mpi_irecv(y%combuf(rcv_pt),n*nerv,& - & psb_mpi_lpk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) + if ((nerv>0).and.(proc_to_comm /= my_rank)) then + if (debug) write(*,*) my_rank,'Posting receive from',prcid(i),rcv_pt + p2ptag = psb_double_swap_tag + call mpi_irecv(y%combuf(rcv_pt),n*nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) end if rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do - if (debug) write(*,*) me,' Gather ' + if (debug) write(*,*) my_rank,' Gather ' ! ! Then gather for sending. ! pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call y%gth(idx_pt,snd_pt,nesd,idx) + call y%gth(idx_pt,snd_pt,nesd,comm_indexes) rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 @@ -634,24 +1766,24 @@ subroutine psi_lswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & ! call y%device_wait() - if (debug) write(*,*) me,' isend' + if (debug) write(*,*) my_rank,' isend' ! ! Then send ! pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - p2ptag = psb_long_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),n*nesd,& - & psb_mpi_lpk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + + if ((nesd>0).and.(proc_to_comm /= my_rank)) then + call mpi_isend(y%combuf(snd_pt),n*nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) end if if(iret /= mpi_success) then @@ -666,8 +1798,8 @@ subroutine psi_lswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & end if if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then + if (debug) write(*,*) my_rank,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then ! ! No matching send? Something is wrong.... ! @@ -675,20 +1807,20 @@ subroutine psi_lswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if - call psb_realloc(totxch,prcid,info) + call psb_realloc(num_neighbors,prcid,info) - if (debug) write(*,*) me,' wait' + if (debug) write(*,*) my_rank,' wait' pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - p2ptag = psb_long_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm /= me)then + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + if (proc_to_comm /= my_rank)then if (nesd>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) if(iret /= mpi_success) then info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/iret/)) @@ -696,14 +1828,14 @@ subroutine psi_lswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & end if end if if (nerv>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) if(iret /= mpi_success) then info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/iret/)) goto 9999 end if end if - else if (proc_to_comm == me) then + else if (proc_to_comm == my_rank) then if (nesd /= nerv) then write(psb_err_unit,*) & & 'Fatal error in swapdata: mismatch on self send',& @@ -716,19 +1848,19 @@ subroutine psi_lswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & pnti = pnti + nerv + nesd + 3 end do - if (debug) write(*,*) me,' scatter' + if (debug) write(*,*) my_rank,' scatter' pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+psb_n_elem_recv_ - if (debug) write(0,*)me,' Received from: ',prcid(i),& + if (debug) write(0,*)my_rank,' Received from: ',prcid(i),& & y%combuf(rcv_pt:rcv_pt+n*nerv-1) - call y%sct(idx_pt,rcv_pt,nerv,idx,beta) + call y%sct(idx_pt,rcv_pt,nerv,comm_indexes,beta) rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 @@ -736,21 +1868,23 @@ subroutine psi_lswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & ! ! Waited for com, cleanup comid ! - y%comid = mpi_request_null + baseline_comm_handle%comid = mpi_request_null ! ! Then wait for device ! - if (debug) write(*,*) me,' wait' + if (debug) write(*,*) my_rank,' wait' call y%device_wait() - if (debug) write(*,*) me,' free buffer' + if (debug) write(*,*) my_rank,' free buffer' call y%free_buffer(info) - if (info == 0) call y%free_comid(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if if (info /= 0) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - if (debug) write(*,*) me,' done' + if (debug) write(*,*) my_rank,' done' end if @@ -760,5 +1894,859 @@ subroutine psi_lswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_lswap_vidx_multivect +end subroutine psi_lswap_baseline_multivect + + + +subroutine psi_lswap_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, n + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_lswap_neighbor_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor multivect swap') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (nonblocking)' + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, & + & ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! Gather send data into contiguous send buffer (polymorphic for GPU) + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data,', topology_total_send,' elems' + call y%gth(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(1:total_send_)) + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Ineighbor_alltoallv' + if (buffer_size > 0) then + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(total_send_ + 1), & ! recv buffer + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if ((topology_total_send + topology_total_recv) > 0) then + if (neighbor_comm_handle%comm_request == mpi_request_null) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if ((topology_total_send + topology_total_recv) > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + end if + + ! Scatter received data to local vector positions (polymorphic for GPU) + if ((topology_total_send + topology_total_recv) > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + call y%sct(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(total_send_+1:total_send_+total_recv_), & + & beta) + end if + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return +end subroutine psi_lswap_neighbor_topology_multivect + + + +subroutine psi_lswap_neighbor_topology_multivect_persistent(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, n + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_lswap_neighbor_topology_multivect_persistent' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor multivect swap') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (persistent)' + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid START: persistent neighbor request already in flight') + goto 9999 + end if + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, & + & ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Gather send data into contiguous send buffer (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data,', topology_total_send,' elems' + call y%gth(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(1:total_send_)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Neighbor_alltoallv_init' + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & ! send buffer + & n*neighbor_comm_handle%send_counts, & + & n*neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(total_send_ + 1), & ! recv buffer + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) > 0) then + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + + ! Wait for the persistent collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on persistent MPI request' + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Scatter received data to local vector positions (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + call y%sct(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(total_send_+1:total_send_+total_recv_), & + & beta) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + call y%device_wait() + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return +end subroutine psi_lswap_neighbor_topology_multivect_persistent + + + subroutine psi_lswap_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, total_send_, total_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_lswap_rma_pull_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for pull mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_send_ + total_recv_ + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA pull rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA pull init_memory_buffer_layout failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send_)) + end if + call y%device_wait() + + ! Pull data from each peer with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA pull') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int((remote_base - 1) * n, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count*n, psb_mpi_lpk_, prc_rank, remote_disp, recv_count*n, psb_mpi_lpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter received data into Y. + if (do_wait) then + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send_+1:total_send_+total_recv_), beta) + end if + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_lswap_rma_pull_multivect + + + subroutine psi_lswap_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, total_send_, total_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_lswap_rma_push_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for push mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_send_ + total_recv_ + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA put rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA put ini_memory_buffer_layout') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send_)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA push') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int((remote_base - 1) * n, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count*n, psb_mpi_lpk_, prc_rank, remote_disp, send_count*n, psb_mpi_lpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send_+1:total_send_+total_recv_), beta) + end if + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_lswap_rma_push_multivect + + +end submodule psi_l_swapdata_impl diff --git a/base/comm/internals/psi_lswaptran.F90 b/base/comm/internals/psi_lswaptran.F90 index 3bf0eacd1..a7a808555 100644 --- a/base/comm/internals/psi_lswaptran.F90 +++ b/base/comm/internals/psi_lswaptran.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -43,7 +43,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D integer(psb_lpk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -59,12 +59,12 @@ ! ! ! Arguments: -! flag - integer Choose the algorithm for data exchange: +! swap_status - integer Choose the algorithm for data exchange: ! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 +! swap_mpi = iand(swap_status,psb_swap_mpi_) /= 0 +! swap_sync = iand(swap_status,psb_swap_sync_) /= 0 +! swap_send = iand(swap_status,psb_swap_send_) /= 0 +! swap_recv = iand(swap_status,psb_swap_recv_) /= 0 ! if (swap_mpi): use underlying MPI_ALLTOALLV. ! if (swap_sync): use PSB_SND and PSB_RCV in ! synchronized pairs @@ -77,10 +77,9 @@ ! ! ! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y - type(psb_l_vect_type) The data area +! beta - real Choose overwrite or sum. +! y - type(psb_d_vect_type) The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -91,13 +90,980 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_lswaptran_vect(flag,beta,y,desc_a,work,info,data) +submodule (psi_l_comm_v_mod) psi_l_swaptran_impl + use psb_base_mod + use psb_comm_factory_mod +contains + module subroutine psi_lswaptran_vect(swap_status,beta,y,desc_a,info,data) - use psi_mod, psb_protect_name => psi_lswaptran_vect - use psb_l_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + type(psb_desc_type),target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, total_send, total_recv, num_neighbors, err_act, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=20) :: name + + info = psb_success_ + name = 'psi_lswaptran_vect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + if( (swap_status /= psb_comm_status_start_).and.(swap_status /= psb_comm_status_wait_)& + & .and.(swap_status /= psb_comm_status_sync_) ) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + ! Set the normalized swap status on the comm handle + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + call psi_ltran_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor a2av tran') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_ltran_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='persistent neighbor tran') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_ltran_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull tran') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_ltran_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push tran') + goto 9999 + end if + case default + call psi_ltran_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline tran') + goto 9999 + end if + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_lswaptran_vect + + ! + ! + ! Subroutine: psi_ltran_baseline_vect + ! Data exchange among processes. + ! + ! Takes care of Y an encapsulated vector. Relies on the gather/scatter methods + ! of vectors. + ! + ! The real workhorse: the outer routine will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_ltran_baseline_vect(ctxt,swap_status,beta,y,idx,& + & num_neighbors,total_send,total_recv,comm_handle,info) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_) :: icomm + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name + + info = psb_success_ + name = 'psi_ltran_baseline_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline swaptran') + goto 9999 + end select + + n=1 + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + + call idx%sync() + + if (debug) write(*,*) me,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + end if + if (debug) write(*,*) me,'do_send start' + call y%new_buffer(ione*size(idx%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt + call mpi_irecv(y%combuf(snd_pt),nesd,& + & psb_mpi_lpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + snd_pt = 1 + do i=1, num_neighbors + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + idx_pt = rcv_pt + call y%gth(idx_pt,nerv,idx) + + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait + ! + call y%device_wait() + + if (debug) write(*,*) me,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((nerv>0).and.(proc_to_comm /= me)) then + call mpi_isend(y%combuf(rcv_pt),nerv,& + & psb_mpi_lpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) me,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then + ! + ! No matching send? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) me,' wait' + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (proc_to_comm /= me)then + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' scatter' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (debug) write(0,*)me,' Received from: ',prcid(i),& + & y%combuf(snd_pt:snd_pt+nesd-1) + call y%sct(snd_pt,nesd,idx,beta) + pnti = pnti + nerv + nesd + 3 + end do + ! + ! Waited for everybody, clean up + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) me,' wait' + call y%device_wait() + if (debug) write(*,*) me,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) me,' done' + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psi_ltran_baseline_vect + + + + + subroutine psi_ltran_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_ltran_neighbor_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor swaptran') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) me,' nbr_vect: starting data exchange' + ! Lazy initialization: build the topology on first call + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) me,' nbr_vect: building topology' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, & + & a_err='neighbor_topology_init') + goto 9999 + end if + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! For transpose exchange: gather recv area first (we will send "recv" data) + if (debug) write(*,*) me,' nbr_tran_vect: gathering recv data,', topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv swapping send/recv arrays + if (debug) write(*,*) me,' nbr_tran_vect: posting MPI_Ineighbor_alltoallv (swapped)' + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (recv_indexes gathered) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_lpk_, & + & y%combuf(topology_total_recv + 1), & ! recv buffer (will contain send_indexes data) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_lpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if (neighbor_comm_handle%comm_request == mpi_request_null) then + ! No matching start? Something is wrong + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) me,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! For transpose exchange: scatter the data that correspond to peers' send area + if (debug) write(*,*) me,' nbr_tran_vect: scattering send-index data,', topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) me,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_ltran_neighbor_topology_vect + + + + + ! + ! + ! + ! + ! Subroutine: psi_lswaptran_multivect + ! Data exchange among processes. + ! + ! Takes care of Y an encaspulated multivector. + ! + ! + module subroutine psi_lswaptran_multivect(swap_status,beta,y,desc_a,info,data) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_multivect_type), intent(inout) :: y + type(psb_desc_type),target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, total_send, total_recv, num_neighbors, err_act, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=20) :: name + + integer(psb_ipk_) :: setflag + + + info = psb_success_ + name = 'psi_lswaptran_multivect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + setflag = swap_status + if (swap_status == psb_swap_start_) then + setflag = psb_comm_status_start_ + else if (swap_status == psb_swap_wait_) then + setflag = psb_comm_status_wait_ + else if ((iand(swap_status, psb_swap_send_) /= 0) .or. (iand(swap_status, psb_swap_recv_) /= 0) .or. & + & (iand(swap_status, psb_swap_mpi_) /= 0) .or. (iand(swap_status, psb_swap_sync_) /= 0)) then + setflag = psb_comm_status_sync_ + end if + + if ((setflag /= psb_comm_status_start_) .and. (setflag /= psb_comm_status_wait_) .and. & + & (setflag /= psb_comm_status_sync_)) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + call y%comm_handle%set_swap_status(setflag, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + call psi_ltran_neighbor_topology_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor a2av tran') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_ltran_neighbor_persistent_topology_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='persistent neighbor tran') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_ltran_rma_pull_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull tran') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_ltran_rma_push_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push tran') + goto 9999 + end if + case default + call psi_ltran_baseline_multivect(ctxt,setflag,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline tran') + goto 9999 + end if + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_lswaptran_multivect + + subroutine psi_ltran_baseline_multivect(ctxt,swap_status,beta,y,idx,& + & num_neighbors,total_send,total_recv,comm_handle,info) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_l_base_multivect_type), intent(inout) :: y + integer(psb_lpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_) :: icomm + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name + + info = psb_success_ + name = 'psi_ltran_vidx_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline multivect swaptran') + goto 9999 + end select + + n = y%get_ncols() + + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + + call idx%sync() + + if (debug) write(*,*) me,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + end if + if (debug) write(*,*) me,'do_send start' + call y%new_buffer(ione*size(idx%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt + call mpi_irecv(y%combuf(snd_pt),n*nesd,& + & psb_mpi_lpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + do i=1, num_neighbors + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call y%gth(idx_pt,rcv_pt,nerv,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait for device + ! + call y%device_wait() + + if (debug) write(*,*) me,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + if ((nerv>0).and.(proc_to_comm /= me)) then + call mpi_isend(y%combuf(rcv_pt),n*nerv,& + & psb_mpi_lpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) me,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then + ! + ! No matching send? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) me,' wait' + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + if (proc_to_comm /= me)then + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' scatter' + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + + if (debug) write(0,*)me,' Received from: ',prcid(i),& + & y%combuf(snd_pt:snd_pt+n*nesd-1) + call y%sct(idx_pt,snd_pt,nesd,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! + ! Waited for com, cleanup comid + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) me,' wait' + call y%device_wait() + if (debug) write(*,*) me,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) me,' done' + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psi_ltran_baseline_multivect + + + subroutine psi_ltran_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -106,85 +1072,170 @@ subroutine psi_lswaptran_vect(flag,beta,y,desc_a,work,info,data) include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_vect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_ltran_neighbor_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor multivect swaptran') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) me,' nbr_vect: starting data exchange' + ! Lazy initialization: build the topology on first call + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) me,' nbr_vect: building topology' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, & + & a_err='neighbor_topology_init') + goto 9999 + end if + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! For transpose exchange: gather recv area first (we will send "recv" data) + if (debug) write(*,*) me,' nbr_tran_vect: gathering recv data,', topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv swapping send/recv arrays + if (debug) write(*,*) me,' nbr_tran_vect: posting MPI_Ineighbor_alltoallv (swapped)' + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (recv_indexes gathered) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_lpk_, & + & y%combuf(topology_total_recv + 1), & ! recv buffer (will contain send_indexes data) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_lpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if (neighbor_comm_handle%comm_request == mpi_request_null) then + ! No matching start? Something is wrong + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) me,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! For transpose exchange: scatter the data that correspond to peers' send area + if (debug) write(*,*) me,' nbr_tran_vect: scattering send-index data,', topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) me,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_lswaptran_vect + end subroutine psi_ltran_neighbor_topology_multivect -! -! -! Subroutine: psi_ltran_vidx_vect -! Data exchange among processes. -! -! Takes care of Y an encapsulated vector. Relies on the gather/scatter methods -! of vectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_ltran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_ltran_vidx_vect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_l_base_vect_mod + + + subroutine psi_ltran_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -193,345 +1244,661 @@ subroutine psi_ltran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_vect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - call idx%sync() - - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) - goto 9999 - end if + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: icomm, np, my_rank, iret + integer(psb_mpk_) :: p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + info = psb_success_ + name = 'psi_ltran_neighbor_persistent_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor swaptran') + goto 9999 + end select + + if (swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='psb_comm_status_unknown_ not allowed in persistent neighbor swaptran') + goto 9999 end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - p2ptag = psb_long_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - call mpi_irecv(y%combuf(snd_pt),nesd,& - & psb_mpi_lpk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) - end if - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - idx_pt = rcv_pt - call y%gth(idx_pt,nerv,idx) - - pnti = pnti + nerv + nesd + 3 - end do - - ! - ! Then wait - ! - call y%device_wait() - - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - p2ptag = psb_long_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),nerv,& - & psb_mpi_lpk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid START: persistent neighbor request already in flight') goto 9999 end if + if (.not. neighbor_comm_handle%is_initialized) then + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Transpose: gather from recv_indexes (we "send" recv data) + if (debug) write(*,*) my_rank,' tran_persistent_vect: gathering recv data,',topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if - pnti = pnti + nerv + nesd + 3 - end do - end if + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + ! Transpose: swap send/recv counts in alltoallv_init + ! send = recv_indexes data with recv_counts/displs + ! recv = into send_indexes area with send_counts/displs + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_lpk_, & + & y%combuf(topology_total_recv + 1), & + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_lpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + end if ! do_start + + if (do_wait) then + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + if ((topology_total_send + topology_total_recv) > 0) then + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Transpose: scatter to send_indexes + if (debug) write(*,*) my_rank,' tran_persistent_vect: scattering to send_indexes,',topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + end if + + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ltran_neighbor_persistent_topology_vect + + + subroutine psi_ltran_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! Effective sizes for transpose: + ! eff_send = total_recv (we expose recv_indexes data) + ! eff_recv = total_send (we GET into the send_indexes area) + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_ltran_rma_pull_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - call psb_realloc(totxch,prcid,info) - - if (debug) write(*,*) me,' wait' - pnti = 1 - p2ptag = psb_long_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (proc_to_comm /= me)then - if (nerv>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + icomm = ctxt%get_mpic() + eff_send = total_recv + eff_recv = total_send + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran pull') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = eff_send + eff_recv + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran pull rank cache allocation') goto 9999 end if end if - if (nesd>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran pull init_memory_buffer_layout_tran failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+nesd-1) - call y%sct(snd_pt,nesd,idx,beta) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Waited for everybody, clean up - ! - y%comid = mpi_request_null - - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if (debug) write(*,*) me,' done' - end if - + end if - call psb_erractionrestore(err_act) - return + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + ! Transpose: gather recv_indexes data into combuf(1:eff_send) + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:eff_send)) + end if + call y%device_wait() + + ! Pull from each peer's recv_indexes area with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = eff_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran pull') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count, psb_mpi_lpk_, prc_rank, remote_disp, recv_count, psb_mpi_lpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if ! do_start - return + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter into send_indexes. + if (do_wait) then + ! Transpose: scatter to send_indexes (peer_recv_indexes in tran init = actual send_indexes) + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(eff_send+1:eff_send+eff_recv), beta) + end if + call y%device_wait() + end if ! do_wait -end subroutine psi_ltran_vidx_vect + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ltran_rma_pull_vect -! -! -! -! -! Subroutine: psi_lswaptran_multivect -! Data exchange among processes. -! -! Takes care of Y an encaspulated multivector. -! -! -subroutine psi_lswaptran_multivect(flag,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_lswaptran_multivect - use psb_l_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + subroutine psi_ltran_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_multivect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_ltran_rma_push_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + eff_send = total_recv + eff_recv = total_send + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran push') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = eff_send + eff_recv + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran push rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran push init_memory_buffer_layout_tran failure') + goto 9999 + end if + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + ! Transpose: gather recv_indexes data into combuf(1:eff_send) + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:eff_send)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + ! Push our recv_indexes data to each peer's send_indexes area; notify after flush. + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = eff_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran push') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count, psb_mpi_lpk_, prc_rank, remote_disp, send_count, psb_mpi_lpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter into send_indexes. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + ! Transpose: scatter to send_indexes (peer_recv_indexes in tran init = actual send_indexes) + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(eff_send+1:eff_send+eff_recv), beta) + end if + call y%device_wait() + end if ! do_wait + call psb_erractionrestore(err_act) return - end subroutine psi_lswaptran_multivect +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ltran_rma_push_vect -! -! -! Subroutine: psi_ltran_vidx_multivect -! Data exchange among processes. -! -! Takes care of Y an encapsulated multivector. Relies on the gather/scatter methods -! of multivectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_ltran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_ltran_vidx_multivect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_l_base_multivect_mod + + subroutine psi_ltran_neighbor_persistent_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -540,243 +1907,661 @@ subroutine psi_ltran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_multivect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n = y%get_ncols() - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - call idx%sync() - - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) - goto 9999 - end if + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: icomm, np, my_rank, iret, n + integer(psb_mpk_) :: p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + info = psb_success_ + name = 'psi_ltran_neighbor_persistent_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor multivect swaptran') + goto 9999 + end select + + if (swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='psb_comm_status_unknown_ not allowed in persistent neighbor multivect swaptran') + goto 9999 end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_long_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt - call mpi_irecv(y%combuf(snd_pt),n*nesd,& - & psb_mpi_lpk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call y%gth(idx_pt,rcv_pt,nerv,idx) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - ! - ! Then wait for device - ! - call y%device_wait() - - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! - - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_long_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),n*nerv,& - & psb_mpi_lpk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid START: persistent neighbor request already in flight') goto 9999 end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - end if - - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + if (.not. neighbor_comm_handle%is_initialized) then + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Transpose: gather from recv_indexes + if (debug) write(*,*) my_rank,' tran_persistent_mv: gathering recv data,',topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:total_recv_)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + ! Transpose: swap send/recv in alltoallv_init + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_lpk_, & + & y%combuf(total_recv_ + 1), & + & n*neighbor_comm_handle%send_counts, & + & n*neighbor_comm_handle%send_displs, & + & psb_mpi_lpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + end if ! do_start + + if (do_wait) then + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + + if ((topology_total_send + topology_total_recv) == 0) then + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + if ((topology_total_send + topology_total_recv) > 0) then + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Transpose: scatter to send_indexes + if (debug) write(*,*) my_rank,' tran_persistent_mv: scattering to send_indexes,',topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(total_recv_+1:total_recv_+total_send_), & + & beta) + end if + + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ltran_neighbor_persistent_topology_multivect + + + subroutine psi_ltran_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv, total_eff_send_, total_eff_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_ltran_rma_pull_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - call psb_realloc(totxch,prcid,info) - - if (debug) write(*,*) me,' wait' - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_long_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm /= me)then - if (nerv>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + icomm = ctxt%get_mpic() + n = y%get_ncols() + eff_send = total_recv + eff_recv = total_send + total_eff_send_ = eff_send * n + total_eff_recv_ = eff_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran pull multivect') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_eff_send_ + total_eff_recv_ + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran pull multivect rank allocation') goto 9999 end if end if - if (nesd>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran pull multivect init_memory_buffer_layout_tran') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+n*nesd-1) - call y%sct(idx_pt,snd_pt,nesd,idx,beta) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! - ! Waited for com, cleanup comid - ! - y%comid = mpi_request_null - - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_eff_send_)) + end if + call y%device_wait() + + ! Pull from each peer's recv_indexes area with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_eff_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran pull multivect') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int((remote_base - 1)*n, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count*n, psb_mpi_lpk_, prc_rank, remote_disp, recv_count*n, psb_mpi_lpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran pull multivect self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter into send_indexes. + if (do_wait) then + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, & + & y%combuf(total_eff_send_+1:total_eff_send_+total_eff_recv_), beta) + end if + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ltran_rma_pull_multivect + + + subroutine psi_ltran_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv, total_eff_send_, total_eff_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_ltran_rma_push_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - if (debug) write(*,*) me,' done' - end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + eff_send = total_recv + eff_recv = total_send + total_eff_send_ = eff_send * n + total_eff_recv_ = eff_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran push multivect') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_eff_send_ + total_eff_recv_ + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran push multivect rank allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran push multivect init_memory_buffer_layout_tran') + goto 9999 + end if + end if + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if - call psb_erractionrestore(err_act) - return + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_eff_send_)) + end if + call y%device_wait() - return + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do -end subroutine psi_ltran_vidx_multivect + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_eff_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran push multivect') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int((remote_base - 1)*n, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count*n, psb_mpi_lpk_, prc_rank, remote_disp, send_count*n, psb_mpi_lpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran push multivect self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter into send_indexes. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, & + & y%combuf(total_eff_send_+1:total_eff_send_+total_eff_recv_), beta) + end if + call y%device_wait() + end if ! do_wait + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ltran_rma_push_multivect +end submodule psi_l_swaptran_impl diff --git a/base/comm/internals/psi_movrl_restr_a.f90 b/base/comm/internals/psi_movrl_restr_a.f90 index d884ad632..dc2137a00 100644 --- a/base/comm/internals/psi_movrl_restr_a.f90 +++ b/base/comm/internals/psi_movrl_restr_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,98 +34,100 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_movrl_restrr1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_movrl_restrr1 - - implicit none - - integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_mpk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_movrl_restrr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx) = xs(i) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_m_comm_a_mod) psi_m_ovrl_restr_a_impl + use psb_base_mod +contains + module subroutine psi_movrl_restrr1(x,xs,desc_a,info) + + implicit none + + integer(psb_mpk_), intent(inout) :: x(:) + integer(psb_mpk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_movrl_restrr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx) = xs(i) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_movrl_restrr1 + return + end subroutine psi_movrl_restrr1 -subroutine psi_movrl_restrr2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_movrl_restrr2 + module subroutine psi_movrl_restrr2(x,xs,desc_a,info) - implicit none + implicit none - integer(psb_mpk_), intent(inout) :: x(:,:) - integer(psb_mpk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + integer(psb_mpk_), intent(inout) :: x(:,:) + integer(psb_mpk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err - name='psi_movrl_restrr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_movrl_restrr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if (size(x,2) /= size(xs,2)) then - info = psb_err_internal_error_ - call psb_errpush(info,name, a_err='Mismacth columns X vs XS') - goto 9999 - endif + if (size(x,2) /= size(xs,2)) then + info = psb_err_internal_error_ + call psb_errpush(info,name, a_err='Mismacth columns X vs XS') + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) + isz = size(desc_a%ovrlap_elem,1) - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx,:) = xs(i,:) - end do + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx,:) = xs(i,:) + end do - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_movrl_restrr2 + return + end subroutine psi_movrl_restrr2 +end submodule psi_m_ovrl_restr_a_impl diff --git a/base/comm/internals/psi_movrl_save_a.f90 b/base/comm/internals/psi_movrl_save_a.f90 index 398ea24aa..d728ed718 100644 --- a/base/comm/internals/psi_movrl_save_a.f90 +++ b/base/comm/internals/psi_movrl_save_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,108 +34,104 @@ ! These subroutines save the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap. ! -subroutine psi_movrl_saver1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_movrl_saver1 - - use psb_realloc_mod - - implicit none - - integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_mpk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_movrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i) = x(idx) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_m_comm_a_mod) psi_m_ovrl_save_a_impl + use psb_base_mod +contains + module subroutine psi_movrl_saver1(x,xs,desc_a,info) + implicit none + + integer(psb_mpk_), intent(inout) :: x(:) + integer(psb_mpk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_movrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i) = x(idx) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_movrl_saver1 - - -subroutine psi_movrl_saver2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_movrl_saver2 - - use psb_realloc_mod - - implicit none - - integer(psb_mpk_), intent(inout) :: x(:,:) - integer(psb_mpk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc - character(len=20) :: name, ch_err - - name='psi_movrl_saver2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = size(x,2) - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i,:) = x(idx,:) - end do - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_movrl_saver1 + + + module subroutine psi_movrl_saver2(x,xs,desc_a,info) + implicit none + + integer(psb_mpk_), intent(inout) :: x(:,:) + integer(psb_mpk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc + character(len=20) :: name, ch_err + + name='psi_movrl_saver2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = size(x,2) + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i,:) = x(idx,:) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_movrl_saver2 + return + end subroutine psi_movrl_saver2 +end submodule psi_m_ovrl_save_a_impl diff --git a/base/comm/internals/psi_movrl_upd_a.f90 b/base/comm/internals/psi_movrl_upd_a.f90 index c4ffa64f0..dfa070a62 100644 --- a/base/comm/internals/psi_movrl_upd_a.f90 +++ b/base/comm/internals/psi_movrl_upd_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -32,143 +32,143 @@ ! Subroutine: psi_movrl_update ! These subroutines update the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap, -! or for the application of Additive Schwarz preconditioners. +! or for the application of Additive Schwarz preconditioners. ! ! -subroutine psi_movrl_updr1(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_movrl_updr1 - - implicit none - - integer(psb_mpk_), intent(inout), target :: x(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_movrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx) = mzero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return +submodule (psi_m_comm_a_mod) psi_m_ovrl_upd_a_impl + use psb_base_mod +contains + module subroutine psi_movrl_updr1(x,desc_a,update,info) + implicit none + + integer(psb_mpk_), intent(inout), target :: x(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_movrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx) = mzero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_movrl_updr1 - -subroutine psi_movrl_updr2(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_movrl_updr2 - - implicit none - - integer(psb_mpk_), intent(inout), target :: x(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_movrl_updr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx,:) = mzero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_movrl_updr1 + + module subroutine psi_movrl_updr2(x,desc_a,update,info) + implicit none + + integer(psb_mpk_), intent(inout), target :: x(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_movrl_updr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx,:) = mzero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_movrl_updr2 + return + end subroutine psi_movrl_updr2 +end submodule psi_m_ovrl_upd_a_impl diff --git a/base/comm/internals/psi_mswapdata_a.F90 b/base/comm/internals/psi_mswapdata_a.F90 index 0a1a3a61f..af6f8cdc3 100644 --- a/base/comm/internals/psi_mswapdata_a.F90 +++ b/base/comm/internals/psi_mswapdata_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -39,7 +39,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D integer(psb_mpk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -70,10 +70,10 @@ ! ! ! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y(:,:) - integer The data area +! beta - real Choose overwrite or sum. +! y(:,:) - real The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do +! work(:) - real Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -84,912 +84,903 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_mswapdatam(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_m_comm_a_mod) psi_m_swapdata_a_impl + use psb_base_mod +contains + module subroutine psi_mswapdatam(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_mswapdatam - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:,:), beta - integer(psb_mpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + integer(psb_mpk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swapdata(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_mswapdatam + end subroutine psi_mswapdatam -subroutine psi_mswapidxm(ctxt,icomm,flag,n,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + module subroutine psi_mswapidxm(ctxt,flag,n,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) - use psi_mod, psb_protect_name => psi_mswapidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:,:), beta - integer(psb_mpk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - integer(psb_mpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:,:) + integer(psb_mpk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + +integer(psb_mpk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if - ! prepare info for communications + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + end if - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_mpk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_mpk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_mpk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),n*nesd,& + & psb_mpi_mpk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),n*nesd,& + & psb_mpi_mpk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*)& + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if - else - allocate(rvhd(totxch),prcid(totxch),stat=info) + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if if(info /= psb_success_) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(albf) deallocate(sndbuf,rcvbuf,stat=info) if(info /= psb_success_) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - albf=.true. - end if - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_mpk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_mpk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - - else if (swap_sync) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm < me) then - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int4_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_mpk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_int4_swap_tag - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),n*nesd,& - & psb_mpi_mpk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),n*nesd,& - & psb_mpi_mpk_,prcid(i),& - & p2ptag,icomm,iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_int4_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*)& - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_mswapidxm + end subroutine psi_mswapidxm + + ! + ! + ! Subroutine: psi_mswapdatav + ! Implements the data exchange among processes. Essentially this is doing + ! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D integer(psb_mpk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_mswapdatav(flag,beta,y,desc_a,work,info,data) -! -! -! Subroutine: psi_mswapdatav -! Implements the data exchange among processes. Essentially this is doing -! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y(:) - integer The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_mswapdatav(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_mswapdatav - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:), beta - integer(psb_mpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + integer(psb_mpk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_mswapdatav + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_mswapdataidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_mswapidxv(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + call psi_swapdata(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 - use psi_mod, psb_protect_name => psi_mswapidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_mswapdatav + + + ! + ! + ! Subroutine: psi_mswapdataidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_mswapidxv(ctxt,flag,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) + + use psb_error_mod + use psb_desc_mod + use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:), beta - integer(psb_mpk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - integer(psb_mpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:) + integer(psb_mpk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + integer(psb_mpk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+nesd-1)) - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_mpk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_mpk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+nesd-1)) + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_mpk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_mpk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),nerv,& + & psb_mpi_mpk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),nesd,& + & psb_mpi_mpk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),nesd,& + & psb_mpi_mpk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send) then - if (proc_to_comm < me) then + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_snd(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_rcv(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int4_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),nerv,& - & psb_mpi_mpk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - p2ptag = psb_int4_swap_tag + end if - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),nesd,& - & psb_mpi_mpk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),nesd,& - & psb_mpi_mpk_,prcid(i),& - & p2ptag,icomm,iret) - end if + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_int4_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_mswapidxv + end subroutine psi_mswapidxv +end submodule psi_m_swapdata_a_impl diff --git a/base/comm/internals/psi_mswaptran_a.F90 b/base/comm/internals/psi_mswaptran_a.F90 index 8d6e0b52f..35e5eec49 100644 --- a/base/comm/internals/psi_mswaptran_a.F90 +++ b/base/comm/internals/psi_mswaptran_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,7 +30,7 @@ ! ! ! -! File: psi_mswaptran.F90 +! File: psi_mswaptran_a.F90 ! ! Subroutine: psi_mswaptranm ! Implements the data exchange among processes. This is similar to Xswapdata, but @@ -43,7 +43,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D integer(psb_mpk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -74,10 +74,10 @@ ! ! ! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y(:,:) - integer The data area +! beta - real Choose overwrite or sum. +! y(:,:) - real The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do +! work(:) - real Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -88,922 +88,913 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_mswaptranm(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_m_comm_a_mod) psi_m_swaptran_a_impl + use psb_base_mod +contains + module subroutine psi_mswaptranm(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_mswaptranm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:,:), beta - integer(psb_mpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + integer(psb_mpk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swaptran(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) return -end subroutine psi_mswaptranm -subroutine psi_mtranidxm(ctxt,icomm,flag,n,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_mswaptranm - use psi_mod, psb_protect_name => psi_mtranidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + module subroutine psi_mtranidxm(ctxt,flag,n,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:,:), beta - integer(psb_mpk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - integer(psb_mpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_mpk_), intent(inout) :: y(:,:) + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + integer(psb_mpk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if - ! prepare info for communications + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + if (do_send) then - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 end if - albf=.true. - end if - if (do_send) then - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) + ! Case SWAP_MPI + if (swap_mpi) then - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_mpk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_mpk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),n*nesd,& + & psb_mpi_mpk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_mpk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_mpk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send',& + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - ! Case SWAP_MPI - if (swap_mpi) then + else if (swap_send) then - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_mpk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_mpk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 - else if (swap_sync) then + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_recv) then - if (proc_to_comm < me) then - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm > me) then + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int4_swap_tag - call mpi_irecv(sndbuf(snd_pt),n*nesd,& - & psb_mpi_mpk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int4_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_mpk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_mpk_,prcid(i),& - & p2ptag,icomm,iret) - end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 + end if - end do + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_int4_swap_tag + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send',& - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_mtranidxm -! -! -! Subroutine: psi_mswaptranv -! Implements the data exchange among processes. This is similar to Xswapdata, but -! the list is read "in reverse", i.e. indices that are normally SENT are used -! for the RECEIVE part and vice-versa. This is the basic data exchange operation -! for doing the product of a sparse matrix by a vector. -! Essentially this is doing a variable all-to-all data exchange -! (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - integer Choose overwrite or sum. -! y(:) - integer The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - integer Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_mswaptranv(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_mswaptranv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + end subroutine psi_mtranidxm + ! + ! + ! Subroutine: psi_mswaptranv + ! Implements the data exchange among processes. This is similar to Xswapdata, but + ! the list is read "in reverse", i.e. indices that are normally SENT are used + ! for the RECEIVE part and vice-versa. This is the basic data exchange operation + ! for doing the product of a sparse matrix by a vector. + ! Essentially this is doing a variable all-to-all data exchange + ! (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D integer(psb_mpk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_mswaptranv(flag,beta,y,desc_a,work,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:), beta - integer(psb_mpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + integer(psb_mpk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tranv' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_mswaptranv + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_mtranidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_mtranidxv(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) + call psi_swaptran(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return - use psi_mod, psb_protect_name => psi_mtranidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_mswaptranv + + + ! + ! + ! Subroutine: psi_mtranidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_mtranidxv(ctxt,flag,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:), beta - integer(psb_mpk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - integer(psb_mpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_mpk_), intent(inout) :: y(:) + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + + integer(psb_mpk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) - - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_mpk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_mpk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) + + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_mpk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_mpk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),nesd,& + & psb_mpi_mpk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),nerv,& + & psb_mpi_mpk_,prcid(i),& + & p2ptag, icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),nerv,& + & psb_mpi_mpk_,prcid(i),& + & p2ptag, icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - if (proc_to_comm < me) then + + else if (swap_send) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_snd(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int4_swap_tag - call mpi_irecv(sndbuf(snd_pt),nesd,& - & psb_mpi_mpk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_int4_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),nerv,& - & psb_mpi_mpk_,prcid(i),& - & p2ptag, icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),nerv,& - & psb_mpi_mpk_,prcid(i),& - & p2ptag, icomm,iret) - end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_int4_swap_tag - - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + end if + + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_mtranidxv + end subroutine psi_mtranidxv +end submodule psi_m_swaptran_a_impl diff --git a/base/comm/internals/psi_sovrl_restr.f90 b/base/comm/internals/psi_sovrl_restr.f90 index 86361fba3..14dc55ce0 100644 --- a/base/comm/internals/psi_sovrl_restr.f90 +++ b/base/comm/internals/psi_sovrl_restr.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,90 +35,90 @@ ! ! ! -subroutine psi_sovrl_restr_vect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_sovrl_restr_vect - use psb_s_base_vect_mod - - implicit none - - class(psb_s_base_vect_type) :: x - real(psb_spk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_sovrl_restr_vect' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,szero) - - call psb_erractionrestore(err_act) - return +submodule (psi_s_comm_v_mod) psi_s_ovrl_restr_v_impl + use psb_base_mod +contains + module subroutine psi_sovrl_restr_vect(x,xs,desc_a,info) + + implicit none + + class(psb_s_base_vect_type) :: x + real(psb_spk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_sovrl_restr_vect' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,szero) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_sovrl_restr_vect + return + end subroutine psi_sovrl_restr_vect -subroutine psi_sovrl_restr_multivect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_sovrl_restr_multivect - use psb_s_base_vect_mod + module subroutine psi_sovrl_restr_multivect(x,xs,desc_a,info) - implicit none + implicit none - class(psb_s_base_multivect_type) :: x - real(psb_spk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + class(psb_s_base_multivect_type) :: x + real(psb_spk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz,nc - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz,nc + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err - name='psi_sovrl_restr_mv' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_sovrl_restr_mv' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) - call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,szero) + isz = size(desc_a%ovrlap_elem,1) + call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,szero) - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_sovrl_restr_multivect + return + end subroutine psi_sovrl_restr_multivect +end submodule psi_s_ovrl_restr_v_impl diff --git a/base/comm/internals/psi_sovrl_restr_a.f90 b/base/comm/internals/psi_sovrl_restr_a.f90 index c12951871..66960ef41 100644 --- a/base/comm/internals/psi_sovrl_restr_a.f90 +++ b/base/comm/internals/psi_sovrl_restr_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,98 +34,100 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_sovrl_restrr1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_sovrl_restrr1 - - implicit none - - real(psb_spk_), intent(inout) :: x(:) - real(psb_spk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_sovrl_restrr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx) = xs(i) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_s_comm_a_mod) psi_s_ovrl_restr_a_impl + use psb_base_mod +contains + module subroutine psi_sovrl_restrr1(x,xs,desc_a,info) + + implicit none + + real(psb_spk_), intent(inout) :: x(:) + real(psb_spk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_sovrl_restrr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx) = xs(i) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_sovrl_restrr1 + return + end subroutine psi_sovrl_restrr1 -subroutine psi_sovrl_restrr2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_sovrl_restrr2 + module subroutine psi_sovrl_restrr2(x,xs,desc_a,info) - implicit none + implicit none - real(psb_spk_), intent(inout) :: x(:,:) - real(psb_spk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + real(psb_spk_), intent(inout) :: x(:,:) + real(psb_spk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err - name='psi_sovrl_restrr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_sovrl_restrr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if (size(x,2) /= size(xs,2)) then - info = psb_err_internal_error_ - call psb_errpush(info,name, a_err='Mismacth columns X vs XS') - goto 9999 - endif + if (size(x,2) /= size(xs,2)) then + info = psb_err_internal_error_ + call psb_errpush(info,name, a_err='Mismacth columns X vs XS') + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) + isz = size(desc_a%ovrlap_elem,1) - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx,:) = xs(i,:) - end do + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx,:) = xs(i,:) + end do - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_sovrl_restrr2 + return + end subroutine psi_sovrl_restrr2 +end submodule psi_s_ovrl_restr_a_impl diff --git a/base/comm/internals/psi_sovrl_save.f90 b/base/comm/internals/psi_sovrl_save.f90 index cb058fe4b..b5d4b3c75 100644 --- a/base/comm/internals/psi_sovrl_save.f90 +++ b/base/comm/internals/psi_sovrl_save.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,103 +34,101 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_sovrl_save_vect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_sovrl_save_vect - use psb_realloc_mod - use psb_s_base_vect_mod - - implicit none - - class(psb_s_base_vect_type) :: x - real(psb_spk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) - - call psb_erractionrestore(err_act) - return +submodule (psi_s_comm_v_mod) psi_s_ovrl_save_v_impl + use psb_base_mod +contains + module subroutine psi_sovrl_save_vect(x,xs,desc_a,info) + + implicit none + + class(psb_s_base_vect_type) :: x + real(psb_spk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_sovrl_save_vect - -subroutine psi_sovrl_save_multivect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_sovrl_save_multivect - use psb_realloc_mod - use psb_s_base_vect_mod - - implicit none - - class(psb_s_base_multivect_type) :: x - real(psb_spk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, nc - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = x%get_ncols() - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_sovrl_save_vect + + module subroutine psi_sovrl_save_multivect(x,xs,desc_a,info) + + implicit none + + class(psb_s_base_multivect_type) :: x + real(psb_spk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, nc + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = x%get_ncols() + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_sovrl_save_multivect + return + end subroutine psi_sovrl_save_multivect +end submodule psi_s_ovrl_save_v_impl diff --git a/base/comm/internals/psi_sovrl_save_a.f90 b/base/comm/internals/psi_sovrl_save_a.f90 index e2b575413..12e5d2aad 100644 --- a/base/comm/internals/psi_sovrl_save_a.f90 +++ b/base/comm/internals/psi_sovrl_save_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,108 +34,104 @@ ! These subroutines save the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap. ! -subroutine psi_sovrl_saver1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_sovrl_saver1 - - use psb_realloc_mod - - implicit none - - real(psb_spk_), intent(inout) :: x(:) - real(psb_spk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_sovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i) = x(idx) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_s_comm_a_mod) psi_s_ovrl_save_a_impl + use psb_base_mod +contains + module subroutine psi_sovrl_saver1(x,xs,desc_a,info) + implicit none + + real(psb_spk_), intent(inout) :: x(:) + real(psb_spk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_sovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i) = x(idx) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_sovrl_saver1 - - -subroutine psi_sovrl_saver2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_sovrl_saver2 - - use psb_realloc_mod - - implicit none - - real(psb_spk_), intent(inout) :: x(:,:) - real(psb_spk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc - character(len=20) :: name, ch_err - - name='psi_sovrl_saver2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = size(x,2) - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i,:) = x(idx,:) - end do - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_sovrl_saver1 + + + module subroutine psi_sovrl_saver2(x,xs,desc_a,info) + implicit none + + real(psb_spk_), intent(inout) :: x(:,:) + real(psb_spk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc + character(len=20) :: name, ch_err + + name='psi_sovrl_saver2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = size(x,2) + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i,:) = x(idx,:) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_sovrl_saver2 + return + end subroutine psi_sovrl_saver2 +end submodule psi_s_ovrl_save_a_impl diff --git a/base/comm/internals/psi_sovrl_upd.f90 b/base/comm/internals/psi_sovrl_upd.f90 index ba3a9f41a..acf68554f 100644 --- a/base/comm/internals/psi_sovrl_upd.f90 +++ b/base/comm/internals/psi_sovrl_upd.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -36,169 +36,167 @@ ! ! ! -subroutine psi_sovrl_upd_vect(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_sovrl_upd_vect - use psb_realloc_mod - use psb_s_base_vect_mod - - implicit none - - class(psb_s_base_vect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - real(psb_spk_), allocatable :: xs(:) - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, nx, ndm - integer(psb_ipk_) :: err_act, i, idx - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - - name='psi_sovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - nx = size(desc_a%ovrlap_elem,1) - call psb_realloc(nx,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_Dealloc_ - call psb_errpush(info,name) - goto 9999 - end if - - if (update /= psb_sum_) then - call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) - ! switch on update type - - select case (update) - case(psb_square_root_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i) = xs(i)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i) = xs(i)/real(ndm) - end do - case(psb_setzero_) - do i=1,nx - if (me /= desc_a%ovrlap_elem(i,3))& - & xs(i) = szero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) +submodule (psi_s_comm_v_mod) psi_s_ovrl_upd_v_impl + use psb_base_mod +contains + module subroutine psi_sovrl_upd_vect(x,desc_a,update,info) + + implicit none + + class(psb_s_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + real(psb_spk_), allocatable :: xs(:) + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, nx, ndm + integer(psb_ipk_) :: err_act, i, idx + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + + name='psi_sovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end select - call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,szero) - end if - - call psb_erractionrestore(err_act) - return + endif + nx = size(desc_a%ovrlap_elem,1) + call psb_realloc(nx,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_Dealloc_ + call psb_errpush(info,name) + goto 9999 + end if + + if (update /= psb_sum_) then + call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) + ! switch on update type + + select case (update) + case(psb_square_root_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i) = xs(i)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i) = xs(i)/real(ndm) + end do + case(psb_setzero_) + do i=1,nx + if (me /= desc_a%ovrlap_elem(i,3))& + & xs(i) = szero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,szero) + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_sovrl_upd_vect - -subroutine psi_sovrl_upd_multivect(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_sovrl_upd_multivect - use psb_realloc_mod - use psb_s_base_vect_mod - - implicit none - - class(psb_s_base_multivect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - real(psb_spk_), allocatable :: xs(:,:) - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, ndm, nx, nc - integer(psb_ipk_) :: err_act, i, idx - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - - name='psi_sovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - nx = size(desc_a%ovrlap_elem,1) - nc = x%get_ncols() - call psb_realloc(nx,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_Dealloc_ - call psb_errpush(info,name) - goto 9999 - end if - - if (update /= psb_sum_) then - call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) - ! switch on update type - - select case (update) - case(psb_square_root_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i,:) = xs(i,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i,:) = xs(i,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,nx - if (me /= desc_a%ovrlap_elem(i,3))& - & xs(i,:) = szero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) + return + end subroutine psi_sovrl_upd_vect + + module subroutine psi_sovrl_upd_multivect(x,desc_a,update,info) + + implicit none + + class(psb_s_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + real(psb_spk_), allocatable :: xs(:,:) + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, ndm, nx, nc + integer(psb_ipk_) :: err_act, i, idx + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + + name='psi_sovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end select - call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,szero) - end if - - call psb_erractionrestore(err_act) - return + endif + nx = size(desc_a%ovrlap_elem,1) + nc = x%get_ncols() + call psb_realloc(nx,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_Dealloc_ + call psb_errpush(info,name) + goto 9999 + end if + + if (update /= psb_sum_) then + call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) + ! switch on update type + + select case (update) + case(psb_square_root_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i,:) = xs(i,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i,:) = xs(i,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,nx + if (me /= desc_a%ovrlap_elem(i,3))& + & xs(i,:) = szero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,szero) + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_sovrl_upd_multivect + return + end subroutine psi_sovrl_upd_multivect +end submodule psi_s_ovrl_upd_v_impl diff --git a/base/comm/internals/psi_sovrl_upd_a.f90 b/base/comm/internals/psi_sovrl_upd_a.f90 index 4387492d7..68a0e3357 100644 --- a/base/comm/internals/psi_sovrl_upd_a.f90 +++ b/base/comm/internals/psi_sovrl_upd_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -32,143 +32,143 @@ ! Subroutine: psi_sovrl_update ! These subroutines update the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap, -! or for the application of Additive Schwarz preconditioners. +! or for the application of Additive Schwarz preconditioners. ! ! -subroutine psi_sovrl_updr1(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_sovrl_updr1 - - implicit none - - real(psb_spk_), intent(inout), target :: x(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_sovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx) = szero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return +submodule (psi_s_comm_a_mod) psi_s_ovrl_upd_a_impl + use psb_base_mod +contains + module subroutine psi_sovrl_updr1(x,desc_a,update,info) + implicit none + + real(psb_spk_), intent(inout), target :: x(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_sovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx) = szero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_sovrl_updr1 - -subroutine psi_sovrl_updr2(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_sovrl_updr2 - - implicit none - - real(psb_spk_), intent(inout), target :: x(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_sovrl_updr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx,:) = szero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_sovrl_updr1 + + module subroutine psi_sovrl_updr2(x,desc_a,update,info) + implicit none + + real(psb_spk_), intent(inout), target :: x(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_sovrl_updr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx,:) = szero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_sovrl_updr2 + return + end subroutine psi_sovrl_updr2 +end submodule psi_s_ovrl_upd_a_impl diff --git a/base/comm/internals/psi_sswapdata.F90 b/base/comm/internals/psi_sswapdata.F90 index e3b49e348..e7bbaae70 100644 --- a/base/comm/internals/psi_sswapdata.F90 +++ b/base/comm/internals/psi_sswapdata.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,7 +41,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D real(psb_spk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -53,32 +53,22 @@ ! is scattered in the owned indices, and BETA=1. ! The first routine picks the desired exchange index list and passes it to the second. ! This version works on encapsulated vectors, and uses their methods to do GTH and SCT, -! so that special versions (i.e. GPU vectors can override them +! so that special versions (i.e. GPU vectors can override them) ! ! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) +! swap_status - integer Swap status selector. +! It is interpreted as a communication status: +! psb_comm_status_start_ -> START phase +! psb_comm_status_wait_ -> WAIT phase +! psb_comm_status_unknown_ -> START+WAIT +! The communication scheme is selected from +! y%comm_handle%comm_type. ! ! ! n - integer Number of columns in Y -! beta - real Choose overwrite or sum. +! beta - real Choose overwrite or sum. ! y - type(psb_@x@_vect_type) The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - real Buffer space. If not sufficient, will do -! our own internal allocation. +! desc_a - type(psb_desc_type). The communication descriptor. ! info - integer. return code. ! data - integer which list is to be used to exchange data ! default psb_comm_halo_ @@ -89,101 +79,156 @@ ! ! ! -subroutine psi_sswapdata_vect(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_sswapdata_vect - use psb_s_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +submodule (psi_s_comm_v_mod) psi_s_swapdata_impl + use psb_desc_const_mod, only: psb_swap_start_, psb_swap_wait_ + use psb_base_mod + use psb_error_mod, only: psb_get_debug_level, psb_get_debug_unit, psb_debug_ext_ + use psb_comm_schemes_mod, only: psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_, psb_comm_rma_pull_, psb_comm_rma_push_, & + & psb_comm_handle_type + use psb_comm_rma_mod, only: psb_comm_rma_handle + use psb_comm_factory_mod + +contains + + module subroutine psi_sswapdata_vect(swap_status,beta,y,desc_a,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_vect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_), target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + integer(psb_ipk_), intent(in) :: swap_status + class(psb_s_base_vect_type), intent(inout) :: y + real(psb_spk_), intent(in) :: beta + type(psb_desc_type), target :: desc_a ! TODO: should this be intent(in)? + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, data_, err_act - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, my_rank, total_send, total_recv, num_neighbors, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + ! communication scheme/status selectors + logical :: baseline, ineighbor_a2av, ineighbor_a2av_persistent - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif + ! error handling variables + integer(psb_ipk_) :: err_act + character(len=30) :: name + logical :: debug - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if + info = psb_success_ + name = 'psi_sswapdata_vect' + call psb_erractionsave(err_act) - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if + debug = .false. - call psi_swapdata(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 + ctxt = desc_a%get_context() - call psb_erractionrestore(err_act) - return + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='desc_a%get_list_p') + goto 9999 + end if + + + if( (swap_status /= psb_comm_status_start_).and.(swap_status /= psb_comm_status_wait_)& + & .and.(swap_status /= psb_comm_status_sync_) ) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + ! Set the normalized swap status on the comm handle + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + if(debug .eqv. .true.) then + write(0,'(a,i0,a,i0)') 'DBG_DISPATCH comm_type=',y%comm_handle%comm_type,' desc_a%comm_type=',desc_a%comm_type + endif + select case(y%comm_handle%comm_type) + case(psb_comm_isend_irecv_) + call psi_sswap_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline swap') + goto 9999 + end if + case(psb_comm_ineighbor_alltoallv_) + call psi_sswap_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,& + & total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor nonblocking swap') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_sswap_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,& + & total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor persistent swap') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_sswap_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull swap') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_sswap_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push swap') + goto 9999 + end if + case default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Incompatible swap_status settings: no valid communication mode selected') + goto 9999 + end select + + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_sswapdata_vect + end subroutine psi_sswapdata_vect -! -! -! Subroutine: psi_sswap_vidx_vect -! Data exchange among processes. -! -! Takes care of Y an exanspulated vector. Relies on the gather/scatter methods -! of vectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_sswap_vidx_vect(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_sswap_vidx_vect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_s_base_vect_mod + subroutine psi_sswap_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -192,336 +237,1436 @@ subroutine psi_sswap_vidx_vect(ctxt,icomm,flag,beta,y,idx, & include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_vect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size),& + & iret, nesd, nerv + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti, n + integer(psb_ipk_) :: y_nrows, idx_min, idx_max + logical :: do_send,do_recv + logical, parameter :: usersend=.false. + logical :: debug + character(len=20) :: name + + info = psb_success_ + name = 'psi_sswap_baseline_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - ! locals - integer(psb_mpk_) :: np, me - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size),& - & iret, nesd, nerv - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti, n - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + icomm = ctxt%get_mpic() - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline swap') + goto 9999 + end select - totrcv_ = totrcv * n - totsnd_ = totsnd * n - call idx%sync() + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') + goto 9999 + end if - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then + n=1 + do_send = (swap_status == psb_comm_status_start_).or.(swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_).or.(swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + call comm_indexes%sync() + + if (debug) write(*,*) my_rank,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Unfinished communication? Something is wrong....') + goto 9999 + end if + end if + call y%new_buffer(ione*size(comm_indexes%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + y_nrows = y%get_nrows() + pnti = 1 + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + + rcv_pt = 1+pnti+psb_n_elem_recv_ + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= my_rank)) then + if (debug) write(*,*) my_rank,'Posting receive from',prcid(i),rcv_pt + p2ptag = psb_double_swap_tag + call mpi_irecv(y%combuf(rcv_pt),nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + pnti = pnti + nerv + nesd + 3 + end do + if (debug) write(*,*) my_rank,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = snd_pt + if ((idx_pt < 1) .or. (nesd < 0) .or. (idx_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if (nesd > 0) then + idx_min = minval(comm_indexes%v(idx_pt:idx_pt+nesd-1)) + idx_max = maxval(comm_indexes%v(idx_pt:idx_pt+nesd-1)) + if ((idx_min < 1) .or. (idx_max > y_nrows)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather index out of bounds') + goto 9999 + end if + end if + if ((idx_pt < 1) .or. (nesd < 0) .or. (idx_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(idx_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait + ! + call y%device_wait() + + if (debug) write(*,*) my_rank,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((nesd>0).and.(proc_to_comm /= my_rank)) then + call mpi_isend(y%combuf(snd_pt),nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) my_rank,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then ! - ! Unfinished communication? Something is wrong.... + ! No matching send? Something is wrong.... ! info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) my_rank,' wait' + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (proc_to_comm /= my_rank)then + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == my_rank) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) my_rank,' scatter' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((idx_pt < 1) .or. (nerv < 0) .or. (idx_pt+max(0,nerv)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter metadata out of bounds') + goto 9999 + end if + if (nerv > 0) then + idx_min = minval(comm_indexes%v(idx_pt:idx_pt+nerv-1)) + idx_max = maxval(comm_indexes%v(idx_pt:idx_pt+nerv-1)) + if ((idx_min < 1) .or. (idx_max > y_nrows)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter index out of bounds') + goto 9999 + end if + end if + if ((rcv_pt < 1) .or. (nerv < 0) .or. (rcv_pt+max(0,nerv)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter combuf bounds error') + goto 9999 + end if + + if (debug) write(*,*)my_rank,' Received from: ',prcid(i),& + & y%combuf(rcv_pt:rcv_pt+nerv-1) + call y%sct(rcv_pt,nerv,comm_indexes,beta) + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Waited for everybody, clean up + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) my_rank,' wait' + call y%device_wait() + if (debug) write(*,*) my_rank,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call y%comm_handle%free(info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) my_rank,' done' end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - rcv_pt = 1+pnti+psb_n_elem_recv_ - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - p2ptag = psb_real_swap_tag - call mpi_irecv(y%combuf(rcv_pt),nerv,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_sswap_baseline_vect + + + + subroutine psi_sswap_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical :: debug + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + info = psb_success_ + name = 'psi_sswap_neighbor_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor swap') + goto 9999 + end select + + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') + goto 9999 + end if + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (nonblocking)' + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(snd_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + else + neighbor_comm_handle%comm_request = mpi_request_null end if - pnti = pnti + nerv + nesd + 3 - end do - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - idx_pt = snd_pt - call y%gth(idx_pt,nesd,idx) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Then wait - ! - call y%device_wait() + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Ineighbor_alltoallv' + if (buffer_size > 0) then + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (baseline/positional layout) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs_v, & ! positional displacements (match gth layout) + & psb_mpi_r_spk_, & + & y%combuf(1), & ! recv buffer (baseline/positional layout) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs_v, & ! positional displacements (match sct layout) + & psb_mpi_r_spk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + ! Valid no-op exchange: nothing was posted in START and nothing to wait/scatter. + neighbor_comm_handle%comm_request = mpi_request_null + else + if (neighbor_comm_handle%comm_request == mpi_request_null) then + write(psb_err_unit,*) my_rank, 'DBG: neighbor WAIT but comm_request is NULL; is_initialized=', & + & neighbor_comm_handle%is_initialized + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - p2ptag = psb_real_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),nesd,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) + ! Only wait and scatter if there's data + if ((topology_total_send + topology_total_recv) > 0) then + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! Scatter received data to local vector positions (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((1+pnti+psb_n_elem_recv_ < 1) .or. (nerv < 0) .or. & + & (1+pnti+psb_n_elem_recv_+max(0,nerv)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter metadata out of bounds') + goto 9999 + end if + if ((rcv_pt < 1) .or. (nerv < 0) .or. (rcv_pt+max(0,nerv)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter combuf bounds error') + goto 9999 + end if + call y%sct(rcv_pt,nerv,comm_indexes,beta) + pnti = pnti + nerv + nesd + 3 + end do + else + ! nothing to wait/scatter end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) goto 9999 end if + if (debug) write(*,*) my_rank,' nbr_vect: done' - pnti = pnti + nerv + nesd + 3 - end do - end if + end if ! do_wait - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_sswap_neighbor_topology_vect + + + + subroutine psi_sswap_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical :: debug + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + info = psb_success_ + debug = .false. + name = 'psi_sswap_neighbor_persistent_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor swap') + goto 9999 + end select + + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') goto 9999 end if - call psb_realloc(totxch,prcid,info) - if (debug) write(*,*) me,' wait' - pnti = 1 - p2ptag = psb_real_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (proc_to_comm /= me)then - if (nesd>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (persistent)' + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid START: persistent neighbor request already in flight') + goto 9999 + end if + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < ione*size(comm_indexes%v)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) goto 9999 end if end if - if (nerv>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Gather send data into combuf using baseline-style gth calls + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data (baseline layout),', topology_total_send,' elems' + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(snd_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Lazy persistent-init: build the request once, then reuse with START/WAIT. + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Neighbor_alltoallv_init' + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & ! send buffer + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs_v, & ! positional (baseline layout) + & psb_mpi_r_spk_, & + & y%combuf(1), & ! recv buffer (baseline layout) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs_v, & ! positional (baseline layout) + & psb_mpi_r_spk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) goto 9999 end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 end if - y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. end if - pnti = pnti + nerv + nesd + 3 - end do - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + end if ! do_start - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(rcv_pt:rcv_pt+nerv-1) - call y%sct(rcv_pt,nerv,idx,beta) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Waited for everybody, clean up - ! - y%comid = mpi_request_null + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + ! Valid no-op exchange: nothing was posted in START and nothing to wait/scatter. + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + ! Only wait and scatter if there's data + if ((topology_total_send + topology_total_recv) > 0) then + ! Wait for the persistent collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on persistent MPI request' + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Scatter received data to local vector positions (baseline-style sct) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data (baseline layout),', topology_total_recv,' elems' + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + rcv_pt = 1+pnti+psb_n_elem_recv_ + if (nerv > 0) then + call y%sct(rcv_pt,nerv,comm_indexes,beta) + end if + pnti = pnti + nerv + nesd + 3 + end do + end if + + call y%device_wait() + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_sswap_neighbor_persistent_topology_vect + + + subroutine psi_sswap_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + + info = psb_success_ + name = 'psi_sswap_rma_pull_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - if (debug) write(*,*) me,' done' - end if + icomm = ctxt%get_mpic() + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for pull mode') + goto 9999 + end select + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) - call psb_erractionrestore(err_act) - return + call comm_indexes%sync() + + ! START phase: build the layout once, prepare the exposed buffer, then issue RMA. + if (do_start) then + buffer_size = total_send + total_recv + + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA pull rank cache allocation') + goto 9999 + end if + end if + + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA pull init_memory_buffer_layout failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + ! Need a larger exposed memory area: recreate the RMA window first, + ! then reallocate combuf and lazily create a new window below. + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + ! Expose combuf once and keep the window around until the descriptor changes. + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send)) + end if + call y%device_wait() + + ! Pull data from each peer with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = total_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA pull') + goto 9999 + end if + if ((recv_pos < 1) .or. (recv_count < 0) .or. (recv_pos+max(0,recv_count)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull local receive bounds error') + goto 9999 + end if + + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count, psb_mpi_r_spk_, prc_rank, remote_disp, recv_count, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter received data into Y. + if (do_wait) then + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send+1:total_send+total_recv), beta) + end if + + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_sswap_rma_pull_vect - return -end subroutine psi_sswap_vidx_vect -! -! -! Subroutine: psi_sswapdata_multivect -! Data exchange among processes. -! -! Takes care of Y an encaspulated multivector. -! -! -subroutine psi_sswapdata_multivect(flag,beta,y,desc_a,work,info,data) + subroutine psi_sswap_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_sswap_rma_push_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for push mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! START phase: identical layout handling, but the remote metadata describes the receive side. + if (do_start) then + buffer_size = total_send + total_recv + + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA put rank cache allocation') + goto 9999 + end if + end if + + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA put ini_memory_buffer_layout') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + ! Need a larger exposed memory area: recreate the RMA window first, + ! then reallocate combuf and lazily create a new window below. + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + ! Keep the window alive across repetitions: it is created once and reused. + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window (prevents isend/irecv ordering issues). + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + ! Push data to each peer; after flush send a P2P notification so target knows data arrived. + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = total_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA push') + goto 9999 + end if + if ((send_pos < 1) .or. (send_count < 0) .or. (send_pos+max(0,send_count)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push local send bounds error') + goto 9999 + end if + + if (send_count > 0) then + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count, psb_mpi_r_spk_, prc_rank, remote_disp, send_count, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if - use psi_mod, psb_protect_name => psi_sswapdata_multivect - use psb_s_base_multivect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + ! WAIT phase: close epoch, wait for P2P notifications, then scatter. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send+1:total_send+total_recv), beta) + end if + + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_sswap_rma_push_vect + + + + ! + ! + ! Subroutine: psi_sswapdata_multivect + ! Data exchange among processes. + ! + ! Takes care of Y an encaspulated multivector. + ! + ! + module subroutine psi_sswapdata_multivect(swap_status,beta,y,desc_a,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_multivect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_), target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + integer(psb_ipk_), intent(in) :: swap_status + class(psb_s_base_multivect_type), intent(inout) :: y + real(psb_spk_), intent(in) :: beta + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, data_, err_act - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) + ! communication scheme/status selectors + logical :: baseline, ineighbor_a2av, ineighbor_a2av_persistent - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, my_rank, total_send, total_recv, num_neighbors, data_, err_act + integer(psb_mpk_) :: n, total_send_, total_recv_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=30) :: name - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif + + info = psb_success_ + name = 'psi_sswapdata_multivect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if - call psi_swapdata(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 + if ((swap_status /= psb_comm_status_start_) .and. (swap_status /= psb_comm_status_wait_) & + & .and. (swap_status /= psb_comm_status_unknown_)) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + baseline = .false. + ineighbor_a2av = .false. + ineighbor_a2av_persistent = .false. + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + ineighbor_a2av = .true. + case(psb_comm_persistent_ineighbor_alltoallv_) + ineighbor_a2av_persistent = .true. + case(psb_comm_rma_pull_) + call psi_sswap_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull swap') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_sswap_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push swap') + goto 9999 + end if + case default + baseline = .true. + end select + + if (baseline) then + call psi_sswap_baseline_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline swap') + goto 9999 + end if + else if (ineighbor_a2av) then + call psi_sswap_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor nonblocking swap') + goto 9999 + end if + else if (ineighbor_a2av_persistent) then + call psi_sswap_neighbor_topology_multivect_persistent(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor persistent swap') + goto 9999 + end if + else + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Incompatible swap_status settings: no valid communication mode selected') + goto 9999 + end if - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_sswapdata_multivect + end subroutine psi_sswapdata_multivect -! -! -! Subroutine: psi_sswap_vidx_multivect -! Data exchange among processes. -! -! Takes care of Y an encapsulated multivector. Relies on the gather/scatter methods -! of multivectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_sswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_sswap_vidx_multivect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_s_base_multivect_mod + + +subroutine psi_sswap_baseline_multivect(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -530,100 +1675,107 @@ subroutine psi_sswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_multivect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name + logical :: do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name - info=psb_success_ - name='psi_swap_datav' + info = psb_success_ + name = 'psi_sswap_baseline_multivect' call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) + call psb_info(ctxt,my_rank,np) if (np == -1) then - info=psb_err_context_error_ + info = psb_err_context_error_ call psb_errpush(info,name) goto 9999 endif n = y%get_ncols() - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline multivect swap') + goto 9999 + end select + + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) - totrcv_ = totrcv * n - totsnd_ = totsnd * n + total_recv_ = total_recv * n + total_send_ = total_send * n - call idx%sync() + call comm_indexes%sync() - if (debug) write(*,*) me,'Internal buffer' + if (debug) write(*,*) my_rank,'Internal buffer' if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + info = psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) + if (debug) write(*,*) my_rank,'do_send start' + call y%new_buffer(total_send_+total_recv_,info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) ! First I post all the non blocking receives pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - p2ptag = psb_real_swap_tag - call mpi_irecv(y%combuf(rcv_pt),n*nerv,& + if ((nerv>0).and.(proc_to_comm /= my_rank)) then + if (debug) write(*,*) my_rank,'Posting receive from',prcid(i),rcv_pt + p2ptag = psb_double_swap_tag + call mpi_irecv(y%combuf(rcv_pt),n*nerv,& & psb_mpi_r_spk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) end if rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do - if (debug) write(*,*) me,' Gather ' + if (debug) write(*,*) my_rank,' Gather ' ! ! Then gather for sending. ! pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call y%gth(idx_pt,snd_pt,nesd,idx) + call y%gth(idx_pt,snd_pt,nesd,comm_indexes) rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 @@ -634,24 +1786,24 @@ subroutine psi_sswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & ! call y%device_wait() - if (debug) write(*,*) me,' isend' + if (debug) write(*,*) my_rank,' isend' ! ! Then send ! pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - p2ptag = psb_real_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),n*nesd,& + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + + if ((nesd>0).and.(proc_to_comm /= my_rank)) then + call mpi_isend(y%combuf(snd_pt),n*nesd,& & psb_mpi_r_spk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) end if if(iret /= mpi_success) then @@ -666,8 +1818,8 @@ subroutine psi_sswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & end if if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then + if (debug) write(*,*) my_rank,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then ! ! No matching send? Something is wrong.... ! @@ -675,20 +1827,20 @@ subroutine psi_sswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if - call psb_realloc(totxch,prcid,info) + call psb_realloc(num_neighbors,prcid,info) - if (debug) write(*,*) me,' wait' + if (debug) write(*,*) my_rank,' wait' pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - p2ptag = psb_real_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm /= me)then + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + if (proc_to_comm /= my_rank)then if (nesd>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) if(iret /= mpi_success) then info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/iret/)) @@ -696,14 +1848,14 @@ subroutine psi_sswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & end if end if if (nerv>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) if(iret /= mpi_success) then info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/iret/)) goto 9999 end if end if - else if (proc_to_comm == me) then + else if (proc_to_comm == my_rank) then if (nesd /= nerv) then write(psb_err_unit,*) & & 'Fatal error in swapdata: mismatch on self send',& @@ -716,19 +1868,19 @@ subroutine psi_sswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & pnti = pnti + nerv + nesd + 3 end do - if (debug) write(*,*) me,' scatter' + if (debug) write(*,*) my_rank,' scatter' pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+psb_n_elem_recv_ - if (debug) write(0,*)me,' Received from: ',prcid(i),& + if (debug) write(0,*)my_rank,' Received from: ',prcid(i),& & y%combuf(rcv_pt:rcv_pt+n*nerv-1) - call y%sct(idx_pt,rcv_pt,nerv,idx,beta) + call y%sct(idx_pt,rcv_pt,nerv,comm_indexes,beta) rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 @@ -736,21 +1888,23 @@ subroutine psi_sswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & ! ! Waited for com, cleanup comid ! - y%comid = mpi_request_null + baseline_comm_handle%comid = mpi_request_null ! ! Then wait for device ! - if (debug) write(*,*) me,' wait' + if (debug) write(*,*) my_rank,' wait' call y%device_wait() - if (debug) write(*,*) me,' free buffer' + if (debug) write(*,*) my_rank,' free buffer' call y%free_buffer(info) - if (info == 0) call y%free_comid(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if if (info /= 0) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - if (debug) write(*,*) me,' done' + if (debug) write(*,*) my_rank,' done' end if @@ -760,5 +1914,859 @@ subroutine psi_sswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_sswap_vidx_multivect +end subroutine psi_sswap_baseline_multivect + + + +subroutine psi_sswap_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, n + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_sswap_neighbor_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor multivect swap') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (nonblocking)' + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, & + & ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! Gather send data into contiguous send buffer (polymorphic for GPU) + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data,', topology_total_send,' elems' + call y%gth(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(1:total_send_)) + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Ineighbor_alltoallv' + if (buffer_size > 0) then + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_r_spk_, & + & y%combuf(total_send_ + 1), & ! recv buffer + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_spk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if ((topology_total_send + topology_total_recv) > 0) then + if (neighbor_comm_handle%comm_request == mpi_request_null) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if ((topology_total_send + topology_total_recv) > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + end if + + ! Scatter received data to local vector positions (polymorphic for GPU) + if ((topology_total_send + topology_total_recv) > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + call y%sct(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(total_send_+1:total_send_+total_recv_), & + & beta) + end if + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return +end subroutine psi_sswap_neighbor_topology_multivect + + + +subroutine psi_sswap_neighbor_topology_multivect_persistent(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, n + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_sswap_neighbor_topology_multivect_persistent' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor multivect swap') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (persistent)' + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid START: persistent neighbor request already in flight') + goto 9999 + end if + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, & + & ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Gather send data into contiguous send buffer (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data,', topology_total_send,' elems' + call y%gth(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(1:total_send_)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Neighbor_alltoallv_init' + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & ! send buffer + & n*neighbor_comm_handle%send_counts, & + & n*neighbor_comm_handle%send_displs, & + & psb_mpi_r_spk_, & + & y%combuf(total_send_ + 1), & ! recv buffer + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_spk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) > 0) then + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + + ! Wait for the persistent collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on persistent MPI request' + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Scatter received data to local vector positions (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + call y%sct(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(total_send_+1:total_send_+total_recv_), & + & beta) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + call y%device_wait() + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return +end subroutine psi_sswap_neighbor_topology_multivect_persistent + + + subroutine psi_sswap_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, total_send_, total_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_sswap_rma_pull_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for pull mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_send_ + total_recv_ + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA pull rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA pull init_memory_buffer_layout failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send_)) + end if + call y%device_wait() + + ! Pull data from each peer with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA pull') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int((remote_base - 1) * n, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count*n, psb_mpi_r_spk_, prc_rank, remote_disp, recv_count*n, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter received data into Y. + if (do_wait) then + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send_+1:total_send_+total_recv_), beta) + end if + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_sswap_rma_pull_multivect + + + subroutine psi_sswap_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, total_send_, total_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_sswap_rma_push_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for push mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_send_ + total_recv_ + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA put rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA put ini_memory_buffer_layout') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send_)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA push') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int((remote_base - 1) * n, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count*n, psb_mpi_r_spk_, prc_rank, remote_disp, send_count*n, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send_+1:total_send_+total_recv_), beta) + end if + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_sswap_rma_push_multivect + + +end submodule psi_s_swapdata_impl diff --git a/base/comm/internals/psi_sswapdata_a.F90 b/base/comm/internals/psi_sswapdata_a.F90 index 0f1f26da0..7d117dc83 100644 --- a/base/comm/internals/psi_sswapdata_a.F90 +++ b/base/comm/internals/psi_sswapdata_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -39,7 +39,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D real(psb_spk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -84,912 +84,903 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_sswapdatam(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_s_comm_a_mod) psi_s_swapdata_a_impl + use psb_base_mod +contains + module subroutine psi_sswapdatam(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_sswapdatam - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:,:), beta - real(psb_spk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + real(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swapdata(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_sswapdatam + end subroutine psi_sswapdatam -subroutine psi_sswapidxm(ctxt,icomm,flag,n,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + module subroutine psi_sswapidxm(ctxt,flag,n,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) - use psi_mod, psb_protect_name => psi_sswapidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:,:), beta - real(psb_spk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - real(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:,:) + real(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + +real(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if - ! prepare info for communications + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + end if - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_r_spk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_r_spk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),n*nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),n*nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*)& + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if - else - allocate(rvhd(totxch),prcid(totxch),stat=info) + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if if(info /= psb_success_) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(albf) deallocate(sndbuf,rcvbuf,stat=info) if(info /= psb_success_) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - albf=.true. - end if - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_r_spk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_r_spk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - - else if (swap_sync) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if (proc_to_comm < me) then - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_real_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_real_swap_tag - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),n*nesd,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),n*nesd,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag,icomm,iret) - end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_real_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*)& - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_sswapidxm + end subroutine psi_sswapidxm + + ! + ! + ! Subroutine: psi_sswapdatav + ! Implements the data exchange among processes. Essentially this is doing + ! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D real(psb_spk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_sswapdatav(flag,beta,y,desc_a,work,info,data) -! -! -! Subroutine: psi_sswapdatav -! Implements the data exchange among processes. Essentially this is doing -! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - real Choose overwrite or sum. -! y(:) - real The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - real Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_sswapdatav(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_sswapdatav - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:), beta - real(psb_spk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + real(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_sswapdatav + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_sswapdataidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_sswapidxv(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + call psi_swapdata(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 - use psi_mod, psb_protect_name => psi_sswapidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_sswapdatav + + + ! + ! + ! Subroutine: psi_sswapdataidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_sswapidxv(ctxt,flag,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) + + use psb_error_mod + use psb_desc_mod + use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:), beta - real(psb_spk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - real(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:) + real(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + real(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+nesd-1)) - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_r_spk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_r_spk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+nesd-1)) + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_r_spk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_r_spk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send) then - if (proc_to_comm < me) then + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_snd(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_rcv(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_real_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),nerv,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - p2ptag = psb_real_swap_tag + end if - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),nesd,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),nesd,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag,icomm,iret) - end if + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_real_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_sswapidxv + end subroutine psi_sswapidxv +end submodule psi_s_swapdata_a_impl diff --git a/base/comm/internals/psi_sswaptran.F90 b/base/comm/internals/psi_sswaptran.F90 index abb0ebed7..069b07d11 100644 --- a/base/comm/internals/psi_sswaptran.F90 +++ b/base/comm/internals/psi_sswaptran.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -43,7 +43,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D real(psb_spk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -59,12 +59,12 @@ ! ! ! Arguments: -! flag - integer Choose the algorithm for data exchange: +! swap_status - integer Choose the algorithm for data exchange: ! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 +! swap_mpi = iand(swap_status,psb_swap_mpi_) /= 0 +! swap_sync = iand(swap_status,psb_swap_sync_) /= 0 +! swap_send = iand(swap_status,psb_swap_send_) /= 0 +! swap_recv = iand(swap_status,psb_swap_recv_) /= 0 ! if (swap_mpi): use underlying MPI_ALLTOALLV. ! if (swap_sync): use PSB_SND and PSB_RCV in ! synchronized pairs @@ -78,9 +78,8 @@ ! ! n - integer Number of columns in Y ! beta - real Choose overwrite or sum. -! y - type(psb_s_vect_type) The data area +! y - type(psb_d_vect_type) The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - real Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -91,13 +90,980 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_sswaptran_vect(flag,beta,y,desc_a,work,info,data) +submodule (psi_s_comm_v_mod) psi_s_swaptran_impl + use psb_base_mod + use psb_comm_factory_mod +contains + module subroutine psi_sswaptran_vect(swap_status,beta,y,desc_a,info,data) - use psi_mod, psb_protect_name => psi_sswaptran_vect - use psb_s_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + type(psb_desc_type),target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, total_send, total_recv, num_neighbors, err_act, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=20) :: name + + info = psb_success_ + name = 'psi_sswaptran_vect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + if( (swap_status /= psb_comm_status_start_).and.(swap_status /= psb_comm_status_wait_)& + & .and.(swap_status /= psb_comm_status_sync_) ) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + ! Set the normalized swap status on the comm handle + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + call psi_stran_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor a2av tran') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_stran_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='persistent neighbor tran') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_stran_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull tran') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_stran_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push tran') + goto 9999 + end if + case default + call psi_stran_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline tran') + goto 9999 + end if + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_sswaptran_vect + + ! + ! + ! Subroutine: psi_stran_baseline_vect + ! Data exchange among processes. + ! + ! Takes care of Y an encapsulated vector. Relies on the gather/scatter methods + ! of vectors. + ! + ! The real workhorse: the outer routine will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_stran_baseline_vect(ctxt,swap_status,beta,y,idx,& + & num_neighbors,total_send,total_recv,comm_handle,info) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_) :: icomm + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name + + info = psb_success_ + name = 'psi_stran_baseline_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline swaptran') + goto 9999 + end select + + n=1 + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + + call idx%sync() + + if (debug) write(*,*) me,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + end if + if (debug) write(*,*) me,'do_send start' + call y%new_buffer(ione*size(idx%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt + call mpi_irecv(y%combuf(snd_pt),nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + snd_pt = 1 + do i=1, num_neighbors + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + idx_pt = rcv_pt + call y%gth(idx_pt,nerv,idx) + + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait + ! + call y%device_wait() + + if (debug) write(*,*) me,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((nerv>0).and.(proc_to_comm /= me)) then + call mpi_isend(y%combuf(rcv_pt),nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) me,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then + ! + ! No matching send? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) me,' wait' + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (proc_to_comm /= me)then + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' scatter' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (debug) write(0,*)me,' Received from: ',prcid(i),& + & y%combuf(snd_pt:snd_pt+nesd-1) + call y%sct(snd_pt,nesd,idx,beta) + pnti = pnti + nerv + nesd + 3 + end do + ! + ! Waited for everybody, clean up + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) me,' wait' + call y%device_wait() + if (debug) write(*,*) me,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) me,' done' + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psi_stran_baseline_vect + + + + + subroutine psi_stran_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_stran_neighbor_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor swaptran') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) me,' nbr_vect: starting data exchange' + ! Lazy initialization: build the topology on first call + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) me,' nbr_vect: building topology' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, & + & a_err='neighbor_topology_init') + goto 9999 + end if + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! For transpose exchange: gather recv area first (we will send "recv" data) + if (debug) write(*,*) me,' nbr_tran_vect: gathering recv data,', topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv swapping send/recv arrays + if (debug) write(*,*) me,' nbr_tran_vect: posting MPI_Ineighbor_alltoallv (swapped)' + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (recv_indexes gathered) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_r_spk_, & + & y%combuf(topology_total_recv + 1), & ! recv buffer (will contain send_indexes data) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_r_spk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if (neighbor_comm_handle%comm_request == mpi_request_null) then + ! No matching start? Something is wrong + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) me,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! For transpose exchange: scatter the data that correspond to peers' send area + if (debug) write(*,*) me,' nbr_tran_vect: scattering send-index data,', topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) me,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_stran_neighbor_topology_vect + + + + + ! + ! + ! + ! + ! Subroutine: psi_sswaptran_multivect + ! Data exchange among processes. + ! + ! Takes care of Y an encaspulated multivector. + ! + ! + module subroutine psi_sswaptran_multivect(swap_status,beta,y,desc_a,info,data) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_multivect_type), intent(inout) :: y + type(psb_desc_type),target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, total_send, total_recv, num_neighbors, err_act, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=20) :: name + + integer(psb_ipk_) :: setflag + + + info = psb_success_ + name = 'psi_sswaptran_multivect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + setflag = swap_status + if (swap_status == psb_swap_start_) then + setflag = psb_comm_status_start_ + else if (swap_status == psb_swap_wait_) then + setflag = psb_comm_status_wait_ + else if ((iand(swap_status, psb_swap_send_) /= 0) .or. (iand(swap_status, psb_swap_recv_) /= 0) .or. & + & (iand(swap_status, psb_swap_mpi_) /= 0) .or. (iand(swap_status, psb_swap_sync_) /= 0)) then + setflag = psb_comm_status_sync_ + end if + + if ((setflag /= psb_comm_status_start_) .and. (setflag /= psb_comm_status_wait_) .and. & + & (setflag /= psb_comm_status_sync_)) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + call y%comm_handle%set_swap_status(setflag, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + call psi_stran_neighbor_topology_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor a2av tran') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_stran_neighbor_persistent_topology_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='persistent neighbor tran') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_stran_rma_pull_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull tran') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_stran_rma_push_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push tran') + goto 9999 + end if + case default + call psi_stran_baseline_multivect(ctxt,setflag,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline tran') + goto 9999 + end if + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_sswaptran_multivect + + subroutine psi_stran_baseline_multivect(ctxt,swap_status,beta,y,idx,& + & num_neighbors,total_send,total_recv,comm_handle,info) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_s_base_multivect_type), intent(inout) :: y + real(psb_spk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_) :: icomm + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name + + info = psb_success_ + name = 'psi_stran_vidx_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline multivect swaptran') + goto 9999 + end select + + n = y%get_ncols() + + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + + call idx%sync() + + if (debug) write(*,*) me,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + end if + if (debug) write(*,*) me,'do_send start' + call y%new_buffer(ione*size(idx%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt + call mpi_irecv(y%combuf(snd_pt),n*nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + do i=1, num_neighbors + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call y%gth(idx_pt,rcv_pt,nerv,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait for device + ! + call y%device_wait() + + if (debug) write(*,*) me,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + if ((nerv>0).and.(proc_to_comm /= me)) then + call mpi_isend(y%combuf(rcv_pt),n*nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) me,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then + ! + ! No matching send? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) me,' wait' + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + if (proc_to_comm /= me)then + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' scatter' + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + + if (debug) write(0,*)me,' Received from: ',prcid(i),& + & y%combuf(snd_pt:snd_pt+n*nesd-1) + call y%sct(idx_pt,snd_pt,nesd,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! + ! Waited for com, cleanup comid + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) me,' wait' + call y%device_wait() + if (debug) write(*,*) me,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) me,' done' + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psi_stran_baseline_multivect + + + subroutine psi_stran_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -106,85 +1072,170 @@ subroutine psi_sswaptran_vect(flag,beta,y,desc_a,work,info,data) include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_vect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_stran_neighbor_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor multivect swaptran') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) me,' nbr_vect: starting data exchange' + ! Lazy initialization: build the topology on first call + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) me,' nbr_vect: building topology' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, & + & a_err='neighbor_topology_init') + goto 9999 + end if + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! For transpose exchange: gather recv area first (we will send "recv" data) + if (debug) write(*,*) me,' nbr_tran_vect: gathering recv data,', topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv swapping send/recv arrays + if (debug) write(*,*) me,' nbr_tran_vect: posting MPI_Ineighbor_alltoallv (swapped)' + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (recv_indexes gathered) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_r_spk_, & + & y%combuf(topology_total_recv + 1), & ! recv buffer (will contain send_indexes data) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_r_spk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if (neighbor_comm_handle%comm_request == mpi_request_null) then + ! No matching start? Something is wrong + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) me,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! For transpose exchange: scatter the data that correspond to peers' send area + if (debug) write(*,*) me,' nbr_tran_vect: scattering send-index data,', topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) me,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_sswaptran_vect + end subroutine psi_stran_neighbor_topology_multivect -! -! -! Subroutine: psi_stran_vidx_vect -! Data exchange among processes. -! -! Takes care of Y an encapsulated vector. Relies on the gather/scatter methods -! of vectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_stran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_stran_vidx_vect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_s_base_vect_mod + + + subroutine psi_stran_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -193,345 +1244,661 @@ subroutine psi_stran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_vect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - call idx%sync() - - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) - goto 9999 - end if + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: icomm, np, my_rank, iret + integer(psb_mpk_) :: p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + info = psb_success_ + name = 'psi_stran_neighbor_persistent_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor swaptran') + goto 9999 + end select + + if (swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='psb_comm_status_unknown_ not allowed in persistent neighbor swaptran') + goto 9999 end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - p2ptag = psb_real_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - call mpi_irecv(y%combuf(snd_pt),nesd,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) - end if - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - idx_pt = rcv_pt - call y%gth(idx_pt,nerv,idx) - - pnti = pnti + nerv + nesd + 3 - end do - - ! - ! Then wait - ! - call y%device_wait() - - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - p2ptag = psb_real_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),nerv,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid START: persistent neighbor request already in flight') goto 9999 end if + if (.not. neighbor_comm_handle%is_initialized) then + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Transpose: gather from recv_indexes (we "send" recv data) + if (debug) write(*,*) my_rank,' tran_persistent_vect: gathering recv data,',topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if - pnti = pnti + nerv + nesd + 3 - end do - end if + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + ! Transpose: swap send/recv counts in alltoallv_init + ! send = recv_indexes data with recv_counts/displs + ! recv = into send_indexes area with send_counts/displs + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_r_spk_, & + & y%combuf(topology_total_recv + 1), & + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_r_spk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + end if ! do_start + + if (do_wait) then + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + if ((topology_total_send + topology_total_recv) > 0) then + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Transpose: scatter to send_indexes + if (debug) write(*,*) my_rank,' tran_persistent_vect: scattering to send_indexes,',topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + end if + + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_stran_neighbor_persistent_topology_vect + + + subroutine psi_stran_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! Effective sizes for transpose: + ! eff_send = total_recv (we expose recv_indexes data) + ! eff_recv = total_send (we GET into the send_indexes area) + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_stran_rma_pull_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - call psb_realloc(totxch,prcid,info) - - if (debug) write(*,*) me,' wait' - pnti = 1 - p2ptag = psb_real_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (proc_to_comm /= me)then - if (nerv>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + icomm = ctxt%get_mpic() + eff_send = total_recv + eff_recv = total_send + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran pull') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = eff_send + eff_recv + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran pull rank cache allocation') goto 9999 end if end if - if (nesd>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran pull init_memory_buffer_layout_tran failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+nesd-1) - call y%sct(snd_pt,nesd,idx,beta) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Waited for everybody, clean up - ! - y%comid = mpi_request_null - - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if (debug) write(*,*) me,' done' - end if - + end if - call psb_erractionrestore(err_act) - return + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + ! Transpose: gather recv_indexes data into combuf(1:eff_send) + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:eff_send)) + end if + call y%device_wait() + + ! Pull from each peer's recv_indexes area with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = eff_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran pull') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count, psb_mpi_r_spk_, prc_rank, remote_disp, recv_count, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if ! do_start - return + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter into send_indexes. + if (do_wait) then + ! Transpose: scatter to send_indexes (peer_recv_indexes in tran init = actual send_indexes) + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(eff_send+1:eff_send+eff_recv), beta) + end if + call y%device_wait() + end if ! do_wait -end subroutine psi_stran_vidx_vect + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_stran_rma_pull_vect -! -! -! -! -! Subroutine: psi_sswaptran_multivect -! Data exchange among processes. -! -! Takes care of Y an encaspulated multivector. -! -! -subroutine psi_sswaptran_multivect(flag,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_sswaptran_multivect - use psb_s_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + subroutine psi_stran_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_multivect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_stran_rma_push_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + eff_send = total_recv + eff_recv = total_send + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran push') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = eff_send + eff_recv + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran push rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran push init_memory_buffer_layout_tran failure') + goto 9999 + end if + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + ! Transpose: gather recv_indexes data into combuf(1:eff_send) + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:eff_send)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + ! Push our recv_indexes data to each peer's send_indexes area; notify after flush. + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = eff_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran push') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count, psb_mpi_r_spk_, prc_rank, remote_disp, send_count, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter into send_indexes. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + ! Transpose: scatter to send_indexes (peer_recv_indexes in tran init = actual send_indexes) + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(eff_send+1:eff_send+eff_recv), beta) + end if + call y%device_wait() + end if ! do_wait + call psb_erractionrestore(err_act) return - end subroutine psi_sswaptran_multivect +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_stran_rma_push_vect -! -! -! Subroutine: psi_stran_vidx_multivect -! Data exchange among processes. -! -! Takes care of Y an encapsulated multivector. Relies on the gather/scatter methods -! of multivectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_stran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_stran_vidx_multivect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_s_base_multivect_mod + + subroutine psi_stran_neighbor_persistent_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -540,243 +1907,661 @@ subroutine psi_stran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_multivect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n = y%get_ncols() - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - call idx%sync() - - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) - goto 9999 - end if + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: icomm, np, my_rank, iret, n + integer(psb_mpk_) :: p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + info = psb_success_ + name = 'psi_stran_neighbor_persistent_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor multivect swaptran') + goto 9999 + end select + + if (swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='psb_comm_status_unknown_ not allowed in persistent neighbor multivect swaptran') + goto 9999 end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_real_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt - call mpi_irecv(y%combuf(snd_pt),n*nesd,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call y%gth(idx_pt,rcv_pt,nerv,idx) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - ! - ! Then wait for device - ! - call y%device_wait() - - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! - - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_real_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),n*nerv,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid START: persistent neighbor request already in flight') goto 9999 end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - end if - - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + if (.not. neighbor_comm_handle%is_initialized) then + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Transpose: gather from recv_indexes + if (debug) write(*,*) my_rank,' tran_persistent_mv: gathering recv data,',topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:total_recv_)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + ! Transpose: swap send/recv in alltoallv_init + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_spk_, & + & y%combuf(total_recv_ + 1), & + & n*neighbor_comm_handle%send_counts, & + & n*neighbor_comm_handle%send_displs, & + & psb_mpi_r_spk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + end if ! do_start + + if (do_wait) then + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + + if ((topology_total_send + topology_total_recv) == 0) then + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + if ((topology_total_send + topology_total_recv) > 0) then + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Transpose: scatter to send_indexes + if (debug) write(*,*) my_rank,' tran_persistent_mv: scattering to send_indexes,',topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(total_recv_+1:total_recv_+total_send_), & + & beta) + end if + + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_stran_neighbor_persistent_topology_multivect + + + subroutine psi_stran_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv, total_eff_send_, total_eff_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_stran_rma_pull_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - call psb_realloc(totxch,prcid,info) - - if (debug) write(*,*) me,' wait' - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_real_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm /= me)then - if (nerv>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + icomm = ctxt%get_mpic() + n = y%get_ncols() + eff_send = total_recv + eff_recv = total_send + total_eff_send_ = eff_send * n + total_eff_recv_ = eff_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran pull multivect') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_eff_send_ + total_eff_recv_ + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran pull multivect rank allocation') goto 9999 end if end if - if (nesd>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran pull multivect init_memory_buffer_layout_tran') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+n*nesd-1) - call y%sct(idx_pt,snd_pt,nesd,idx,beta) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! - ! Waited for com, cleanup comid - ! - y%comid = mpi_request_null - - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_eff_send_)) + end if + call y%device_wait() + + ! Pull from each peer's recv_indexes area with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_eff_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran pull multivect') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int((remote_base - 1)*n, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count*n, psb_mpi_r_spk_, prc_rank, remote_disp, recv_count*n, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran pull multivect self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter into send_indexes. + if (do_wait) then + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, & + & y%combuf(total_eff_send_+1:total_eff_send_+total_eff_recv_), beta) + end if + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_stran_rma_pull_multivect + + + subroutine psi_stran_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv, total_eff_send_, total_eff_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_stran_rma_push_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - if (debug) write(*,*) me,' done' - end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + eff_send = total_recv + eff_recv = total_send + total_eff_send_ = eff_send * n + total_eff_recv_ = eff_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran push multivect') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_eff_send_ + total_eff_recv_ + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran push multivect rank allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran push multivect init_memory_buffer_layout_tran') + goto 9999 + end if + end if + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if - call psb_erractionrestore(err_act) - return + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_eff_send_)) + end if + call y%device_wait() - return + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do -end subroutine psi_stran_vidx_multivect + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_eff_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran push multivect') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int((remote_base - 1)*n, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count*n, psb_mpi_r_spk_, prc_rank, remote_disp, send_count*n, psb_mpi_r_spk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran push multivect self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter into send_indexes. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, & + & y%combuf(total_eff_send_+1:total_eff_send_+total_eff_recv_), beta) + end if + call y%device_wait() + end if ! do_wait + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_stran_rma_push_multivect +end submodule psi_s_swaptran_impl diff --git a/base/comm/internals/psi_sswaptran_a.F90 b/base/comm/internals/psi_sswaptran_a.F90 index 10e741ddb..53b22426e 100644 --- a/base/comm/internals/psi_sswaptran_a.F90 +++ b/base/comm/internals/psi_sswaptran_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,7 +30,7 @@ ! ! ! -! File: psi_sswaptran.F90 +! File: psi_sswaptran_a.F90 ! ! Subroutine: psi_sswaptranm ! Implements the data exchange among processes. This is similar to Xswapdata, but @@ -43,7 +43,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D real(psb_spk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -88,922 +88,913 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_sswaptranm(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_s_comm_a_mod) psi_s_swaptran_a_impl + use psb_base_mod +contains + module subroutine psi_sswaptranm(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_sswaptranm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:,:), beta - real(psb_spk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + real(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swaptran(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) return -end subroutine psi_sswaptranm -subroutine psi_stranidxm(ctxt,icomm,flag,n,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_sswaptranm - use psi_mod, psb_protect_name => psi_stranidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + module subroutine psi_stranidxm(ctxt,flag,n,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:,:), beta - real(psb_spk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - real(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + real(psb_spk_), intent(inout) :: y(:,:) + real(psb_spk_), intent(in) :: beta + real(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + real(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if - ! prepare info for communications + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + if (do_send) then - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 end if - albf=.true. - end if - if (do_send) then - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) + ! Case SWAP_MPI + if (swap_mpi) then - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_r_spk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_r_spk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),n*nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send',& + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - ! Case SWAP_MPI - if (swap_mpi) then + else if (swap_send) then - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_r_spk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_r_spk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 - else if (swap_sync) then + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_recv) then - if (proc_to_comm < me) then - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm > me) then + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_real_swap_tag - call mpi_irecv(sndbuf(snd_pt),n*nesd,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_real_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag,icomm,iret) - end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 + end if - end do + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_real_swap_tag + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send',& - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_stranidxm -! -! -! Subroutine: psi_sswaptranv -! Implements the data exchange among processes. This is similar to Xswapdata, but -! the list is read "in reverse", i.e. indices that are normally SENT are used -! for the RECEIVE part and vice-versa. This is the basic data exchange operation -! for doing the product of a sparse matrix by a vector. -! Essentially this is doing a variable all-to-all data exchange -! (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - real Choose overwrite or sum. -! y(:) - real The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - real Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_sswaptranv(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_sswaptranv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + end subroutine psi_stranidxm + ! + ! + ! Subroutine: psi_sswaptranv + ! Implements the data exchange among processes. This is similar to Xswapdata, but + ! the list is read "in reverse", i.e. indices that are normally SENT are used + ! for the RECEIVE part and vice-versa. This is the basic data exchange operation + ! for doing the product of a sparse matrix by a vector. + ! Essentially this is doing a variable all-to-all data exchange + ! (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D real(psb_spk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_sswaptranv(flag,beta,y,desc_a,work,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:), beta - real(psb_spk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + real(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tranv' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_sswaptranv + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_stranidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_stranidxv(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) + call psi_swaptran(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return - use psi_mod, psb_protect_name => psi_stranidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_sswaptranv + + + ! + ! + ! Subroutine: psi_stranidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_stranidxv(ctxt,flag,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:), beta - real(psb_spk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - real(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + real(psb_spk_), intent(inout) :: y(:) + real(psb_spk_), intent(in) :: beta + real(psb_spk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + + real(psb_spk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) - - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_r_spk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_r_spk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) + + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_r_spk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_r_spk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),nesd,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag, icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),nerv,& + & psb_mpi_r_spk_,prcid(i),& + & p2ptag, icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - if (proc_to_comm < me) then + + else if (swap_send) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_snd(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_real_swap_tag - call mpi_irecv(sndbuf(snd_pt),nesd,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_real_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),nerv,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag, icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),nerv,& - & psb_mpi_r_spk_,prcid(i),& - & p2ptag, icomm,iret) - end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_real_swap_tag - - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + end if + + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_stranidxv + end subroutine psi_stranidxv +end submodule psi_s_swaptran_a_impl diff --git a/base/comm/internals/psi_zovrl_restr.f90 b/base/comm/internals/psi_zovrl_restr.f90 index 7fe94aa63..a281d2e13 100644 --- a/base/comm/internals/psi_zovrl_restr.f90 +++ b/base/comm/internals/psi_zovrl_restr.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,90 +35,90 @@ ! ! ! -subroutine psi_zovrl_restr_vect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_zovrl_restr_vect - use psb_z_base_vect_mod - - implicit none - - class(psb_z_base_vect_type) :: x - complex(psb_dpk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_zovrl_restr_vect' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,zzero) - - call psb_erractionrestore(err_act) - return +submodule (psi_z_comm_v_mod) psi_z_ovrl_restr_v_impl + use psb_base_mod +contains + module subroutine psi_zovrl_restr_vect(x,xs,desc_a,info) + + implicit none + + class(psb_z_base_vect_type) :: x + complex(psb_dpk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_zovrl_restr_vect' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,zzero) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_zovrl_restr_vect + return + end subroutine psi_zovrl_restr_vect -subroutine psi_zovrl_restr_multivect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_zovrl_restr_multivect - use psb_z_base_vect_mod + module subroutine psi_zovrl_restr_multivect(x,xs,desc_a,info) - implicit none + implicit none - class(psb_z_base_multivect_type) :: x - complex(psb_dpk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + class(psb_z_base_multivect_type) :: x + complex(psb_dpk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz,nc - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz,nc + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err - name='psi_zovrl_restr_mv' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_zovrl_restr_mv' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) - call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,zzero) + isz = size(desc_a%ovrlap_elem,1) + call x%sct(isz,desc_a%ovrlap_elem(:,1),xs,zzero) - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_zovrl_restr_multivect + return + end subroutine psi_zovrl_restr_multivect +end submodule psi_z_ovrl_restr_v_impl diff --git a/base/comm/internals/psi_zovrl_restr_a.f90 b/base/comm/internals/psi_zovrl_restr_a.f90 index a823b73d4..bffd31032 100644 --- a/base/comm/internals/psi_zovrl_restr_a.f90 +++ b/base/comm/internals/psi_zovrl_restr_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,98 +34,100 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_zovrl_restrr1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_zovrl_restrr1 - - implicit none - - complex(psb_dpk_), intent(inout) :: x(:) - complex(psb_dpk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_zovrl_restrr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx) = xs(i) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_z_comm_a_mod) psi_z_ovrl_restr_a_impl + use psb_base_mod +contains + module subroutine psi_zovrl_restrr1(x,xs,desc_a,info) + + implicit none + + complex(psb_dpk_), intent(inout) :: x(:) + complex(psb_dpk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_zovrl_restrr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx) = xs(i) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_zovrl_restrr1 + return + end subroutine psi_zovrl_restrr1 -subroutine psi_zovrl_restrr2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_zovrl_restrr2 + module subroutine psi_zovrl_restrr2(x,xs,desc_a,info) - implicit none + implicit none - complex(psb_dpk_), intent(inout) :: x(:,:) - complex(psb_dpk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + complex(psb_dpk_), intent(inout) :: x(:,:) + complex(psb_dpk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err - name='psi_zovrl_restrr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + name='psi_zovrl_restrr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if (size(x,2) /= size(xs,2)) then - info = psb_err_internal_error_ - call psb_errpush(info,name, a_err='Mismacth columns X vs XS') - goto 9999 - endif + if (size(x,2) /= size(xs,2)) then + info = psb_err_internal_error_ + call psb_errpush(info,name, a_err='Mismacth columns X vs XS') + goto 9999 + endif - isz = size(desc_a%ovrlap_elem,1) + isz = size(desc_a%ovrlap_elem,1) - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - x(idx,:) = xs(i,:) - end do + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + x(idx,:) = xs(i,:) + end do - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_zovrl_restrr2 + return + end subroutine psi_zovrl_restrr2 +end submodule psi_z_ovrl_restr_a_impl diff --git a/base/comm/internals/psi_zovrl_save.f90 b/base/comm/internals/psi_zovrl_save.f90 index 841dec1d3..c642f7898 100644 --- a/base/comm/internals/psi_zovrl_save.f90 +++ b/base/comm/internals/psi_zovrl_save.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,103 +34,101 @@ ! for the transpose matrix-vector product when there is a nonempty overlap. ! ! -subroutine psi_zovrl_save_vect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_zovrl_save_vect - use psb_realloc_mod - use psb_z_base_vect_mod - - implicit none - - class(psb_z_base_vect_type) :: x - complex(psb_dpk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) - - call psb_erractionrestore(err_act) - return +submodule (psi_z_comm_v_mod) psi_z_ovrl_save_v_impl + use psb_base_mod +contains + module subroutine psi_zovrl_save_vect(x,xs,desc_a,info) + + implicit none + + class(psb_z_base_vect_type) :: x + complex(psb_dpk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_zovrl_save_vect - -subroutine psi_zovrl_save_multivect(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_zovrl_save_multivect - use psb_realloc_mod - use psb_z_base_vect_mod - - implicit none - - class(psb_z_base_multivect_type) :: x - complex(psb_dpk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, nc - integer(psb_ipk_) :: err_act, i, idx - character(len=20) :: name, ch_err - - name='psi_dovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = x%get_ncols() - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_zovrl_save_vect + + module subroutine psi_zovrl_save_multivect(x,xs,desc_a,info) + + implicit none + + class(psb_z_base_multivect_type) :: x + complex(psb_dpk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, nc + integer(psb_ipk_) :: err_act, i, idx + character(len=20) :: name, ch_err + + name='psi_dovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = x%get_ncols() + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + call x%gth(isz,desc_a%ovrlap_elem(:,1),xs) + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_zovrl_save_multivect + return + end subroutine psi_zovrl_save_multivect +end submodule psi_z_ovrl_save_v_impl diff --git a/base/comm/internals/psi_zovrl_save_a.f90 b/base/comm/internals/psi_zovrl_save_a.f90 index f2c09ee81..b24f82522 100644 --- a/base/comm/internals/psi_zovrl_save_a.f90 +++ b/base/comm/internals/psi_zovrl_save_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -34,108 +34,104 @@ ! These subroutines save the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap. ! -subroutine psi_zovrl_saver1(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_zovrl_saver1 - - use psb_realloc_mod - - implicit none - - complex(psb_dpk_), intent(inout) :: x(:) - complex(psb_dpk_), allocatable :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz - character(len=20) :: name, ch_err - - name='psi_zovrl_saver1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - call psb_realloc(isz,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i) = x(idx) - end do - - call psb_erractionrestore(err_act) - return +submodule (psi_z_comm_a_mod) psi_z_ovrl_save_a_impl + use psb_base_mod +contains + module subroutine psi_zovrl_saver1(x,xs,desc_a,info) + implicit none + + complex(psb_dpk_), intent(inout) :: x(:) + complex(psb_dpk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz + character(len=20) :: name, ch_err + + name='psi_zovrl_saver1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + call psb_realloc(isz,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i) = x(idx) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_zovrl_saver1 - - -subroutine psi_zovrl_saver2(x,xs,desc_a,info) - use psi_mod, psi_protect_name => psi_zovrl_saver2 - - use psb_realloc_mod - - implicit none - - complex(psb_dpk_), intent(inout) :: x(:,:) - complex(psb_dpk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc - character(len=20) :: name, ch_err - - name='psi_zovrl_saver2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - isz = size(desc_a%ovrlap_elem,1) - nc = size(x,2) - call psb_realloc(isz,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - do i=1, isz - idx = desc_a%ovrlap_elem(i,1) - xs(i,:) = x(idx,:) - end do - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_zovrl_saver1 + + + module subroutine psi_zovrl_saver2(x,xs,desc_a,info) + implicit none + + complex(psb_dpk_), intent(inout) :: x(:,:) + complex(psb_dpk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, isz, nc + character(len=20) :: name, ch_err + + name='psi_zovrl_saver2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + isz = size(desc_a%ovrlap_elem,1) + nc = size(x,2) + call psb_realloc(isz,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + do i=1, isz + idx = desc_a%ovrlap_elem(i,1) + xs(i,:) = x(idx,:) + end do + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_zovrl_saver2 + return + end subroutine psi_zovrl_saver2 +end submodule psi_z_ovrl_save_a_impl diff --git a/base/comm/internals/psi_zovrl_upd.f90 b/base/comm/internals/psi_zovrl_upd.f90 index 7a3bccf2f..cbe494643 100644 --- a/base/comm/internals/psi_zovrl_upd.f90 +++ b/base/comm/internals/psi_zovrl_upd.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -36,169 +36,167 @@ ! ! ! -subroutine psi_zovrl_upd_vect(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_zovrl_upd_vect - use psb_realloc_mod - use psb_z_base_vect_mod - - implicit none - - class(psb_z_base_vect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - complex(psb_dpk_), allocatable :: xs(:) - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, nx, ndm - integer(psb_ipk_) :: err_act, i, idx - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - - name='psi_zovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - nx = size(desc_a%ovrlap_elem,1) - call psb_realloc(nx,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_Dealloc_ - call psb_errpush(info,name) - goto 9999 - end if - - if (update /= psb_sum_) then - call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) - ! switch on update type - - select case (update) - case(psb_square_root_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i) = xs(i)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i) = xs(i)/real(ndm) - end do - case(psb_setzero_) - do i=1,nx - if (me /= desc_a%ovrlap_elem(i,3))& - & xs(i) = zzero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) +submodule (psi_z_comm_v_mod) psi_z_ovrl_upd_v_impl + use psb_base_mod +contains + module subroutine psi_zovrl_upd_vect(x,desc_a,update,info) + + implicit none + + class(psb_z_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + complex(psb_dpk_), allocatable :: xs(:) + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, nx, ndm + integer(psb_ipk_) :: err_act, i, idx + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + + name='psi_zovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end select - call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,zzero) - end if - - call psb_erractionrestore(err_act) - return + endif + nx = size(desc_a%ovrlap_elem,1) + call psb_realloc(nx,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_Dealloc_ + call psb_errpush(info,name) + goto 9999 + end if + + if (update /= psb_sum_) then + call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) + ! switch on update type + + select case (update) + case(psb_square_root_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i) = xs(i)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i) = xs(i)/real(ndm) + end do + case(psb_setzero_) + do i=1,nx + if (me /= desc_a%ovrlap_elem(i,3))& + & xs(i) = zzero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,zzero) + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_zovrl_upd_vect - -subroutine psi_zovrl_upd_multivect(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_zovrl_upd_multivect - use psb_realloc_mod - use psb_z_base_vect_mod - - implicit none - - class(psb_z_base_multivect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - complex(psb_dpk_), allocatable :: xs(:,:) - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: np, me, isz, ndm, nx, nc - integer(psb_ipk_) :: err_act, i, idx - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - - name='psi_zovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - nx = size(desc_a%ovrlap_elem,1) - nc = x%get_ncols() - call psb_realloc(nx,nc,xs,info) - if (info /= psb_success_) then - info = psb_err_alloc_Dealloc_ - call psb_errpush(info,name) - goto 9999 - end if - - if (update /= psb_sum_) then - call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) - ! switch on update type - - select case (update) - case(psb_square_root_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i,:) = xs(i,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,nx - ndm = desc_a%ovrlap_elem(i,2) - xs(i,:) = xs(i,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,nx - if (me /= desc_a%ovrlap_elem(i,3))& - & xs(i,:) = zzero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) + return + end subroutine psi_zovrl_upd_vect + + module subroutine psi_zovrl_upd_multivect(x,desc_a,update,info) + + implicit none + + class(psb_z_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + complex(psb_dpk_), allocatable :: xs(:,:) + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me, isz, ndm, nx, nc + integer(psb_ipk_) :: err_act, i, idx + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + + name='psi_zovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end select - call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,zzero) - end if - - call psb_erractionrestore(err_act) - return + endif + nx = size(desc_a%ovrlap_elem,1) + nc = x%get_ncols() + call psb_realloc(nx,nc,xs,info) + if (info /= psb_success_) then + info = psb_err_alloc_Dealloc_ + call psb_errpush(info,name) + goto 9999 + end if + + if (update /= psb_sum_) then + call x%gth(nx,desc_a%ovrlap_elem(:,1),xs) + ! switch on update type + + select case (update) + case(psb_square_root_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i,:) = xs(i,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,nx + ndm = desc_a%ovrlap_elem(i,2) + xs(i,:) = xs(i,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,nx + if (me /= desc_a%ovrlap_elem(i,3))& + & xs(i,:) = zzero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + call x%sct(nx,desc_a%ovrlap_elem(:,1),xs,zzero) + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_zovrl_upd_multivect + return + end subroutine psi_zovrl_upd_multivect +end submodule psi_z_ovrl_upd_v_impl diff --git a/base/comm/internals/psi_zovrl_upd_a.f90 b/base/comm/internals/psi_zovrl_upd_a.f90 index 658bd3172..b879e2636 100644 --- a/base/comm/internals/psi_zovrl_upd_a.f90 +++ b/base/comm/internals/psi_zovrl_upd_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -32,143 +32,143 @@ ! Subroutine: psi_zovrl_update ! These subroutines update the overlap region of a vector; they are used ! for the transpose matrix-vector product when there is a nonempty overlap, -! or for the application of Additive Schwarz preconditioners. +! or for the application of Additive Schwarz preconditioners. ! ! -subroutine psi_zovrl_updr1(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_zovrl_updr1 - - implicit none - - complex(psb_dpk_), intent(inout), target :: x(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_zovrl_updr1' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx) = x(idx)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx) = zzero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return +submodule (psi_z_comm_a_mod) psi_z_ovrl_upd_a_impl + use psb_base_mod +contains + module subroutine psi_zovrl_updr1(x,desc_a,update,info) + implicit none + + complex(psb_dpk_), intent(inout), target :: x(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_zovrl_updr1' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx) = x(idx)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx) = zzero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_zovrl_updr1 - -subroutine psi_zovrl_updr2(x,desc_a,update,info) - use psi_mod, psi_protect_name => psi_zovrl_updr2 - - implicit none - - complex(psb_dpk_), intent(inout), target :: x(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, i, idx, ndm - integer(psb_ipk_) :: ierr(5) - character(len=20) :: name, ch_err - - name='psi_zovrl_updr2' - info = psb_success_ - call psb_erractionsave(err_act) - if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 - end if - ctxt = desc_a%get_context() - call psb_info(ctxt, me, np) - if (np == -1) then - info = psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - ! switch on update type - select case (update) - case(psb_square_root_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/sqrt(real(ndm)) - end do - case(psb_avg_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - ndm = desc_a%ovrlap_elem(i,2) - x(idx,:) = x(idx,:)/real(ndm) - end do - case(psb_setzero_) - do i=1,size(desc_a%ovrlap_elem,1) - idx = desc_a%ovrlap_elem(i,1) - if (me /= desc_a%ovrlap_elem(i,3))& - & x(idx,:) = zzero - end do - case(psb_sum_) - ! do nothing - - case default - ! wrong value for choice argument - info = psb_err_iarg_invalid_value_ - ierr(1) = 3; ierr(2)=update; - call psb_errpush(info,name,i_err=ierr) - goto 9999 - end select - - call psb_erractionrestore(err_act) - return + return + end subroutine psi_zovrl_updr1 + + module subroutine psi_zovrl_updr2(x,desc_a,update,info) + implicit none + + complex(psb_dpk_), intent(inout), target :: x(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, i, idx, ndm + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name, ch_err + + name='psi_zovrl_updr2' + info = psb_success_ + call psb_erractionsave(err_act) + if (psb_errstatus_fatal()) then + info = psb_err_internal_error_ ; goto 9999 + end if + ctxt = desc_a%get_context() + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + ! switch on update type + select case (update) + case(psb_square_root_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/sqrt(real(ndm)) + end do + case(psb_avg_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + ndm = desc_a%ovrlap_elem(i,2) + x(idx,:) = x(idx,:)/real(ndm) + end do + case(psb_setzero_) + do i=1,size(desc_a%ovrlap_elem,1) + idx = desc_a%ovrlap_elem(i,1) + if (me /= desc_a%ovrlap_elem(i,3))& + & x(idx,:) = zzero + end do + case(psb_sum_) + ! do nothing + + case default + ! wrong value for choice argument + info = psb_err_iarg_invalid_value_ + ierr(1) = 3; ierr(2)=update; + call psb_errpush(info,name,i_err=ierr) + goto 9999 + end select + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) - return -end subroutine psi_zovrl_updr2 + return + end subroutine psi_zovrl_updr2 +end submodule psi_z_ovrl_upd_a_impl diff --git a/base/comm/internals/psi_zswapdata.F90 b/base/comm/internals/psi_zswapdata.F90 index 53147c846..dcc977fef 100644 --- a/base/comm/internals/psi_zswapdata.F90 +++ b/base/comm/internals/psi_zswapdata.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,7 +41,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D complex(psb_dpk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -53,32 +53,22 @@ ! is scattered in the owned indices, and BETA=1. ! The first routine picks the desired exchange index list and passes it to the second. ! This version works on encapsulated vectors, and uses their methods to do GTH and SCT, -! so that special versions (i.e. GPU vectors can override them +! so that special versions (i.e. GPU vectors can override them) ! ! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) +! swap_status - integer Swap status selector. +! It is interpreted as a communication status: +! psb_comm_status_start_ -> START phase +! psb_comm_status_wait_ -> WAIT phase +! psb_comm_status_unknown_ -> START+WAIT +! The communication scheme is selected from +! y%comm_handle%comm_type. ! ! ! n - integer Number of columns in Y -! beta - complex Choose overwrite or sum. +! beta - real Choose overwrite or sum. ! y - type(psb_@x@_vect_type) The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - complex Buffer space. If not sufficient, will do -! our own internal allocation. +! desc_a - type(psb_desc_type). The communication descriptor. ! info - integer. return code. ! data - integer which list is to be used to exchange data ! default psb_comm_halo_ @@ -89,101 +79,156 @@ ! ! ! -subroutine psi_zswapdata_vect(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_zswapdata_vect - use psb_z_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +submodule (psi_z_comm_v_mod) psi_z_swapdata_impl + use psb_desc_const_mod, only: psb_swap_start_, psb_swap_wait_ + use psb_base_mod + use psb_error_mod, only: psb_get_debug_level, psb_get_debug_unit, psb_debug_ext_ + use psb_comm_schemes_mod, only: psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_, psb_comm_rma_pull_, psb_comm_rma_push_, & + & psb_comm_handle_type + use psb_comm_rma_mod, only: psb_comm_rma_handle + use psb_comm_factory_mod + +contains + + module subroutine psi_zswapdata_vect(swap_status,beta,y,desc_a,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_vect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_), target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + integer(psb_ipk_), intent(in) :: swap_status + class(psb_z_base_vect_type), intent(inout) :: y + complex(psb_dpk_), intent(in) :: beta + type(psb_desc_type), target :: desc_a ! TODO: should this be intent(in)? + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, data_, err_act - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, my_rank, total_send, total_recv, num_neighbors, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + ! communication scheme/status selectors + logical :: baseline, ineighbor_a2av, ineighbor_a2av_persistent - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif + ! error handling variables + integer(psb_ipk_) :: err_act + character(len=30) :: name + logical :: debug - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if + info = psb_success_ + name = 'psi_zswapdata_vect' + call psb_erractionsave(err_act) - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if + debug = .false. - call psi_swapdata(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 + ctxt = desc_a%get_context() - call psb_erractionrestore(err_act) - return + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='desc_a%get_list_p') + goto 9999 + end if + + + if( (swap_status /= psb_comm_status_start_).and.(swap_status /= psb_comm_status_wait_)& + & .and.(swap_status /= psb_comm_status_sync_) ) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + ! Set the normalized swap status on the comm handle + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + if(debug .eqv. .true.) then + write(0,'(a,i0,a,i0)') 'DBG_DISPATCH comm_type=',y%comm_handle%comm_type,' desc_a%comm_type=',desc_a%comm_type + endif + select case(y%comm_handle%comm_type) + case(psb_comm_isend_irecv_) + call psi_zswap_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline swap') + goto 9999 + end if + case(psb_comm_ineighbor_alltoallv_) + call psi_zswap_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,& + & total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor nonblocking swap') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_zswap_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,& + & total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor persistent swap') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_zswap_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull swap') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_zswap_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push swap') + goto 9999 + end if + case default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Incompatible swap_status settings: no valid communication mode selected') + goto 9999 + end select + + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_zswapdata_vect + end subroutine psi_zswapdata_vect -! -! -! Subroutine: psi_zswap_vidx_vect -! Data exchange among processes. -! -! Takes care of Y an exanspulated vector. Relies on the gather/scatter methods -! of vectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_zswap_vidx_vect(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_zswap_vidx_vect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_z_base_vect_mod + subroutine psi_zswap_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -192,336 +237,1416 @@ subroutine psi_zswap_vidx_vect(ctxt,icomm,flag,beta,y,idx, & include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_vect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size),& + & iret, nesd, nerv + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti, n + logical :: do_send,do_recv + logical, parameter :: usersend=.false. + logical :: debug + character(len=20) :: name + + info = psb_success_ + name = 'psi_zswap_baseline_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - ! locals - integer(psb_mpk_) :: np, me - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size),& - & iret, nesd, nerv - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti, n - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + icomm = ctxt%get_mpic() - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline swap') + goto 9999 + end select - totrcv_ = totrcv * n - totsnd_ = totsnd * n - call idx%sync() + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') + goto 9999 + end if - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then + n=1 + do_send = (swap_status == psb_comm_status_start_).or.(swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_).or.(swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + call comm_indexes%sync() + + if (debug) write(*,*) my_rank,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Unfinished communication? Something is wrong....') + goto 9999 + end if + end if + call y%new_buffer(ione*size(comm_indexes%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + + rcv_pt = 1+pnti+psb_n_elem_recv_ + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= my_rank)) then + if (debug) write(*,*) my_rank,'Posting receive from',prcid(i),rcv_pt + p2ptag = psb_double_swap_tag + call mpi_irecv(y%combuf(rcv_pt),nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + pnti = pnti + nerv + nesd + 3 + end do + if (debug) write(*,*) my_rank,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + idx_pt = snd_pt + if ((idx_pt < 1) .or. (nesd < 0) .or. (idx_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((idx_pt < 1) .or. (nesd < 0) .or. (idx_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(idx_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait + ! + call y%device_wait() + + if (debug) write(*,*) my_rank,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((nesd>0).and.(proc_to_comm /= my_rank)) then + call mpi_isend(y%combuf(snd_pt),nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) my_rank,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then ! - ! Unfinished communication? Something is wrong.... + ! No matching send? Something is wrong.... ! info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) my_rank,' wait' + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (proc_to_comm /= my_rank)then + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == my_rank) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) my_rank,' scatter' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((idx_pt < 1) .or. (nerv < 0) .or. (idx_pt+max(0,nerv)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter metadata out of bounds') + goto 9999 + end if + if ((rcv_pt < 1) .or. (nerv < 0) .or. (rcv_pt+max(0,nerv)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter combuf bounds error') + goto 9999 + end if + + if (debug) write(*,*)my_rank,' Received from: ',prcid(i),& + & y%combuf(rcv_pt:rcv_pt+nerv-1) + call y%sct(rcv_pt,nerv,comm_indexes,beta) + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Waited for everybody, clean up + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) my_rank,' wait' + call y%device_wait() + if (debug) write(*,*) my_rank,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call y%comm_handle%free(info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) my_rank,' done' end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - rcv_pt = 1+pnti+psb_n_elem_recv_ - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - p2ptag = psb_dcomplex_swap_tag - call mpi_irecv(y%combuf(rcv_pt),nerv,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_zswap_baseline_vect + + + + subroutine psi_zswap_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical :: debug + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + info = psb_success_ + name = 'psi_zswap_neighbor_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor swap') + goto 9999 + end select + + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') + goto 9999 + end if + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (nonblocking)' + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') + goto 9999 + end if + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(snd_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + else + neighbor_comm_handle%comm_request = mpi_request_null end if - pnti = pnti + nerv + nesd + 3 - end do - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - idx_pt = snd_pt - call y%gth(idx_pt,nesd,idx) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Then wait - ! - call y%device_wait() + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Ineighbor_alltoallv' + if (buffer_size > 0) then + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (baseline/positional layout) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs_v, & ! positional displacements (match gth layout) + & psb_mpi_r_dpk_, & + & y%combuf(1), & ! recv buffer (baseline/positional layout) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs_v, & ! positional displacements (match sct layout) + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + ! Valid no-op exchange: nothing was posted in START and nothing to wait/scatter. + neighbor_comm_handle%comm_request = mpi_request_null + else + if (neighbor_comm_handle%comm_request == mpi_request_null) then + write(psb_err_unit,*) my_rank, 'DBG: neighbor WAIT but comm_request is NULL; is_initialized=', & + & neighbor_comm_handle%is_initialized + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - p2ptag = psb_dcomplex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + ! Only wait and scatter if there's data + if ((topology_total_send + topology_total_recv) > 0) then + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if - if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),nesd,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) + ! Scatter received data to local vector positions (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((1+pnti+psb_n_elem_recv_ < 1) .or. (nerv < 0) .or. & + & (1+pnti+psb_n_elem_recv_+max(0,nerv)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter metadata out of bounds') + goto 9999 + end if + if ((rcv_pt < 1) .or. (nerv < 0) .or. (rcv_pt+max(0,nerv)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline scatter combuf bounds error') + goto 9999 + end if + call y%sct(rcv_pt,nerv,comm_indexes,beta) + pnti = pnti + nerv + nesd + 3 + end do + else + ! nothing to wait/scatter end if - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) goto 9999 end if + if (debug) write(*,*) my_rank,' nbr_vect: done' - pnti = pnti + nerv + nesd + 3 - end do - end if + end if ! do_wait - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_zswap_neighbor_topology_vect + + + + subroutine psi_zswap_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical :: debug + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + info = psb_success_ + debug = .false. + name = 'psi_zswap_neighbor_persistent_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor swap') + goto 9999 + end select + + if(swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status: psb_comm_status_unknown_ is not allowed in neighbor swap') goto 9999 end if - call psb_realloc(totxch,prcid,info) - if (debug) write(*,*) me,' wait' - pnti = 1 - p2ptag = psb_dcomplex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (proc_to_comm /= me)then - if (nesd>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (persistent)' + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid START: persistent neighbor request already in flight') + goto 9999 + end if + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < ione*size(comm_indexes%v)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) goto 9999 end if end if - if (nerv>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Gather send data into combuf using baseline-style gth calls + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data (baseline layout),', topology_total_send,' elems' + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(comm_indexes%v))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather metadata out of bounds') goto 9999 end if + if ((snd_pt < 1) .or. (nesd < 0) .or. (snd_pt+max(0,nesd)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='baseline gather combuf bounds error') + goto 9999 + end if + call y%gth(snd_pt,nesd,comm_indexes) + pnti = pnti + nerv + nesd + 3 + end do + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Lazy persistent-init: build the request once, then reuse with START/WAIT. + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Neighbor_alltoallv_init' + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & ! send buffer + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs_v, & ! positional (baseline layout) + & psb_mpi_r_dpk_, & + & y%combuf(1), & ! recv buffer (baseline layout) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs_v, & ! positional (baseline layout) + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 end if - y%combuf(rcv_pt:rcv_pt+nerv-1) = y%combuf(snd_pt:snd_pt+nesd-1) + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. end if - pnti = pnti + nerv + nesd + 3 - end do - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ + end if ! do_start - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(rcv_pt:rcv_pt+nerv-1) - call y%sct(rcv_pt,nerv,idx,beta) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Waited for everybody, clean up - ! - y%comid = mpi_request_null + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + ! Valid no-op exchange: nothing was posted in START and nothing to wait/scatter. + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + ! Only wait and scatter if there's data + if ((topology_total_send + topology_total_recv) > 0) then + ! Wait for the persistent collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on persistent MPI request' + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Scatter received data to local vector positions (baseline-style sct) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data (baseline layout),', topology_total_recv,' elems' + pnti = 1 + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + rcv_pt = 1+pnti+psb_n_elem_recv_ + if (nerv > 0) then + call y%sct(rcv_pt,nerv,comm_indexes,beta) + end if + pnti = pnti + nerv + nesd + 3 + end do + end if + + call y%device_wait() + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_zswap_neighbor_persistent_topology_vect + + + subroutine psi_zswap_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + integer(psb_ipk_) :: i, nesd, nerv, snd_pt, rcv_pt, pnti, n + + + info = psb_success_ + name = 'psi_zswap_rma_pull_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - if (debug) write(*,*) me,' done' - end if + icomm = ctxt%get_mpic() + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for pull mode') + goto 9999 + end select + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) - call psb_erractionrestore(err_act) - return + call comm_indexes%sync() + + ! START phase: build the layout once, prepare the exposed buffer, then issue RMA. + if (do_start) then + buffer_size = total_send + total_recv + + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA pull rank cache allocation') + goto 9999 + end if + end if + + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA pull init_memory_buffer_layout failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + ! Need a larger exposed memory area: recreate the RMA window first, + ! then reallocate combuf and lazily create a new window below. + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + ! Expose combuf once and keep the window around until the descriptor changes. + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send)) + end if + call y%device_wait() + + ! Pull data from each peer with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = total_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA pull') + goto 9999 + end if + if ((recv_pos < 1) .or. (recv_count < 0) .or. (recv_pos+max(0,recv_count)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull local receive bounds error') + goto 9999 + end if + + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count, psb_mpi_r_dpk_, prc_rank, remote_disp, recv_count, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter received data into Y. + if (do_wait) then + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send+1:total_send+total_recv), beta) + end if + + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_zswap_rma_pull_vect - return -end subroutine psi_zswap_vidx_vect -! -! -! Subroutine: psi_zswapdata_multivect -! Data exchange among processes. -! -! Takes care of Y an encaspulated multivector. -! -! -subroutine psi_zswapdata_multivect(flag,beta,y,desc_a,work,info,data) + subroutine psi_zswap_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_zswap_rma_push_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for push mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! START phase: identical layout handling, but the remote metadata describes the receive side. + if (do_start) then + buffer_size = total_send + total_recv + + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA put rank cache allocation') + goto 9999 + end if + end if + + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA put ini_memory_buffer_layout') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + ! Need a larger exposed memory area: recreate the RMA window first, + ! then reallocate combuf and lazily create a new window below. + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + ! Allocate buffer with size of comm_indexes%v to include all metadata, + ! matching baseline and topology buffer layout + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + ! Keep the window alive across repetitions: it is created once and reused. + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window (prevents isend/irecv ordering issues). + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + ! Push data to each peer; after flush send a P2P notification so target knows data arrived. + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = total_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA push') + goto 9999 + end if + if ((send_pos < 1) .or. (send_count < 0) .or. (send_pos+max(0,send_count)-1 > size(y%combuf))) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push local send bounds error') + goto 9999 + end if + + if (send_count > 0) then + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count, psb_mpi_r_dpk_, prc_rank, remote_disp, send_count, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send+1:total_send+total_recv), beta) + end if + + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_zswap_rma_push_vect + - use psi_mod, psb_protect_name => psi_zswapdata_multivect - use psb_z_base_multivect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + + ! + ! + ! Subroutine: psi_zswapdata_multivect + ! Data exchange among processes. + ! + ! Takes care of Y an encaspulated multivector. + ! + ! + module subroutine psi_zswapdata_multivect(swap_status,beta,y,desc_a,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_multivect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_), target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + integer(psb_ipk_), intent(in) :: swap_status + class(psb_z_base_multivect_type), intent(inout) :: y + complex(psb_dpk_), intent(in) :: beta + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, data_, err_act - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) + ! communication scheme/status selectors + logical :: baseline, ineighbor_a2av, ineighbor_a2av_persistent - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, my_rank, total_send, total_recv, num_neighbors, data_, err_act + integer(psb_mpk_) :: n, total_send_, total_recv_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=30) :: name - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif + + info = psb_success_ + name = 'psi_zswapdata_multivect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if - call psi_swapdata(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 + if ((swap_status /= psb_comm_status_start_) .and. (swap_status /= psb_comm_status_wait_) & + & .and. (swap_status /= psb_comm_status_unknown_)) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + baseline = .false. + ineighbor_a2av = .false. + ineighbor_a2av_persistent = .false. + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + ineighbor_a2av = .true. + case(psb_comm_persistent_ineighbor_alltoallv_) + ineighbor_a2av_persistent = .true. + case(psb_comm_rma_pull_) + call psi_zswap_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull swap') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_zswap_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,& + & y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push swap') + goto 9999 + end if + case default + baseline = .true. + end select + + if (baseline) then + call psi_zswap_baseline_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline swap') + goto 9999 + end if + else if (ineighbor_a2av) then + call psi_zswap_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor nonblocking swap') + goto 9999 + end if + else if (ineighbor_a2av_persistent) then + call psi_zswap_neighbor_topology_multivect_persistent(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor persistent swap') + goto 9999 + end if + else + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Incompatible swap_status settings: no valid communication mode selected') + goto 9999 + end if - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_zswapdata_multivect + end subroutine psi_zswapdata_multivect -! -! -! Subroutine: psi_zswap_vidx_multivect -! Data exchange among processes. -! -! Takes care of Y an encapsulated multivector. Relies on the gather/scatter methods -! of multivectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_zswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_zswap_vidx_multivect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_z_base_multivect_mod + + +subroutine psi_zswap_baseline_multivect(ctxt,swap_status,beta,y,comm_indexes, & + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -530,100 +1655,107 @@ subroutine psi_zswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_multivect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name + logical :: do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name - info=psb_success_ - name='psi_swap_datav' + info = psb_success_ + name = 'psi_zswap_baseline_multivect' call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) + call psb_info(ctxt,my_rank,np) if (np == -1) then - info=psb_err_context_error_ + info = psb_err_context_error_ call psb_errpush(info,name) goto 9999 endif n = y%get_ncols() - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline multivect swap') + goto 9999 + end select + + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) - totrcv_ = totrcv * n - totsnd_ = totsnd * n + total_recv_ = total_recv * n + total_send_ = total_send * n - call idx%sync() + call comm_indexes%sync() - if (debug) write(*,*) me,'Internal buffer' + if (debug) write(*,*) my_rank,'Internal buffer' if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + info = psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) + if (debug) write(*,*) my_rank,'do_send start' + call y%new_buffer(total_send_+total_recv_,info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) ! First I post all the non blocking receives pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - p2ptag = psb_dcomplex_swap_tag - call mpi_irecv(y%combuf(rcv_pt),n*nerv,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) + if ((nerv>0).and.(proc_to_comm /= my_rank)) then + if (debug) write(*,*) my_rank,'Posting receive from',prcid(i),rcv_pt + p2ptag = psb_double_swap_tag + call mpi_irecv(y%combuf(rcv_pt),n*nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) end if rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 end do - if (debug) write(*,*) me,' Gather ' + if (debug) write(*,*) my_rank,' Gather ' ! ! Then gather for sending. ! pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call y%gth(idx_pt,snd_pt,nesd,idx) + call y%gth(idx_pt,snd_pt,nesd,comm_indexes) rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 @@ -634,24 +1766,24 @@ subroutine psi_zswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & ! call y%device_wait() - if (debug) write(*,*) me,' isend' + if (debug) write(*,*) my_rank,' isend' ! ! Then send ! pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - p2ptag = psb_dcomplex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - if ((nesd>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(snd_pt),n*nesd,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + + if ((nesd>0).and.(proc_to_comm /= my_rank)) then + call mpi_isend(y%combuf(snd_pt),n*nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) end if if(iret /= mpi_success) then @@ -666,8 +1798,8 @@ subroutine psi_zswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & end if if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then + if (debug) write(*,*) my_rank,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then ! ! No matching send? Something is wrong.... ! @@ -675,20 +1807,20 @@ subroutine psi_zswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & call psb_errpush(info,name,m_err=(/-2/)) goto 9999 end if - call psb_realloc(totxch,prcid,info) + call psb_realloc(num_neighbors,prcid,info) - if (debug) write(*,*) me,' wait' + if (debug) write(*,*) my_rank,' wait' pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - p2ptag = psb_dcomplex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm /= me)then + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) + if (proc_to_comm /= my_rank)then if (nesd>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) if(iret /= mpi_success) then info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/iret/)) @@ -696,14 +1828,14 @@ subroutine psi_zswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & end if end if if (nerv>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) if(iret /= mpi_success) then info=psb_err_mpi_error_ call psb_errpush(info,name,m_err=(/iret/)) goto 9999 end if end if - else if (proc_to_comm == me) then + else if (proc_to_comm == my_rank) then if (nesd /= nerv) then write(psb_err_unit,*) & & 'Fatal error in swapdata: mismatch on self send',& @@ -716,19 +1848,19 @@ subroutine psi_zswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & pnti = pnti + nerv + nesd + 3 end do - if (debug) write(*,*) me,' scatter' + if (debug) write(*,*) my_rank,' scatter' pnti = 1 - snd_pt = totrcv_+1 + snd_pt = total_recv_+1 rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) + do i=1, num_neighbors + proc_to_comm = comm_indexes%v(pnti+psb_proc_id_) + nerv = comm_indexes%v(pnti+psb_n_elem_recv_) + nesd = comm_indexes%v(pnti+nerv+psb_n_elem_send_) idx_pt = 1+pnti+psb_n_elem_recv_ - if (debug) write(0,*)me,' Received from: ',prcid(i),& + if (debug) write(0,*)my_rank,' Received from: ',prcid(i),& & y%combuf(rcv_pt:rcv_pt+n*nerv-1) - call y%sct(idx_pt,rcv_pt,nerv,idx,beta) + call y%sct(idx_pt,rcv_pt,nerv,comm_indexes,beta) rcv_pt = rcv_pt + n*nerv snd_pt = snd_pt + n*nesd pnti = pnti + nerv + nesd + 3 @@ -736,21 +1868,23 @@ subroutine psi_zswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & ! ! Waited for com, cleanup comid ! - y%comid = mpi_request_null + baseline_comm_handle%comid = mpi_request_null ! ! Then wait for device ! - if (debug) write(*,*) me,' wait' + if (debug) write(*,*) my_rank,' wait' call y%device_wait() - if (debug) write(*,*) me,' free buffer' + if (debug) write(*,*) my_rank,' free buffer' call y%free_buffer(info) - if (info == 0) call y%free_comid(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if if (info /= 0) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - if (debug) write(*,*) me,' done' + if (debug) write(*,*) my_rank,' done' end if @@ -760,5 +1894,859 @@ subroutine psi_zswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx, & 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_zswap_vidx_multivect +end subroutine psi_zswap_baseline_multivect + + + +subroutine psi_zswap_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, n + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_zswap_neighbor_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor multivect swap') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (nonblocking)' + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, & + & ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! Gather send data into contiguous send buffer (polymorphic for GPU) + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data,', topology_total_send,' elems' + call y%gth(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(1:total_send_)) + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Ineighbor_alltoallv' + if (buffer_size > 0) then + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(total_send_ + 1), & ! recv buffer + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if ((topology_total_send + topology_total_recv) > 0) then + if (neighbor_comm_handle%comm_request == mpi_request_null) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + else + neighbor_comm_handle%comm_request = mpi_request_null + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if ((topology_total_send + topology_total_recv) > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + end if + + ! Scatter received data to local vector positions (polymorphic for GPU) + if ((topology_total_send + topology_total_recv) > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + call y%sct(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(total_send_+1:total_send_+total_recv_), & + & beta) + end if + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return +end subroutine psi_zswap_neighbor_topology_multivect + + + +subroutine psi_zswap_neighbor_topology_multivect_persistent(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, my_rank, n + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_zswap_neighbor_topology_multivect_persistent' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor multivect swap') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_unknown_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_unknown_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) my_rank,' nbr_vect: starting data exchange (persistent)' + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid START: persistent neighbor request already in flight') + goto 9999 + end if + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) my_rank,' nbr_vect: building topology via handle' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, & + & ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Gather send data into contiguous send buffer (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: gathering send data,', topology_total_send,' elems' + call y%gth(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(1:total_send_)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + if (debug) write(*,*) my_rank,' nbr_vect: posting MPI_Neighbor_alltoallv_init' + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & ! send buffer + & n*neighbor_comm_handle%send_counts, & + & n*neighbor_comm_handle%send_displs, & + & psb_mpi_r_dpk_, & + & y%combuf(total_send_ + 1), & ! recv buffer + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_r_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) > 0) then + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + + ! Wait for the persistent collective to complete + if (debug) write(*,*) my_rank,' nbr_vect: waiting on persistent MPI request' + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Scatter received data to local vector positions (polymorphic for GPU) + if (debug) write(*,*) my_rank,' nbr_vect: scattering recv data,', topology_total_recv,' elems' + call y%sct(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(total_send_+1:total_send_+total_recv_), & + & beta) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + call y%device_wait() + if (debug) write(*,*) my_rank,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return +end subroutine psi_zswap_neighbor_topology_multivect_persistent + + + subroutine psi_zswap_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, total_send_, total_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_zswap_rma_pull_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for pull mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_send_ + total_recv_ + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA pull rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA pull init_memory_buffer_layout failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send_)) + end if + call y%device_wait() + + ! Pull data from each peer with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA pull') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int((remote_base - 1) * n, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count*n, psb_mpi_r_dpk_, prc_rank, remote_disp, recv_count*n, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter received data into Y. + if (do_wait) then + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send_+1:total_send_+total_recv_), beta) + end if + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_zswap_rma_pull_multivect + + + subroutine psi_zswap_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, total_send_, total_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, memory_buffer_layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_zswap_rma_push_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + total_send_ = total_send * n + total_recv_ = total_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for push mode') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_send_ + total_recv_ + memory_buffer_layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= total_send) .or. & + & (rma_handle%layout_recv /= total_recv) + + if (memory_buffer_layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA put rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA put ini_memory_buffer_layout') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (total_send > 0) then + call y%gth(int(total_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_send_)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA push') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int((remote_base - 1) * n, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count*n, psb_mpi_r_dpk_, prc_rank, remote_disp, send_count*n, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (total_recv > 0) then + call y%sct(int(total_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(total_send_+1:total_send_+total_recv_), beta) + end if + call y%device_wait() + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_zswap_rma_push_multivect + + +end submodule psi_z_swapdata_impl diff --git a/base/comm/internals/psi_zswapdata_a.F90 b/base/comm/internals/psi_zswapdata_a.F90 index f37dc1c7a..c7db818e5 100644 --- a/base/comm/internals/psi_zswapdata_a.F90 +++ b/base/comm/internals/psi_zswapdata_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -39,7 +39,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D complex(psb_dpk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -70,10 +70,10 @@ ! ! ! n - integer Number of columns in Y -! beta - complex Choose overwrite or sum. -! y(:,:) - complex The data area +! beta - real Choose overwrite or sum. +! y(:,:) - real The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - complex Buffer space. If not sufficient, will do +! work(:) - real Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -84,912 +84,903 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_zswapdatam(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_z_comm_a_mod) psi_z_swapdata_a_impl + use psb_base_mod +contains + module subroutine psi_zswapdatam(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_zswapdatam - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:,:), beta - complex(psb_dpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + complex(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swapdata(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_zswapdatam + end subroutine psi_zswapdatam -subroutine psi_zswapidxm(ctxt,icomm,flag,n,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + module subroutine psi_zswapidxm(ctxt,flag,n,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) - use psi_mod, psb_protect_name => psi_zswapidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:,:), beta - complex(psb_dpk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - complex(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:,:) + complex(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + +complex(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_data' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_data' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_r_dpk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_r_dpk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),n*nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),n*nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*)& + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + - ! prepare info for communications + else if (swap_send) then - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + else if (swap_recv) then - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + end if - else - allocate(rvhd(totxch),prcid(totxch),stat=info) + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if if(info /= psb_success_) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(albf) deallocate(sndbuf,rcvbuf,stat=info) if(info /= psb_success_) then call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if - albf=.true. - end if - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+n*nesd-1)) - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_c_dpk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_c_dpk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - - else if (swap_sync) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm < me) then - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_dcomplex_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_dcomplex_swap_tag - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),n*nesd,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),n*nesd,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag,icomm,iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_dcomplex_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*)& - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+n*nerv-1) = sndbuf(snd_pt:snd_pt+n*nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_zswapidxm - -! -! -! Subroutine: psi_zswapdatav -! Implements the data exchange among processes. Essentially this is doing -! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - complex Choose overwrite or sum. -! y(:) - complex The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - complex Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_zswapdatav(flag,beta,y,desc_a,work,info,data) + end subroutine psi_zswapidxm + + ! + ! + ! Subroutine: psi_zswapdatav + ! Implements the data exchange among processes. Essentially this is doing + ! a variable all-to-all data exchange (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D complex(psb_dpk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_zswapdatav(flag,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_zswapdatav - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:), beta - complex(psb_dpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swapdata(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + complex(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, totxch, data_, err_act + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_zswapdatav + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_zswapdataidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_zswapidxv(ctxt,icomm,flag,beta,y,idx, & - & totxch,totsnd,totrcv,work,info) + call psi_swapdata(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return - use psi_mod, psb_protect_name => psi_zswapidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_zswapdatav + + + ! + ! + ! Subroutine: psi_zswapdataidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_zswapidxv(ctxt,flag,beta,y,idx, & + & totxch,totsnd,totrcv,work,info) + + use psb_error_mod + use psb_desc_mod + use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:), beta - complex(psb_dpk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - complex(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:) + complex(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + complex(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_datav' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_datav' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& - & y,sndbuf(snd_pt:snd_pt+nesd-1)) - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(sndbuf,sdsz,bsdidx,& - & psb_mpi_c_dpk_,rcvbuf,rvsz,& - & brvidx,psb_mpi_c_dpk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + do i=1, totxch + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_gth(nesd,idx(idx_pt:idx_pt+nesd-1),& + & y,sndbuf(snd_pt:snd_pt+nesd-1)) + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(sndbuf,sdsz,bsdidx,& + & psb_mpi_r_dpk_,rcvbuf,rvsz,& + & brvidx,psb_mpi_r_dpk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nerv>0) call psb_rcv(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_snd(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(rcvbuf(rcv_pt),nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((nesd>0).and.(proc_to_comm /= me)) then + if (usersend) then + call mpi_rsend(sndbuf(snd_pt),nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(sndbuf(snd_pt),nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nerv>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send', & + & nerv,nesd + end if + rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm < me) then + else if (swap_send) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_snd(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_rcv(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_dcomplex_swap_tag - call mpi_irecv(rcvbuf(rcv_pt),nerv,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag, icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - p2ptag = psb_dcomplex_swap_tag - - if ((nesd>0).and.(proc_to_comm /= me)) then - if (usersend) then - call mpi_rsend(sndbuf(snd_pt),nesd,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(sndbuf(snd_pt),nesd,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag,icomm,iret) - end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_dcomplex_swap_tag - - if ((proc_to_comm /= me).and.(nerv>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send', & - & nerv,nesd - end if - rcvbuf(rcv_pt:rcv_pt+nerv-1) = sndbuf(snd_pt:snd_pt+nesd-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_snd(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_rcv(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& - & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + end if + + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call psi_sct(nerv,idx(idx_pt:idx_pt+nerv-1),& + & rcvbuf(rcv_pt:rcv_pt+nerv-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_zswapidxv + end subroutine psi_zswapidxv +end submodule psi_z_swapdata_a_impl diff --git a/base/comm/internals/psi_zswaptran.F90 b/base/comm/internals/psi_zswaptran.F90 index 367dbd33d..50ba3585e 100644 --- a/base/comm/internals/psi_zswaptran.F90 +++ b/base/comm/internals/psi_zswaptran.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -43,7 +43,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D complex(psb_dpk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -59,12 +59,12 @@ ! ! ! Arguments: -! flag - integer Choose the algorithm for data exchange: +! swap_status - integer Choose the algorithm for data exchange: ! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 +! swap_mpi = iand(swap_status,psb_swap_mpi_) /= 0 +! swap_sync = iand(swap_status,psb_swap_sync_) /= 0 +! swap_send = iand(swap_status,psb_swap_send_) /= 0 +! swap_recv = iand(swap_status,psb_swap_recv_) /= 0 ! if (swap_mpi): use underlying MPI_ALLTOALLV. ! if (swap_sync): use PSB_SND and PSB_RCV in ! synchronized pairs @@ -77,10 +77,9 @@ ! ! ! n - integer Number of columns in Y -! beta - complex Choose overwrite or sum. -! y - type(psb_z_vect_type) The data area +! beta - real Choose overwrite or sum. +! y - type(psb_d_vect_type) The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - complex Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -91,13 +90,980 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_zswaptran_vect(flag,beta,y,desc_a,work,info,data) +submodule (psi_z_comm_v_mod) psi_z_swaptran_impl + use psb_base_mod + use psb_comm_factory_mod +contains + module subroutine psi_zswaptran_vect(swap_status,beta,y,desc_a,info,data) - use psi_mod, psb_protect_name => psi_zswaptran_vect - use psb_z_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + type(psb_desc_type),target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, total_send, total_recv, num_neighbors, err_act, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=20) :: name + + info = psb_success_ + name = 'psi_zswaptran_vect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + if( (swap_status /= psb_comm_status_start_).and.(swap_status /= psb_comm_status_wait_)& + & .and.(swap_status /= psb_comm_status_sync_) ) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + ! Set the normalized swap status on the comm handle + call y%comm_handle%set_swap_status(swap_status, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + call psi_ztran_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor a2av tran') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_ztran_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='persistent neighbor tran') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_ztran_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull tran') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_ztran_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push tran') + goto 9999 + end if + case default + call psi_ztran_baseline_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline tran') + goto 9999 + end if + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_zswaptran_vect + + ! + ! + ! Subroutine: psi_ztran_baseline_vect + ! Data exchange among processes. + ! + ! Takes care of Y an encapsulated vector. Relies on the gather/scatter methods + ! of vectors. + ! + ! The real workhorse: the outer routine will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_ztran_baseline_vect(ctxt,swap_status,beta,y,idx,& + & num_neighbors,total_send,total_recv,comm_handle,info) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: num_neighbors,total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_) :: icomm + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name + + info = psb_success_ + name = 'psi_ztran_baseline_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline swaptran') + goto 9999 + end select + + n=1 + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + + call idx%sync() + + if (debug) write(*,*) me,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + end if + if (debug) write(*,*) me,'do_send start' + call y%new_buffer(ione*size(idx%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt + call mpi_irecv(y%combuf(snd_pt),nesd,& + & psb_mpi_c_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + snd_pt = 1 + do i=1, num_neighbors + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + idx_pt = rcv_pt + call y%gth(idx_pt,nerv,idx) + + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait + ! + call y%device_wait() + + if (debug) write(*,*) me,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if ((nerv>0).and.(proc_to_comm /= me)) then + call mpi_isend(y%combuf(rcv_pt),nerv,& + & psb_mpi_c_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) me,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then + ! + ! No matching send? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) me,' wait' + pnti = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (proc_to_comm /= me)then + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' scatter' + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + snd_pt = 1+pnti+nerv+psb_n_elem_send_ + rcv_pt = 1+pnti+psb_n_elem_recv_ + + if (debug) write(0,*)me,' Received from: ',prcid(i),& + & y%combuf(snd_pt:snd_pt+nesd-1) + call y%sct(snd_pt,nesd,idx,beta) + pnti = pnti + nerv + nesd + 3 + end do + ! + ! Waited for everybody, clean up + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) me,' wait' + call y%device_wait() + if (debug) write(*,*) me,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) me,' done' + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psi_ztran_baseline_vect + + + + + subroutine psi_ztran_neighbor_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_ztran_neighbor_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor swaptran') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) me,' nbr_vect: starting data exchange' + ! Lazy initialization: build the topology on first call + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) me,' nbr_vect: building topology' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, & + & a_err='neighbor_topology_init') + goto 9999 + end if + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! For transpose exchange: gather recv area first (we will send "recv" data) + if (debug) write(*,*) me,' nbr_tran_vect: gathering recv data,', topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv swapping send/recv arrays + if (debug) write(*,*) me,' nbr_tran_vect: posting MPI_Ineighbor_alltoallv (swapped)' + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (recv_indexes gathered) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_c_dpk_, & + & y%combuf(topology_total_recv + 1), & ! recv buffer (will contain send_indexes data) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_c_dpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if (neighbor_comm_handle%comm_request == mpi_request_null) then + ! No matching start? Something is wrong + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) me,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! For transpose exchange: scatter the data that correspond to peers' send area + if (debug) write(*,*) me,' nbr_tran_vect: scattering send-index data,', topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) me,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_ztran_neighbor_topology_vect + + + + + ! + ! + ! + ! + ! Subroutine: psi_zswaptran_multivect + ! Data exchange among processes. + ! + ! Takes care of Y an encaspulated multivector. + ! + ! + module subroutine psi_zswaptran_multivect(swap_status,beta,y,desc_a,info,data) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_multivect_type), intent(inout) :: y + type(psb_desc_type),target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, total_send, total_recv, num_neighbors, err_act, data_ + class(psb_i_base_vect_type), pointer :: comm_indexes + character(len=20) :: name + + integer(psb_ipk_) :: setflag + + + info = psb_success_ + name = 'psi_zswaptran_multivect' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,comm_indexes,num_neighbors,total_recv,total_send,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + setflag = swap_status + if (swap_status == psb_swap_start_) then + setflag = psb_comm_status_start_ + else if (swap_status == psb_swap_wait_) then + setflag = psb_comm_status_wait_ + else if ((iand(swap_status, psb_swap_send_) /= 0) .or. (iand(swap_status, psb_swap_recv_) /= 0) .or. & + & (iand(swap_status, psb_swap_mpi_) /= 0) .or. (iand(swap_status, psb_swap_sync_) /= 0)) then + setflag = psb_comm_status_sync_ + end if + + if ((setflag /= psb_comm_status_start_) .and. (setflag /= psb_comm_status_wait_) .and. & + & (setflag /= psb_comm_status_sync_)) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid swap_status') + goto 9999 + end if + + if (.not. allocated(y%comm_handle)) then + call psb_comm_set(desc_a%comm_type, y%comm_handle, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='init comm default baseline') + goto 9999 + end if + end if + + call y%comm_handle%set_swap_status(setflag, info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='set_swap_status') + goto 9999 + end if + + select case(y%comm_handle%comm_type) + case(psb_comm_ineighbor_alltoallv_) + call psi_ztran_neighbor_topology_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='neighbor a2av tran') + goto 9999 + end if + case(psb_comm_persistent_ineighbor_alltoallv_) + call psi_ztran_neighbor_persistent_topology_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='persistent neighbor tran') + goto 9999 + end if + case(psb_comm_rma_pull_) + call psi_ztran_rma_pull_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma pull tran') + goto 9999 + end if + case(psb_comm_rma_push_) + call psi_ztran_rma_push_multivect(ctxt,setflag,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='rma push tran') + goto 9999 + end if + case default + call psi_ztran_baseline_multivect(ctxt,setflag,beta,y,comm_indexes,num_neighbors,total_send,total_recv,y%comm_handle,info) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='baseline tran') + goto 9999 + end if + end select + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_zswaptran_multivect + + subroutine psi_ztran_baseline_multivect(ctxt,swap_status,beta,y,idx,& + & num_neighbors,total_send,total_recv,comm_handle,info) + +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_z_base_multivect_type), intent(inout) :: y + complex(psb_dpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_) :: icomm + integer(psb_mpk_), allocatable :: prcid(:) + type(psb_comm_baseline_handle), pointer :: baseline_comm_handle + integer(psb_ipk_) :: err_act, i, idx_pt, total_send_, total_recv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false., debug=.false. + character(len=20) :: name + + info = psb_success_ + name = 'psi_ztran_vidx_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + baseline_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_baseline_handle) + baseline_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected baseline comm_handle in baseline multivect swaptran') + goto 9999 + end select + + n = y%get_ncols() + + do_send = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_recv = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + total_recv_ = total_recv * n + total_send_ = total_send * n + + call idx%sync() + + if (debug) write(*,*) me,'Internal buffer' + if (do_send) then + if (allocated(baseline_comm_handle%comid)) then + if (any(baseline_comm_handle%comid /= mpi_request_null)) then + ! + ! Unfinished communication? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + end if + if (debug) write(*,*) me,'do_send start' + call y%new_buffer(ione*size(idx%v),info) + call psb_realloc(num_neighbors,2_psb_ipk_,baseline_comm_handle%comid,info) + baseline_comm_handle%comid = mpi_request_null + call psb_realloc(num_neighbors,prcid,info) + ! First I post all the non blocking receives + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt + call mpi_irecv(y%combuf(snd_pt),n*nesd,& + & psb_mpi_c_dpk_,prcid(i),& + & p2ptag, icomm,baseline_comm_handle%comid(i,2),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' Gather ' + ! + ! Then gather for sending. + ! + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + do i=1, num_neighbors + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + call y%gth(idx_pt,rcv_pt,nerv,idx) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + ! + ! Then wait for device + ! + call y%device_wait() + + if (debug) write(*,*) me,' isend' + ! + ! Then send + ! + + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + if ((nerv>0).and.(proc_to_comm /= me)) then + call mpi_isend(y%combuf(rcv_pt),n*nerv,& + & psb_mpi_c_dpk_,prcid(i),& + & p2ptag,icomm,baseline_comm_handle%comid(i,1),iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if + + if (do_recv) then + if (debug) write(*,*) me,' do_Recv' + if (.not.allocated(baseline_comm_handle%comid)) then + ! + ! No matching send? Something is wrong.... + ! + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/-2/)) + goto 9999 + end if + call psb_realloc(num_neighbors,prcid,info) + + if (debug) write(*,*) me,' wait' + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + p2ptag = psb_double_swap_tag + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + if (proc_to_comm /= me)then + if (nerv>0) then + call mpi_wait(baseline_comm_handle%comid(i,1),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (nesd>0) then + call mpi_wait(baseline_comm_handle%comid(i,2),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swapdata: mismatch on self send',& + & nerv,nesd + end if + y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + if (debug) write(*,*) me,' scatter' + pnti = 1 + snd_pt = total_recv_+1 + rcv_pt = 1 + do i=1, num_neighbors + proc_to_comm = idx%v(pnti+psb_proc_id_) + nerv = idx%v(pnti+psb_n_elem_recv_) + nesd = idx%v(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + + if (debug) write(0,*)me,' Received from: ',prcid(i),& + & y%combuf(snd_pt:snd_pt+n*nesd-1) + call y%sct(idx_pt,snd_pt,nesd,idx,beta) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! + ! Waited for com, cleanup comid + ! + baseline_comm_handle%comid = mpi_request_null + + ! + ! Then wait for device + ! + if (debug) write(*,*) me,' wait' + call y%device_wait() + if (debug) write(*,*) me,' free buffer' + call y%maybe_free_buffer(info) + if (info == 0) then + if (allocated(y%comm_handle)) call psb_comm_free(y%comm_handle, info) + end if + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if (debug) write(*,*) me,' done' + end if + + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psi_ztran_baseline_multivect + + + subroutine psi_ztran_neighbor_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -106,85 +1072,170 @@ subroutine psi_zswaptran_vect(flag,beta,y,desc_a,work,info,data) include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_vect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + + info = psb_success_ + name = 'psi_ztran_neighbor_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in neighbor multivect swaptran') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + ! --------------------------------------------------------- + ! START phase: build topology (if needed), gather, post MPI + ! --------------------------------------------------------- + if (do_start) then + if(debug) write(*,*) me,' nbr_vect: starting data exchange' + ! Lazy initialization: build the topology on first call + if (.not. neighbor_comm_handle%is_initialized) then + if (debug) write(*,*) me,' nbr_vect: building topology' + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, & + & a_err='neighbor_topology_init') + goto 9999 + end if + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Buffer layout: + ! combuf(1 : total_send) = send area + ! combuf(total_send+1 : total_send+total_recv) = recv area + buffer_size = topology_total_send + topology_total_recv + + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + neighbor_comm_handle%comm_request = mpi_request_null + + ! For transpose exchange: gather recv area first (we will send "recv" data) + if (debug) write(*,*) me,' nbr_tran_vect: gathering recv data,', topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + + ! Wait for device (important for GPU subclasses) + call y%device_wait() + + ! Post non-blocking neighborhood alltoallv swapping send/recv arrays + if (debug) write(*,*) me,' nbr_tran_vect: posting MPI_Ineighbor_alltoallv (swapped)' + call mpi_ineighbor_alltoallv( & + & y%combuf(1), & ! send buffer (recv_indexes gathered) + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_c_dpk_, & + & y%combuf(topology_total_recv + 1), & ! recv buffer (will contain send_indexes data) + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_c_dpk_, & + & neighbor_comm_handle%graph_comm, & + & neighbor_comm_handle%comm_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + end if ! do_start + + ! --------------------------------------------------------- + ! WAIT phase: complete MPI, scatter received data + ! --------------------------------------------------------- + if (do_wait) then + + if (neighbor_comm_handle%comm_request == mpi_request_null) then + ! No matching start? Something is wrong + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/-2/)) + goto 9999 + end if + + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + ! Wait for the non-blocking collective to complete + if (debug) write(*,*) me,' nbr_vect: waiting on MPI request' + call mpi_wait(neighbor_comm_handle%comm_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + + ! For transpose exchange: scatter the data that correspond to peers' send area + if (debug) write(*,*) me,' nbr_tran_vect: scattering send-index data,', topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + + + ! Clean up + neighbor_comm_handle%comm_request = mpi_request_null + call y%device_wait() + call y%maybe_free_buffer(info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + if (debug) write(*,*) me,' nbr_vect: done' + + end if ! do_wait + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_zswaptran_vect + end subroutine psi_ztran_neighbor_topology_multivect -! -! -! Subroutine: psi_ztran_vidx_vect -! Data exchange among processes. -! -! Takes care of Y an encapsulated vector. Relies on the gather/scatter methods -! of vectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_ztran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_ztran_vidx_vect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_z_base_vect_mod + + + subroutine psi_ztran_neighbor_persistent_topology_vect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -193,345 +1244,661 @@ subroutine psi_ztran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_vect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - call idx%sync() - - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) - goto 9999 - end if + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: icomm, np, my_rank, iret + integer(psb_mpk_) :: p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + info = psb_success_ + name = 'psi_ztran_neighbor_persistent_topology_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor swaptran') + goto 9999 + end select + + if (swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='psb_comm_status_unknown_ not allowed in persistent neighbor swaptran') + goto 9999 end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - p2ptag = psb_dcomplex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),rcv_pt - call mpi_irecv(y%combuf(snd_pt),nesd,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) - end if - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - snd_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - idx_pt = rcv_pt - call y%gth(idx_pt,nerv,idx) - - pnti = pnti + nerv + nesd + 3 - end do - - ! - ! Then wait - ! - call y%device_wait() - - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - p2ptag = psb_dcomplex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),nerv,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid START: persistent neighbor request already in flight') goto 9999 end if + if (.not. neighbor_comm_handle%is_initialized) then + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + buffer_size = topology_total_send + topology_total_recv + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Transpose: gather from recv_indexes (we "send" recv data) + if (debug) write(*,*) my_rank,' tran_persistent_vect: gathering recv data,',topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:topology_total_recv)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if - pnti = pnti + nerv + nesd + 3 - end do - end if + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + ! Transpose: swap send/recv counts in alltoallv_init + ! send = recv_indexes data with recv_counts/displs + ! recv = into send_indexes area with send_counts/displs + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & + & neighbor_comm_handle%recv_counts, & + & neighbor_comm_handle%recv_displs, & + & psb_mpi_c_dpk_, & + & y%combuf(topology_total_recv + 1), & + & neighbor_comm_handle%send_counts, & + & neighbor_comm_handle%send_displs, & + & psb_mpi_c_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + end if ! do_start + + if (do_wait) then + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + + if ((topology_total_send + topology_total_recv) == 0) then + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + if ((topology_total_send + topology_total_recv) > 0) then + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Transpose: scatter to send_indexes + if (debug) write(*,*) my_rank,' tran_persistent_vect: scattering to send_indexes,',topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(topology_total_recv+1:topology_total_recv+topology_total_send), & + & beta) + end if + + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ztran_neighbor_persistent_topology_vect + + + subroutine psi_ztran_rma_pull_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + ! Effective sizes for transpose: + ! eff_send = total_recv (we expose recv_indexes data) + ! eff_recv = total_send (we GET into the send_indexes area) + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_ztran_rma_pull_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - call psb_realloc(totxch,prcid,info) - - if (debug) write(*,*) me,' wait' - pnti = 1 - p2ptag = psb_dcomplex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (proc_to_comm /= me)then - if (nerv>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + icomm = ctxt%get_mpic() + eff_send = total_recv + eff_recv = total_send + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran pull') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = eff_send + eff_recv + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran pull rank cache allocation') goto 9999 end if end if - if (nesd>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran pull init_memory_buffer_layout_tran failure') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - y%combuf(snd_pt:snd_pt+nesd-1) = y%combuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - snd_pt = 1+pnti+nerv+psb_n_elem_send_ - rcv_pt = 1+pnti+psb_n_elem_recv_ - - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+nesd-1) - call y%sct(snd_pt,nesd,idx,beta) - pnti = pnti + nerv + nesd + 3 - end do - ! - ! Waited for everybody, clean up - ! - y%comid = mpi_request_null - - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if (debug) write(*,*) me,' done' - end if - + end if - call psb_erractionrestore(err_act) - return + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + ! Transpose: gather recv_indexes data into combuf(1:eff_send) + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:eff_send)) + end if + call y%device_wait() + + ! Pull from each peer's recv_indexes area with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = eff_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran pull') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count, psb_mpi_r_dpk_, prc_rank, remote_disp, recv_count, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran pull self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if ! do_start - return + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter into send_indexes. + if (do_wait) then + ! Transpose: scatter to send_indexes (peer_recv_indexes in tran init = actual send_indexes) + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(eff_send+1:eff_send+eff_recv), beta) + end if + call y%device_wait() + end if ! do_wait -end subroutine psi_ztran_vidx_vect + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ztran_rma_pull_vect -! -! -! -! -! Subroutine: psi_zswaptran_multivect -! Data exchange among processes. -! -! Takes care of Y an encaspulated multivector. -! -! -subroutine psi_zswaptran_multivect(flag,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_zswaptran_multivect - use psb_z_base_vect_mod - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + subroutine psi_ztran_rma_push_vect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_multivect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - class(psb_i_base_vect_type), pointer :: d_vidx - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_vidx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_vidx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_ztran_rma_push_vect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + end if + icomm = ctxt%get_mpic() + eff_send = total_recv + eff_recv = total_send + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran push') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = eff_send + eff_recv + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran push rank cache allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran push init_memory_buffer_layout_tran failure') + goto 9999 + end if + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < size(comm_indexes%v)) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(ione*size(comm_indexes%v), info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + ! Transpose: gather recv_indexes data into combuf(1:eff_send) + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:eff_send)) + end if + call y%device_wait() + + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do + + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + ! Push our recv_indexes data to each peer's send_indexes area; notify after flush. + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx) + 1 + recv_pos = eff_send + rma_handle%peer_recv_displs(neighbor_idx) + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran push') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int(remote_base - 1, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count, psb_mpi_r_dpk_, prc_rank, remote_disp, send_count, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran push self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count-1) = y%combuf(send_pos:send_pos+send_count-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter into send_indexes. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + ! Transpose: scatter to send_indexes (peer_recv_indexes in tran init = actual send_indexes) + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, y%combuf(eff_send+1:eff_send+eff_recv), beta) + end if + call y%device_wait() + end if ! do_wait + call psb_erractionrestore(err_act) return - end subroutine psi_zswaptran_multivect +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ztran_rma_push_vect -! -! -! Subroutine: psi_ztran_vidx_multivect -! Data exchange among processes. -! -! Takes care of Y an encapsulated multivector. Relies on the gather/scatter methods -! of multivectors. -! -! The real workhorse: the outer routine will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_ztran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - - use psi_mod, psb_protect_name => psi_ztran_vidx_multivect - use psb_error_mod - use psb_realloc_mod - use psb_desc_mod - use psb_penv_mod - use psb_z_base_multivect_mod + + subroutine psi_ztran_neighbor_persistent_topology_multivect(ctxt,swap_status,beta,y,comm_indexes,& + & num_neighbors,total_send,total_recv,comm_handle,info) #ifdef PSB_MPI_MOD use mpi #endif @@ -540,243 +1907,661 @@ subroutine psi_ztran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_multivect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable :: prcid(:) - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false., debug=.false. - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n = y%get_ncols() - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - call idx%sync() - - if (debug) write(*,*) me,'Internal buffer' - if (do_send) then - if (allocated(y%comid)) then - if (any(y%comid /= mpi_request_null)) then - ! - ! Unfinished communication? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) - goto 9999 - end if + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors,total_send,total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: icomm, np, my_rank, iret, n + integer(psb_mpk_) :: p2pstat(mpi_status_size) + type(psb_comm_neighbor_handle), pointer :: neighbor_comm_handle + integer(psb_ipk_) :: err_act, topology_total_send, topology_total_recv, buffer_size + integer(psb_mpk_) :: total_send_, total_recv_ + logical :: do_start, do_wait + logical, parameter :: debug = .false. + character(len=30) :: name + + info = psb_success_ + name = 'psi_ztran_neighbor_persistent_topology_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + icomm = ctxt%get_mpic() + n = y%get_ncols() + + neighbor_comm_handle => null() + select type(ch => comm_handle) + type is(psb_comm_neighbor_handle) + neighbor_comm_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected neighbor comm_handle in persistent neighbor multivect swaptran') + goto 9999 + end select + + if (swap_status == psb_comm_status_unknown_) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='psb_comm_status_unknown_ not allowed in persistent neighbor multivect swaptran') + goto 9999 end if - if (debug) write(*,*) me,'do_send start' - call y%new_buffer(ione*size(idx%v),info) - call y%new_comid(totxch,info) - y%comid = mpi_request_null - call psb_realloc(totxch,prcid,info) - ! First I post all the non blocking receives - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_dcomplex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - if (debug) write(*,*) me,'Posting receive from',prcid(i),snd_pt - call mpi_irecv(y%combuf(snd_pt),n*nesd,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag, icomm,y%comid(i,2),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' Gather ' - ! - ! Then gather for sending. - ! - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - do i=1, totxch - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call y%gth(idx_pt,rcv_pt,nerv,idx) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - ! - ! Then wait for device - ! - call y%device_wait() - - if (debug) write(*,*) me,' isend' - ! - ! Then send - ! - - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_dcomplex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - if ((nerv>0).and.(proc_to_comm /= me)) then - call mpi_isend(y%combuf(rcv_pt),n*nerv,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag,icomm,y%comid(i,1),iret) - end if - - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + if (neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Invalid START: persistent neighbor request already in flight') goto 9999 end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - end if - - if (do_recv) then - if (debug) write(*,*) me,' do_Recv' - if (.not.allocated(y%comid)) then - ! - ! No matching send? Something is wrong.... - ! - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/-2/)) + if (.not. neighbor_comm_handle%is_initialized) then + call neighbor_comm_handle%topology_init(comm_indexes%v, num_neighbors, total_send, total_recv, ctxt, icomm, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_, name, a_err='neighbor_topology_init') + goto 9999 + end if + end if + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + buffer_size = total_send_ + total_recv_ + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (neighbor_comm_handle%persistent_request_ready) then + if (neighbor_comm_handle%persistent_request /= mpi_request_null) then + call mpi_request_free(neighbor_comm_handle%persistent_request, iret) + end if + neighbor_comm_handle%persistent_request = mpi_request_null + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_in_flight = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + call y%new_buffer(buffer_size, info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_, name) + goto 9999 + end if + end if + end if + neighbor_comm_handle%comm_request = mpi_request_null + + if (buffer_size > 0) then + ! Transpose: gather from recv_indexes + if (debug) write(*,*) my_rank,' tran_persistent_mv: gathering recv data,',topology_total_recv,' elems' + call y%gth(int(topology_total_recv,psb_mpk_), & + & neighbor_comm_handle%recv_indexes, & + & y%combuf(1:total_recv_)) + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + + call y%device_wait() + + if (.not. neighbor_comm_handle%persistent_request_ready) then + if (buffer_size > 0) then + ! Transpose: swap send/recv in alltoallv_init + call mpi_neighbor_alltoallv_init( & + & y%combuf(1), & + & n*neighbor_comm_handle%recv_counts, & + & n*neighbor_comm_handle%recv_displs, & + & psb_mpi_c_dpk_, & + & y%combuf(total_recv_ + 1), & + & n*neighbor_comm_handle%send_counts, & + & n*neighbor_comm_handle%send_displs, & + & psb_mpi_c_dpk_, & + & neighbor_comm_handle%graph_comm, & + & mpi_info_null, & + & neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_request_ready = .true. + neighbor_comm_handle%persistent_buffer_size = buffer_size + else + neighbor_comm_handle%persistent_request_ready = .false. + neighbor_comm_handle%persistent_buffer_size = 0 + end if + end if + + if (buffer_size > 0) then + call mpi_start(neighbor_comm_handle%persistent_request, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .true. + else + neighbor_comm_handle%persistent_in_flight = .false. + end if + end if ! do_start + + if (do_wait) then + topology_total_send = neighbor_comm_handle%total_send + topology_total_recv = neighbor_comm_handle%total_recv + total_send_ = topology_total_send * n + total_recv_ = topology_total_recv * n + + if ((topology_total_send + topology_total_recv) == 0) then + neighbor_comm_handle%persistent_in_flight = .false. + else + if (.not. neighbor_comm_handle%persistent_in_flight) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, a_err='Invalid WAIT: no persistent neighbor request in flight') + goto 9999 + end if + end if + + if ((topology_total_send + topology_total_recv) > 0) then + call mpi_wait(neighbor_comm_handle%persistent_request, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info, name, m_err=(/iret/)) + goto 9999 + end if + neighbor_comm_handle%persistent_in_flight = .false. + + ! Transpose: scatter to send_indexes + if (debug) write(*,*) my_rank,' tran_persistent_mv: scattering to send_indexes,',topology_total_send,' elems' + call y%sct(int(topology_total_send,psb_mpk_), & + & neighbor_comm_handle%send_indexes, & + & y%combuf(total_recv_+1:total_recv_+total_send_), & + & beta) + end if + + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ztran_neighbor_persistent_topology_multivect + + + subroutine psi_ztran_rma_pull_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv, total_eff_send_, total_eff_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_ztran_rma_pull_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - call psb_realloc(totxch,prcid,info) - - if (debug) write(*,*) me,' wait' - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - p2ptag = psb_dcomplex_swap_tag - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - if (proc_to_comm /= me)then - if (nerv>0) then - call mpi_wait(y%comid(i,1),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + icomm = ctxt%get_mpic() + n = y%get_ncols() + eff_send = total_recv + eff_recv = total_send + total_eff_send_ = eff_send * n + total_eff_recv_ = eff_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran pull multivect') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_eff_send_ + total_eff_recv_ + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran pull multivect rank allocation') goto 9999 end if end if - if (nesd>0) then - call mpi_wait(y%comid(i,2),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran pull multivect init_memory_buffer_layout_tran') + goto 9999 + end if + end if + + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) goto 9999 end if end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swapdata: mismatch on self send',& - & nerv,nesd - end if - y%combuf(snd_pt:snd_pt+n*nesd-1) = y%combuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - if (debug) write(*,*) me,' scatter' - pnti = 1 - snd_pt = totrcv_+1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx%v(pnti+psb_proc_id_) - nerv = idx%v(pnti+psb_n_elem_recv_) - nesd = idx%v(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - - if (debug) write(0,*)me,' Received from: ',prcid(i),& - & y%combuf(snd_pt:snd_pt+n*nesd-1) - call y%sct(idx_pt,snd_pt,nesd,idx,beta) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! - ! Waited for com, cleanup comid - ! - y%comid = mpi_request_null - - ! - ! Then wait for device - ! - if (debug) write(*,*) me,' wait' - call y%device_wait() - if (debug) write(*,*) me,' free buffer' - call y%maybe_free_buffer(info) - if (info == 0) call y%free_comid(info) - if (info /= 0) then - call psb_errpush(psb_err_alloc_dealloc_,name) + end if + + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if + + if (buffer_size > 0) then + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_eff_send_)) + end if + call y%device_wait() + + ! Pull from each peer's recv_indexes area with per-neighbor passive lock (neighbor-only sync). + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_eff_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_send_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran pull multivect') + goto 9999 + end if + if (recv_count > 0) then + call mpi_win_lock(MPI_LOCK_SHARED, prc_rank, 0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + remote_disp = int((remote_base - 1)*n, kind=MPI_ADDRESS_KIND) + call mpi_get(y%combuf(recv_pos), recv_count*n, psb_mpi_r_dpk_, prc_rank, remote_disp, recv_count*n, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_win_unlock(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran pull multivect self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: GETs already complete (per-neighbor unlock in START); scatter into send_indexes. + if (do_wait) then + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, & + & y%combuf(total_eff_send_+1:total_eff_send_+total_eff_recv_), beta) + end if + call y%device_wait() + end if ! do_wait + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ztran_rma_pull_multivect + + + subroutine psi_ztran_rma_push_multivect(ctxt,swap_status,beta,y,comm_indexes,num_neighbors,total_send,total_recv,comm_handle,info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_multivect_type), intent(inout) :: y + class(psb_i_base_vect_type), intent(inout) :: comm_indexes + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + class(psb_comm_handle_type), intent(inout) :: comm_handle + integer(psb_ipk_), intent(out) :: info + + integer(psb_mpk_) :: np, my_rank, iret, element_bytes, icomm, n + integer(psb_mpk_) :: proc_to_comm, prc_rank, recv_count, send_count, send_pos, recv_pos, list_pos + integer(psb_mpk_) :: remote_base + integer(kind=MPI_ADDRESS_KIND) :: remote_disp, exposed_bytes + integer(psb_ipk_) :: err_act, neighbor_idx, buffer_size, eff_send, eff_recv, total_eff_send_, total_eff_recv_ + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_mpk_), parameter :: rma_push_notify_tag = 914_psb_mpk_ + logical :: do_start, do_wait, layout_rebuild_needed + type(psb_comm_rma_handle), pointer :: rma_handle + character(len=30) :: name + + info = psb_success_ + name = 'psi_ztran_rma_push_multivect' + call psb_erractionsave(err_act) + call psb_info(ctxt,my_rank,np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) goto 9999 end if - if (debug) write(*,*) me,' done' - end if + icomm = ctxt%get_mpic() + n = y%get_ncols() + eff_send = total_recv + eff_recv = total_send + total_eff_send_ = eff_send * n + total_eff_recv_ = eff_recv * n + + select type(ch => comm_handle) + type is(psb_comm_rma_handle) + rma_handle => ch + class default + info = psb_err_mpi_error_ + call psb_errpush(info,name,a_err='Expected RMA comm_handle for tran push multivect') + goto 9999 + end select + + do_start = (swap_status == psb_comm_status_start_) .or. (swap_status == psb_comm_status_sync_) + do_wait = (swap_status == psb_comm_status_wait_) .or. (swap_status == psb_comm_status_sync_) + + call comm_indexes%sync() + + if (do_start) then + buffer_size = total_eff_send_ + total_eff_recv_ + layout_rebuild_needed = (.not. rma_handle%layout_ready) .or. & + & (rma_handle%layout_nnbr /= num_neighbors) .or. & + & (rma_handle%layout_send /= eff_send) .or. & + & (rma_handle%layout_recv /= eff_recv) + + if (layout_rebuild_needed) then + if (allocated(peer_mpi_rank)) deallocate(peer_mpi_rank) + if (num_neighbors > 0) then + allocate(peer_mpi_rank(num_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info,name,a_err='RMA tran push multivect rank allocation') + goto 9999 + end if + end if + list_pos = 1 + do neighbor_idx = 1, num_neighbors + proc_to_comm = comm_indexes%v(list_pos+psb_proc_id_) + peer_mpi_rank(neighbor_idx) = psb_get_mpi_rank(ctxt,proc_to_comm) + recv_count = comm_indexes%v(list_pos+psb_n_elem_recv_) + send_count = comm_indexes%v(list_pos+recv_count+psb_n_elem_send_) + list_pos = list_pos + recv_count + send_count + 3 + end do + call rma_handle%init_memory_buffer_layout_tran(info, comm_indexes%v, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + if (info /= psb_success_) then + call psb_errpush(info,name,a_err='RMA tran push multivect init_memory_buffer_layout_tran') + goto 9999 + end if + end if + if (buffer_size > 0) then + if (.not. allocated(y%combuf)) then + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + else if (size(y%combuf) < buffer_size) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + rma_handle%window_open = .false. + end if + if (rma_handle%window_ready) then + call mpi_win_free(rma_handle%win, iret) + rma_handle%window_ready = .false. + rma_handle%win = mpi_win_null + end if + call y%new_buffer(buffer_size, info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if + end if - call psb_erractionrestore(err_act) - return + if ((buffer_size > 0).and.(.not. rma_handle%window_ready)) then + element_bytes = storage_size(y%combuf(1))/8 + exposed_bytes = int(size(y%combuf),kind=MPI_ADDRESS_KIND) * int(element_bytes,kind=MPI_ADDRESS_KIND) + call mpi_win_create(y%combuf, exposed_bytes, element_bytes, & + & mpi_info_null, ctxt%get_mpic(), rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_ready = .true. + end if -9999 call psb_error_handler(ctxt,err_act) + if (buffer_size > 0) then + if (eff_send > 0) then + call y%gth(int(eff_send,psb_mpk_), rma_handle%peer_send_indexes, y%combuf(1:total_eff_send_)) + end if + call y%device_wait() - return + ! Pre-post notification receives before opening the window. + if (num_neighbors > 0) then + rma_handle%notify_recv_reqs(1:num_neighbors) = MPI_REQUEST_NULL + rma_handle%notify_send_reqs(1:num_neighbors) = MPI_REQUEST_NULL + end if + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + call mpi_irecv(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_recv_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + end do -end subroutine psi_ztran_vidx_multivect + call mpi_win_lock_all(0, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .true. + + do neighbor_idx=1, num_neighbors + proc_to_comm = rma_handle%peer_proc(neighbor_idx) + send_count = rma_handle%peer_send_counts(neighbor_idx) + recv_count = rma_handle%peer_recv_counts(neighbor_idx) + prc_rank = rma_handle%peer_mpi_rank(neighbor_idx) + send_pos = rma_handle%peer_send_displs(neighbor_idx)*n + 1 + recv_pos = total_eff_send_ + rma_handle%peer_recv_displs(neighbor_idx)*n + 1 + + if (proc_to_comm /= my_rank) then + remote_base = rma_handle%peer_remote_recv_displs(neighbor_idx) + if (remote_base < 1) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='Invalid remote metadata in RMA tran push multivect') + goto 9999 + end if + if (send_count > 0) then + remote_disp = int((remote_base - 1)*n, kind=MPI_ADDRESS_KIND) + call mpi_put(y%combuf(send_pos), send_count*n, psb_mpi_r_dpk_, prc_rank, remote_disp, send_count*n, psb_mpi_r_dpk_, & + & rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + call mpi_win_flush(prc_rank, rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_isend(rma_handle%notify_buf(neighbor_idx), 1, psb_mpi_mpk_, prc_rank, & + & rma_push_notify_tag, icomm, rma_handle%notify_send_reqs(neighbor_idx), iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else + if (send_count /= recv_count) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='RMA tran push multivect self-copy mismatch') + goto 9999 + end if + y%combuf(recv_pos:recv_pos+recv_count*n-1) = y%combuf(send_pos:send_pos+send_count*n-1) + end if + end do + end if + end if ! do_start + + ! WAIT phase: close epoch, wait for P2P notifications, then scatter into send_indexes. + if (do_wait) then + if (rma_handle%window_open) then + call mpi_win_unlock_all(rma_handle%win, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + rma_handle%window_open = .false. + end if + if (num_neighbors > 0) then + call mpi_waitall(num_neighbors, rma_handle%notify_recv_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + call mpi_waitall(num_neighbors, rma_handle%notify_send_reqs, MPI_STATUSES_IGNORE, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + if (eff_recv > 0) then + call y%sct(int(eff_recv,psb_mpk_), rma_handle%peer_recv_indexes, & + & y%combuf(total_eff_send_+1:total_eff_send_+total_eff_recv_), beta) + end if + call y%device_wait() + end if ! do_wait + call psb_erractionrestore(err_act) + return +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psi_ztran_rma_push_multivect +end submodule psi_z_swaptran_impl diff --git a/base/comm/internals/psi_zswaptran_a.F90 b/base/comm/internals/psi_zswaptran_a.F90 index 8b4e4268c..1d7a9b74d 100644 --- a/base/comm/internals/psi_zswaptran_a.F90 +++ b/base/comm/internals/psi_zswaptran_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,7 +30,7 @@ ! ! ! -! File: psi_zswaptran.F90 +! File: psi_zswaptran_a.F90 ! ! Subroutine: psi_zswaptranm ! Implements the data exchange among processes. This is similar to Xswapdata, but @@ -43,7 +43,7 @@ ! application environment. All the variants have the same structure ! In all these subroutines X may be: I Integer ! S real(psb_spk_) -! D real(psb_dpk_) +! D complex(psb_dpk_) ! C complex(psb_spk_) ! Z complex(psb_dpk_) ! Basically the operation is as follows: on each process, we identify @@ -74,10 +74,10 @@ ! ! ! n - integer Number of columns in Y -! beta - complex Choose overwrite or sum. -! y(:,:) - complex The data area +! beta - real Choose overwrite or sum. +! y(:,:) - real The data area ! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - complex Buffer space. If not sufficient, will do +! work(:) - real Buffer space. If not sufficient, will do ! our own internal allocation. ! info - integer. return code. ! data - integer which list is to be used to exchange data @@ -88,922 +88,913 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psi_zswaptranm(flag,n,beta,y,desc_a,work,info,data) +submodule (psi_z_comm_a_mod) psi_z_swaptran_a_impl + use psb_base_mod +contains + module subroutine psi_zswaptranm(flag,n,beta,y,desc_a,work,info,data) - use psi_mod, psb_protect_name => psi_zswaptranm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:,:), beta - complex(psb_dpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_mpk_) :: np, me - integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if(present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + integer(psb_mpk_), intent(in) :: n + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:,:) + type(psb_desc_type),target :: desc_a + complex(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_mpk_) :: np, me + integer(psb_ipk_) :: idxs, idxr, err_act, totxch, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif + + if(present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if + + call psi_swaptran(ctxt,flag,n,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + call psb_erractionrestore(err_act) return -end subroutine psi_zswaptranm -subroutine psi_ztranidxm(ctxt,icomm,flag,n,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psi_zswaptranm - use psi_mod, psb_protect_name => psi_ztranidxm - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + module subroutine psi_ztranidxm(ctxt,flag,n,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_mpk_), intent(in) :: n - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:,:), beta - complex(psb_dpk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - complex(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + complex(psb_dpk_), intent(inout) :: y(:,:) + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + integer(psb_mpk_) :: icomm + logical, parameter :: usersend=.false. + + complex(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 + + ! prepare info for communications + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = n*nerv + + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = n*nesd + + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + end if - ! prepare info for communications + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. + end if - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + if (do_send) then - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = n*nerv + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = n*nesd + call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - end if - - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 end if - albf=.true. - end if - if (do_send) then - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - call psi_gth(nerv,n,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+n*nerv-1)) + ! Case SWAP_MPI + if (swap_mpi) then - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_r_dpk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_r_dpk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),n*nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),n*nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send',& + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do - ! Case SWAP_MPI - if (swap_mpi) then + else if (swap_send) then - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_c_dpk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_c_dpk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 - else if (swap_sync) then + end do - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_recv) then - if (proc_to_comm < me) then - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_dcomplex_swap_tag - call mpi_irecv(sndbuf(snd_pt),n*nesd,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_dcomplex_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag,icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),n*nerv,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag,icomm,iret) - end if + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 + end if - end do + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) + rcv_pt = rcv_pt + n*nerv + snd_pt = snd_pt + n*nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_dcomplex_swap_tag + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send',& - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+n*nesd-1) = rcvbuf(rcv_pt:rcv_pt+n*nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+n*nerv-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+n*nesd-1), proc_to_comm) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,n,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+n*nesd-1),beta,y) - rcv_pt = rcv_pt + n*nerv - snd_pt = snd_pt + n*nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_ztranidxm -! -! -! Subroutine: psi_zswaptranv -! Implements the data exchange among processes. This is similar to Xswapdata, but -! the list is read "in reverse", i.e. indices that are normally SENT are used -! for the RECEIVE part and vice-versa. This is the basic data exchange operation -! for doing the product of a sparse matrix by a vector. -! Essentially this is doing a variable all-to-all data exchange -! (ALLTOALLV in MPI parlance), but -! it is capable of pruning empty exchanges, which are very likely in out -! application environment. All the variants have the same structure -! In all these subroutines X may be: I Integer -! S real(psb_spk_) -! D real(psb_dpk_) -! C complex(psb_spk_) -! Z complex(psb_dpk_) -! Basically the operation is as follows: on each process, we identify -! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); -! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y -! but only on the elements involved in the UNPACK operation. -! Thus: for halo data exchange, the receive section is confined in the -! halo indices, and BETA=0, whereas for overlap exchange the receive section -! is scattered in the owned indices, and BETA=1. -! The first routine picks the desired exchange index list and passes it to the second. -! -! Arguments: -! flag - integer Choose the algorithm for data exchange: -! this is chosen through bit fields. -! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 -! swap_sync = iand(flag,psb_swap_sync_) /= 0 -! swap_send = iand(flag,psb_swap_send_) /= 0 -! swap_recv = iand(flag,psb_swap_recv_) /= 0 -! if (swap_mpi): use underlying MPI_ALLTOALLV. -! if (swap_sync): use PSB_SND and PSB_RCV in -! synchronized pairs -! if (swap_send .and. swap_recv): use mpi_irecv -! and mpi_send -! if (swap_send): use psb_snd (but need another -! call with swap_recv to complete) -! if (swap_recv): use psb_rcv (completing a -! previous call with swap_send) -! -! -! n - integer Number of columns in Y -! beta - complex Choose overwrite or sum. -! y(:) - complex The data area -! desc_a - type(psb_desc_type). The communication descriptor. -! work(:) - complex Buffer space. If not sufficient, will do -! our own internal allocation. -! info - integer. return code. -! data - integer which list is to be used to exchange data -! default psb_comm_halo_ -! psb_comm_halo_ use halo_index -! psb_comm_ext_ use ext_index -! psb_comm_ovrl_ use ovrl_index -! psb_comm_mov_ use ovr_mst_idx -! -! -subroutine psi_zswaptranv(flag,beta,y,desc_a,work,info,data) - - use psi_mod, psb_protect_name => psi_zswaptranv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + end subroutine psi_ztranidxm + ! + ! + ! Subroutine: psi_zswaptranv + ! Implements the data exchange among processes. This is similar to Xswapdata, but + ! the list is read "in reverse", i.e. indices that are normally SENT are used + ! for the RECEIVE part and vice-versa. This is the basic data exchange operation + ! for doing the product of a sparse matrix by a vector. + ! Essentially this is doing a variable all-to-all data exchange + ! (ALLTOALLV in MPI parlance), but + ! it is capable of pruning empty exchanges, which are very likely in out + ! application environment. All the variants have the same structure + ! In all these subroutines X may be: I Integer + ! S real(psb_spk_) + ! D complex(psb_dpk_) + ! C complex(psb_spk_) + ! Z complex(psb_dpk_) + ! Basically the operation is as follows: on each process, we identify + ! sections SND(Y) and RCV(Y); then we do a SEND(PACK(SND(Y))); + ! then we receive, and we do an update with Y = UNPACK(RCV(Y)) + BETA * Y + ! but only on the elements involved in the UNPACK operation. + ! Thus: for halo data exchange, the receive section is confined in the + ! halo indices, and BETA=0, whereas for overlap exchange the receive section + ! is scattered in the owned indices, and BETA=1. + ! The first routine picks the desired exchange index list and passes it to the second. + ! + ! Arguments: + ! flag - integer Choose the algorithm for data exchange: + ! this is chosen through bit fields. + ! swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + ! swap_sync = iand(flag,psb_swap_sync_) /= 0 + ! swap_send = iand(flag,psb_swap_send_) /= 0 + ! swap_recv = iand(flag,psb_swap_recv_) /= 0 + ! if (swap_mpi): use underlying MPI_ALLTOALLV. + ! if (swap_sync): use PSB_SND and PSB_RCV in + ! synchronized pairs + ! if (swap_send .and. swap_recv): use mpi_irecv + ! and mpi_send + ! if (swap_send): use psb_snd (but need another + ! call with swap_recv to complete) + ! if (swap_recv): use psb_rcv (completing a + ! previous call with swap_send) + ! + ! + ! n - integer Number of columns in Y + ! beta - real Choose overwrite or sum. + ! y(:) - real The data area + ! desc_a - type(psb_desc_type). The communication descriptor. + ! work(:) - real Buffer space. If not sufficient, will do + ! our own internal allocation. + ! info - integer. return code. + ! data - integer which list is to be used to exchange data + ! default psb_comm_halo_ + ! psb_comm_halo_ use halo_index + ! psb_comm_ext_ use ext_index + ! psb_comm_ovrl_ use ovrl_index + ! psb_comm_mov_ use ovr_mst_idx + ! + ! + module subroutine psi_zswaptranv(flag,beta,y,desc_a,work,info,data) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:), beta - complex(psb_dpk_), target :: work(:) - type(psb_desc_type),target :: desc_a - integer(psb_ipk_), optional :: data - - ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_mpk_) :: icomm - integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ - integer(psb_ipk_), pointer :: d_idx(:) - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tranv' - call psb_erractionsave(err_act) - - ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - if (.not.psb_is_asb_desc(desc_a)) then - info=psb_err_invalid_cd_state_ - call psb_errpush(info,name) - goto 9999 - endif - - if (present(data)) then - data_ = data - else - data_ = psb_comm_halo_ - end if - - call desc_a%get_list(data_,d_idx,totxch,idxr,idxs,info) - if (info /= psb_success_) then - call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') - goto 9999 - end if - - call psi_swaptran(ctxt,icomm,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) - if (info /= psb_success_) goto 9999 - - call psb_erractionrestore(err_act) - return + integer(psb_ipk_), intent(in) :: flag + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:) + type(psb_desc_type),target :: desc_a + complex(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + + ! locals + type(psb_ctxt_type) :: ctxt + integer(psb_mpk_) :: icomm + integer(psb_ipk_) :: np, me, idxs, idxr, totxch, err_act, data_ + integer(psb_ipk_), pointer :: d_idx(:) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tranv' + call psb_erractionsave(err_act) + + ctxt = desc_a%get_context() + icomm = ctxt%get_mpic() + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif -9999 call psb_error_handler(ctxt,err_act) + if (.not.psb_is_asb_desc(desc_a)) then + info=psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + endif - return -end subroutine psi_zswaptranv + if (present(data)) then + data_ = data + else + data_ = psb_comm_halo_ + end if + call desc_a%get_list_p(data_,d_idx,totxch,idxr,idxs,info) + if (info /= psb_success_) then + call psb_errpush(psb_err_internal_error_,name,a_err='psb_cd_get_list') + goto 9999 + end if -! -! -! Subroutine: psi_ztranidxv -! Does the data exchange among processes. -! -! The real workhorse: the outer routines will only choose the index list -! this one takes the index list and does the actual exchange. -! -! -! -subroutine psi_ztranidxv(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) + call psi_swaptran(ctxt,flag,beta,y,d_idx,totxch,idxs,idxr,work,info) + if (info /= psb_success_) goto 9999 + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) - use psi_mod, psb_protect_name => psi_ztranidxv - use psb_error_mod - use psb_desc_mod - use psb_penv_mod + return + end subroutine psi_zswaptranv + + + ! + ! + ! Subroutine: psi_ztranidxv + ! Does the data exchange among processes. + ! + ! The real workhorse: the outer routines will only choose the index list + ! this one takes the index list and does the actual exchange. + ! + ! + ! + module subroutine psi_ztranidxv(ctxt,flag,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) #ifdef PSB_MPI_MOD - use mpi + use mpi #endif - implicit none + implicit none #ifdef PSB_MPI_H - include 'mpif.h' + include 'mpif.h' #endif - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:), beta - complex(psb_dpk_), target :: work(:) - integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv - - ! locals - integer(psb_mpk_) :: np, me, nesd, nerv, n - integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret - integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& - & sdsz, rvsz, prcid, rvhd, sdhd - integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& - & snd_pt, rcv_pt, pnti - logical :: swap_mpi, swap_sync, swap_send, swap_recv,& - & albf,do_send,do_recv - logical, parameter :: usersend=.false. - - complex(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf -#if !defined(FLANG) - volatile :: sndbuf, rcvbuf + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + complex(psb_dpk_), intent(inout) :: y(:) + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd, totrcv + + ! locals + integer(psb_mpk_) :: np, me, nesd, nerv, n + integer(psb_mpk_) :: proc_to_comm, p2ptag, p2pstat(mpi_status_size), iret + integer(psb_mpk_), allocatable, dimension(:) :: bsdidx, brvidx,& + & sdsz, rvsz, prcid, rvhd, sdhd + integer(psb_ipk_) :: err_act, i, idx_pt, totsnd_, totrcv_,& + & snd_pt, rcv_pt, pnti + integer(psb_mpk_) :: icomm + logical :: swap_mpi, swap_sync, swap_send, swap_recv,& + & albf,do_send,do_recv + logical, parameter :: usersend=.false. + + complex(psb_dpk_), pointer, dimension(:) :: sndbuf, rcvbuf +#if !defined(PSB_CMP_FLANG) + volatile :: sndbuf, rcvbuf #endif - character(len=20) :: name - - info=psb_success_ - name='psi_swap_tran' - call psb_erractionsave(err_act) - call psb_info(ctxt,me,np) - if (np == -1) then - info=psb_err_context_error_ - call psb_errpush(info,name) - goto 9999 - endif - - n=1 - swap_mpi = iand(flag,psb_swap_mpi_) /= 0 - swap_sync = iand(flag,psb_swap_sync_) /= 0 - swap_send = iand(flag,psb_swap_send_) /= 0 - swap_recv = iand(flag,psb_swap_recv_) /= 0 - do_send = swap_mpi .or. swap_sync .or. swap_send - do_recv = swap_mpi .or. swap_sync .or. swap_recv - - totrcv_ = totrcv * n - totsnd_ = totsnd * n - - if (swap_mpi) then - allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& - & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& - & stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) + character(len=20) :: name + + info=psb_success_ + name='psi_swap_tran' + call psb_erractionsave(err_act) + call psb_info(ctxt,me,np) + if (np == -1) then + info=psb_err_context_error_ + call psb_errpush(info,name) goto 9999 - end if + endif + icomm = ctxt%get_mpic() + + n=1 + swap_mpi = iand(flag,psb_swap_mpi_) /= 0 + swap_sync = iand(flag,psb_swap_sync_) /= 0 + swap_send = iand(flag,psb_swap_send_) /= 0 + swap_recv = iand(flag,psb_swap_recv_) /= 0 + do_send = swap_mpi .or. swap_sync .or. swap_send + do_recv = swap_mpi .or. swap_sync .or. swap_recv + + totrcv_ = totrcv * n + totsnd_ = totsnd * n + + if (swap_mpi) then + allocate(sdsz(0:np-1), rvsz(0:np-1), bsdidx(0:np-1),& + & brvidx(0:np-1), rvhd(0:np-1), sdhd(0:np-1), prcid(0:np-1),& + & stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if - rvhd(:) = mpi_request_null - sdsz(:) = 0 - rvsz(:) = 0 + rvhd(:) = mpi_request_null + sdsz(:) = 0 + rvsz(:) = 0 - ! prepare info for communications + ! prepare info for communications - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(proc_to_comm) = psb_get_mpi_rank(ctxt,proc_to_comm) - brvidx(proc_to_comm) = rcv_pt - rvsz(proc_to_comm) = nerv + brvidx(proc_to_comm) = rcv_pt + rvsz(proc_to_comm) = nerv - bsdidx(proc_to_comm) = snd_pt - sdsz(proc_to_comm) = nesd + bsdidx(proc_to_comm) = snd_pt + sdsz(proc_to_comm) = nesd - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 - end do + end do - else - allocate(rvhd(totxch),prcid(totxch),stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + else + allocate(rvhd(totxch),prcid(totxch),stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if end if - end if - totrcv_ = max(totrcv_,1) - totsnd_ = max(totsnd_,1) - if((totrcv_+totsnd_) < size(work)) then - sndbuf => work(1:totsnd_) - rcvbuf => work(totsnd_+1:totsnd_+totrcv_) - albf=.false. - else - allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 + totrcv_ = max(totrcv_,1) + totsnd_ = max(totsnd_,1) + if((totrcv_+totsnd_) < size(work)) then + sndbuf => work(1:totsnd_) + rcvbuf => work(totsnd_+1:totsnd_+totrcv_) + albf=.false. + else + allocate(sndbuf(totsnd_),rcvbuf(totrcv_), stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + albf=.true. end if - albf=.true. - end if - - - if (do_send) then - - ! Pack send buffers - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+psb_n_elem_recv_ - - call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& - & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) - - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - ! Case SWAP_MPI - if (swap_mpi) then - - ! swap elements using mpi_alltoallv - call mpi_alltoallv(rcvbuf,rvsz,brvidx,& - & psb_mpi_c_dpk_,& - & sndbuf,sdsz,bsdidx,psb_mpi_c_dpk_,icomm,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 + + + if (do_send) then + + ! Pack send buffers + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+psb_n_elem_recv_ + + call psi_gth(nerv,idx(idx_pt:idx_pt+nerv-1),& + & y,rcvbuf(rcv_pt:rcv_pt+nerv-1)) + + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + end if - else if (swap_sync) then + ! Case SWAP_MPI + if (swap_mpi) then + + ! swap elements using mpi_alltoallv + call mpi_alltoallv(rcvbuf,rvsz,brvidx,& + & psb_mpi_r_dpk_,& + & sndbuf,sdsz,bsdidx,psb_mpi_r_dpk_,icomm,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + + else if (swap_sync) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if (proc_to_comm < me) then + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + else if (proc_to_comm > me) then + if (nesd>0) call psb_rcv(ctxt,& + & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) + if (nerv>0) call psb_snd(ctxt,& + & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + else if (swap_send .and. swap_recv) then + + ! First I post all the non blocking receives + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) + if ((nesd>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + call mpi_irecv(sndbuf(snd_pt),nesd,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag,icomm,rvhd(i),iret) + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + ! Then I post all the blocking sends + if (usersend) call mpi_barrier(icomm,iret) + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + + if ((nerv>0).and.(proc_to_comm /= me)) then + p2ptag = psb_double_swap_tag + if (usersend) then + call mpi_rsend(rcvbuf(rcv_pt),nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,iret) + else + call mpi_send(rcvbuf(rcv_pt),nerv,& + & psb_mpi_r_dpk_,prcid(i),& + & p2ptag, icomm,iret) + end if + + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + + pnti = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + p2ptag = psb_double_swap_tag + + if ((proc_to_comm /= me).and.(nesd>0)) then + call mpi_wait(rvhd(i),p2pstat,iret) + if(iret /= mpi_success) then + info=psb_err_mpi_error_ + call psb_errpush(info,name,m_err=(/iret/)) + goto 9999 + end if + else if (proc_to_comm == me) then + if (nesd /= nerv) then + write(psb_err_unit,*) & + & 'Fatal error in swaptran: mismatch on self send', & + & nerv,nesd + end if + sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) + end if + pnti = pnti + nerv + nesd + 3 + end do + - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) + else if (swap_send) then - if (proc_to_comm < me) then + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nerv>0) call psb_snd(ctxt,& & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + else if (swap_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) if (nesd>0) call psb_rcv(ctxt,& & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - else if (proc_to_comm > me) then - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send .and. swap_recv) then - - ! First I post all the non blocking receives - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - prcid(i) = psb_get_mpi_rank(ctxt,proc_to_comm) - if ((nesd>0).and.(proc_to_comm /= me)) then - p2ptag = psb_dcomplex_swap_tag - call mpi_irecv(sndbuf(snd_pt),nesd,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag,icomm,rvhd(i),iret) - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - ! Then I post all the blocking sends - if (usersend) call mpi_barrier(icomm,iret) - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - - if ((nerv>0).and.(proc_to_comm /= me)) then - p2ptag = psb_dcomplex_swap_tag - if (usersend) then - call mpi_rsend(rcvbuf(rcv_pt),nerv,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag, icomm,iret) - else - call mpi_send(rcvbuf(rcv_pt),nerv,& - & psb_mpi_c_dpk_,prcid(i),& - & p2ptag, icomm,iret) - end if + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - end if - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - - pnti = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - p2ptag = psb_dcomplex_swap_tag - - if ((proc_to_comm /= me).and.(nesd>0)) then - call mpi_wait(rvhd(i),p2pstat,iret) - if(iret /= mpi_success) then - info=psb_err_mpi_error_ - call psb_errpush(info,name,m_err=(/iret/)) - goto 9999 - end if - else if (proc_to_comm == me) then - if (nesd /= nerv) then - write(psb_err_unit,*) & - & 'Fatal error in swaptran: mismatch on self send', & - & nerv,nesd - end if - sndbuf(snd_pt:snd_pt+nesd-1) = rcvbuf(rcv_pt:rcv_pt+nerv-1) - end if - pnti = pnti + nerv + nesd + 3 - end do - - - else if (swap_send) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nerv>0) call psb_snd(ctxt,& - & rcvbuf(rcv_pt:rcv_pt+nerv-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - else if (swap_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - if (nesd>0) call psb_rcv(ctxt,& - & sndbuf(snd_pt:snd_pt+nesd-1), proc_to_comm) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (do_recv) then - - pnti = 1 - snd_pt = 1 - rcv_pt = 1 - do i=1, totxch - proc_to_comm = idx(pnti+psb_proc_id_) - nerv = idx(pnti+psb_n_elem_recv_) - nesd = idx(pnti+nerv+psb_n_elem_send_) - idx_pt = 1+pnti+nerv+psb_n_elem_send_ - call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& - & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) - rcv_pt = rcv_pt + nerv - snd_pt = snd_pt + nesd - pnti = pnti + nerv + nesd + 3 - end do - - end if - - if (swap_mpi) then - deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& - & stat=info) - else - deallocate(rvhd,prcid,stat=info) - end if - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - if(albf) deallocate(sndbuf,rcvbuf,stat=info) - if(info /= psb_success_) then - call psb_errpush(psb_err_alloc_dealloc_,name) - goto 9999 - end if - - call psb_erractionrestore(err_act) - return + end if + + if (do_recv) then + + pnti = 1 + snd_pt = 1 + rcv_pt = 1 + do i=1, totxch + proc_to_comm = idx(pnti+psb_proc_id_) + nerv = idx(pnti+psb_n_elem_recv_) + nesd = idx(pnti+nerv+psb_n_elem_send_) + idx_pt = 1+pnti+nerv+psb_n_elem_send_ + call psi_sct(nesd,idx(idx_pt:idx_pt+nesd-1),& + & sndbuf(snd_pt:snd_pt+nesd-1),beta,y) + rcv_pt = rcv_pt + nerv + snd_pt = snd_pt + nesd + pnti = pnti + nerv + nesd + 3 + end do + + end if + + if (swap_mpi) then + deallocate(sdsz,rvsz,bsdidx,brvidx,rvhd,prcid,sdhd,& + & stat=info) + else + deallocate(rvhd,prcid,stat=info) + end if + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + if(albf) deallocate(sndbuf,rcvbuf,stat=info) + if(info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,name) + goto 9999 + end if + + call psb_erractionrestore(err_act) + return 9999 call psb_error_handler(ctxt,err_act) return -end subroutine psi_ztranidxv + end subroutine psi_ztranidxv +end submodule psi_z_swaptran_a_impl diff --git a/base/comm/psb_cgather.f90 b/base/comm/psb_cgather.f90 index bc5302f56..443d17290 100644 --- a/base/comm/psb_cgather.f90 +++ b/base/comm/psb_cgather.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_cgather_a.f90 b/base/comm/psb_cgather_a.f90 index ac2e66e4a..ee1420d70 100644 --- a/base/comm/psb_cgather_a.f90 +++ b/base/comm/psb_cgather_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -189,7 +189,7 @@ end subroutine psb_cgatherm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_chalo.f90 b/base/comm/psb_chalo.f90 index 7eca2d129..ba51ab33c 100644 --- a/base/comm/psb_chalo.f90 +++ b/base/comm/psb_chalo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,7 +41,6 @@ ! info - integer. Return code ! jx - integer(optional). The starting column of the global matrix. ! ik - integer(optional). The number of columns to gather. -! work - complex(optional). Work area. ! tran - character(optional). Transpose exchange. ! mode - integer(optional). Communication mode (see Swapdata) ! data - integer Which index list in desc_a should be used @@ -52,36 +51,35 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psb_chalo_vect(x,desc_a,info,work,tran,mode,data) +subroutine psb_chalo_vect(x,desc_a,info,tran,mode,data) use psb_base_mod, psb_protect_name => psb_chalo_vect use psi_mod implicit none - type(psb_c_vect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a + type(psb_c_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), target, optional, intent(inout) :: work(:) integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + character, intent(in), optional :: tran ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, iix, jjx, & - & nrow, ncol, lldx, imode, liwork,data_ - integer(psb_lpk_) :: m, n, ix, ijx - complex(psb_spk_),pointer :: iwork(:) - character :: tran_ - character(len=20) :: name, ch_err - logical :: aliw - - name='psb_chalov' - info=psb_success_ + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, iix, jjx, & + & nrow, ncol, lldx, imode,data_ + integer(psb_lpk_) :: m, n, ix, ijx + character :: tran_ + character(len=20) :: name, ch_err + logical :: aliw + + name = 'psb_chalov' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -118,7 +116,7 @@ subroutine psb_chalo_vect(x,desc_a,info,work,tran,mode,data) if (present(mode)) then imode = mode else - imode = IOR(psb_swap_send_,psb_swap_recv_) + imode = psb_comm_status_sync_ endif if ((info == 0).and.(lldx= liwork) then - iwork => work - aliw=.false. - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - ! exchange halo elements if(tran_ == 'N') then - call psi_swapdata(imode,czero,x%v,& - & desc_a,iwork,info,data=data_) + call psi_swapdata(imode,czero,x%v,desc_a,info,data=data_) else if((tran_ == 'T').or.(tran_ == 'C')) then - call psi_swaptran(imode,cone,x%v,& - & desc_a,iwork,info) + call psi_swaptran(imode,cone,x%v,desc_a,info) else info = psb_err_internal_error_ call psb_errpush(info,name,a_err='invalid tran') @@ -174,9 +144,6 @@ subroutine psb_chalo_vect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return @@ -196,7 +163,6 @@ end subroutine psb_chalo_vect ! info - integer. Return code ! jx - integer(optional). The starting column of the global matrix. ! ik - integer(optional). The number of columns to gather. -! work - complex(optional). Work area. ! tran - character(optional). Transpose exchange. ! mode - integer(optional). Communication mode (see Swapdata) ! data - integer Which index list in desc_a should be used @@ -207,36 +173,35 @@ end subroutine psb_chalo_vect ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psb_chalo_multivect(x,desc_a,info,work,tran,mode,data) +subroutine psb_chalo_multivect(x,desc_a,info,tran,mode,data) use psb_base_mod, psb_protect_name => psb_chalo_multivect use psi_mod implicit none - type(psb_c_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + type(psb_c_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, iix, jjx, & - & nrow, ncol, lldx, imode, liwork,data_ - integer(psb_lpk_) :: m, n, ix, ijx - complex(psb_spk_),pointer :: iwork(:) - character :: tran_ - character(len=20) :: name, ch_err - logical :: aliw - - name='psb_chalov' - info=psb_success_ + integer(psb_ipk_) :: np, me, err_act, iix, jjx, & + & nrow, ncol, lldx, imode, data_ + integer(psb_lpk_) :: m, n, ix, ijx + character :: tran_ + character(len=20) :: name, ch_err + logical :: aliw + + name = 'psb_chalov' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -274,7 +239,7 @@ subroutine psb_chalo_multivect(x,desc_a,info,work,tran,mode,data) if (present(mode)) then imode = mode else - imode = IOR(psb_swap_send_,psb_swap_recv_) + imode = psb_comm_status_sync_ endif if (lldx < ncol) call x%reall(ncol,x%get_ncols(),info) @@ -285,39 +250,11 @@ subroutine psb_chalo_multivect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - liwork=nrow - if (present(work)) then - if(size(work) >= liwork) then - iwork => work - aliw=.false. - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - ! exchange halo elements if(tran_ == 'N') then - call psi_swapdata(imode,czero,x%v,& - & desc_a,iwork,info,data=data_) + call psi_swapdata(imode,czero,x%v,desc_a,info,data=data_) else if((tran_ == 'T').or.(tran_ == 'C')) then - call psi_swaptran(imode,cone,x%v,& - & desc_a,iwork,info) + call psi_swaptran(imode,cone,x%v,desc_a,info) else info = psb_err_internal_error_ call psb_errpush(info,name,a_err='invalid tran') @@ -330,9 +267,6 @@ subroutine psb_chalo_multivect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return diff --git a/base/comm/psb_chalo_a.f90 b/base/comm/psb_chalo_a.f90 index 30d47ba08..2a0441071 100644 --- a/base/comm/psb_chalo_a.f90 +++ b/base/comm/psb_chalo_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -217,7 +217,7 @@ end subroutine psb_chalom !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_covrl.f90 b/base/comm/psb_covrl.f90 index 6ae6ce9f7..adbd16173 100644 --- a/base/comm/psb_covrl.f90 +++ b/base/comm/psb_covrl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -42,7 +42,6 @@ ! info - integer. Return code. ! jx - integer(optional). The starting column of the global matrix ! ik - integer(optional). The number of columns to gather. -! work - complex(optional). A work area. ! update - integer(optional). Type of update: ! psb_none_ do nothing ! psb_sum_ sum of overlaps @@ -63,29 +62,27 @@ ! - if (swap_recv): use psb_rcv (completing a ! previous call with swap_send) ! -subroutine psb_covrl_vect(x,desc_a,info,work,update,mode) +subroutine psb_covrl_vect(x,desc_a,info,update,mode) use psb_base_mod, psb_protect_name => psb_covrl_vect use psi_mod implicit none - type(psb_c_vect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), optional, target, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_c_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & - & nrow, ncol, ldx, liwork, data_, update_, mode_ - integer(psb_lpk_) :: m, n, ix, ijx - complex(psb_spk_),pointer :: iwork(:) - logical :: do_swap - character(len=20) :: name, ch_err - logical :: aliw + integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & + & nrow, ncol, ldx, data_, update_, mode_ + integer(psb_lpk_) :: m, n, ix, ijx + logical :: do_swap + character(len=20) :: name, ch_err + logical :: aliw - name='psb_covrlv' - info=psb_success_ + name = 'psb_covrlv' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then info = psb_err_internal_error_ ; goto 9999 @@ -137,41 +134,16 @@ subroutine psb_covrl_vect(x,desc_a,info,work,update,mode) goto 9999 end if - ! check for presence/size of a work area - liwork=ncol - if (present(work)) then - if(size(work) >= liwork) then - aliw=.false. - else - aliw=.true. - end if - else - aliw=.true. - end if - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - else - iwork => work - end if - ! exchange overlap elements if (do_swap) then call psi_swapdata(mode_,cone,x%v,& - & desc_a,iwork,info,data=psb_comm_ovr_) + & desc_a,info,data=psb_comm_ovr_) end if if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Inner updates') goto 9999 end if - - if (aliw) deallocate(iwork) - nullify(iwork) call psb_erractionrestore(err_act) return @@ -192,7 +164,6 @@ end subroutine psb_covrl_vect ! info - integer. Return code. ! jx - integer(optional). The starting column of the global matrix ! ik - integer(optional). The number of columns to gather. -! work - complex(optional). A work area. ! update - integer(optional). Type of update: ! psb_none_ do nothing ! psb_sum_ sum of overlaps @@ -213,35 +184,33 @@ end subroutine psb_covrl_vect ! - if (swap_recv): use psb_rcv (completing a ! previous call with swap_send) ! -subroutine psb_covrl_multivect(x,desc_a,info,work,update,mode) +subroutine psb_covrl_multivect(x,desc_a,info,update,mode) use psb_base_mod, psb_protect_name => psb_covrl_multivect use psi_mod implicit none - type(psb_c_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), optional, target, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_c_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & - & nrow, ncol, ldx, liwork, data_, update_, mode_ - integer(psb_lpk_) :: m, n, ix, ijx - complex(psb_spk_),pointer :: iwork(:) - logical :: do_swap - character(len=20) :: name, ch_err - logical :: aliw + integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & + & nrow, ncol, ldx, data_, update_, mode_ + integer(psb_lpk_) :: m, n, ix, ijx + logical :: do_swap + character(len=20) :: name, ch_err + logical :: aliw - name='psb_covrlv' - info=psb_success_ + name = 'psb_covrlv' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then info = psb_err_internal_error_ ; goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -276,7 +245,7 @@ subroutine psb_covrl_multivect(x,desc_a,info,work,update,mode) if (present(mode)) then mode_ = mode else - mode_ = IOR(psb_swap_send_,psb_swap_recv_) + mode_ = psb_comm_status_sync_ endif do_swap = (mode_ /= 0) @@ -284,37 +253,16 @@ subroutine psb_covrl_multivect(x,desc_a,info,work,update,mode) if (ldx < ncol) call x%reall(ncol,x%get_ncols(),info) if(info /= psb_success_) then - info=psb_err_from_subroutine_ ; ch_err='psb_reall' + info=psb_err_from_subroutine_ + ch_err='psb_reall' call psb_errpush(info,name,a_err=ch_err) goto 9999 end if - ! check for presence/size of a work area - liwork=ncol - if (present(work)) then - if(size(work) >= liwork) then - aliw=.false. - else - aliw=.true. - end if - else - aliw=.true. - end if - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - else - iwork => work - end if - ! exchange overlap elements if (do_swap) then call psi_swapdata(mode_,cone,x%v,& - & desc_a,iwork,info,data=psb_comm_ovr_) + & desc_a,info,data=psb_comm_ovr_) end if if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info) if (info /= psb_success_) then @@ -322,9 +270,6 @@ subroutine psb_covrl_multivect(x,desc_a,info,work,update,mode) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return diff --git a/base/comm/psb_covrl_a.f90 b/base/comm/psb_covrl_a.f90 index 2d389438d..98eae90e8 100644 --- a/base/comm/psb_covrl_a.f90 +++ b/base/comm/psb_covrl_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -208,7 +208,7 @@ end subroutine psb_covrlm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_cscatter.F90 b/base/comm/psb_cscatter.F90 index 8d1235dbe..5121c2152 100644 --- a/base/comm/psb_cscatter.F90 +++ b/base/comm/psb_cscatter.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_cscatter_a.F90 b/base/comm/psb_cscatter_a.F90 index f351b0b02..dadf13c5c 100644 --- a/base/comm/psb_cscatter_a.F90 +++ b/base/comm/psb_cscatter_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -262,7 +262,7 @@ end subroutine psb_cscatterm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_cspgather.F90 b/base/comm/psb_cspgather.F90 index d1bde4877..f31659a1d 100644 --- a/base/comm/psb_cspgather.F90 +++ b/base/comm/psb_cspgather.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,7 +85,7 @@ subroutine psb_csp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then @@ -269,7 +269,7 @@ subroutine psb_lcsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,kee info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then @@ -442,7 +442,7 @@ subroutine psb_lclcsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,k info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then diff --git a/base/comm/psb_dgather.f90 b/base/comm/psb_dgather.f90 index ed0591e81..443ef2f08 100644 --- a/base/comm/psb_dgather.f90 +++ b/base/comm/psb_dgather.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_dgather_a.f90 b/base/comm/psb_dgather_a.f90 index 1e03ccfd1..14ce53a12 100644 --- a/base/comm/psb_dgather_a.f90 +++ b/base/comm/psb_dgather_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -189,7 +189,7 @@ end subroutine psb_dgatherm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_dhalo.f90 b/base/comm/psb_dhalo.f90 index 080631e14..66be2ad7f 100644 --- a/base/comm/psb_dhalo.f90 +++ b/base/comm/psb_dhalo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,7 +41,6 @@ ! info - integer. Return code ! jx - integer(optional). The starting column of the global matrix. ! ik - integer(optional). The number of columns to gather. -! work - real(optional). Work area. ! tran - character(optional). Transpose exchange. ! mode - integer(optional). Communication mode (see Swapdata) ! data - integer Which index list in desc_a should be used @@ -52,36 +51,35 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psb_dhalo_vect(x,desc_a,info,work,tran,mode,data) +subroutine psb_dhalo_vect(x,desc_a,info,tran,mode,data) use psb_base_mod, psb_protect_name => psb_dhalo_vect use psi_mod implicit none - type(psb_d_vect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a + type(psb_d_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), target, optional, intent(inout) :: work(:) integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + character, intent(in), optional :: tran ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, iix, jjx, & - & nrow, ncol, lldx, imode, liwork,data_ - integer(psb_lpk_) :: m, n, ix, ijx - real(psb_dpk_),pointer :: iwork(:) - character :: tran_ - character(len=20) :: name, ch_err - logical :: aliw - - name='psb_dhalov' - info=psb_success_ + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, iix, jjx, & + & nrow, ncol, lldx, imode,data_ + integer(psb_lpk_) :: m, n, ix, ijx + character :: tran_ + character(len=20) :: name, ch_err + logical :: aliw + + name = 'psb_dhalov' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -118,7 +116,7 @@ subroutine psb_dhalo_vect(x,desc_a,info,work,tran,mode,data) if (present(mode)) then imode = mode else - imode = IOR(psb_swap_send_,psb_swap_recv_) + imode = psb_comm_status_sync_ endif if ((info == 0).and.(lldx= liwork) then - iwork => work - aliw=.false. - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - ! exchange halo elements if(tran_ == 'N') then - call psi_swapdata(imode,dzero,x%v,& - & desc_a,iwork,info,data=data_) + call psi_swapdata(imode,dzero,x%v,desc_a,info,data=data_) else if((tran_ == 'T').or.(tran_ == 'C')) then - call psi_swaptran(imode,done,x%v,& - & desc_a,iwork,info) + call psi_swaptran(imode,done,x%v,desc_a,info) else info = psb_err_internal_error_ call psb_errpush(info,name,a_err='invalid tran') @@ -174,9 +144,6 @@ subroutine psb_dhalo_vect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return @@ -196,7 +163,6 @@ end subroutine psb_dhalo_vect ! info - integer. Return code ! jx - integer(optional). The starting column of the global matrix. ! ik - integer(optional). The number of columns to gather. -! work - real(optional). Work area. ! tran - character(optional). Transpose exchange. ! mode - integer(optional). Communication mode (see Swapdata) ! data - integer Which index list in desc_a should be used @@ -207,36 +173,35 @@ end subroutine psb_dhalo_vect ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psb_dhalo_multivect(x,desc_a,info,work,tran,mode,data) +subroutine psb_dhalo_multivect(x,desc_a,info,tran,mode,data) use psb_base_mod, psb_protect_name => psb_dhalo_multivect use psi_mod implicit none - type(psb_d_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + type(psb_d_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, iix, jjx, & - & nrow, ncol, lldx, imode, liwork,data_ - integer(psb_lpk_) :: m, n, ix, ijx - real(psb_dpk_),pointer :: iwork(:) - character :: tran_ - character(len=20) :: name, ch_err - logical :: aliw - - name='psb_dhalov' - info=psb_success_ + integer(psb_ipk_) :: np, me, err_act, iix, jjx, & + & nrow, ncol, lldx, imode, data_ + integer(psb_lpk_) :: m, n, ix, ijx + character :: tran_ + character(len=20) :: name, ch_err + logical :: aliw + + name = 'psb_dhalov' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -274,7 +239,7 @@ subroutine psb_dhalo_multivect(x,desc_a,info,work,tran,mode,data) if (present(mode)) then imode = mode else - imode = IOR(psb_swap_send_,psb_swap_recv_) + imode = psb_comm_status_sync_ endif if (lldx < ncol) call x%reall(ncol,x%get_ncols(),info) @@ -285,39 +250,11 @@ subroutine psb_dhalo_multivect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - liwork=nrow - if (present(work)) then - if(size(work) >= liwork) then - iwork => work - aliw=.false. - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - ! exchange halo elements if(tran_ == 'N') then - call psi_swapdata(imode,dzero,x%v,& - & desc_a,iwork,info,data=data_) + call psi_swapdata(imode,dzero,x%v,desc_a,info,data=data_) else if((tran_ == 'T').or.(tran_ == 'C')) then - call psi_swaptran(imode,done,x%v,& - & desc_a,iwork,info) + call psi_swaptran(imode,done,x%v,desc_a,info) else info = psb_err_internal_error_ call psb_errpush(info,name,a_err='invalid tran') @@ -330,9 +267,6 @@ subroutine psb_dhalo_multivect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return diff --git a/base/comm/psb_dhalo_a.f90 b/base/comm/psb_dhalo_a.f90 index d802ead5d..4fc2ef4de 100644 --- a/base/comm/psb_dhalo_a.f90 +++ b/base/comm/psb_dhalo_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -217,7 +217,7 @@ end subroutine psb_dhalom !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_dovrl.f90 b/base/comm/psb_dovrl.f90 index f0905278c..24d21897a 100644 --- a/base/comm/psb_dovrl.f90 +++ b/base/comm/psb_dovrl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -42,7 +42,6 @@ ! info - integer. Return code. ! jx - integer(optional). The starting column of the global matrix ! ik - integer(optional). The number of columns to gather. -! work - real(optional). A work area. ! update - integer(optional). Type of update: ! psb_none_ do nothing ! psb_sum_ sum of overlaps @@ -63,29 +62,27 @@ ! - if (swap_recv): use psb_rcv (completing a ! previous call with swap_send) ! -subroutine psb_dovrl_vect(x,desc_a,info,work,update,mode) +subroutine psb_dovrl_vect(x,desc_a,info,update,mode) use psb_base_mod, psb_protect_name => psb_dovrl_vect use psi_mod implicit none - type(psb_d_vect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), optional, target, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_d_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & - & nrow, ncol, ldx, liwork, data_, update_, mode_ - integer(psb_lpk_) :: m, n, ix, ijx - real(psb_dpk_),pointer :: iwork(:) - logical :: do_swap - character(len=20) :: name, ch_err - logical :: aliw + integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & + & nrow, ncol, ldx, data_, update_, mode_ + integer(psb_lpk_) :: m, n, ix, ijx + logical :: do_swap + character(len=20) :: name, ch_err + logical :: aliw - name='psb_dovrlv' - info=psb_success_ + name = 'psb_dovrlv' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then info = psb_err_internal_error_ ; goto 9999 @@ -137,41 +134,16 @@ subroutine psb_dovrl_vect(x,desc_a,info,work,update,mode) goto 9999 end if - ! check for presence/size of a work area - liwork=ncol - if (present(work)) then - if(size(work) >= liwork) then - aliw=.false. - else - aliw=.true. - end if - else - aliw=.true. - end if - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - else - iwork => work - end if - ! exchange overlap elements if (do_swap) then call psi_swapdata(mode_,done,x%v,& - & desc_a,iwork,info,data=psb_comm_ovr_) + & desc_a,info,data=psb_comm_ovr_) end if if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Inner updates') goto 9999 end if - - if (aliw) deallocate(iwork) - nullify(iwork) call psb_erractionrestore(err_act) return @@ -192,7 +164,6 @@ end subroutine psb_dovrl_vect ! info - integer. Return code. ! jx - integer(optional). The starting column of the global matrix ! ik - integer(optional). The number of columns to gather. -! work - real(optional). A work area. ! update - integer(optional). Type of update: ! psb_none_ do nothing ! psb_sum_ sum of overlaps @@ -213,35 +184,33 @@ end subroutine psb_dovrl_vect ! - if (swap_recv): use psb_rcv (completing a ! previous call with swap_send) ! -subroutine psb_dovrl_multivect(x,desc_a,info,work,update,mode) +subroutine psb_dovrl_multivect(x,desc_a,info,update,mode) use psb_base_mod, psb_protect_name => psb_dovrl_multivect use psi_mod implicit none - type(psb_d_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), optional, target, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_d_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & - & nrow, ncol, ldx, liwork, data_, update_, mode_ - integer(psb_lpk_) :: m, n, ix, ijx - real(psb_dpk_),pointer :: iwork(:) - logical :: do_swap - character(len=20) :: name, ch_err - logical :: aliw + integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & + & nrow, ncol, ldx, data_, update_, mode_ + integer(psb_lpk_) :: m, n, ix, ijx + logical :: do_swap + character(len=20) :: name, ch_err + logical :: aliw - name='psb_dovrlv' - info=psb_success_ + name = 'psb_dovrlv' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then info = psb_err_internal_error_ ; goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -276,7 +245,7 @@ subroutine psb_dovrl_multivect(x,desc_a,info,work,update,mode) if (present(mode)) then mode_ = mode else - mode_ = IOR(psb_swap_send_,psb_swap_recv_) + mode_ = psb_comm_status_sync_ endif do_swap = (mode_ /= 0) @@ -284,37 +253,16 @@ subroutine psb_dovrl_multivect(x,desc_a,info,work,update,mode) if (ldx < ncol) call x%reall(ncol,x%get_ncols(),info) if(info /= psb_success_) then - info=psb_err_from_subroutine_ ; ch_err='psb_reall' + info=psb_err_from_subroutine_ + ch_err='psb_reall' call psb_errpush(info,name,a_err=ch_err) goto 9999 end if - ! check for presence/size of a work area - liwork=ncol - if (present(work)) then - if(size(work) >= liwork) then - aliw=.false. - else - aliw=.true. - end if - else - aliw=.true. - end if - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - else - iwork => work - end if - ! exchange overlap elements if (do_swap) then call psi_swapdata(mode_,done,x%v,& - & desc_a,iwork,info,data=psb_comm_ovr_) + & desc_a,info,data=psb_comm_ovr_) end if if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info) if (info /= psb_success_) then @@ -322,9 +270,6 @@ subroutine psb_dovrl_multivect(x,desc_a,info,work,update,mode) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return diff --git a/base/comm/psb_dovrl_a.f90 b/base/comm/psb_dovrl_a.f90 index 464b8e31e..c45638213 100644 --- a/base/comm/psb_dovrl_a.f90 +++ b/base/comm/psb_dovrl_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -208,7 +208,7 @@ end subroutine psb_dovrlm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_dscatter.F90 b/base/comm/psb_dscatter.F90 index 3465333b6..559922c8f 100644 --- a/base/comm/psb_dscatter.F90 +++ b/base/comm/psb_dscatter.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_dscatter_a.F90 b/base/comm/psb_dscatter_a.F90 index 8864cca8c..739e1aaa8 100644 --- a/base/comm/psb_dscatter_a.F90 +++ b/base/comm/psb_dscatter_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -262,7 +262,7 @@ end subroutine psb_dscatterm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_dspgather.F90 b/base/comm/psb_dspgather.F90 index 98a9bc916..e38cb89ad 100644 --- a/base/comm/psb_dspgather.F90 +++ b/base/comm/psb_dspgather.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,7 +85,7 @@ subroutine psb_dsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then @@ -269,7 +269,7 @@ subroutine psb_ldsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,kee info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then @@ -442,7 +442,7 @@ subroutine psb_ldldsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,k info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then diff --git a/base/comm/psb_egather_a.f90 b/base/comm/psb_egather_a.f90 index b777cebd7..36ddb6abd 100644 --- a/base/comm/psb_egather_a.f90 +++ b/base/comm/psb_egather_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -189,7 +189,7 @@ end subroutine psb_egatherm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_ehalo_a.f90 b/base/comm/psb_ehalo_a.f90 index d5431e691..742d539a3 100644 --- a/base/comm/psb_ehalo_a.f90 +++ b/base/comm/psb_ehalo_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -217,7 +217,7 @@ end subroutine psb_ehalom !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_eovrl_a.f90 b/base/comm/psb_eovrl_a.f90 index b24e5ab83..5c2354dd6 100644 --- a/base/comm/psb_eovrl_a.f90 +++ b/base/comm/psb_eovrl_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -208,7 +208,7 @@ end subroutine psb_eovrlm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_escatter_a.F90 b/base/comm/psb_escatter_a.F90 index 9c5ed19df..f5cd08e8e 100644 --- a/base/comm/psb_escatter_a.F90 +++ b/base/comm/psb_escatter_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -262,7 +262,7 @@ end subroutine psb_escatterm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_i2gather_a.f90 b/base/comm/psb_i2gather_a.f90 index e0e1ed7a7..b8eb80bf9 100644 --- a/base/comm/psb_i2gather_a.f90 +++ b/base/comm/psb_i2gather_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -189,7 +189,7 @@ end subroutine psb_i2gatherm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_i2halo_a.f90 b/base/comm/psb_i2halo_a.f90 index 054b61beb..1ae795a12 100644 --- a/base/comm/psb_i2halo_a.f90 +++ b/base/comm/psb_i2halo_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -217,7 +217,7 @@ end subroutine psb_i2halom !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_i2ovrl_a.f90 b/base/comm/psb_i2ovrl_a.f90 index 09cc3b5d1..1501efcea 100644 --- a/base/comm/psb_i2ovrl_a.f90 +++ b/base/comm/psb_i2ovrl_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -208,7 +208,7 @@ end subroutine psb_i2ovrlm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_i2scatter_a.F90 b/base/comm/psb_i2scatter_a.F90 index 1a07587f0..2da1bcab2 100644 --- a/base/comm/psb_i2scatter_a.F90 +++ b/base/comm/psb_i2scatter_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -262,7 +262,7 @@ end subroutine psb_i2scatterm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_igather.f90 b/base/comm/psb_igather.f90 index acfdf52aa..1d8db00d6 100644 --- a/base/comm/psb_igather.f90 +++ b/base/comm/psb_igather.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_ihalo.f90 b/base/comm/psb_ihalo.f90 index 57e529584..b5ffbbb49 100644 --- a/base/comm/psb_ihalo.f90 +++ b/base/comm/psb_ihalo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,7 +41,6 @@ ! info - integer. Return code ! jx - integer(optional). The starting column of the global matrix. ! ik - integer(optional). The number of columns to gather. -! work - integer(optional). Work area. ! tran - character(optional). Transpose exchange. ! mode - integer(optional). Communication mode (see Swapdata) ! data - integer Which index list in desc_a should be used @@ -52,36 +51,35 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psb_ihalo_vect(x,desc_a,info,work,tran,mode,data) +subroutine psb_ihalo_vect(x,desc_a,info,tran,mode,data) use psb_base_mod, psb_protect_name => psb_ihalo_vect use psi_mod implicit none - type(psb_i_vect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a + type(psb_i_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), target, optional, intent(inout) :: work(:) integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + character, intent(in), optional :: tran ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, iix, jjx, & - & nrow, ncol, lldx, imode, liwork,data_ - integer(psb_lpk_) :: m, n, ix, ijx - integer(psb_ipk_),pointer :: iwork(:) - character :: tran_ - character(len=20) :: name, ch_err - logical :: aliw - - name='psb_ihalov' - info=psb_success_ + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, iix, jjx, & + & nrow, ncol, lldx, imode,data_ + integer(psb_lpk_) :: m, n, ix, ijx + character :: tran_ + character(len=20) :: name, ch_err + logical :: aliw + + name = 'psb_ihalov' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -118,7 +116,7 @@ subroutine psb_ihalo_vect(x,desc_a,info,work,tran,mode,data) if (present(mode)) then imode = mode else - imode = IOR(psb_swap_send_,psb_swap_recv_) + imode = psb_comm_status_sync_ endif if ((info == 0).and.(lldx= liwork) then - iwork => work - aliw=.false. - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - ! exchange halo elements if(tran_ == 'N') then - call psi_swapdata(imode,izero,x%v,& - & desc_a,iwork,info,data=data_) + call psi_swapdata(imode,izero,x%v,desc_a,info,data=data_) else if((tran_ == 'T').or.(tran_ == 'C')) then - call psi_swaptran(imode,ione,x%v,& - & desc_a,iwork,info) + call psi_swaptran(imode,ione,x%v,desc_a,info) else info = psb_err_internal_error_ call psb_errpush(info,name,a_err='invalid tran') @@ -174,9 +144,6 @@ subroutine psb_ihalo_vect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return @@ -196,7 +163,6 @@ end subroutine psb_ihalo_vect ! info - integer. Return code ! jx - integer(optional). The starting column of the global matrix. ! ik - integer(optional). The number of columns to gather. -! work - integer(optional). Work area. ! tran - character(optional). Transpose exchange. ! mode - integer(optional). Communication mode (see Swapdata) ! data - integer Which index list in desc_a should be used @@ -207,36 +173,35 @@ end subroutine psb_ihalo_vect ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psb_ihalo_multivect(x,desc_a,info,work,tran,mode,data) +subroutine psb_ihalo_multivect(x,desc_a,info,tran,mode,data) use psb_base_mod, psb_protect_name => psb_ihalo_multivect use psi_mod implicit none - type(psb_i_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + type(psb_i_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, iix, jjx, & - & nrow, ncol, lldx, imode, liwork,data_ - integer(psb_lpk_) :: m, n, ix, ijx - integer(psb_ipk_),pointer :: iwork(:) - character :: tran_ - character(len=20) :: name, ch_err - logical :: aliw - - name='psb_ihalov' - info=psb_success_ + integer(psb_ipk_) :: np, me, err_act, iix, jjx, & + & nrow, ncol, lldx, imode, data_ + integer(psb_lpk_) :: m, n, ix, ijx + character :: tran_ + character(len=20) :: name, ch_err + logical :: aliw + + name = 'psb_ihalov' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -274,7 +239,7 @@ subroutine psb_ihalo_multivect(x,desc_a,info,work,tran,mode,data) if (present(mode)) then imode = mode else - imode = IOR(psb_swap_send_,psb_swap_recv_) + imode = psb_comm_status_sync_ endif if (lldx < ncol) call x%reall(ncol,x%get_ncols(),info) @@ -285,39 +250,11 @@ subroutine psb_ihalo_multivect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - liwork=nrow - if (present(work)) then - if(size(work) >= liwork) then - iwork => work - aliw=.false. - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - ! exchange halo elements if(tran_ == 'N') then - call psi_swapdata(imode,izero,x%v,& - & desc_a,iwork,info,data=data_) + call psi_swapdata(imode,izero,x%v,desc_a,info,data=data_) else if((tran_ == 'T').or.(tran_ == 'C')) then - call psi_swaptran(imode,ione,x%v,& - & desc_a,iwork,info) + call psi_swaptran(imode,ione,x%v,desc_a,info) else info = psb_err_internal_error_ call psb_errpush(info,name,a_err='invalid tran') @@ -330,9 +267,6 @@ subroutine psb_ihalo_multivect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return diff --git a/base/comm/psb_iovrl.f90 b/base/comm/psb_iovrl.f90 index 3dd459f1e..196d8b9e8 100644 --- a/base/comm/psb_iovrl.f90 +++ b/base/comm/psb_iovrl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -42,7 +42,6 @@ ! info - integer. Return code. ! jx - integer(optional). The starting column of the global matrix ! ik - integer(optional). The number of columns to gather. -! work - integer(optional). A work area. ! update - integer(optional). Type of update: ! psb_none_ do nothing ! psb_sum_ sum of overlaps @@ -63,29 +62,27 @@ ! - if (swap_recv): use psb_rcv (completing a ! previous call with swap_send) ! -subroutine psb_iovrl_vect(x,desc_a,info,work,update,mode) +subroutine psb_iovrl_vect(x,desc_a,info,update,mode) use psb_base_mod, psb_protect_name => psb_iovrl_vect use psi_mod implicit none - type(psb_i_vect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), optional, target, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_i_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & - & nrow, ncol, ldx, liwork, data_, update_, mode_ - integer(psb_lpk_) :: m, n, ix, ijx - integer(psb_ipk_),pointer :: iwork(:) - logical :: do_swap - character(len=20) :: name, ch_err - logical :: aliw + integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & + & nrow, ncol, ldx, data_, update_, mode_ + integer(psb_lpk_) :: m, n, ix, ijx + logical :: do_swap + character(len=20) :: name, ch_err + logical :: aliw - name='psb_iovrlv' - info=psb_success_ + name = 'psb_iovrlv' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then info = psb_err_internal_error_ ; goto 9999 @@ -137,41 +134,16 @@ subroutine psb_iovrl_vect(x,desc_a,info,work,update,mode) goto 9999 end if - ! check for presence/size of a work area - liwork=ncol - if (present(work)) then - if(size(work) >= liwork) then - aliw=.false. - else - aliw=.true. - end if - else - aliw=.true. - end if - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - else - iwork => work - end if - ! exchange overlap elements if (do_swap) then call psi_swapdata(mode_,ione,x%v,& - & desc_a,iwork,info,data=psb_comm_ovr_) + & desc_a,info,data=psb_comm_ovr_) end if if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Inner updates') goto 9999 end if - - if (aliw) deallocate(iwork) - nullify(iwork) call psb_erractionrestore(err_act) return @@ -192,7 +164,6 @@ end subroutine psb_iovrl_vect ! info - integer. Return code. ! jx - integer(optional). The starting column of the global matrix ! ik - integer(optional). The number of columns to gather. -! work - integer(optional). A work area. ! update - integer(optional). Type of update: ! psb_none_ do nothing ! psb_sum_ sum of overlaps @@ -213,35 +184,33 @@ end subroutine psb_iovrl_vect ! - if (swap_recv): use psb_rcv (completing a ! previous call with swap_send) ! -subroutine psb_iovrl_multivect(x,desc_a,info,work,update,mode) +subroutine psb_iovrl_multivect(x,desc_a,info,update,mode) use psb_base_mod, psb_protect_name => psb_iovrl_multivect use psi_mod implicit none - type(psb_i_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), optional, target, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_i_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & - & nrow, ncol, ldx, liwork, data_, update_, mode_ - integer(psb_lpk_) :: m, n, ix, ijx - integer(psb_ipk_),pointer :: iwork(:) - logical :: do_swap - character(len=20) :: name, ch_err - logical :: aliw + integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & + & nrow, ncol, ldx, data_, update_, mode_ + integer(psb_lpk_) :: m, n, ix, ijx + logical :: do_swap + character(len=20) :: name, ch_err + logical :: aliw - name='psb_iovrlv' - info=psb_success_ + name = 'psb_iovrlv' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then info = psb_err_internal_error_ ; goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -276,7 +245,7 @@ subroutine psb_iovrl_multivect(x,desc_a,info,work,update,mode) if (present(mode)) then mode_ = mode else - mode_ = IOR(psb_swap_send_,psb_swap_recv_) + mode_ = psb_comm_status_sync_ endif do_swap = (mode_ /= 0) @@ -284,37 +253,16 @@ subroutine psb_iovrl_multivect(x,desc_a,info,work,update,mode) if (ldx < ncol) call x%reall(ncol,x%get_ncols(),info) if(info /= psb_success_) then - info=psb_err_from_subroutine_ ; ch_err='psb_reall' + info=psb_err_from_subroutine_ + ch_err='psb_reall' call psb_errpush(info,name,a_err=ch_err) goto 9999 end if - ! check for presence/size of a work area - liwork=ncol - if (present(work)) then - if(size(work) >= liwork) then - aliw=.false. - else - aliw=.true. - end if - else - aliw=.true. - end if - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - else - iwork => work - end if - ! exchange overlap elements if (do_swap) then call psi_swapdata(mode_,ione,x%v,& - & desc_a,iwork,info,data=psb_comm_ovr_) + & desc_a,info,data=psb_comm_ovr_) end if if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info) if (info /= psb_success_) then @@ -322,9 +270,6 @@ subroutine psb_iovrl_multivect(x,desc_a,info,work,update,mode) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return diff --git a/base/comm/psb_iscatter.F90 b/base/comm/psb_iscatter.F90 index 57268e71f..607a4c9be 100644 --- a/base/comm/psb_iscatter.F90 +++ b/base/comm/psb_iscatter.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_ispgather.F90 b/base/comm/psb_ispgather.F90 index 773c5864c..bfb43ce7c 100644 --- a/base/comm/psb_ispgather.F90 +++ b/base/comm/psb_ispgather.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,7 +85,7 @@ subroutine psb_isp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then @@ -269,7 +269,7 @@ subroutine psb_@LX@sp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,k info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then @@ -442,7 +442,7 @@ subroutine psb_@LX@@LX@sp_allgather(globa, loca, desc_a, info, root, dupl,keepn info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then diff --git a/base/comm/psb_lgather.f90 b/base/comm/psb_lgather.f90 index 17359bce8..d629b90d5 100644 --- a/base/comm/psb_lgather.f90 +++ b/base/comm/psb_lgather.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_lhalo.f90 b/base/comm/psb_lhalo.f90 index 3a1885619..b4fb42917 100644 --- a/base/comm/psb_lhalo.f90 +++ b/base/comm/psb_lhalo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,7 +41,6 @@ ! info - integer. Return code ! jx - integer(optional). The starting column of the global matrix. ! ik - integer(optional). The number of columns to gather. -! work - integer(optional). Work area. ! tran - character(optional). Transpose exchange. ! mode - integer(optional). Communication mode (see Swapdata) ! data - integer Which index list in desc_a should be used @@ -52,36 +51,35 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psb_lhalo_vect(x,desc_a,info,work,tran,mode,data) +subroutine psb_lhalo_vect(x,desc_a,info,tran,mode,data) use psb_base_mod, psb_protect_name => psb_lhalo_vect use psi_mod implicit none - type(psb_l_vect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a + type(psb_l_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info - integer(psb_lpk_), target, optional, intent(inout) :: work(:) integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + character, intent(in), optional :: tran ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, iix, jjx, & - & nrow, ncol, lldx, imode, liwork,data_ - integer(psb_lpk_) :: m, n, ix, ijx - integer(psb_lpk_),pointer :: iwork(:) - character :: tran_ - character(len=20) :: name, ch_err - logical :: aliw - - name='psb_lhalov' - info=psb_success_ + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, iix, jjx, & + & nrow, ncol, lldx, imode,data_ + integer(psb_lpk_) :: m, n, ix, ijx + character :: tran_ + character(len=20) :: name, ch_err + logical :: aliw + + name = 'psb_lhalov' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -118,7 +116,7 @@ subroutine psb_lhalo_vect(x,desc_a,info,work,tran,mode,data) if (present(mode)) then imode = mode else - imode = IOR(psb_swap_send_,psb_swap_recv_) + imode = psb_comm_status_sync_ endif if ((info == 0).and.(lldx= liwork) then - iwork => work - aliw=.false. - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - ! exchange halo elements if(tran_ == 'N') then - call psi_swapdata(imode,lzero,x%v,& - & desc_a,iwork,info,data=data_) + call psi_swapdata(imode,lzero,x%v,desc_a,info,data=data_) else if((tran_ == 'T').or.(tran_ == 'C')) then - call psi_swaptran(imode,lone,x%v,& - & desc_a,iwork,info) + call psi_swaptran(imode,lone,x%v,desc_a,info) else info = psb_err_internal_error_ call psb_errpush(info,name,a_err='invalid tran') @@ -174,9 +144,6 @@ subroutine psb_lhalo_vect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return @@ -196,7 +163,6 @@ end subroutine psb_lhalo_vect ! info - integer. Return code ! jx - integer(optional). The starting column of the global matrix. ! ik - integer(optional). The number of columns to gather. -! work - integer(optional). Work area. ! tran - character(optional). Transpose exchange. ! mode - integer(optional). Communication mode (see Swapdata) ! data - integer Which index list in desc_a should be used @@ -207,36 +173,35 @@ end subroutine psb_lhalo_vect ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psb_lhalo_multivect(x,desc_a,info,work,tran,mode,data) +subroutine psb_lhalo_multivect(x,desc_a,info,tran,mode,data) use psb_base_mod, psb_protect_name => psb_lhalo_multivect use psi_mod implicit none - type(psb_l_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_lpk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + type(psb_l_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, iix, jjx, & - & nrow, ncol, lldx, imode, liwork,data_ - integer(psb_lpk_) :: m, n, ix, ijx - integer(psb_lpk_),pointer :: iwork(:) - character :: tran_ - character(len=20) :: name, ch_err - logical :: aliw - - name='psb_lhalov' - info=psb_success_ + integer(psb_ipk_) :: np, me, err_act, iix, jjx, & + & nrow, ncol, lldx, imode, data_ + integer(psb_lpk_) :: m, n, ix, ijx + character :: tran_ + character(len=20) :: name, ch_err + logical :: aliw + + name = 'psb_lhalov' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -274,7 +239,7 @@ subroutine psb_lhalo_multivect(x,desc_a,info,work,tran,mode,data) if (present(mode)) then imode = mode else - imode = IOR(psb_swap_send_,psb_swap_recv_) + imode = psb_comm_status_sync_ endif if (lldx < ncol) call x%reall(ncol,x%get_ncols(),info) @@ -285,39 +250,11 @@ subroutine psb_lhalo_multivect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - liwork=nrow - if (present(work)) then - if(size(work) >= liwork) then - iwork => work - aliw=.false. - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - ! exchange halo elements if(tran_ == 'N') then - call psi_swapdata(imode,lzero,x%v,& - & desc_a,iwork,info,data=data_) + call psi_swapdata(imode,lzero,x%v,desc_a,info,data=data_) else if((tran_ == 'T').or.(tran_ == 'C')) then - call psi_swaptran(imode,lone,x%v,& - & desc_a,iwork,info) + call psi_swaptran(imode,lone,x%v,desc_a,info) else info = psb_err_internal_error_ call psb_errpush(info,name,a_err='invalid tran') @@ -330,9 +267,6 @@ subroutine psb_lhalo_multivect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return diff --git a/base/comm/psb_lovrl.f90 b/base/comm/psb_lovrl.f90 index 43de77bb0..de65d126f 100644 --- a/base/comm/psb_lovrl.f90 +++ b/base/comm/psb_lovrl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -42,7 +42,6 @@ ! info - integer. Return code. ! jx - integer(optional). The starting column of the global matrix ! ik - integer(optional). The number of columns to gather. -! work - integer(optional). A work area. ! update - integer(optional). Type of update: ! psb_none_ do nothing ! psb_sum_ sum of overlaps @@ -63,29 +62,27 @@ ! - if (swap_recv): use psb_rcv (completing a ! previous call with swap_send) ! -subroutine psb_lovrl_vect(x,desc_a,info,work,update,mode) +subroutine psb_lovrl_vect(x,desc_a,info,update,mode) use psb_base_mod, psb_protect_name => psb_lovrl_vect use psi_mod implicit none - type(psb_l_vect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_lpk_), optional, target, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_l_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & - & nrow, ncol, ldx, liwork, data_, update_, mode_ - integer(psb_lpk_) :: m, n, ix, ijx - integer(psb_lpk_),pointer :: iwork(:) - logical :: do_swap - character(len=20) :: name, ch_err - logical :: aliw + integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & + & nrow, ncol, ldx, data_, update_, mode_ + integer(psb_lpk_) :: m, n, ix, ijx + logical :: do_swap + character(len=20) :: name, ch_err + logical :: aliw - name='psb_lovrlv' - info=psb_success_ + name = 'psb_lovrlv' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then info = psb_err_internal_error_ ; goto 9999 @@ -137,41 +134,16 @@ subroutine psb_lovrl_vect(x,desc_a,info,work,update,mode) goto 9999 end if - ! check for presence/size of a work area - liwork=ncol - if (present(work)) then - if(size(work) >= liwork) then - aliw=.false. - else - aliw=.true. - end if - else - aliw=.true. - end if - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - else - iwork => work - end if - ! exchange overlap elements if (do_swap) then call psi_swapdata(mode_,lone,x%v,& - & desc_a,iwork,info,data=psb_comm_ovr_) + & desc_a,info,data=psb_comm_ovr_) end if if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Inner updates') goto 9999 end if - - if (aliw) deallocate(iwork) - nullify(iwork) call psb_erractionrestore(err_act) return @@ -192,7 +164,6 @@ end subroutine psb_lovrl_vect ! info - integer. Return code. ! jx - integer(optional). The starting column of the global matrix ! ik - integer(optional). The number of columns to gather. -! work - integer(optional). A work area. ! update - integer(optional). Type of update: ! psb_none_ do nothing ! psb_sum_ sum of overlaps @@ -213,35 +184,33 @@ end subroutine psb_lovrl_vect ! - if (swap_recv): use psb_rcv (completing a ! previous call with swap_send) ! -subroutine psb_lovrl_multivect(x,desc_a,info,work,update,mode) +subroutine psb_lovrl_multivect(x,desc_a,info,update,mode) use psb_base_mod, psb_protect_name => psb_lovrl_multivect use psi_mod implicit none - type(psb_l_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_lpk_), optional, target, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_l_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & - & nrow, ncol, ldx, liwork, data_, update_, mode_ - integer(psb_lpk_) :: m, n, ix, ijx - integer(psb_lpk_),pointer :: iwork(:) - logical :: do_swap - character(len=20) :: name, ch_err - logical :: aliw + integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & + & nrow, ncol, ldx, data_, update_, mode_ + integer(psb_lpk_) :: m, n, ix, ijx + logical :: do_swap + character(len=20) :: name, ch_err + logical :: aliw - name='psb_lovrlv' - info=psb_success_ + name = 'psb_lovrlv' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then info = psb_err_internal_error_ ; goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -276,7 +245,7 @@ subroutine psb_lovrl_multivect(x,desc_a,info,work,update,mode) if (present(mode)) then mode_ = mode else - mode_ = IOR(psb_swap_send_,psb_swap_recv_) + mode_ = psb_comm_status_sync_ endif do_swap = (mode_ /= 0) @@ -284,37 +253,16 @@ subroutine psb_lovrl_multivect(x,desc_a,info,work,update,mode) if (ldx < ncol) call x%reall(ncol,x%get_ncols(),info) if(info /= psb_success_) then - info=psb_err_from_subroutine_ ; ch_err='psb_reall' + info=psb_err_from_subroutine_ + ch_err='psb_reall' call psb_errpush(info,name,a_err=ch_err) goto 9999 end if - ! check for presence/size of a work area - liwork=ncol - if (present(work)) then - if(size(work) >= liwork) then - aliw=.false. - else - aliw=.true. - end if - else - aliw=.true. - end if - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - else - iwork => work - end if - ! exchange overlap elements if (do_swap) then call psi_swapdata(mode_,lone,x%v,& - & desc_a,iwork,info,data=psb_comm_ovr_) + & desc_a,info,data=psb_comm_ovr_) end if if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info) if (info /= psb_success_) then @@ -322,9 +270,6 @@ subroutine psb_lovrl_multivect(x,desc_a,info,work,update,mode) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return diff --git a/base/comm/psb_lscatter.F90 b/base/comm/psb_lscatter.F90 index 0ebbe28eb..fb80711bd 100644 --- a/base/comm/psb_lscatter.F90 +++ b/base/comm/psb_lscatter.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_lspgather.F90 b/base/comm/psb_lspgather.F90 index 8cc009bf5..1e8dcf65d 100644 --- a/base/comm/psb_lspgather.F90 +++ b/base/comm/psb_lspgather.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,7 +85,7 @@ subroutine psb_lsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then @@ -269,7 +269,7 @@ subroutine psb_@LX@sp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,k info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then @@ -442,7 +442,7 @@ subroutine psb_@LX@@LX@sp_allgather(globa, loca, desc_a, info, root, dupl,keepn info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then diff --git a/base/comm/psb_mgather_a.f90 b/base/comm/psb_mgather_a.f90 index df574ea29..7f94883fc 100644 --- a/base/comm/psb_mgather_a.f90 +++ b/base/comm/psb_mgather_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -189,7 +189,7 @@ end subroutine psb_mgatherm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_mhalo_a.f90 b/base/comm/psb_mhalo_a.f90 index c3f6a6889..0b020d81e 100644 --- a/base/comm/psb_mhalo_a.f90 +++ b/base/comm/psb_mhalo_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -217,7 +217,7 @@ end subroutine psb_mhalom !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_movrl_a.f90 b/base/comm/psb_movrl_a.f90 index 983bcbf81..607674dd2 100644 --- a/base/comm/psb_movrl_a.f90 +++ b/base/comm/psb_movrl_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -208,7 +208,7 @@ end subroutine psb_movrlm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_mscatter_a.F90 b/base/comm/psb_mscatter_a.F90 index 628fcf19d..847320adb 100644 --- a/base/comm/psb_mscatter_a.F90 +++ b/base/comm/psb_mscatter_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -262,7 +262,7 @@ end subroutine psb_mscatterm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_sgather.f90 b/base/comm/psb_sgather.f90 index 59cecc175..d095ba456 100644 --- a/base/comm/psb_sgather.f90 +++ b/base/comm/psb_sgather.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_sgather_a.f90 b/base/comm/psb_sgather_a.f90 index 28d5f5dca..d19d31a12 100644 --- a/base/comm/psb_sgather_a.f90 +++ b/base/comm/psb_sgather_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -189,7 +189,7 @@ end subroutine psb_sgatherm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_shalo.f90 b/base/comm/psb_shalo.f90 index 412fc75f2..0a4ce01d9 100644 --- a/base/comm/psb_shalo.f90 +++ b/base/comm/psb_shalo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,7 +41,6 @@ ! info - integer. Return code ! jx - integer(optional). The starting column of the global matrix. ! ik - integer(optional). The number of columns to gather. -! work - real(optional). Work area. ! tran - character(optional). Transpose exchange. ! mode - integer(optional). Communication mode (see Swapdata) ! data - integer Which index list in desc_a should be used @@ -52,36 +51,35 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psb_shalo_vect(x,desc_a,info,work,tran,mode,data) +subroutine psb_shalo_vect(x,desc_a,info,tran,mode,data) use psb_base_mod, psb_protect_name => psb_shalo_vect use psi_mod implicit none - type(psb_s_vect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a + type(psb_s_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info - real(psb_spk_), target, optional, intent(inout) :: work(:) integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + character, intent(in), optional :: tran ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, iix, jjx, & - & nrow, ncol, lldx, imode, liwork,data_ - integer(psb_lpk_) :: m, n, ix, ijx - real(psb_spk_),pointer :: iwork(:) - character :: tran_ - character(len=20) :: name, ch_err - logical :: aliw - - name='psb_shalov' - info=psb_success_ + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, iix, jjx, & + & nrow, ncol, lldx, imode,data_ + integer(psb_lpk_) :: m, n, ix, ijx + character :: tran_ + character(len=20) :: name, ch_err + logical :: aliw + + name = 'psb_shalov' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -118,7 +116,7 @@ subroutine psb_shalo_vect(x,desc_a,info,work,tran,mode,data) if (present(mode)) then imode = mode else - imode = IOR(psb_swap_send_,psb_swap_recv_) + imode = psb_comm_status_sync_ endif if ((info == 0).and.(lldx= liwork) then - iwork => work - aliw=.false. - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - ! exchange halo elements if(tran_ == 'N') then - call psi_swapdata(imode,szero,x%v,& - & desc_a,iwork,info,data=data_) + call psi_swapdata(imode,szero,x%v,desc_a,info,data=data_) else if((tran_ == 'T').or.(tran_ == 'C')) then - call psi_swaptran(imode,sone,x%v,& - & desc_a,iwork,info) + call psi_swaptran(imode,sone,x%v,desc_a,info) else info = psb_err_internal_error_ call psb_errpush(info,name,a_err='invalid tran') @@ -174,9 +144,6 @@ subroutine psb_shalo_vect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return @@ -196,7 +163,6 @@ end subroutine psb_shalo_vect ! info - integer. Return code ! jx - integer(optional). The starting column of the global matrix. ! ik - integer(optional). The number of columns to gather. -! work - real(optional). Work area. ! tran - character(optional). Transpose exchange. ! mode - integer(optional). Communication mode (see Swapdata) ! data - integer Which index list in desc_a should be used @@ -207,36 +173,35 @@ end subroutine psb_shalo_vect ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psb_shalo_multivect(x,desc_a,info,work,tran,mode,data) +subroutine psb_shalo_multivect(x,desc_a,info,tran,mode,data) use psb_base_mod, psb_protect_name => psb_shalo_multivect use psi_mod implicit none - type(psb_s_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_spk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + type(psb_s_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, iix, jjx, & - & nrow, ncol, lldx, imode, liwork,data_ - integer(psb_lpk_) :: m, n, ix, ijx - real(psb_spk_),pointer :: iwork(:) - character :: tran_ - character(len=20) :: name, ch_err - logical :: aliw - - name='psb_shalov' - info=psb_success_ + integer(psb_ipk_) :: np, me, err_act, iix, jjx, & + & nrow, ncol, lldx, imode, data_ + integer(psb_lpk_) :: m, n, ix, ijx + character :: tran_ + character(len=20) :: name, ch_err + logical :: aliw + + name = 'psb_shalov' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -274,7 +239,7 @@ subroutine psb_shalo_multivect(x,desc_a,info,work,tran,mode,data) if (present(mode)) then imode = mode else - imode = IOR(psb_swap_send_,psb_swap_recv_) + imode = psb_comm_status_sync_ endif if (lldx < ncol) call x%reall(ncol,x%get_ncols(),info) @@ -285,39 +250,11 @@ subroutine psb_shalo_multivect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - liwork=nrow - if (present(work)) then - if(size(work) >= liwork) then - iwork => work - aliw=.false. - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - ! exchange halo elements if(tran_ == 'N') then - call psi_swapdata(imode,szero,x%v,& - & desc_a,iwork,info,data=data_) + call psi_swapdata(imode,szero,x%v,desc_a,info,data=data_) else if((tran_ == 'T').or.(tran_ == 'C')) then - call psi_swaptran(imode,sone,x%v,& - & desc_a,iwork,info) + call psi_swaptran(imode,sone,x%v,desc_a,info) else info = psb_err_internal_error_ call psb_errpush(info,name,a_err='invalid tran') @@ -330,9 +267,6 @@ subroutine psb_shalo_multivect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return diff --git a/base/comm/psb_shalo_a.f90 b/base/comm/psb_shalo_a.f90 index 23cc464d8..5de9cf81c 100644 --- a/base/comm/psb_shalo_a.f90 +++ b/base/comm/psb_shalo_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -217,7 +217,7 @@ end subroutine psb_shalom !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_sovrl.f90 b/base/comm/psb_sovrl.f90 index 05c5ade28..0300e10e6 100644 --- a/base/comm/psb_sovrl.f90 +++ b/base/comm/psb_sovrl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -42,7 +42,6 @@ ! info - integer. Return code. ! jx - integer(optional). The starting column of the global matrix ! ik - integer(optional). The number of columns to gather. -! work - real(optional). A work area. ! update - integer(optional). Type of update: ! psb_none_ do nothing ! psb_sum_ sum of overlaps @@ -63,29 +62,27 @@ ! - if (swap_recv): use psb_rcv (completing a ! previous call with swap_send) ! -subroutine psb_sovrl_vect(x,desc_a,info,work,update,mode) +subroutine psb_sovrl_vect(x,desc_a,info,update,mode) use psb_base_mod, psb_protect_name => psb_sovrl_vect use psi_mod implicit none - type(psb_s_vect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_spk_), optional, target, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_s_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & - & nrow, ncol, ldx, liwork, data_, update_, mode_ - integer(psb_lpk_) :: m, n, ix, ijx - real(psb_spk_),pointer :: iwork(:) - logical :: do_swap - character(len=20) :: name, ch_err - logical :: aliw + integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & + & nrow, ncol, ldx, data_, update_, mode_ + integer(psb_lpk_) :: m, n, ix, ijx + logical :: do_swap + character(len=20) :: name, ch_err + logical :: aliw - name='psb_sovrlv' - info=psb_success_ + name = 'psb_sovrlv' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then info = psb_err_internal_error_ ; goto 9999 @@ -137,41 +134,16 @@ subroutine psb_sovrl_vect(x,desc_a,info,work,update,mode) goto 9999 end if - ! check for presence/size of a work area - liwork=ncol - if (present(work)) then - if(size(work) >= liwork) then - aliw=.false. - else - aliw=.true. - end if - else - aliw=.true. - end if - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - else - iwork => work - end if - ! exchange overlap elements if (do_swap) then call psi_swapdata(mode_,sone,x%v,& - & desc_a,iwork,info,data=psb_comm_ovr_) + & desc_a,info,data=psb_comm_ovr_) end if if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Inner updates') goto 9999 end if - - if (aliw) deallocate(iwork) - nullify(iwork) call psb_erractionrestore(err_act) return @@ -192,7 +164,6 @@ end subroutine psb_sovrl_vect ! info - integer. Return code. ! jx - integer(optional). The starting column of the global matrix ! ik - integer(optional). The number of columns to gather. -! work - real(optional). A work area. ! update - integer(optional). Type of update: ! psb_none_ do nothing ! psb_sum_ sum of overlaps @@ -213,35 +184,33 @@ end subroutine psb_sovrl_vect ! - if (swap_recv): use psb_rcv (completing a ! previous call with swap_send) ! -subroutine psb_sovrl_multivect(x,desc_a,info,work,update,mode) +subroutine psb_sovrl_multivect(x,desc_a,info,update,mode) use psb_base_mod, psb_protect_name => psb_sovrl_multivect use psi_mod implicit none - type(psb_s_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_spk_), optional, target, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_s_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & - & nrow, ncol, ldx, liwork, data_, update_, mode_ - integer(psb_lpk_) :: m, n, ix, ijx - real(psb_spk_),pointer :: iwork(:) - logical :: do_swap - character(len=20) :: name, ch_err - logical :: aliw + integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & + & nrow, ncol, ldx, data_, update_, mode_ + integer(psb_lpk_) :: m, n, ix, ijx + logical :: do_swap + character(len=20) :: name, ch_err + logical :: aliw - name='psb_sovrlv' - info=psb_success_ + name = 'psb_sovrlv' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then info = psb_err_internal_error_ ; goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -276,7 +245,7 @@ subroutine psb_sovrl_multivect(x,desc_a,info,work,update,mode) if (present(mode)) then mode_ = mode else - mode_ = IOR(psb_swap_send_,psb_swap_recv_) + mode_ = psb_comm_status_sync_ endif do_swap = (mode_ /= 0) @@ -284,37 +253,16 @@ subroutine psb_sovrl_multivect(x,desc_a,info,work,update,mode) if (ldx < ncol) call x%reall(ncol,x%get_ncols(),info) if(info /= psb_success_) then - info=psb_err_from_subroutine_ ; ch_err='psb_reall' + info=psb_err_from_subroutine_ + ch_err='psb_reall' call psb_errpush(info,name,a_err=ch_err) goto 9999 end if - ! check for presence/size of a work area - liwork=ncol - if (present(work)) then - if(size(work) >= liwork) then - aliw=.false. - else - aliw=.true. - end if - else - aliw=.true. - end if - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - else - iwork => work - end if - ! exchange overlap elements if (do_swap) then call psi_swapdata(mode_,sone,x%v,& - & desc_a,iwork,info,data=psb_comm_ovr_) + & desc_a,info,data=psb_comm_ovr_) end if if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info) if (info /= psb_success_) then @@ -322,9 +270,6 @@ subroutine psb_sovrl_multivect(x,desc_a,info,work,update,mode) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return diff --git a/base/comm/psb_sovrl_a.f90 b/base/comm/psb_sovrl_a.f90 index 6ced0fd57..ddce2b2bb 100644 --- a/base/comm/psb_sovrl_a.f90 +++ b/base/comm/psb_sovrl_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -208,7 +208,7 @@ end subroutine psb_sovrlm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_sscatter.F90 b/base/comm/psb_sscatter.F90 index f2b79e839..802be716b 100644 --- a/base/comm/psb_sscatter.F90 +++ b/base/comm/psb_sscatter.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_sscatter_a.F90 b/base/comm/psb_sscatter_a.F90 index e060bd1c8..ae8525d32 100644 --- a/base/comm/psb_sscatter_a.F90 +++ b/base/comm/psb_sscatter_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -262,7 +262,7 @@ end subroutine psb_sscatterm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_sspgather.F90 b/base/comm/psb_sspgather.F90 index 7e822c87c..14efe3539 100644 --- a/base/comm/psb_sspgather.F90 +++ b/base/comm/psb_sspgather.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,7 +85,7 @@ subroutine psb_ssp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then @@ -269,7 +269,7 @@ subroutine psb_lssp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,kee info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then @@ -442,7 +442,7 @@ subroutine psb_lslssp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,k info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then diff --git a/base/comm/psb_zgather.f90 b/base/comm/psb_zgather.f90 index 5cf445a9b..b4bf15b7e 100644 --- a/base/comm/psb_zgather.f90 +++ b/base/comm/psb_zgather.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_zgather_a.f90 b/base/comm/psb_zgather_a.f90 index fa5f288b5..0b702835d 100644 --- a/base/comm/psb_zgather_a.f90 +++ b/base/comm/psb_zgather_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -189,7 +189,7 @@ end subroutine psb_zgatherm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_zhalo.f90 b/base/comm/psb_zhalo.f90 index 2bf1aef20..beed0238c 100644 --- a/base/comm/psb_zhalo.f90 +++ b/base/comm/psb_zhalo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,7 +41,6 @@ ! info - integer. Return code ! jx - integer(optional). The starting column of the global matrix. ! ik - integer(optional). The number of columns to gather. -! work - complex(optional). Work area. ! tran - character(optional). Transpose exchange. ! mode - integer(optional). Communication mode (see Swapdata) ! data - integer Which index list in desc_a should be used @@ -52,36 +51,35 @@ ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psb_zhalo_vect(x,desc_a,info,work,tran,mode,data) +subroutine psb_zhalo_vect(x,desc_a,info,tran,mode,data) use psb_base_mod, psb_protect_name => psb_zhalo_vect use psi_mod implicit none - type(psb_z_vect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a + type(psb_z_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), target, optional, intent(inout) :: work(:) integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + character, intent(in), optional :: tran ! locals - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, iix, jjx, & - & nrow, ncol, lldx, imode, liwork,data_ - integer(psb_lpk_) :: m, n, ix, ijx - complex(psb_dpk_),pointer :: iwork(:) - character :: tran_ - character(len=20) :: name, ch_err - logical :: aliw - - name='psb_zhalov' - info=psb_success_ + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act, iix, jjx, & + & nrow, ncol, lldx, imode,data_ + integer(psb_lpk_) :: m, n, ix, ijx + character :: tran_ + character(len=20) :: name, ch_err + logical :: aliw + + name = 'psb_zhalov' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -118,7 +116,7 @@ subroutine psb_zhalo_vect(x,desc_a,info,work,tran,mode,data) if (present(mode)) then imode = mode else - imode = IOR(psb_swap_send_,psb_swap_recv_) + imode = psb_comm_status_sync_ endif if ((info == 0).and.(lldx= liwork) then - iwork => work - aliw=.false. - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - ! exchange halo elements if(tran_ == 'N') then - call psi_swapdata(imode,zzero,x%v,& - & desc_a,iwork,info,data=data_) + call psi_swapdata(imode,zzero,x%v,desc_a,info,data=data_) else if((tran_ == 'T').or.(tran_ == 'C')) then - call psi_swaptran(imode,zone,x%v,& - & desc_a,iwork,info) + call psi_swaptran(imode,zone,x%v,desc_a,info) else info = psb_err_internal_error_ call psb_errpush(info,name,a_err='invalid tran') @@ -174,9 +144,6 @@ subroutine psb_zhalo_vect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return @@ -196,7 +163,6 @@ end subroutine psb_zhalo_vect ! info - integer. Return code ! jx - integer(optional). The starting column of the global matrix. ! ik - integer(optional). The number of columns to gather. -! work - complex(optional). Work area. ! tran - character(optional). Transpose exchange. ! mode - integer(optional). Communication mode (see Swapdata) ! data - integer Which index list in desc_a should be used @@ -207,36 +173,35 @@ end subroutine psb_zhalo_vect ! psb_comm_mov_ use ovr_mst_idx ! ! -subroutine psb_zhalo_multivect(x,desc_a,info,work,tran,mode,data) +subroutine psb_zhalo_multivect(x,desc_a,info,tran,mode,data) use psb_base_mod, psb_protect_name => psb_zhalo_multivect use psi_mod implicit none - type(psb_z_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + type(psb_z_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, iix, jjx, & - & nrow, ncol, lldx, imode, liwork,data_ - integer(psb_lpk_) :: m, n, ix, ijx - complex(psb_dpk_),pointer :: iwork(:) - character :: tran_ - character(len=20) :: name, ch_err - logical :: aliw - - name='psb_zhalov' - info=psb_success_ + integer(psb_ipk_) :: np, me, err_act, iix, jjx, & + & nrow, ncol, lldx, imode, data_ + integer(psb_lpk_) :: m, n, ix, ijx + character :: tran_ + character(len=20) :: name, ch_err + logical :: aliw + + name = 'psb_zhalov' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -274,7 +239,7 @@ subroutine psb_zhalo_multivect(x,desc_a,info,work,tran,mode,data) if (present(mode)) then imode = mode else - imode = IOR(psb_swap_send_,psb_swap_recv_) + imode = psb_comm_status_sync_ endif if (lldx < ncol) call x%reall(ncol,x%get_ncols(),info) @@ -285,39 +250,11 @@ subroutine psb_zhalo_multivect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - liwork=nrow - if (present(work)) then - if(size(work) >= liwork) then - iwork => work - aliw=.false. - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - else - aliw=.true. - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - end if - ! exchange halo elements if(tran_ == 'N') then - call psi_swapdata(imode,zzero,x%v,& - & desc_a,iwork,info,data=data_) + call psi_swapdata(imode,zzero,x%v,desc_a,info,data=data_) else if((tran_ == 'T').or.(tran_ == 'C')) then - call psi_swaptran(imode,zone,x%v,& - & desc_a,iwork,info) + call psi_swaptran(imode,zone,x%v,desc_a,info) else info = psb_err_internal_error_ call psb_errpush(info,name,a_err='invalid tran') @@ -330,9 +267,6 @@ subroutine psb_zhalo_multivect(x,desc_a,info,work,tran,mode,data) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return diff --git a/base/comm/psb_zhalo_a.f90 b/base/comm/psb_zhalo_a.f90 index 2acc24631..fac264995 100644 --- a/base/comm/psb_zhalo_a.f90 +++ b/base/comm/psb_zhalo_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -217,7 +217,7 @@ end subroutine psb_zhalom !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_zovrl.f90 b/base/comm/psb_zovrl.f90 index 02a2a73d7..00c376710 100644 --- a/base/comm/psb_zovrl.f90 +++ b/base/comm/psb_zovrl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -42,7 +42,6 @@ ! info - integer. Return code. ! jx - integer(optional). The starting column of the global matrix ! ik - integer(optional). The number of columns to gather. -! work - complex(optional). A work area. ! update - integer(optional). Type of update: ! psb_none_ do nothing ! psb_sum_ sum of overlaps @@ -63,29 +62,27 @@ ! - if (swap_recv): use psb_rcv (completing a ! previous call with swap_send) ! -subroutine psb_zovrl_vect(x,desc_a,info,work,update,mode) +subroutine psb_zovrl_vect(x,desc_a,info,update,mode) use psb_base_mod, psb_protect_name => psb_zovrl_vect use psi_mod implicit none - type(psb_z_vect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), optional, target, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_z_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & - & nrow, ncol, ldx, liwork, data_, update_, mode_ - integer(psb_lpk_) :: m, n, ix, ijx - complex(psb_dpk_),pointer :: iwork(:) - logical :: do_swap - character(len=20) :: name, ch_err - logical :: aliw + integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & + & nrow, ncol, ldx, data_, update_, mode_ + integer(psb_lpk_) :: m, n, ix, ijx + logical :: do_swap + character(len=20) :: name, ch_err + logical :: aliw - name='psb_zovrlv' - info=psb_success_ + name = 'psb_zovrlv' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then info = psb_err_internal_error_ ; goto 9999 @@ -137,41 +134,16 @@ subroutine psb_zovrl_vect(x,desc_a,info,work,update,mode) goto 9999 end if - ! check for presence/size of a work area - liwork=ncol - if (present(work)) then - if(size(work) >= liwork) then - aliw=.false. - else - aliw=.true. - end if - else - aliw=.true. - end if - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - else - iwork => work - end if - ! exchange overlap elements if (do_swap) then call psi_swapdata(mode_,zone,x%v,& - & desc_a,iwork,info,data=psb_comm_ovr_) + & desc_a,info,data=psb_comm_ovr_) end if if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Inner updates') goto 9999 end if - - if (aliw) deallocate(iwork) - nullify(iwork) call psb_erractionrestore(err_act) return @@ -192,7 +164,6 @@ end subroutine psb_zovrl_vect ! info - integer. Return code. ! jx - integer(optional). The starting column of the global matrix ! ik - integer(optional). The number of columns to gather. -! work - complex(optional). A work area. ! update - integer(optional). Type of update: ! psb_none_ do nothing ! psb_sum_ sum of overlaps @@ -213,35 +184,33 @@ end subroutine psb_zovrl_vect ! - if (swap_recv): use psb_rcv (completing a ! previous call with swap_send) ! -subroutine psb_zovrl_multivect(x,desc_a,info,work,update,mode) +subroutine psb_zovrl_multivect(x,desc_a,info,update,mode) use psb_base_mod, psb_protect_name => psb_zovrl_multivect use psi_mod implicit none - type(psb_z_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), optional, target, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_z_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & - & nrow, ncol, ldx, liwork, data_, update_, mode_ - integer(psb_lpk_) :: m, n, ix, ijx - complex(psb_dpk_),pointer :: iwork(:) - logical :: do_swap - character(len=20) :: name, ch_err - logical :: aliw + integer(psb_ipk_) :: np, me, err_act, k, iix, jjx, & + & nrow, ncol, ldx, data_, update_, mode_ + integer(psb_lpk_) :: m, n, ix, ijx + logical :: do_swap + character(len=20) :: name, ch_err + logical :: aliw - name='psb_zovrlv' - info=psb_success_ + name = 'psb_zovrlv' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then info = psb_err_internal_error_ ; goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() ! check on blacs grid call psb_info(ctxt, me, np) @@ -276,7 +245,7 @@ subroutine psb_zovrl_multivect(x,desc_a,info,work,update,mode) if (present(mode)) then mode_ = mode else - mode_ = IOR(psb_swap_send_,psb_swap_recv_) + mode_ = psb_comm_status_sync_ endif do_swap = (mode_ /= 0) @@ -284,37 +253,16 @@ subroutine psb_zovrl_multivect(x,desc_a,info,work,update,mode) if (ldx < ncol) call x%reall(ncol,x%get_ncols(),info) if(info /= psb_success_) then - info=psb_err_from_subroutine_ ; ch_err='psb_reall' + info=psb_err_from_subroutine_ + ch_err='psb_reall' call psb_errpush(info,name,a_err=ch_err) goto 9999 end if - ! check for presence/size of a work area - liwork=ncol - if (present(work)) then - if(size(work) >= liwork) then - aliw=.false. - else - aliw=.true. - end if - else - aliw=.true. - end if - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - else - iwork => work - end if - ! exchange overlap elements if (do_swap) then call psi_swapdata(mode_,zone,x%v,& - & desc_a,iwork,info,data=psb_comm_ovr_) + & desc_a,info,data=psb_comm_ovr_) end if if (info == psb_success_) call psi_ovrl_upd(x%v,desc_a,update_,info) if (info /= psb_success_) then @@ -322,9 +270,6 @@ subroutine psb_zovrl_multivect(x,desc_a,info,work,update,mode) goto 9999 end if - if (aliw) deallocate(iwork) - nullify(iwork) - call psb_erractionrestore(err_act) return diff --git a/base/comm/psb_zovrl_a.f90 b/base/comm/psb_zovrl_a.f90 index e7a87cef8..f95b827ac 100644 --- a/base/comm/psb_zovrl_a.f90 +++ b/base/comm/psb_zovrl_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -208,7 +208,7 @@ end subroutine psb_zovrlm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_zscatter.F90 b/base/comm/psb_zscatter.F90 index f8d2102b6..aae8efd34 100644 --- a/base/comm/psb_zscatter.F90 +++ b/base/comm/psb_zscatter.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_zscatter_a.F90 b/base/comm/psb_zscatter_a.F90 index d51dc82ac..5321905ae 100644 --- a/base/comm/psb_zscatter_a.F90 +++ b/base/comm/psb_zscatter_a.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -262,7 +262,7 @@ end subroutine psb_zscatterm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/comm/psb_zspgather.F90 b/base/comm/psb_zspgather.F90 index 1630f904a..5533b5095 100644 --- a/base/comm/psb_zspgather.F90 +++ b/base/comm/psb_zspgather.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,7 +85,7 @@ subroutine psb_zsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,keep info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then @@ -269,7 +269,7 @@ subroutine psb_lzsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,kee info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then @@ -442,7 +442,7 @@ subroutine psb_lzlzsp_allgather(globa, loca, desc_a, info, root, dupl,keepnum,k info = psb_err_internal_error_ ; goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() call psb_info(ctxt, me, np) if (present(keepnum)) then diff --git a/base/modules/Makefile b/base/modules/Makefile index dd13cb2b7..353f64211 100644 --- a/base/modules/Makefile +++ b/base/modules/Makefile @@ -28,22 +28,32 @@ COMMINT= penv/psi_penv_mod.o \ SERIAL_MODS=serial/psb_s_serial_mod.o serial/psb_d_serial_mod.o \ serial/psb_c_serial_mod.o serial/psb_z_serial_mod.o \ serial/psb_serial_mod.o \ + comm/comm_schemes/psb_comm_schemes_mod.o \ + comm/comm_schemes/psb_comm_baseline_mod.o \ + comm/comm_schemes/psb_comm_neighbor_impl_mod.o \ + comm/comm_schemes/psb_comm_rma_mod.o \ + comm/comm_schemes/psb_comm_factory_mod.o \ + serial/psb_i2_base_vect_mod.o serial/psb_i2_vect_mod.o\ serial/psb_i_base_vect_mod.o serial/psb_i_vect_mod.o\ serial/psb_l_base_vect_mod.o serial/psb_l_vect_mod.o\ serial/psb_d_base_vect_mod.o serial/psb_d_vect_mod.o\ serial/psb_s_base_vect_mod.o serial/psb_s_vect_mod.o\ serial/psb_c_base_vect_mod.o serial/psb_c_vect_mod.o\ serial/psb_z_base_vect_mod.o serial/psb_z_vect_mod.o\ - serial/psb_vect_mod.o\ - auxil/psi_serial_mod.o auxil/psi_m_serial_mod.o auxil/psi_e_serial_mod.o \ + serial/psb_vect_mod.o \ + auxil/psi_serial_mod.o \ + auxil/psi_i2_serial_mod.o auxil/psi_m_serial_mod.o auxil/psi_e_serial_mod.o \ auxil/psi_s_serial_mod.o auxil/psi_d_serial_mod.o \ auxil/psi_c_serial_mod.o auxil/psi_z_serial_mod.o \ - psi_mod.o psi_i_mod.o psi_l_mod.o psi_s_mod.o psi_d_mod.o psi_c_mod.o psi_z_mod.o\ + psi_mod.o psi_i2_mod.o psi_i_mod.o psi_l_mod.o psi_s_mod.o psi_d_mod.o psi_c_mod.o psi_z_mod.o\ auxil/psb_ip_reord_mod.o\ auxil/psi_acx_mod.o auxil/psi_alcx_mod.o auxil/psi_lcx_mod.o \ + auxil/psb_i2_ip_reord_mod.o \ auxil/psb_m_ip_reord_mod.o auxil/psb_e_ip_reord_mod.o \ auxil/psb_s_ip_reord_mod.o auxil/psb_d_ip_reord_mod.o \ auxil/psb_c_ip_reord_mod.o auxil/psb_z_ip_reord_mod.o \ + auxil/psb_i2_hsort_mod.o auxil/psb_i2_isort_mod.o \ + auxil/psb_i2_msort_mod.o auxil/psb_i2_qsort_mod.o \ auxil/psb_m_hsort_mod.o auxil/psb_m_isort_mod.o \ auxil/psb_m_msort_mod.o auxil/psb_m_qsort_mod.o \ auxil/psb_e_hsort_mod.o auxil/psb_e_isort_mod.o \ @@ -56,6 +66,7 @@ SERIAL_MODS=serial/psb_s_serial_mod.o serial/psb_d_serial_mod.o \ auxil/psb_c_msort_mod.o auxil/psb_c_qsort_mod.o \ auxil/psb_z_hsort_mod.o auxil/psb_z_isort_mod.o \ auxil/psb_z_msort_mod.o auxil/psb_z_qsort_mod.o \ + auxil/psb_i2_hsort_x_mod.o \ auxil/psb_i_hsort_x_mod.o \ auxil/psb_l_hsort_x_mod.o \ auxil/psb_s_hsort_x_mod.o \ @@ -85,7 +96,7 @@ UTIL_MODS = desc/psb_desc_const_mod.o desc/psb_indx_map_mod.o\ tools/psb_i_tools_mod.o tools/psb_l_tools_mod.o \ tools/psb_s_tools_mod.o tools/psb_d_tools_mod.o\ tools/psb_c_tools_mod.o tools/psb_z_tools_mod.o \ - tools/psb_m_tools_a_mod.o tools/psb_e_tools_a_mod.o \ + tools/psb_i2_tools_a_mod.o tools/psb_m_tools_a_mod.o tools/psb_e_tools_a_mod.o \ tools/psb_s_tools_a_mod.o tools/psb_d_tools_a_mod.o\ tools/psb_c_tools_a_mod.o tools/psb_z_tools_a_mod.o \ tools/psb_tools_mod.o \ @@ -94,13 +105,16 @@ UTIL_MODS = desc/psb_desc_const_mod.o desc/psb_indx_map_mod.o\ comm/psb_s_linmap_mod.o comm/psb_d_linmap_mod.o \ comm/psb_c_linmap_mod.o comm/psb_z_linmap_mod.o \ comm/psb_comm_mod.o \ + comm/psb_neighbor_topology_mod.o \ comm/psb_i_comm_mod.o comm/psb_l_comm_mod.o \ comm/psb_s_comm_mod.o comm/psb_d_comm_mod.o\ comm/psb_c_comm_mod.o comm/psb_z_comm_mod.o \ + comm/psb_i2_comm_a_mod.o \ comm/psb_m_comm_a_mod.o comm/psb_e_comm_a_mod.o \ comm/psb_s_comm_a_mod.o comm/psb_d_comm_a_mod.o\ comm/psb_c_comm_a_mod.o comm/psb_z_comm_a_mod.o \ comm/psi_e_comm_a_mod.o comm/psi_m_comm_a_mod.o \ + comm/psi_i2_comm_a_mod.o comm/psi_i2_comm_v_mod.o \ comm/psi_s_comm_a_mod.o comm/psi_d_comm_a_mod.o \ comm/psi_c_comm_a_mod.o comm/psi_z_comm_a_mod.o \ comm/psi_i_comm_v_mod.o comm/psi_l_comm_v_mod.o \ @@ -123,8 +137,8 @@ FINCLUDES=$(FMFLAG)$(LIBDIR) $(FMFLAG). $(FIFLAG). objs: $(MODULES) $(OBJS) $(MPFOBJS) - /bin/cp -p $(CPUPDFLAG) *$(.mod) $(MODDIR) - /bin/cp -p $(CPUPDFLAG) psb_config.h psb_types.h $(INCDIR) + $(INSTALL) -p $(CPUPDFLAG) *$(.mod) $(MODDIR) + $(INSTALL) -p $(CPUPDFLAG) psb_config.h psb_types.h $(INCDIR) lib: objs $(LIBDIR)/$(LIBNAME) @@ -135,6 +149,7 @@ $(LIBDIR)/$(LIBNAME): objs $(OBJS): $(MODULES) psb_error_mod.o: psb_const_mod.o psb_realloc_mod.o \ + auxil/psb_i2_realloc_mod.o \ auxil/psb_m_realloc_mod.o \ auxil/psb_e_realloc_mod.o \ auxil/psb_s_realloc_mod.o \ @@ -147,6 +162,7 @@ penv/psi_collective_mod.o penv/psi_p2p_mod.o: penv/psi_penv_mod.o psb_realloc_mod.o: auxil/psb_m_realloc_mod.o \ auxil/psb_e_realloc_mod.o \ + auxil/psb_i2_realloc_mod.o \ auxil/psb_s_realloc_mod.o \ auxil/psb_d_realloc_mod.o \ auxil/psb_c_realloc_mod.o \ @@ -177,10 +193,22 @@ penv/psi_d_collective_mod.o penv/psi_c_collective_mod.o penv/psi_z_collective_m auxil/psi_acx_mod.o auxil/psi_alcx_mod.o auxil/psi_lcx_mod.o \ -auxil/psb_string_mod.o auxil/psb_m_realloc_mod.o auxil/psb_e_realloc_mod.o auxil/psb_s_realloc_mod.o \ +auxil/psb_string_mod.o auxil/psb_i2_realloc_mod.o auxil/psb_m_realloc_mod.o auxil/psb_e_realloc_mod.o \ +auxil/psb_s_realloc_mod.o \ auxil/psb_d_realloc_mod.o auxil/psb_c_realloc_mod.o auxil/psb_z_realloc_mod.o \ desc/psb_desc_const_mod.o psi_penv_mod.o: psb_const_mod.o +comm/comm_schemes/psb_comm_schemes_mod.o: psb_const_mod.o + +comm/comm_schemes/psb_comm_baseline_mod.o: comm/comm_schemes/psb_comm_schemes_mod.o + +comm/comm_schemes/psb_comm_neighbor_impl_mod.o: psb_const_mod.o desc/psb_desc_const_mod.o comm/comm_schemes/psb_comm_schemes_mod.o + +comm/comm_schemes/psb_comm_rma_mod.o: comm/comm_schemes/psb_comm_schemes_mod.o psb_const_mod.o desc/psb_desc_const_mod.o + +comm/comm_schemes/psb_comm_factory_mod.o: comm/comm_schemes/psb_comm_schemes_mod.o comm/comm_schemes/psb_comm_baseline_mod.o comm/comm_schemes/psb_comm_neighbor_impl_mod.o comm/comm_schemes/psb_comm_rma_mod.o + +comm/psb_neighbor_topology_mod.o: psb_const_mod.o desc/psb_desc_const_mod.o desc/psb_indx_map_mod.o desc/psb_hash_mod.o: psb_realloc_mod.o psb_const_mod.o desc/psb_desc_const_mod.o auxil/psb_i_sort_mod.o auxil/psb_s_sort_mod.o auxil/psb_d_sort_mod.o auxil/psb_c_sort_mod.o auxil/psb_z_sort_mod.o \ @@ -191,6 +219,8 @@ auxil/psb_sort_mod.o: auxil/psb_m_hsort_mod.o auxil/psb_m_isort_mod.o \ auxil/psb_m_msort_mod.o auxil/psb_m_qsort_mod.o \ auxil/psb_e_hsort_mod.o auxil/psb_e_isort_mod.o \ auxil/psb_e_msort_mod.o auxil/psb_e_qsort_mod.o \ + auxil/psb_i2_hsort_mod.o auxil/psb_i2_isort_mod.o \ + auxil/psb_i2_msort_mod.o auxil/psb_i2_qsort_mod.o \ auxil/psb_s_hsort_mod.o auxil/psb_s_isort_mod.o \ auxil/psb_s_msort_mod.o auxil/psb_s_qsort_mod.o \ auxil/psb_d_hsort_mod.o auxil/psb_d_isort_mod.o \ @@ -199,6 +229,7 @@ auxil/psb_sort_mod.o: auxil/psb_m_hsort_mod.o auxil/psb_m_isort_mod.o \ auxil/psb_c_msort_mod.o auxil/psb_c_qsort_mod.o \ auxil/psb_z_hsort_mod.o auxil/psb_z_isort_mod.o \ auxil/psb_z_msort_mod.o auxil/psb_z_qsort_mod.o \ + auxil/psb_i2_hsort_x_mod.o \ auxil/psb_i_hsort_x_mod.o \ auxil/psb_l_hsort_x_mod.o \ auxil/psb_s_hsort_x_mod.o \ @@ -212,6 +243,8 @@ auxil/psb_m_hsort_mod.o auxil/psb_m_isort_mod.o \ auxil/psb_m_msort_mod.o auxil/psb_m_qsort_mod.o \ auxil/psb_e_hsort_mod.o auxil/psb_e_isort_mod.o \ auxil/psb_e_msort_mod.o auxil/psb_e_qsort_mod.o \ +auxil/psb_i2_hsort_mod.o auxil/psb_i2_isort_mod.o \ +auxil/psb_i2_msort_mod.o auxil/psb_i2_qsort_mod.o \ auxil/psb_s_hsort_mod.o auxil/psb_s_isort_mod.o \ auxil/psb_s_msort_mod.o auxil/psb_s_qsort_mod.o \ auxil/psb_d_hsort_mod.o auxil/psb_d_isort_mod.o \ @@ -220,17 +253,19 @@ auxil/psb_c_hsort_mod.o auxil/psb_c_isort_mod.o \ auxil/psb_c_msort_mod.o auxil/psb_c_qsort_mod.o \ auxil/psb_z_hsort_mod.o auxil/psb_z_isort_mod.o \ auxil/psb_z_msort_mod.o auxil/psb_z_qsort_mod.o \ +auxil/psb_i2_hsort_x_mod.o \ auxil/psb_i_hsort_x_mod.o \ auxil/psb_l_hsort_x_mod.o \ auxil/psb_s_hsort_x_mod.o \ auxil/psb_d_hsort_x_mod.o \ auxil/psb_c_hsort_x_mod.o \ auxil/psb_z_hsort_x_mod.o \ -auxil/psb_m_ip_reord_mod.o auxil/psb_e_ip_reord_mod.o \ +auxil/psb_i2_ip_reord_mod.o auxil/psb_m_ip_reord_mod.o auxil/psb_e_ip_reord_mod.o \ auxil/psb_s_ip_reord_mod.o auxil/psb_d_ip_reord_mod.o \ auxil/psb_c_ip_reord_mod.o auxil/psb_z_ip_reord_mod.o : psb_realloc_mod.o psb_const_mod.o - +auxil/psb_i2_hsort_x_mod.o: auxil/psb_m_hsort_mod.o auxil/psb_e_hsort_mod.o auxil/psb_i2_hsort_mod.o +auxil/psb_i_hsort_x_mod.o: auxil/psb_m_hsort_mod.o auxil/psb_e_hsort_mod.o auxil/psb_i2_hsort_mod.o auxil/psb_i_hsort_x_mod.o: auxil/psb_m_hsort_mod.o auxil/psb_e_hsort_mod.o auxil/psb_l_hsort_x_mod.o: auxil/psb_m_hsort_mod.o auxil/psb_e_hsort_mod.o auxil/psb_s_hsort_x_mod.o: auxil/psb_s_hsort_mod.o @@ -238,14 +273,14 @@ auxil/psb_d_hsort_x_mod.o: auxil/psb_d_hsort_mod.o auxil/psb_c_hsort_x_mod.o: auxil/psb_c_hsort_mod.o auxil/psb_z_hsort_x_mod.o: auxil/psb_z_hsort_mod.o -auxil/psi_serial_mod.o: auxil/psi_m_serial_mod.o auxil/psi_e_serial_mod.o \ +auxil/psi_serial_mod.o: auxil/psi_i2_serial_mod.o auxil/psi_m_serial_mod.o auxil/psi_e_serial_mod.o \ auxil/psi_s_serial_mod.o auxil/psi_d_serial_mod.o\ auxil/psi_c_serial_mod.o auxil/psi_z_serial_mod.o \ auxil/psi_acx_mod.o auxil/psi_alcx_mod.o auxil/psi_lcx_mod.o -auxil/psi_m_serial_mod.o auxil/psi_e_serial_mod.o auxil/psi_s_serial_mod.o auxil/psi_d_serial_mod.o auxil/psi_c_serial_mod.o auxil/psi_z_serial_mod.o: psb_const_mod.o +auxil/psi_i2_serial_mod.o auxil/psi_m_serial_mod.o auxil/psi_e_serial_mod.o auxil/psi_s_serial_mod.o auxil/psi_d_serial_mod.o auxil/psi_c_serial_mod.o auxil/psi_z_serial_mod.o: psb_const_mod.o -auxil/psb_ip_reord_mod.o: auxil/psb_m_ip_reord_mod.o auxil/psb_e_ip_reord_mod.o \ +auxil/psb_ip_reord_mod.o: auxil/psb_i2_ip_reord_mod.o auxil/psb_m_ip_reord_mod.o auxil/psb_e_ip_reord_mod.o \ auxil/psb_s_ip_reord_mod.o auxil/psb_d_ip_reord_mod.o \ auxil/psb_c_ip_reord_mod.o auxil/psb_z_ip_reord_mod.o @@ -260,9 +295,11 @@ serial/psb_d_base_mat_mod.o: serial/psb_d_base_vect_mod.o #serial/psb_ld_base_mat_mod.o: serial/psb_d_base_vect_mod.o serial/psb_c_base_mat_mod.o: serial/psb_c_base_vect_mod.o serial/psb_z_base_mat_mod.o: serial/psb_z_base_vect_mod.o -serial/psb_l_base_vect_mod.o: serial/psb_i_base_vect_mod.o -serial/psb_c_base_vect_mod.o serial/psb_s_base_vect_mod.o serial/psb_d_base_vect_mod.o serial/psb_z_base_vect_mod.o: serial/psb_i_base_vect_mod.o serial/psb_l_base_vect_mod.o -serial/psb_i_base_vect_mod.o serial/psb_l_base_vect_mod.o serial/psb_c_base_vect_mod.o serial/psb_s_base_vect_mod.o serial/psb_d_base_vect_mod.o serial/psb_z_base_vect_mod.o: auxil/psi_serial_mod.o psb_realloc_mod.o +serial/psb_i2_base_vect_mod.o: serial/psb_i_base_vect_mod.o comm/comm_schemes/psb_comm_schemes_mod.o comm/comm_schemes/psb_comm_factory_mod.o +serial/psb_l_base_vect_mod.o: serial/psb_i_base_vect_mod.o comm/comm_schemes/psb_comm_schemes_mod.o comm/comm_schemes/psb_comm_factory_mod.o +serial/psb_d_base_vect_mod.o serial/psb_c_base_vect_mod.o serial/psb_s_base_vect_mod.o serial/psb_z_base_vect_mod.o: serial/psb_i_base_vect_mod.o serial/psb_l_base_vect_mod.o comm/comm_schemes/psb_comm_neighbor_impl_mod.o comm/comm_schemes/psb_comm_schemes_mod.o comm/comm_schemes/psb_comm_factory_mod.o +serial/psb_i_base_vect_mod.o serial/psb_l_base_vect_mod.o serial/psb_c_base_vect_mod.o serial/psb_s_base_vect_mod.o serial/psb_d_base_vect_mod.o serial/psb_z_base_vect_mod.o: auxil/psi_serial_mod.o psb_realloc_mod.o comm/comm_schemes/psb_comm_neighbor_impl_mod.o \ + comm/psb_neighbor_topology_mod.o comm/comm_schemes/psb_comm_schemes_mod.o comm/comm_schemes/psb_comm_factory_mod.o comm/comm_schemes/psb_comm_schemes_mod.o comm/comm_schemes/psb_comm_factory_mod.o serial/psb_s_mat_mod.o: serial/psb_s_base_mat_mod.o serial/psb_s_csr_mat_mod.o serial/psb_s_csc_mat_mod.o serial/psb_s_vect_mod.o \ serial/psb_i_vect_mod.o serial/psb_l_vect_mod.o serial/psb_d_mat_mod.o: serial/psb_d_base_mat_mod.o serial/psb_d_csr_mat_mod.o serial/psb_d_csc_mat_mod.o serial/psb_d_vect_mod.o \ @@ -279,13 +316,14 @@ serial/psb_z_csc_mat_mod.o serial/psb_z_csr_mat_mod.o serial/psb_lz_csr_mat_mod. serial/psb_mat_mod.o: serial/psb_vect_mod.o serial/psb_s_mat_mod.o serial/psb_d_mat_mod.o serial/psb_c_mat_mod.o serial/psb_z_mat_mod.o serial/psb_serial_mod.o: serial/psb_s_serial_mod.o serial/psb_d_serial_mod.o serial/psb_c_serial_mod.o serial/psb_z_serial_mod.o auxil/psi_serial_mod.o serial/psb_i_vect_mod.o: serial/psb_i_base_vect_mod.o +serial/psb_i2_vect_mod.o: serial/psb_i2_base_vect_mod.o serial/psb_i_vect_mod.o serial/psb_l_vect_mod.o: serial/psb_l_base_vect_mod.o serial/psb_i_vect_mod.o serial/psb_s_vect_mod.o: serial/psb_s_base_vect_mod.o serial/psb_i_vect_mod.o serial/psb_d_vect_mod.o: serial/psb_d_base_vect_mod.o serial/psb_i_vect_mod.o serial/psb_c_vect_mod.o: serial/psb_c_base_vect_mod.o serial/psb_i_vect_mod.o serial/psb_z_vect_mod.o: serial/psb_z_base_vect_mod.o serial/psb_i_vect_mod.o serial/psb_s_serial_mod.o serial/psb_d_serial_mod.o serial/psb_c_serial_mod.o serial/psb_z_serial_mod.o: serial/psb_mat_mod.o auxil/psb_string_mod.o auxil/psb_sort_mod.o auxil/psi_serial_mod.o -serial/psb_vect_mod.o: serial/psb_i_vect_mod.o serial/psb_l_vect_mod.o serial/psb_d_vect_mod.o serial/psb_s_vect_mod.o serial/psb_c_vect_mod.o serial/psb_z_vect_mod.o +serial/psb_vect_mod.o: serial/psb_i2_vect_mod.o serial/psb_i_vect_mod.o serial/psb_l_vect_mod.o serial/psb_d_vect_mod.o serial/psb_s_vect_mod.o serial/psb_c_vect_mod.o serial/psb_z_vect_mod.o auxil/psb_s_rb_idx_tree_mod.o: serial/psb_s_csr_mat_mod.o psb_realloc_mod.o auxil/psb_d_rb_idx_tree_mod.o: serial/psb_d_csr_mat_mod.o psb_realloc_mod.o @@ -304,10 +342,12 @@ desc/psb_desc_mod.o: psb_penv_mod.o psb_realloc_mod.o\ desc/psb_repl_map_mod.o desc/psb_gen_block_map_mod.o desc/psb_desc_const_mod.o\ desc/psb_indx_map_mod.o serial/psb_i_vect_mod.o +psi_i2_mod.o: desc/psb_desc_mod.o serial/psb_i2_vect_mod.o comm/psi_e_comm_a_mod.o \ + comm/psi_m_comm_a_mod.o comm/psi_i_comm_v_mod.o comm/psi_i2_comm_a_mod.o comm/psi_i2_comm_v_mod.o psi_i_mod.o: desc/psb_desc_mod.o serial/psb_i_vect_mod.o comm/psi_e_comm_a_mod.o \ - comm/psi_m_comm_a_mod.o comm/psi_i_comm_v_mod.o + comm/psi_m_comm_a_mod.o comm/psi_i_comm_v_mod.o comm/psi_i2_comm_a_mod.o comm/psi_i2_comm_v_mod.o psi_l_mod.o: desc/psb_desc_mod.o serial/psb_l_vect_mod.o comm/psi_e_comm_a_mod.o \ - comm/psi_m_comm_a_mod.o comm/psi_l_comm_v_mod.o + comm/psi_m_comm_a_mod.o comm/psi_l_comm_v_mod.o comm/psi_i2_comm_a_mod.o comm/psi_i2_comm_v_mod.o psi_s_mod.o: desc/psb_desc_mod.o serial/psb_s_vect_mod.o comm/psi_s_comm_a_mod.o \ comm/psi_s_comm_v_mod.o psi_d_mod.o: desc/psb_desc_mod.o serial/psb_d_vect_mod.o comm/psi_d_comm_a_mod.o \ @@ -317,7 +357,7 @@ psi_c_mod.o: desc/psb_desc_mod.o serial/psb_c_vect_mod.o comm/psi_c_comm_a_mod.o psi_z_mod.o: desc/psb_desc_mod.o serial/psb_z_vect_mod.o comm/psi_z_comm_a_mod.o \ comm/psi_z_comm_v_mod.o psi_mod.o: psb_penv_mod.o desc/psb_desc_mod.o auxil/psi_serial_mod.o serial/psb_serial_mod.o\ - psi_i_mod.o psi_l_mod.o psi_s_mod.o psi_d_mod.o psi_c_mod.o psi_z_mod.o + psi_i2_mod.o psi_i_mod.o psi_l_mod.o psi_s_mod.o psi_d_mod.o psi_c_mod.o psi_z_mod.o desc/psb_indx_map_mod.o: desc/psb_desc_const_mod.o psb_error_mod.o psb_penv_mod.o psb_realloc_mod.o auxil/psb_sort_mod.o desc/psb_hash_map_mod.o desc/psb_list_map_mod.o desc/psb_repl_map_mod.o desc/psb_gen_block_map_mod.o:\ @@ -337,24 +377,28 @@ comm/psb_c_linmap_mod.o: comm/psb_base_linmap_mod.o serial/psb_c_mat_mod.o seria comm/psb_z_linmap_mod.o: comm/psb_base_linmap_mod.o serial/psb_z_mat_mod.o serial/psb_z_vect_mod.o comm/psb_base_linmap_mod.o: desc/psb_desc_mod.o serial/psb_serial_mod.o comm/psb_comm_mod.o comm/psb_comm_mod.o: desc/psb_desc_mod.o serial/psb_mat_mod.o -comm/psb_comm_mod.o: comm/psb_i_comm_mod.o comm/psb_l_comm_mod.o \ +comm/psb_comm_mod.o: comm/psb_i2_comm_mod.o comm/psb_i_comm_mod.o comm/psb_l_comm_mod.o \ comm/psb_s_comm_mod.o comm/psb_d_comm_mod.o \ comm/psb_c_comm_mod.o comm/psb_z_comm_mod.o \ + comm/psb_i2_comm_a_mod.o \ comm/psb_m_comm_a_mod.o comm/psb_e_comm_a_mod.o \ comm/psb_s_comm_a_mod.o comm/psb_d_comm_a_mod.o\ comm/psb_c_comm_a_mod.o comm/psb_z_comm_a_mod.o -comm/psb_m_comm_a_mod.o comm/psb_e_comm_a_mod.o \ +comm/psb_i2_comm_a_mod.o comm/psb_m_comm_a_mod.o comm/psb_e_comm_a_mod.o \ comm/psb_s_comm_a_mod.o comm/psb_d_comm_a_mod.o\ comm/psb_c_comm_a_mod.o comm/psb_z_comm_a_mod.o: desc/psb_desc_mod.o -comm/psb_i_comm_mod.o: serial/psb_i_vect_mod.o desc/psb_desc_mod.o +comm/psb_i2_comm_mod.o: serial/psb_i2_vect_mod.o desc/psb_desc_mod.o +comm/psb_i_comm_mod.o: serial/psb_i_vect_mod.o desc/psb_desc_mod.o comm/psb_l_comm_mod.o: serial/psb_l_vect_mod.o desc/psb_desc_mod.o comm/psb_s_comm_mod.o: serial/psb_s_vect_mod.o desc/psb_desc_mod.o serial/psb_mat_mod.o comm/psb_d_comm_mod.o: serial/psb_d_vect_mod.o desc/psb_desc_mod.o serial/psb_mat_mod.o comm/psb_c_comm_mod.o: serial/psb_c_vect_mod.o desc/psb_desc_mod.o serial/psb_mat_mod.o comm/psb_z_comm_mod.o: serial/psb_z_vect_mod.o desc/psb_desc_mod.o serial/psb_mat_mod.o +comm/psi_i2_comm_v_mod.o: serial/psb_i2_vect_mod.o comm/psi_i2_comm_a_mod.o \ + comm/psi_m_comm_a_mod.o comm/psi_i_comm_v_mod.o: serial/psb_i_vect_mod.o comm/psi_e_comm_a_mod.o \ comm/psi_m_comm_a_mod.o comm/psi_l_comm_v_mod.o: serial/psb_l_vect_mod.o comm/psi_e_comm_a_mod.o \ @@ -364,23 +408,22 @@ comm/psi_d_comm_v_mod.o: serial/psb_d_vect_mod.o comm/psi_d_comm_a_mod.o comm/psi_c_comm_v_mod.o: serial/psb_c_vect_mod.o comm/psi_c_comm_a_mod.o comm/psi_z_comm_v_mod.o: serial/psb_z_vect_mod.o comm/psi_z_comm_a_mod.o -comm/psi_e_comm_a_mod.o comm/psi_m_comm_a_mod.o \ +comm/psi_e_comm_a_mod.o comm/psi_m_comm_a_mod.o comm/psi_i2_comm_a_mod.o \ comm/psi_s_comm_a_mod.o comm/psi_d_comm_a_mod.o \ comm/psi_c_comm_a_mod.o comm/psi_z_comm_a_mod.o: desc/psb_desc_mod.o - - tools/psb_tools_mod.o: tools/psb_cd_tools_mod.o tools/psb_s_tools_mod.o tools/psb_d_tools_mod.o\ tools/psb_i_tools_mod.o tools/psb_l_tools_mod.o \ tools/psb_c_tools_mod.o tools/psb_z_tools_mod.o \ - tools/psb_m_tools_a_mod.o tools/psb_e_tools_a_mod.o \ + tools/psb_i2_tools_a_mod.o tools/psb_m_tools_a_mod.o tools/psb_e_tools_a_mod.o \ tools/psb_s_tools_a_mod.o tools/psb_d_tools_a_mod.o\ tools/psb_c_tools_a_mod.o tools/psb_z_tools_a_mod.o tools/psb_cd_tools_mod.o tools/psb_i_tools_mod.o tools/psb_l_tools_mod.o \ tools/psb_s_tools_mod.o tools/psb_d_tools_mod.o \ -tools/psb_c_tools_mod.o tools/psb_z_tools_mod.o tools/psb_m_tools_a_mod.o tools/psb_e_tools_a_mod.o \ +tools/psb_c_tools_mod.o tools/psb_z_tools_mod.o \ +tools/psb_i2_tools_a_mod.o tools/psb_m_tools_a_mod.o tools/psb_e_tools_a_mod.o \ tools/psb_s_tools_a_mod.o tools/psb_d_tools_a_mod.o\ tools/psb_c_tools_a_mod.o tools/psb_z_tools_a_mod.o: desc/psb_desc_mod.o psi_mod.o serial/psb_mat_mod.o @@ -420,5 +463,4 @@ clean: /bin/rm -f $(MODULES) $(OBJS) $(MPFOBJS) *$(.mod) veryclean: clean - /bin/rm -f *.h - + /bin/rm -f *.h \ No newline at end of file diff --git a/base/modules/auxil/psb_c_hsort_mod.f90 b/base/modules/auxil/psb_c_hsort_mod.f90 index e7eb2fbf7..ad375db79 100644 --- a/base/modules/auxil/psb_c_hsort_mod.f90 +++ b/base/modules/auxil/psb_c_hsort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,10 +44,10 @@ module psb_c_hsort_mod use psb_const_mod interface psb_hsort - subroutine psb_chsort(x,ix,dir,flag) + subroutine psb_chsort(x,ix,dir,flag,reord) import complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_chsort end interface psb_hsort diff --git a/base/modules/auxil/psb_c_hsort_x_mod.f90 b/base/modules/auxil/psb_c_hsort_x_mod.f90 index 8f0437f7c..1787a77b7 100644 --- a/base/modules/auxil/psb_c_hsort_x_mod.f90 +++ b/base/modules/auxil/psb_c_hsort_x_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_c_ip_reord_mod.F90 b/base/modules/auxil/psb_c_ip_reord_mod.F90 index daec3a65f..99b3354e9 100644 --- a/base/modules/auxil/psb_c_ip_reord_mod.F90 +++ b/base/modules/auxil/psb_c_ip_reord_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_c_isort_mod.f90 b/base/modules/auxil/psb_c_isort_mod.f90 index d0dbd2815..bc46e9516 100644 --- a/base/modules/auxil/psb_c_isort_mod.f90 +++ b/base/modules/auxil/psb_c_isort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,10 +44,10 @@ module psb_c_isort_mod use psb_const_mod interface psb_isort - subroutine psb_cisort(x,ix,dir,flag) + subroutine psb_cisort(x,ix,dir,flag,reord) import complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_cisort end interface psb_isort diff --git a/base/modules/auxil/psb_c_msort_mod.f90 b/base/modules/auxil/psb_c_msort_mod.f90 index a74c32fd7..efd5fb7ad 100644 --- a/base/modules/auxil/psb_c_msort_mod.f90 +++ b/base/modules/auxil/psb_c_msort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -55,10 +55,10 @@ module psb_c_msort_mod interface psb_msort - subroutine psb_cmsort(x,ix,dir,flag) + subroutine psb_cmsort(x,ix,dir,flag,reord) import complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_cmsort end interface psb_msort diff --git a/base/modules/auxil/psb_c_qsort_mod.f90 b/base/modules/auxil/psb_c_qsort_mod.f90 index 6c4ceb3f8..b055fc07c 100644 --- a/base/modules/auxil/psb_c_qsort_mod.f90 +++ b/base/modules/auxil/psb_c_qsort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -45,10 +45,10 @@ module psb_c_qsort_mod interface psb_qsort - subroutine psb_cqsort(x,ix,dir,flag) + subroutine psb_cqsort(x,ix,dir,flag,reord) import complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_cqsort end interface psb_qsort diff --git a/base/modules/auxil/psb_c_rb_idx_tree_mod.f90 b/base/modules/auxil/psb_c_rb_idx_tree_mod.f90 index 9b3ada6e4..f3669f69e 100644 --- a/base/modules/auxil/psb_c_rb_idx_tree_mod.f90 +++ b/base/modules/auxil/psb_c_rb_idx_tree_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_c_realloc_mod.F90 b/base/modules/auxil/psb_c_realloc_mod.F90 index 16be31838..dae4f8974 100644 --- a/base/modules/auxil/psb_c_realloc_mod.F90 +++ b/base/modules/auxil/psb_c_realloc_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_d_hsort_mod.f90 b/base/modules/auxil/psb_d_hsort_mod.f90 index 570f27b1b..d54886471 100644 --- a/base/modules/auxil/psb_d_hsort_mod.f90 +++ b/base/modules/auxil/psb_d_hsort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,10 +44,10 @@ module psb_d_hsort_mod use psb_const_mod interface psb_hsort - subroutine psb_dhsort(x,ix,dir,flag) + subroutine psb_dhsort(x,ix,dir,flag,reord) import real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_dhsort end interface psb_hsort diff --git a/base/modules/auxil/psb_d_hsort_x_mod.f90 b/base/modules/auxil/psb_d_hsort_x_mod.f90 index ba45d6833..adefb3c46 100644 --- a/base/modules/auxil/psb_d_hsort_x_mod.f90 +++ b/base/modules/auxil/psb_d_hsort_x_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_d_ip_reord_mod.F90 b/base/modules/auxil/psb_d_ip_reord_mod.F90 index 7cd0a2699..229cafc5e 100644 --- a/base/modules/auxil/psb_d_ip_reord_mod.F90 +++ b/base/modules/auxil/psb_d_ip_reord_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_d_isort_mod.f90 b/base/modules/auxil/psb_d_isort_mod.f90 index b34a3dfff..f59e1cc07 100644 --- a/base/modules/auxil/psb_d_isort_mod.f90 +++ b/base/modules/auxil/psb_d_isort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,10 +44,10 @@ module psb_d_isort_mod use psb_const_mod interface psb_isort - subroutine psb_disort(x,ix,dir,flag) + subroutine psb_disort(x,ix,dir,flag,reord) import real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_disort end interface psb_isort diff --git a/base/modules/auxil/psb_d_msort_mod.f90 b/base/modules/auxil/psb_d_msort_mod.f90 index d035486b7..b9acd7cdf 100644 --- a/base/modules/auxil/psb_d_msort_mod.f90 +++ b/base/modules/auxil/psb_d_msort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -55,10 +55,10 @@ module psb_d_msort_mod interface psb_msort - subroutine psb_dmsort(x,ix,dir,flag) + subroutine psb_dmsort(x,ix,dir,flag,reord) import real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_dmsort end interface psb_msort diff --git a/base/modules/auxil/psb_d_qsort_mod.f90 b/base/modules/auxil/psb_d_qsort_mod.f90 index 4da0b840a..ca547cd2e 100644 --- a/base/modules/auxil/psb_d_qsort_mod.f90 +++ b/base/modules/auxil/psb_d_qsort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -64,10 +64,10 @@ module psb_d_qsort_mod end interface psb_ssrch interface psb_qsort - subroutine psb_dqsort(x,ix,dir,flag) + subroutine psb_dqsort(x,ix,dir,flag,reord) import real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_dqsort end interface psb_qsort diff --git a/base/modules/auxil/psb_d_rb_idx_tree_mod.f90 b/base/modules/auxil/psb_d_rb_idx_tree_mod.f90 index 099d1a305..b68326d0b 100644 --- a/base/modules/auxil/psb_d_rb_idx_tree_mod.f90 +++ b/base/modules/auxil/psb_d_rb_idx_tree_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_d_realloc_mod.F90 b/base/modules/auxil/psb_d_realloc_mod.F90 index ae093a4a3..96d094d5a 100644 --- a/base/modules/auxil/psb_d_realloc_mod.F90 +++ b/base/modules/auxil/psb_d_realloc_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_e_hsort_mod.f90 b/base/modules/auxil/psb_e_hsort_mod.f90 index 5433cec4a..5789c680e 100644 --- a/base/modules/auxil/psb_e_hsort_mod.f90 +++ b/base/modules/auxil/psb_e_hsort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,10 +44,10 @@ module psb_e_hsort_mod use psb_const_mod interface psb_hsort - subroutine psb_ehsort(x,ix,dir,flag) + subroutine psb_ehsort(x,ix,dir,flag,reord) import integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_epk_), optional, intent(inout) :: ix(:) end subroutine psb_ehsort end interface psb_hsort diff --git a/base/modules/auxil/psb_e_ip_reord_mod.F90 b/base/modules/auxil/psb_e_ip_reord_mod.F90 index 7369d1f2f..7b018cab1 100644 --- a/base/modules/auxil/psb_e_ip_reord_mod.F90 +++ b/base/modules/auxil/psb_e_ip_reord_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_e_isort_mod.f90 b/base/modules/auxil/psb_e_isort_mod.f90 index ead8af045..dd859b7ec 100644 --- a/base/modules/auxil/psb_e_isort_mod.f90 +++ b/base/modules/auxil/psb_e_isort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,10 +44,10 @@ module psb_e_isort_mod use psb_const_mod interface psb_isort - subroutine psb_eisort(x,ix,dir,flag) + subroutine psb_eisort(x,ix,dir,flag,reord) import integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_epk_), optional, intent(inout) :: ix(:) end subroutine psb_eisort end interface psb_isort diff --git a/base/modules/auxil/psb_e_msort_mod.f90 b/base/modules/auxil/psb_e_msort_mod.f90 index 5a0758dda..0f1637afd 100644 --- a/base/modules/auxil/psb_e_msort_mod.f90 +++ b/base/modules/auxil/psb_e_msort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -62,10 +62,10 @@ module psb_e_msort_mod interface psb_msort - subroutine psb_emsort(x,ix,dir,flag) + subroutine psb_emsort(x,ix,dir,flag,reord) import integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_epk_), optional, intent(inout) :: ix(:) end subroutine psb_emsort end interface psb_msort diff --git a/base/modules/auxil/psb_e_qsort_mod.f90 b/base/modules/auxil/psb_e_qsort_mod.f90 index 09f45d459..f3d2457e7 100644 --- a/base/modules/auxil/psb_e_qsort_mod.f90 +++ b/base/modules/auxil/psb_e_qsort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -64,10 +64,10 @@ module psb_e_qsort_mod end interface psb_ssrch interface psb_qsort - subroutine psb_eqsort(x,ix,dir,flag) + subroutine psb_eqsort(x,ix,dir,flag,reord) import integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_epk_), optional, intent(inout) :: ix(:) end subroutine psb_eqsort end interface psb_qsort diff --git a/base/modules/auxil/psb_e_realloc_mod.F90 b/base/modules/auxil/psb_e_realloc_mod.F90 index 688753d88..b3749ced6 100644 --- a/base/modules/auxil/psb_e_realloc_mod.F90 +++ b/base/modules/auxil/psb_e_realloc_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_i2_hsort_mod.f90 b/base/modules/auxil/psb_i2_hsort_mod.f90 index 6a6c96de4..9c5fc4985 100644 --- a/base/modules/auxil/psb_i2_hsort_mod.f90 +++ b/base/modules/auxil/psb_i2_hsort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,10 +44,10 @@ module psb_i2_hsort_mod use psb_const_mod interface psb_hsort - subroutine psb_i2hsort(x,ix,dir,flag) + subroutine psb_i2hsort(x,ix,dir,flag,reord) import integer(psb_i2pk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_i2hsort end interface psb_hsort diff --git a/base/modules/auxil/psb_i2_hsort_x_mod.f90 b/base/modules/auxil/psb_i2_hsort_x_mod.f90 new file mode 100644 index 000000000..1c4d0ea8e --- /dev/null +++ b/base/modules/auxil/psb_i2_hsort_x_mod.f90 @@ -0,0 +1,312 @@ +! +! Parallel Sparse BLAS version 3.5 +! (C) Copyright 2006-2018 +! Salvatore Filippone +! Alfredo Buttari +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! Sorting routines +! References: +! D. Knuth +! The Art of Computer Programming, vol. 3 +! Addison-Wesley +! +! Aho, Hopcroft, Ullman +! Data Structures and Algorithms +! Addison-Wesley +! +module psb_i2_hsort_x_mod + use psb_const_mod + use psb_e_hsort_mod + use psb_m_hsort_mod + use psb_i2_hsort_mod + + type psb_i2_heap + integer(psb_ipk_) :: dir + integer(psb_ipk_) :: last + integer(psb_i2pk_), allocatable :: keys(:) + contains + procedure, pass(heap) :: init => psb_i2_init_heap + procedure, pass(heap) :: howmany => psb_i2_howmany + procedure, pass(heap) :: insert => psb_i2_insert_heap + procedure, pass(heap) :: get_first => psb_i2_heap_get_first + procedure, pass(heap) :: dump => psb_i2_dump_heap + procedure, pass(heap) :: free => psb_i2_free_heap + end type psb_i2_heap + + type psb_i2_idx_heap + integer(psb_ipk_) :: dir + integer(psb_ipk_) :: last + integer(psb_i2pk_), allocatable :: keys(:) + integer(psb_ipk_), allocatable :: idxs(:) + contains + procedure, pass(heap) :: init => psb_i2_idx_init_heap + procedure, pass(heap) :: howmany => psb_i2_idx_howmany + procedure, pass(heap) :: insert => psb_i2_idx_insert_heap + procedure, pass(heap) :: get_first => psb_i2_idx_heap_get_first + procedure, pass(heap) :: dump => psb_i2_idx_dump_heap + procedure, pass(heap) :: free => psb_i2_idx_free_heap + end type psb_i2_idx_heap + + +contains + + subroutine psb_i2_init_heap(heap,info,dir) + use psb_realloc_mod, only : psb_ensure_size + implicit none + class(psb_i2_heap), intent(inout) :: heap + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: dir + + info = psb_success_ + heap%last=0 + if (present(dir)) then + heap%dir = dir + else + heap%dir = psb_sort_up_ + endif + select case(heap%dir) + case (psb_sort_up_,psb_sort_down_,psb_asort_up_,psb_asort_down_) + ! ok, do nothing + case default + write(psb_err_unit,*) 'Invalid direction, defaulting to psb_sort_up_' + heap%dir = psb_sort_up_ + end select + call psb_ensure_size(psb_heap_resize,heap%keys,info) + + return + end subroutine psb_i2_init_heap + + + function psb_i2_howmany(heap) result(res) + implicit none + class(psb_i2_heap), intent(in) :: heap + integer(psb_ipk_) :: res + res = heap%last + end function psb_i2_howmany + + subroutine psb_i2_insert_heap(key,heap,info) + use psb_realloc_mod, only : psb_ensure_size + implicit none + + integer(psb_i2pk_), intent(in) :: key + class(psb_i2_heap), intent(inout) :: heap + integer(psb_ipk_), intent(out) :: info + + info = psb_success_ + if (heap%last < 0) then + write(psb_err_unit,*) 'Invalid last in heap ',heap%last + info = heap%last + return + endif + + call psb_ensure_size(heap%last+1,heap%keys,info) + if (info /= psb_success_) then + write(psb_err_unit,*) 'Memory allocation failure in heap_insert' + info = -5 + return + end if + call psi_insert_heap(key,& + & heap%last,heap%keys,heap%dir,info) + + return + end subroutine psb_i2_insert_heap + + subroutine psb_i2_heap_get_first(key,heap,info) + implicit none + + class(psb_i2_heap), intent(inout) :: heap + integer(psb_ipk_), intent(out) :: info + integer(psb_i2pk_), intent(out) :: key + + + info = psb_success_ + + call psi_heap_get_first(key,& + & heap%last,heap%keys,heap%dir,info) + + return + end subroutine psb_i2_heap_get_first + + subroutine psb_i2_dump_heap(iout,heap,info) + + implicit none + class(psb_i2_heap), intent(in) :: heap + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: iout + + info = psb_success_ + if (iout < 0) then + write(psb_err_unit,*) 'Invalid file ' + info =-1 + return + end if + + write(iout,*) 'Heap direction ',heap%dir + write(iout,*) 'Heap size ',heap%last + if ((heap%last > 0).and.((.not.allocated(heap%keys)).or.& + & (size(heap%keys) 0).and.((.not.allocated(heap%keys)).or.& + & (size(heap%keys) 0).and.((.not.allocated(heap%idxs)).or.& + & (size(heap%idxs) len(fstring)) exit + fstring(i:i) = cstring(i) + i = i + 1 + end do + do + if (i > len(fstring)) exit + fstring(i:i) = " " + i = i + 1 + end do + return + end subroutine psb_stringc2f + subroutine psb_stringf2c(fstring,cstring) + character(c_char) :: cstring(*) + character(len=*) :: fstring + integer :: i + + do i=1, len(fstring) + cstring(i) = fstring(i:i) + end do + cstring(len(fstring)+1) = c_null_char + return + end subroutine psb_stringf2c end module psb_string_mod diff --git a/base/modules/auxil/psb_z_hsort_mod.f90 b/base/modules/auxil/psb_z_hsort_mod.f90 index 98e47da2c..e7f7939df 100644 --- a/base/modules/auxil/psb_z_hsort_mod.f90 +++ b/base/modules/auxil/psb_z_hsort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,10 +44,10 @@ module psb_z_hsort_mod use psb_const_mod interface psb_hsort - subroutine psb_zhsort(x,ix,dir,flag) + subroutine psb_zhsort(x,ix,dir,flag,reord) import complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_zhsort end interface psb_hsort diff --git a/base/modules/auxil/psb_z_hsort_x_mod.f90 b/base/modules/auxil/psb_z_hsort_x_mod.f90 index 4b7302aa0..9e944ec20 100644 --- a/base/modules/auxil/psb_z_hsort_x_mod.f90 +++ b/base/modules/auxil/psb_z_hsort_x_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_z_ip_reord_mod.F90 b/base/modules/auxil/psb_z_ip_reord_mod.F90 index f8ddc182c..7552d7188 100644 --- a/base/modules/auxil/psb_z_ip_reord_mod.F90 +++ b/base/modules/auxil/psb_z_ip_reord_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_z_isort_mod.f90 b/base/modules/auxil/psb_z_isort_mod.f90 index 4048088a9..12c673b46 100644 --- a/base/modules/auxil/psb_z_isort_mod.f90 +++ b/base/modules/auxil/psb_z_isort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,10 +44,10 @@ module psb_z_isort_mod use psb_const_mod interface psb_isort - subroutine psb_zisort(x,ix,dir,flag) + subroutine psb_zisort(x,ix,dir,flag,reord) import complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_zisort end interface psb_isort diff --git a/base/modules/auxil/psb_z_msort_mod.f90 b/base/modules/auxil/psb_z_msort_mod.f90 index 515b69cf1..7a02669ee 100644 --- a/base/modules/auxil/psb_z_msort_mod.f90 +++ b/base/modules/auxil/psb_z_msort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -55,10 +55,10 @@ module psb_z_msort_mod interface psb_msort - subroutine psb_zmsort(x,ix,dir,flag) + subroutine psb_zmsort(x,ix,dir,flag,reord) import complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_zmsort end interface psb_msort diff --git a/base/modules/auxil/psb_z_qsort_mod.f90 b/base/modules/auxil/psb_z_qsort_mod.f90 index 2fc6baab2..be7081596 100644 --- a/base/modules/auxil/psb_z_qsort_mod.f90 +++ b/base/modules/auxil/psb_z_qsort_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -45,10 +45,10 @@ module psb_z_qsort_mod interface psb_qsort - subroutine psb_zqsort(x,ix,dir,flag) + subroutine psb_zqsort(x,ix,dir,flag,reord) import complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) end subroutine psb_zqsort end interface psb_qsort diff --git a/base/modules/auxil/psb_z_rb_idx_tree_mod.f90 b/base/modules/auxil/psb_z_rb_idx_tree_mod.f90 index 7b15f0800..d3e3555d2 100644 --- a/base/modules/auxil/psb_z_rb_idx_tree_mod.f90 +++ b/base/modules/auxil/psb_z_rb_idx_tree_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psb_z_realloc_mod.F90 b/base/modules/auxil/psb_z_realloc_mod.F90 index cf33e731f..198a41012 100644 --- a/base/modules/auxil/psb_z_realloc_mod.F90 +++ b/base/modules/auxil/psb_z_realloc_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psi_acx_mod.f90 b/base/modules/auxil/psi_acx_mod.f90 index 8150c8779..90a021f0f 100644 --- a/base/modules/auxil/psi_acx_mod.f90 +++ b/base/modules/auxil/psi_acx_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psi_alcx_mod.f90 b/base/modules/auxil/psi_alcx_mod.f90 index c11ce8e1d..1bd83d3c6 100644 --- a/base/modules/auxil/psi_alcx_mod.f90 +++ b/base/modules/auxil/psi_alcx_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psi_c_serial_mod.f90 b/base/modules/auxil/psi_c_serial_mod.f90 index 1d30df106..4e67e134b 100644 --- a/base/modules/auxil/psi_c_serial_mod.f90 +++ b/base/modules/auxil/psi_c_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,7 +35,7 @@ module psi_c_serial_mod interface psb_gelp ! 2-D version subroutine psb_m_cgelp(trans,iperm,x,info) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none complex(psb_spk_), intent(inout) :: x(:,:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -43,7 +43,7 @@ module psi_c_serial_mod character, intent(in) :: trans end subroutine psb_m_cgelp subroutine psb_m_cgelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_mpk_,psb_spk_ + import implicit none complex(psb_spk_), intent(inout) :: x(:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -51,7 +51,7 @@ module psi_c_serial_mod character, intent(in) :: trans end subroutine psb_m_cgelpv subroutine psb_e_cgelp(trans,iperm,x,info) - import :: psb_ipk_, psb_epk_, psb_spk_ + import implicit none complex(psb_spk_), intent(inout) :: x(:,:) integer(psb_epk_), intent(in) :: iperm(:) @@ -59,7 +59,7 @@ module psi_c_serial_mod character, intent(in) :: trans end subroutine psb_e_cgelp subroutine psb_e_cgelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_epk_, psb_spk_ + import implicit none complex(psb_spk_), intent(inout) :: x(:) integer(psb_epk_), intent(in) :: iperm(:) @@ -70,7 +70,7 @@ module psi_c_serial_mod interface psb_geaxpby subroutine psi_caxpby(m,n,alpha, x, beta, y, info) - import :: psb_ipk_, psb_spk_ + import implicit none integer(psb_ipk_), intent(in) :: m, n complex(psb_spk_), intent (in) :: x(:,:) @@ -79,7 +79,7 @@ module psi_c_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_caxpby subroutine psi_caxpbyv(m,alpha, x, beta, y, info) - import :: psb_ipk_, psb_spk_ + import implicit none integer(psb_ipk_), intent(in) :: m complex(psb_spk_), intent (in) :: x(:) @@ -88,7 +88,7 @@ module psi_c_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_caxpbyv subroutine psi_caxpbyv2(m,alpha, x, beta, y, z, info) - import :: psb_ipk_, psb_spk_ + import implicit none integer(psb_ipk_), intent(in) :: m complex(psb_spk_), intent (in) :: x(:) @@ -101,7 +101,7 @@ module psi_c_serial_mod interface psi_upd_xyz subroutine psi_c_upd_xyz(m,alpha, beta, gamma,delta,x, y, z, info) - import :: psb_ipk_, psb_spk_ + import implicit none integer(psb_ipk_), intent(in) :: m complex(psb_spk_), intent (in) :: x(:) @@ -114,7 +114,7 @@ module psi_c_serial_mod interface psi_xyzw subroutine psi_cxyzw(m,a,b,c,d,e,f,x, y, z,w, info) - import :: psb_ipk_, psb_spk_ + import implicit none integer(psb_ipk_), intent(in) :: m complex(psb_spk_), intent (in) :: x(:) @@ -128,21 +128,21 @@ module psi_c_serial_mod interface psi_gth subroutine psi_cgthmv(n,k,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) complex(psb_spk_) :: x(:,:), y(:),alpha,beta end subroutine psi_cgthmv subroutine psi_cgthv(n,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) complex(psb_spk_) :: x(:), y(:),alpha,beta end subroutine psi_cgthv subroutine psi_cgthzmv(n,k,idx,x,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -150,7 +150,7 @@ module psi_c_serial_mod end subroutine psi_cgthzmv subroutine psi_cgthzmm(n,k,idx,x,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -158,8 +158,7 @@ module psi_c_serial_mod end subroutine psi_cgthzmm subroutine psi_cgthzv(n,idx,x,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ - implicit none + import integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) complex(psb_spk_) :: x(:), y(:) @@ -168,21 +167,21 @@ module psi_c_serial_mod interface psi_sct subroutine psi_csctmm(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) complex(psb_spk_) :: beta, x(:,:), y(:,:) end subroutine psi_csctmm subroutine psi_csctmv(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) complex(psb_spk_) :: beta, x(:), y(:,:) end subroutine psi_csctmv subroutine psi_csctv(n,idx,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n @@ -193,7 +192,7 @@ module psi_c_serial_mod interface psi_exscan subroutine psi_c_exscanv(n,x,info,shift) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_ipk_), intent(in) :: n complex(psb_spk_), intent (inout) :: x(:) diff --git a/base/modules/auxil/psi_d_serial_mod.f90 b/base/modules/auxil/psi_d_serial_mod.f90 index 4115d89ab..7d3d445c7 100644 --- a/base/modules/auxil/psi_d_serial_mod.f90 +++ b/base/modules/auxil/psi_d_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,7 +35,7 @@ module psi_d_serial_mod interface psb_gelp ! 2-D version subroutine psb_m_dgelp(trans,iperm,x,info) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none real(psb_dpk_), intent(inout) :: x(:,:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -43,7 +43,7 @@ module psi_d_serial_mod character, intent(in) :: trans end subroutine psb_m_dgelp subroutine psb_m_dgelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_mpk_,psb_dpk_ + import implicit none real(psb_dpk_), intent(inout) :: x(:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -51,7 +51,7 @@ module psi_d_serial_mod character, intent(in) :: trans end subroutine psb_m_dgelpv subroutine psb_e_dgelp(trans,iperm,x,info) - import :: psb_ipk_, psb_epk_, psb_dpk_ + import implicit none real(psb_dpk_), intent(inout) :: x(:,:) integer(psb_epk_), intent(in) :: iperm(:) @@ -59,7 +59,7 @@ module psi_d_serial_mod character, intent(in) :: trans end subroutine psb_e_dgelp subroutine psb_e_dgelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_epk_, psb_dpk_ + import implicit none real(psb_dpk_), intent(inout) :: x(:) integer(psb_epk_), intent(in) :: iperm(:) @@ -70,7 +70,7 @@ module psi_d_serial_mod interface psb_geaxpby subroutine psi_daxpby(m,n,alpha, x, beta, y, info) - import :: psb_ipk_, psb_dpk_ + import implicit none integer(psb_ipk_), intent(in) :: m, n real(psb_dpk_), intent (in) :: x(:,:) @@ -79,7 +79,7 @@ module psi_d_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_daxpby subroutine psi_daxpbyv(m,alpha, x, beta, y, info) - import :: psb_ipk_, psb_dpk_ + import implicit none integer(psb_ipk_), intent(in) :: m real(psb_dpk_), intent (in) :: x(:) @@ -88,7 +88,7 @@ module psi_d_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_daxpbyv subroutine psi_daxpbyv2(m,alpha, x, beta, y, z, info) - import :: psb_ipk_, psb_dpk_ + import implicit none integer(psb_ipk_), intent(in) :: m real(psb_dpk_), intent (in) :: x(:) @@ -101,7 +101,7 @@ module psi_d_serial_mod interface psi_upd_xyz subroutine psi_d_upd_xyz(m,alpha, beta, gamma,delta,x, y, z, info) - import :: psb_ipk_, psb_dpk_ + import implicit none integer(psb_ipk_), intent(in) :: m real(psb_dpk_), intent (in) :: x(:) @@ -114,7 +114,7 @@ module psi_d_serial_mod interface psi_xyzw subroutine psi_dxyzw(m,a,b,c,d,e,f,x, y, z,w, info) - import :: psb_ipk_, psb_dpk_ + import implicit none integer(psb_ipk_), intent(in) :: m real(psb_dpk_), intent (in) :: x(:) @@ -128,21 +128,21 @@ module psi_d_serial_mod interface psi_gth subroutine psi_dgthmv(n,k,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) real(psb_dpk_) :: x(:,:), y(:),alpha,beta end subroutine psi_dgthmv subroutine psi_dgthv(n,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) real(psb_dpk_) :: x(:), y(:),alpha,beta end subroutine psi_dgthv subroutine psi_dgthzmv(n,k,idx,x,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -150,7 +150,7 @@ module psi_d_serial_mod end subroutine psi_dgthzmv subroutine psi_dgthzmm(n,k,idx,x,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -158,8 +158,7 @@ module psi_d_serial_mod end subroutine psi_dgthzmm subroutine psi_dgthzv(n,idx,x,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ - implicit none + import integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) real(psb_dpk_) :: x(:), y(:) @@ -168,21 +167,21 @@ module psi_d_serial_mod interface psi_sct subroutine psi_dsctmm(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) real(psb_dpk_) :: beta, x(:,:), y(:,:) end subroutine psi_dsctmm subroutine psi_dsctmv(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) real(psb_dpk_) :: beta, x(:), y(:,:) end subroutine psi_dsctmv subroutine psi_dsctv(n,idx,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n @@ -193,7 +192,7 @@ module psi_d_serial_mod interface psi_exscan subroutine psi_d_exscanv(n,x,info,shift) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_ipk_), intent(in) :: n real(psb_dpk_), intent (inout) :: x(:) diff --git a/base/modules/auxil/psi_e_serial_mod.f90 b/base/modules/auxil/psi_e_serial_mod.f90 index 6ebc3a542..f25dab3df 100644 --- a/base/modules/auxil/psi_e_serial_mod.f90 +++ b/base/modules/auxil/psi_e_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,12 +30,12 @@ ! ! module psi_e_serial_mod - use psb_const_mod, only : psb_ipk_, psb_lpk_, psb_mpk_, psb_epk_ + use psb_const_mod, only : psb_ipk_, psb_lpk_, psb_mpk_, psb_epk_, psb_i2pk_ interface psb_gelp ! 2-D version subroutine psb_m_egelp(trans,iperm,x,info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_epk_), intent(inout) :: x(:,:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -43,7 +43,7 @@ module psi_e_serial_mod character, intent(in) :: trans end subroutine psb_m_egelp subroutine psb_m_egelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_epk_), intent(inout) :: x(:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -51,7 +51,7 @@ module psi_e_serial_mod character, intent(in) :: trans end subroutine psb_m_egelpv subroutine psb_e_egelp(trans,iperm,x,info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_epk_), intent(inout) :: x(:,:) integer(psb_epk_), intent(in) :: iperm(:) @@ -59,7 +59,7 @@ module psi_e_serial_mod character, intent(in) :: trans end subroutine psb_e_egelp subroutine psb_e_egelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_epk_), intent(inout) :: x(:) integer(psb_epk_), intent(in) :: iperm(:) @@ -70,7 +70,7 @@ module psi_e_serial_mod interface psb_geaxpby subroutine psi_eaxpby(m,n,alpha, x, beta, y, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m, n integer(psb_epk_), intent (in) :: x(:,:) @@ -79,7 +79,7 @@ module psi_e_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_eaxpby subroutine psi_eaxpbyv(m,alpha, x, beta, y, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m integer(psb_epk_), intent (in) :: x(:) @@ -88,7 +88,7 @@ module psi_e_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_eaxpbyv subroutine psi_eaxpbyv2(m,alpha, x, beta, y, z, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m integer(psb_epk_), intent (in) :: x(:) @@ -101,7 +101,7 @@ module psi_e_serial_mod interface psi_upd_xyz subroutine psi_e_upd_xyz(m,alpha, beta, gamma,delta,x, y, z, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m integer(psb_epk_), intent (in) :: x(:) @@ -114,7 +114,7 @@ module psi_e_serial_mod interface psi_xyzw subroutine psi_exyzw(m,a,b,c,d,e,f,x, y, z,w, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m integer(psb_epk_), intent (in) :: x(:) @@ -128,21 +128,21 @@ module psi_e_serial_mod interface psi_gth subroutine psi_egthmv(n,k,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) integer(psb_epk_) :: x(:,:), y(:),alpha,beta end subroutine psi_egthmv subroutine psi_egthv(n,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) integer(psb_epk_) :: x(:), y(:),alpha,beta end subroutine psi_egthv subroutine psi_egthzmv(n,k,idx,x,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -150,7 +150,7 @@ module psi_e_serial_mod end subroutine psi_egthzmv subroutine psi_egthzmm(n,k,idx,x,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -158,8 +158,7 @@ module psi_e_serial_mod end subroutine psi_egthzmm subroutine psi_egthzv(n,idx,x,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ - implicit none + import integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) integer(psb_epk_) :: x(:), y(:) @@ -168,21 +167,21 @@ module psi_e_serial_mod interface psi_sct subroutine psi_esctmm(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) integer(psb_epk_) :: beta, x(:,:), y(:,:) end subroutine psi_esctmm subroutine psi_esctmv(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) integer(psb_epk_) :: beta, x(:), y(:,:) end subroutine psi_esctmv subroutine psi_esctv(n,idx,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n @@ -193,7 +192,7 @@ module psi_e_serial_mod interface psi_exscan subroutine psi_e_exscanv(n,x,info,shift) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: n integer(psb_epk_), intent (inout) :: x(:) diff --git a/base/modules/auxil/psi_i2_serial_mod.f90 b/base/modules/auxil/psi_i2_serial_mod.f90 index 57712a66d..4285602f9 100644 --- a/base/modules/auxil/psi_i2_serial_mod.f90 +++ b/base/modules/auxil/psi_i2_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,12 +30,12 @@ ! ! module psi_i2_serial_mod - use psb_const_mod, only : psb_ipk_, psb_lpk_, psb_mpk_, psb_epk_ + use psb_const_mod, only : psb_ipk_, psb_lpk_, psb_mpk_, psb_epk_, psb_i2pk_ interface psb_gelp ! 2-D version subroutine psb_m_i2gelp(trans,iperm,x,info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_i2pk_), intent(inout) :: x(:,:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -43,7 +43,7 @@ module psi_i2_serial_mod character, intent(in) :: trans end subroutine psb_m_i2gelp subroutine psb_m_i2gelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_i2pk_), intent(inout) :: x(:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -51,7 +51,7 @@ module psi_i2_serial_mod character, intent(in) :: trans end subroutine psb_m_i2gelpv subroutine psb_e_i2gelp(trans,iperm,x,info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_i2pk_), intent(inout) :: x(:,:) integer(psb_epk_), intent(in) :: iperm(:) @@ -59,7 +59,7 @@ module psi_i2_serial_mod character, intent(in) :: trans end subroutine psb_e_i2gelp subroutine psb_e_i2gelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_i2pk_), intent(inout) :: x(:) integer(psb_epk_), intent(in) :: iperm(:) @@ -70,7 +70,7 @@ module psi_i2_serial_mod interface psb_geaxpby subroutine psi_i2axpby(m,n,alpha, x, beta, y, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m, n integer(psb_i2pk_), intent (in) :: x(:,:) @@ -79,7 +79,7 @@ module psi_i2_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_i2axpby subroutine psi_i2axpbyv(m,alpha, x, beta, y, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m integer(psb_i2pk_), intent (in) :: x(:) @@ -88,7 +88,7 @@ module psi_i2_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_i2axpbyv subroutine psi_i2axpbyv2(m,alpha, x, beta, y, z, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m integer(psb_i2pk_), intent (in) :: x(:) @@ -101,7 +101,7 @@ module psi_i2_serial_mod interface psi_upd_xyz subroutine psi_i2_upd_xyz(m,alpha, beta, gamma,delta,x, y, z, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m integer(psb_i2pk_), intent (in) :: x(:) @@ -114,7 +114,7 @@ module psi_i2_serial_mod interface psi_xyzw subroutine psi_i2xyzw(m,a,b,c,d,e,f,x, y, z,w, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m integer(psb_i2pk_), intent (in) :: x(:) @@ -128,21 +128,21 @@ module psi_i2_serial_mod interface psi_gth subroutine psi_i2gthmv(n,k,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) integer(psb_i2pk_) :: x(:,:), y(:),alpha,beta end subroutine psi_i2gthmv subroutine psi_i2gthv(n,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) integer(psb_i2pk_) :: x(:), y(:),alpha,beta end subroutine psi_i2gthv subroutine psi_i2gthzmv(n,k,idx,x,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -150,7 +150,7 @@ module psi_i2_serial_mod end subroutine psi_i2gthzmv subroutine psi_i2gthzmm(n,k,idx,x,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -158,8 +158,7 @@ module psi_i2_serial_mod end subroutine psi_i2gthzmm subroutine psi_i2gthzv(n,idx,x,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ - implicit none + import integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) integer(psb_i2pk_) :: x(:), y(:) @@ -168,21 +167,21 @@ module psi_i2_serial_mod interface psi_sct subroutine psi_i2sctmm(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) integer(psb_i2pk_) :: beta, x(:,:), y(:,:) end subroutine psi_i2sctmm subroutine psi_i2sctmv(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) integer(psb_i2pk_) :: beta, x(:), y(:,:) end subroutine psi_i2sctmv subroutine psi_i2sctv(n,idx,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n @@ -193,7 +192,7 @@ module psi_i2_serial_mod interface psi_exscan subroutine psi_i2_exscanv(n,x,info,shift) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: n integer(psb_i2pk_), intent (inout) :: x(:) diff --git a/base/modules/auxil/psi_lcx_mod.f90 b/base/modules/auxil/psi_lcx_mod.f90 index 482069f0e..a876d5220 100644 --- a/base/modules/auxil/psi_lcx_mod.f90 +++ b/base/modules/auxil/psi_lcx_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/auxil/psi_m_serial_mod.f90 b/base/modules/auxil/psi_m_serial_mod.f90 index 05a75bde8..a790fcc0d 100644 --- a/base/modules/auxil/psi_m_serial_mod.f90 +++ b/base/modules/auxil/psi_m_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,12 +30,12 @@ ! ! module psi_m_serial_mod - use psb_const_mod, only : psb_ipk_, psb_lpk_, psb_mpk_, psb_epk_ + use psb_const_mod, only : psb_ipk_, psb_lpk_, psb_mpk_, psb_epk_, psb_i2pk_ interface psb_gelp ! 2-D version subroutine psb_m_mgelp(trans,iperm,x,info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_), intent(inout) :: x(:,:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -43,7 +43,7 @@ module psi_m_serial_mod character, intent(in) :: trans end subroutine psb_m_mgelp subroutine psb_m_mgelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_), intent(inout) :: x(:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -51,7 +51,7 @@ module psi_m_serial_mod character, intent(in) :: trans end subroutine psb_m_mgelpv subroutine psb_e_mgelp(trans,iperm,x,info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_), intent(inout) :: x(:,:) integer(psb_epk_), intent(in) :: iperm(:) @@ -59,7 +59,7 @@ module psi_m_serial_mod character, intent(in) :: trans end subroutine psb_e_mgelp subroutine psb_e_mgelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_), intent(inout) :: x(:) integer(psb_epk_), intent(in) :: iperm(:) @@ -70,7 +70,7 @@ module psi_m_serial_mod interface psb_geaxpby subroutine psi_maxpby(m,n,alpha, x, beta, y, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m, n integer(psb_mpk_), intent (in) :: x(:,:) @@ -79,7 +79,7 @@ module psi_m_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_maxpby subroutine psi_maxpbyv(m,alpha, x, beta, y, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m integer(psb_mpk_), intent (in) :: x(:) @@ -88,7 +88,7 @@ module psi_m_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_maxpbyv subroutine psi_maxpbyv2(m,alpha, x, beta, y, z, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m integer(psb_mpk_), intent (in) :: x(:) @@ -101,7 +101,7 @@ module psi_m_serial_mod interface psi_upd_xyz subroutine psi_m_upd_xyz(m,alpha, beta, gamma,delta,x, y, z, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m integer(psb_mpk_), intent (in) :: x(:) @@ -114,7 +114,7 @@ module psi_m_serial_mod interface psi_xyzw subroutine psi_mxyzw(m,a,b,c,d,e,f,x, y, z,w, info) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: m integer(psb_mpk_), intent (in) :: x(:) @@ -128,21 +128,21 @@ module psi_m_serial_mod interface psi_gth subroutine psi_mgthmv(n,k,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) integer(psb_mpk_) :: x(:,:), y(:),alpha,beta end subroutine psi_mgthmv subroutine psi_mgthv(n,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) integer(psb_mpk_) :: x(:), y(:),alpha,beta end subroutine psi_mgthv subroutine psi_mgthzmv(n,k,idx,x,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -150,7 +150,7 @@ module psi_m_serial_mod end subroutine psi_mgthzmv subroutine psi_mgthzmm(n,k,idx,x,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -158,8 +158,7 @@ module psi_m_serial_mod end subroutine psi_mgthzmm subroutine psi_mgthzv(n,idx,x,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ - implicit none + import integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) integer(psb_mpk_) :: x(:), y(:) @@ -168,21 +167,21 @@ module psi_m_serial_mod interface psi_sct subroutine psi_msctmm(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) integer(psb_mpk_) :: beta, x(:,:), y(:,:) end subroutine psi_msctmm subroutine psi_msctmv(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) integer(psb_mpk_) :: beta, x(:), y(:,:) end subroutine psi_msctmv subroutine psi_msctv(n,idx,x,beta,y) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_mpk_) :: n @@ -193,7 +192,7 @@ module psi_m_serial_mod interface psi_exscan subroutine psi_m_exscanv(n,x,info,shift) - import :: psb_ipk_, psb_lpk_,psb_mpk_, psb_epk_ + import implicit none integer(psb_ipk_), intent(in) :: n integer(psb_mpk_), intent (inout) :: x(:) diff --git a/base/modules/auxil/psi_s_serial_mod.f90 b/base/modules/auxil/psi_s_serial_mod.f90 index 95f536f32..b7c657e1d 100644 --- a/base/modules/auxil/psi_s_serial_mod.f90 +++ b/base/modules/auxil/psi_s_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,7 +35,7 @@ module psi_s_serial_mod interface psb_gelp ! 2-D version subroutine psb_m_sgelp(trans,iperm,x,info) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none real(psb_spk_), intent(inout) :: x(:,:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -43,7 +43,7 @@ module psi_s_serial_mod character, intent(in) :: trans end subroutine psb_m_sgelp subroutine psb_m_sgelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_mpk_,psb_spk_ + import implicit none real(psb_spk_), intent(inout) :: x(:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -51,7 +51,7 @@ module psi_s_serial_mod character, intent(in) :: trans end subroutine psb_m_sgelpv subroutine psb_e_sgelp(trans,iperm,x,info) - import :: psb_ipk_, psb_epk_, psb_spk_ + import implicit none real(psb_spk_), intent(inout) :: x(:,:) integer(psb_epk_), intent(in) :: iperm(:) @@ -59,7 +59,7 @@ module psi_s_serial_mod character, intent(in) :: trans end subroutine psb_e_sgelp subroutine psb_e_sgelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_epk_, psb_spk_ + import implicit none real(psb_spk_), intent(inout) :: x(:) integer(psb_epk_), intent(in) :: iperm(:) @@ -70,7 +70,7 @@ module psi_s_serial_mod interface psb_geaxpby subroutine psi_saxpby(m,n,alpha, x, beta, y, info) - import :: psb_ipk_, psb_spk_ + import implicit none integer(psb_ipk_), intent(in) :: m, n real(psb_spk_), intent (in) :: x(:,:) @@ -79,7 +79,7 @@ module psi_s_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_saxpby subroutine psi_saxpbyv(m,alpha, x, beta, y, info) - import :: psb_ipk_, psb_spk_ + import implicit none integer(psb_ipk_), intent(in) :: m real(psb_spk_), intent (in) :: x(:) @@ -88,7 +88,7 @@ module psi_s_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_saxpbyv subroutine psi_saxpbyv2(m,alpha, x, beta, y, z, info) - import :: psb_ipk_, psb_spk_ + import implicit none integer(psb_ipk_), intent(in) :: m real(psb_spk_), intent (in) :: x(:) @@ -101,7 +101,7 @@ module psi_s_serial_mod interface psi_upd_xyz subroutine psi_s_upd_xyz(m,alpha, beta, gamma,delta,x, y, z, info) - import :: psb_ipk_, psb_spk_ + import implicit none integer(psb_ipk_), intent(in) :: m real(psb_spk_), intent (in) :: x(:) @@ -114,7 +114,7 @@ module psi_s_serial_mod interface psi_xyzw subroutine psi_sxyzw(m,a,b,c,d,e,f,x, y, z,w, info) - import :: psb_ipk_, psb_spk_ + import implicit none integer(psb_ipk_), intent(in) :: m real(psb_spk_), intent (in) :: x(:) @@ -128,21 +128,21 @@ module psi_s_serial_mod interface psi_gth subroutine psi_sgthmv(n,k,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) real(psb_spk_) :: x(:,:), y(:),alpha,beta end subroutine psi_sgthmv subroutine psi_sgthv(n,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) real(psb_spk_) :: x(:), y(:),alpha,beta end subroutine psi_sgthv subroutine psi_sgthzmv(n,k,idx,x,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -150,7 +150,7 @@ module psi_s_serial_mod end subroutine psi_sgthzmv subroutine psi_sgthzmm(n,k,idx,x,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -158,8 +158,7 @@ module psi_s_serial_mod end subroutine psi_sgthzmm subroutine psi_sgthzv(n,idx,x,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ - implicit none + import integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) real(psb_spk_) :: x(:), y(:) @@ -168,21 +167,21 @@ module psi_s_serial_mod interface psi_sct subroutine psi_ssctmm(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) real(psb_spk_) :: beta, x(:,:), y(:,:) end subroutine psi_ssctmm subroutine psi_ssctmv(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) real(psb_spk_) :: beta, x(:), y(:,:) end subroutine psi_ssctmv subroutine psi_ssctv(n,idx,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_mpk_) :: n @@ -193,7 +192,7 @@ module psi_s_serial_mod interface psi_exscan subroutine psi_s_exscanv(n,x,info,shift) - import :: psb_ipk_, psb_mpk_, psb_spk_ + import implicit none integer(psb_ipk_), intent(in) :: n real(psb_spk_), intent (inout) :: x(:) diff --git a/base/modules/auxil/psi_serial_mod.f90 b/base/modules/auxil/psi_serial_mod.f90 index 249ecaa2b..fac8a7194 100644 --- a/base/modules/auxil/psi_serial_mod.f90 +++ b/base/modules/auxil/psi_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,6 +30,7 @@ ! ! module psi_serial_mod + use psi_i2_serial_mod use psi_m_serial_mod use psi_e_serial_mod use psi_s_serial_mod diff --git a/base/modules/auxil/psi_z_serial_mod.f90 b/base/modules/auxil/psi_z_serial_mod.f90 index c08a0fece..dd407d33d 100644 --- a/base/modules/auxil/psi_z_serial_mod.f90 +++ b/base/modules/auxil/psi_z_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,7 +35,7 @@ module psi_z_serial_mod interface psb_gelp ! 2-D version subroutine psb_m_zgelp(trans,iperm,x,info) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none complex(psb_dpk_), intent(inout) :: x(:,:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -43,7 +43,7 @@ module psi_z_serial_mod character, intent(in) :: trans end subroutine psb_m_zgelp subroutine psb_m_zgelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_mpk_,psb_dpk_ + import implicit none complex(psb_dpk_), intent(inout) :: x(:) integer(psb_mpk_), intent(in) :: iperm(:) @@ -51,7 +51,7 @@ module psi_z_serial_mod character, intent(in) :: trans end subroutine psb_m_zgelpv subroutine psb_e_zgelp(trans,iperm,x,info) - import :: psb_ipk_, psb_epk_, psb_dpk_ + import implicit none complex(psb_dpk_), intent(inout) :: x(:,:) integer(psb_epk_), intent(in) :: iperm(:) @@ -59,7 +59,7 @@ module psi_z_serial_mod character, intent(in) :: trans end subroutine psb_e_zgelp subroutine psb_e_zgelpv(trans,iperm,x,info) - import :: psb_ipk_, psb_epk_, psb_dpk_ + import implicit none complex(psb_dpk_), intent(inout) :: x(:) integer(psb_epk_), intent(in) :: iperm(:) @@ -70,7 +70,7 @@ module psi_z_serial_mod interface psb_geaxpby subroutine psi_zaxpby(m,n,alpha, x, beta, y, info) - import :: psb_ipk_, psb_dpk_ + import implicit none integer(psb_ipk_), intent(in) :: m, n complex(psb_dpk_), intent (in) :: x(:,:) @@ -79,7 +79,7 @@ module psi_z_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_zaxpby subroutine psi_zaxpbyv(m,alpha, x, beta, y, info) - import :: psb_ipk_, psb_dpk_ + import implicit none integer(psb_ipk_), intent(in) :: m complex(psb_dpk_), intent (in) :: x(:) @@ -88,7 +88,7 @@ module psi_z_serial_mod integer(psb_ipk_), intent(out) :: info end subroutine psi_zaxpbyv subroutine psi_zaxpbyv2(m,alpha, x, beta, y, z, info) - import :: psb_ipk_, psb_dpk_ + import implicit none integer(psb_ipk_), intent(in) :: m complex(psb_dpk_), intent (in) :: x(:) @@ -101,7 +101,7 @@ module psi_z_serial_mod interface psi_upd_xyz subroutine psi_z_upd_xyz(m,alpha, beta, gamma,delta,x, y, z, info) - import :: psb_ipk_, psb_dpk_ + import implicit none integer(psb_ipk_), intent(in) :: m complex(psb_dpk_), intent (in) :: x(:) @@ -114,7 +114,7 @@ module psi_z_serial_mod interface psi_xyzw subroutine psi_zxyzw(m,a,b,c,d,e,f,x, y, z,w, info) - import :: psb_ipk_, psb_dpk_ + import implicit none integer(psb_ipk_), intent(in) :: m complex(psb_dpk_), intent (in) :: x(:) @@ -128,21 +128,21 @@ module psi_z_serial_mod interface psi_gth subroutine psi_zgthmv(n,k,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) complex(psb_dpk_) :: x(:,:), y(:),alpha,beta end subroutine psi_zgthmv subroutine psi_zgthv(n,idx,alpha,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) complex(psb_dpk_) :: x(:), y(:),alpha,beta end subroutine psi_zgthv subroutine psi_zgthzmv(n,k,idx,x,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -150,7 +150,7 @@ module psi_z_serial_mod end subroutine psi_zgthzmv subroutine psi_zgthzmm(n,k,idx,x,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) @@ -158,8 +158,7 @@ module psi_z_serial_mod end subroutine psi_zgthzmm subroutine psi_zgthzv(n,idx,x,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ - implicit none + import integer(psb_mpk_) :: n integer(psb_ipk_) :: idx(:) complex(psb_dpk_) :: x(:), y(:) @@ -168,21 +167,21 @@ module psi_z_serial_mod interface psi_sct subroutine psi_zsctmm(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) complex(psb_dpk_) :: beta, x(:,:), y(:,:) end subroutine psi_zsctmm subroutine psi_zsctmv(n,k,idx,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n, k integer(psb_ipk_) :: idx(:) complex(psb_dpk_) :: beta, x(:), y(:,:) end subroutine psi_zsctmv subroutine psi_zsctv(n,idx,x,beta,y) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_mpk_) :: n @@ -193,7 +192,7 @@ module psi_z_serial_mod interface psi_exscan subroutine psi_z_exscanv(n,x,info,shift) - import :: psb_ipk_, psb_mpk_, psb_dpk_ + import implicit none integer(psb_ipk_), intent(in) :: n complex(psb_dpk_), intent (inout) :: x(:) diff --git a/base/modules/comm/comm_schemes/psb_comm_baseline_mod.F90 b/base/modules/comm/comm_schemes/psb_comm_baseline_mod.F90 new file mode 100644 index 000000000..350fd372e --- /dev/null +++ b/base/modules/comm/comm_schemes/psb_comm_baseline_mod.F90 @@ -0,0 +1,62 @@ +module psb_comm_baseline_mod + use psb_comm_schemes_mod, only: psb_comm_handle_type, psb_comm_isend_irecv_ + use psb_const_mod + implicit none + + type, extends(psb_comm_handle_type) :: psb_comm_baseline_handle + ! MPI request IDs for Isend/Irecv (dimension: num_neighbors x 2) + ! First column: send requests, second column: recv requests + integer(psb_ipk_), allocatable :: comid(:,:) + contains + procedure, pass :: init => psb_comm_baseline_init + procedure, pass :: free => psb_comm_baseline_free + procedure, pass :: set_swap_status => psb_comm_baseline_set_swap_status + procedure, pass :: get_swap_status => psb_comm_baseline_get_swap_status + end type psb_comm_baseline_handle + +contains + + subroutine psb_comm_baseline_init(this, info) + implicit none + class(psb_comm_baseline_handle), intent(inout) :: this + integer(psb_ipk_), intent(out) :: info + info = 0 + this%comm_type = psb_comm_isend_irecv_ + this%id = 0 + this%swap_status = 0 + end subroutine psb_comm_baseline_init + + subroutine psb_comm_baseline_free(this, info) + class(psb_comm_baseline_handle), intent(inout) :: this + integer(psb_ipk_), intent(out) :: info + info = 0 + ! Free MPI resources (comid) + if (allocated(this%comid)) deallocate(this%comid, stat=info) + end subroutine psb_comm_baseline_free + + subroutine psb_comm_baseline_set_swap_status(this, flag, info) + class(psb_comm_baseline_handle), intent(inout) :: this + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + info = 0 + this%swap_status = flag + end subroutine psb_comm_baseline_set_swap_status + + subroutine psb_comm_baseline_get_swap_status(this, flag, info) + class(psb_comm_baseline_handle), intent(in) :: this + integer(psb_ipk_), intent(out) :: flag + integer(psb_ipk_), intent(out) :: info + info = 0 + flag = this%swap_status + end subroutine psb_comm_baseline_get_swap_status + + ! Allocate comid array for num_neighbors + subroutine psb_comm_baseline_alloc_comid(this, n, info) + implicit none + class(psb_comm_baseline_handle), intent(inout) :: this + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + allocate(this%comid(n, 2_psb_ipk_), stat=info) + end subroutine psb_comm_baseline_alloc_comid + +end module psb_comm_baseline_mod diff --git a/base/modules/comm/comm_schemes/psb_comm_factory_mod.F90 b/base/modules/comm/comm_schemes/psb_comm_factory_mod.F90 new file mode 100644 index 000000000..fbb633585 --- /dev/null +++ b/base/modules/comm/comm_schemes/psb_comm_factory_mod.F90 @@ -0,0 +1,128 @@ +module psb_comm_factory_mod + use psb_const_mod + use psb_comm_schemes_mod, only: psb_comm_handle_type, psb_comm_isend_irecv_, & + & psb_comm_ineighbor_alltoallv_, psb_comm_persistent_ineighbor_alltoallv_, & + & psb_comm_rma_pull_, psb_comm_rma_push_, & + & psb_comm_unknown_, psb_comm_status_start_, psb_comm_status_wait_, & + & psb_comm_status_sync_, psb_comm_status_unknown_ + use psb_comm_baseline_mod, only: psb_comm_baseline_handle + use psb_comm_neighbor_impl_mod, only: psb_comm_neighbor_handle + use psb_comm_rma_mod, only: psb_comm_rma_handle + implicit none + +contains + + ! Allocatable-based factory routines (preferred names) + subroutine psb_comm_set(comm_type, handle, info) + implicit none + integer(psb_ipk_), intent(in) :: comm_type + class(psb_comm_handle_type), allocatable, intent(inout) :: handle + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: old_id, old_swap_status + + info = 0 + old_id = 0 + old_swap_status = psb_comm_status_unknown_ + + if (allocated(handle)) then + old_id = handle%id + old_swap_status = handle%swap_status + + if (handle%comm_type == comm_type) then + call handle%free(info) + if (info /= 0) return + call handle%init(info) + if (info /= 0) return + handle%id = old_id + handle%swap_status = old_swap_status + select type(h => handle) + type is(psb_comm_neighbor_handle) + h%comm_type = comm_type + h%use_persistent_buffers = (comm_type == psb_comm_persistent_ineighbor_alltoallv_) + type is(psb_comm_rma_handle) + h%comm_type = comm_type + class default + ! nothing else to configure + end select + return + else + call psb_comm_free(handle, info) + if (info /= 0) return + end if + end if + + select case(comm_type) + case(psb_comm_ineighbor_alltoallv_, psb_comm_persistent_ineighbor_alltoallv_) + allocate(psb_comm_neighbor_handle :: handle, stat=info) + if (info /= 0) return + call handle%init(info) + if (info /= 0) return + handle%id = old_id + handle%swap_status = old_swap_status + select type(h => handle) + type is(psb_comm_neighbor_handle) + h%comm_type = comm_type + h%use_persistent_buffers = (comm_type == psb_comm_persistent_ineighbor_alltoallv_) + end select + case(psb_comm_rma_pull_, psb_comm_rma_push_) + allocate(psb_comm_rma_handle :: handle, stat=info) + if (info /= 0) return + call handle%init(info) + if (info /= 0) return + handle%id = old_id + handle%swap_status = old_swap_status + select type(h => handle) + type is(psb_comm_rma_handle) + h%comm_type = comm_type + end select + case default + allocate(psb_comm_baseline_handle :: handle, stat=info) + if (info /= 0) return + call handle%init(info) + if (info /= 0) return + handle%id = old_id + handle%swap_status = old_swap_status + end select + end subroutine psb_comm_set + + subroutine psb_comm_free(handle, info) + implicit none + class(psb_comm_handle_type), allocatable, intent(inout) :: handle + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (.not. allocated(handle)) return + call handle%free(info) + if (allocated(handle)) then + deallocate(handle) + end if + end subroutine psb_comm_free + + subroutine psb_comm_set_swap_status(handle, flag, info) + implicit none + class(psb_comm_handle_type), allocatable, intent(inout) :: handle + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + info = 0 + if (.not. allocated(handle)) then + info = -1 + return + end if + call handle%set_swap_status(flag, info) + end subroutine psb_comm_set_swap_status + + subroutine psb_comm_get_swap_status(handle, flag, info) + implicit none + class(psb_comm_handle_type), allocatable, intent(in) :: handle + integer(psb_ipk_), intent(out) :: flag + integer(psb_ipk_), intent(out) :: info + info = 0 + if (.not. allocated(handle)) then + flag = 0 + info = -1 + return + end if + call handle%get_swap_status(flag, info) + end subroutine psb_comm_get_swap_status + +end module psb_comm_factory_mod diff --git a/base/modules/comm/comm_schemes/psb_comm_neighbor_impl_mod.F90 b/base/modules/comm/comm_schemes/psb_comm_neighbor_impl_mod.F90 new file mode 100644 index 000000000..4ae0f9f73 --- /dev/null +++ b/base/modules/comm/comm_schemes/psb_comm_neighbor_impl_mod.F90 @@ -0,0 +1,460 @@ +! Merged neighbor-topology module +! +module psb_comm_neighbor_impl_mod + use psb_const_mod + use psb_desc_const_mod, only: psb_proc_id_, psb_n_elem_recv_, psb_elem_recv_, & + & psb_n_elem_send_, psb_elem_send_ + use psb_error_mod + use psb_comm_schemes_mod, only: psb_comm_handle_type, psb_comm_ineighbor_alltoallv_ +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type, extends(psb_comm_handle_type) :: psb_comm_neighbor_handle + integer(psb_mpk_) :: graph_comm = mpi_comm_null + integer(psb_ipk_) :: num_neighbors = 0 + integer(psb_mpk_), allocatable :: send_counts(:), recv_counts(:) + integer(psb_mpk_), allocatable :: send_displs(:), recv_displs(:) + integer(psb_mpk_), allocatable :: send_displs_v(:), recv_displs_v(:) + integer(psb_ipk_), allocatable :: send_indexes(:) + integer(psb_ipk_), allocatable :: recv_indexes(:) + integer(psb_ipk_) :: total_send = 0 + integer(psb_ipk_) :: total_recv = 0 + logical :: is_initialized = .false. + logical :: use_persistent_buffers = .false. + integer(psb_mpk_) :: comm_request = mpi_request_null + integer(psb_mpk_) :: persistent_request = mpi_request_null + logical :: persistent_request_ready = .false. + logical :: persistent_in_flight = .false. + integer(psb_ipk_) :: persistent_buffer_size = 0 + contains + procedure, pass :: init => psb_comm_neighbor_init + procedure, pass :: free => neighbor_topology_free + procedure, pass :: set_swap_status => psb_comm_neighbor_set_swap_status + procedure, pass :: get_swap_status => psb_comm_neighbor_get_swap_status + procedure, pass :: topology_init => neighbor_topology_init + procedure, pass :: sizeof => neighbor_topology_sizeof + end type psb_comm_neighbor_handle + + +contains + + ! --------------------------------------------------------------- + ! neighbor_topology_init + ! + ! Parse the halo index list (obtained via desc_a%get_list_p) + ! and build: + ! - MPI dist-graph communicator with only the true neighbors + ! - per-neighbor send/recv counts and displacements + ! - contiguous gather/scatter index arrays + ! + ! The topology is stored inside the vector and lazily built + ! on the first psi_swapdata call that uses the neighbor-alltoallv + ! communication mode. + ! + ! Arguments: + ! topology - the persistent state (output, intent inout) + ! halo_index - halo_index array (from get_list_p, intent in) + ! num_neighbors - number of exchanges (from get_list_p) + ! total_send_elems - total send count (from get_list_p) + ! total_recv_elems - total recv count (from get_list_p) + ! ctxt - PSBLAS context + ! icomm - MPI communicator + ! info - error code (output) + ! --------------------------------------------------------------- + subroutine neighbor_topology_init(topology, halo_index, num_neighbors, & + & total_send_elems, total_recv_elems, ctxt, icomm, info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + class(psb_comm_neighbor_handle), intent(inout) :: topology + integer(psb_ipk_), intent(in) :: halo_index(:) + integer(psb_ipk_), intent(in) :: num_neighbors, total_send_elems, total_recv_elems + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: icomm + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: iret + integer(psb_ipk_) :: i, k, idx_ptr, num_elem_recv, num_elem_send, partner_proc + integer(psb_ipk_) :: neighbor_count, send_offset, recv_offset + integer(psb_mpk_), allocatable :: source_ranks(:), dest_ranks(:) + integer(psb_mpk_), allocatable :: source_weights(:), dest_weights(:) + integer(psb_mpk_) :: in_degree, out_degree + character(len=40) :: name + integer(psb_ipk_) :: proc_id + integer(psb_ipk_) :: position + integer(psb_ipk_) :: err_act + + info = psb_success_ + name = 'neighbor_topology_init' + call psb_erractionsave(err_act) + + ! Clean up any previous state + call topology%free(info) + + ! ---------------------------------------------------------- + ! First pass: count neighbors (excluding self) and totals + ! ---------------------------------------------------------- + topology%num_neighbors = 0 + topology%total_send = 0 + topology%total_recv = 0 + + if(size(halo_index) < 1) then + call psb_errpush(psb_err_topology_invalid_args_,name) + goto 9999 + end if + + allocate(source_ranks(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Source ranks allocation failed') + goto 9999 + end if + + allocate(dest_ranks(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Destination ranks allocation failed') + goto 9999 + end if + + allocate(source_weights(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Source weights allocation failed') + goto 9999 + end if + + allocate(dest_weights(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Destination weights allocation failed') + goto 9999 + end if + + allocate(topology%send_counts(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Send counts allocation failed') + goto 9999 + end if + + allocate(topology%recv_counts(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Receive counts allocation failed') + goto 9999 + end if + + allocate(topology%send_displs(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Send displacements allocation failed') + goto 9999 + end if + + allocate(topology%recv_displs(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Receive displacements allocation failed') + goto 9999 + end if + + allocate(topology%send_displs_v(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Send vect displacements allocation failed') + goto 9999 + end if + + allocate(topology%recv_displs_v(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Receive vect displacements allocation failed') + goto 9999 + end if + + + ! ----------------------------------------------------------- + ! Allocate the gather/scatter index arrays + ! ----------------------------------------------------------- + allocate(topology%send_indexes(total_send_elems), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Send indexes allocation failed') + goto 9999 + end if + + allocate(topology%recv_indexes(total_recv_elems), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Recv indexes allocation failed') + goto 9999 + end if + + ! ----------------------------------------------------------- + ! Fill neighbor ranks, weights, counts, displacements, + ! and gather/scatter index arrays. + ! + ! The halo_index layout per neighbor (starting at position): + ! position + 0 : process id + ! position + 1 : nerv (num recv elements) + ! position + 2 .. +1+nerv : recv element indexes + ! position + 2+nerv : nesd (num send elements) + ! position + 3+nerv .. +2+nerv+nesd : send element indexes + ! Total stride per neighbor: nerv + nesd + 3 + ! ----------------------------------------------------------- + send_offset = 0 + recv_offset = 0 + position = 1 + + do i = 1, num_neighbors + proc_id = halo_index(position) + num_elem_recv = halo_index(position + 1) + num_elem_send = halo_index(position + num_elem_recv + 2) + + ! Fill source/destination ranks and weights (weights are all 1 for now) + source_ranks(i) = int(proc_id, psb_mpk_) + dest_ranks(i) = int(proc_id, psb_mpk_) + source_weights(i) = 1 + dest_weights(i) = 1 + + ! Counts and displacements (displs set BEFORE accumulating offset) + topology%send_counts(i) = int(num_elem_send, psb_mpk_) + topology%recv_counts(i) = int(num_elem_recv, psb_mpk_) + topology%send_displs(i) = int(send_offset, psb_mpk_) + topology%recv_displs(i) = int(recv_offset, psb_mpk_) + ! Positional displacements: match the combuf layout used by gthzbuf/sctb_buf + ! snd_pt = 1 + position + num_elem_recv + psb_n_elem_send_ → displs = snd_pt - 1 + ! rcv_pt = 1 + position + psb_n_elem_recv_ → displs = rcv_pt - 1 + topology%send_displs_v(i) = int(position + num_elem_recv + psb_n_elem_send_, psb_mpk_) + topology%recv_displs_v(i) = int(position + psb_n_elem_recv_, psb_mpk_) + + ! Fill recv_indexes from halo_index(position+2 .. position+1+nerv) + do k = 1, num_elem_recv + topology%recv_indexes(recv_offset + k) = halo_index(position + psb_elem_recv_ + k - 1) + end do + + ! Fill send_indexes from halo_index(position+3+nerv .. position+2+nerv+nesd) + do k = 1, num_elem_send + topology%send_indexes(send_offset + k) = halo_index(position + num_elem_recv + psb_elem_send_ + k - 1) + end do + + send_offset = send_offset + num_elem_send + recv_offset = recv_offset + num_elem_recv + + topology%num_neighbors = topology%num_neighbors + 1 + topology%total_send = topology%total_send + num_elem_send + topology%total_recv = topology%total_recv + num_elem_recv + + position = position + num_elem_recv + num_elem_send + 3 + end do + + ! ---------------------------------------------------------- + ! Sanity check: the totals computed from the neighbor list + ! should match the totals returned by get_list_p. + ! ---------------------------------------------------------- + if (topology%total_send /= total_send_elems) then + info = psb_err_topology_args_mismatch_ + call psb_errpush(info, name, a_err='Send elements mismatch') + goto 9999 + end if + + if (topology%total_recv /= total_recv_elems) then + info = psb_err_topology_args_mismatch_ + call psb_errpush(info, name, a_err='Receive elements mismatch') + goto 9999 + end if + + if(topology%num_neighbors /= num_neighbors) then + info = psb_err_topology_args_mismatch_ + call psb_errpush(info, name, a_err='Number of neighbors mismatch') + goto 9999 + end if + + + ! ---------------------------------------------------------- + ! Build the dist-graph communicator + ! ---------------------------------------------------------- + in_degree = topology%num_neighbors !! Just for clarity + out_degree = topology%num_neighbors !! Just for clarity + + call mpi_dist_graph_create_adjacent(icomm, & + & in_degree, source_ranks, source_weights, & + & out_degree, dest_ranks, dest_weights, & + & mpi_info_null, .false., & ! Check this line for optimizations + & topology%graph_comm, info) + if (info /= mpi_success) then + info = psb_err_topology_error_ + call psb_errpush(info, name) + goto 9999 + end if + + topology%is_initialized = .true. + + ! TODO: Is it safe to deallocate these temporary arrays here, or do we need them for the gather/scatter indexes? + ! deallocate(source_ranks, dest_ranks, source_weights, dest_weights) + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine neighbor_topology_init + + + ! --------------------------------------------------------------- + ! neighbor_topology_free + ! Release all resources held by the persistent state. + ! --------------------------------------------------------------- + subroutine neighbor_topology_free(this, info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + class(psb_comm_neighbor_handle), intent(inout) :: this + integer(psb_ipk_), intent(out) :: info + integer(psb_mpk_) :: iret + + info = psb_success_ + + if (this%persistent_request_ready) then + if (this%persistent_request /= mpi_request_null) then + call mpi_request_free(this%persistent_request, iret) + end if + this%persistent_request = mpi_request_null + this%persistent_request_ready = .false. + this%persistent_in_flight = .false. + this%persistent_buffer_size = 0 + end if + + if (this%graph_comm /= mpi_comm_null) then + call mpi_comm_free(this%graph_comm, iret) + this%graph_comm = mpi_comm_null + end if + + if (allocated(this%send_counts)) deallocate(this%send_counts) + if (allocated(this%recv_counts)) deallocate(this%recv_counts) + if (allocated(this%send_displs)) deallocate(this%send_displs) + if (allocated(this%recv_displs)) deallocate(this%recv_displs) + if (allocated(this%send_displs_v)) deallocate(this%send_displs_v) + if (allocated(this%recv_displs_v)) deallocate(this%recv_displs_v) + if (allocated(this%send_indexes)) deallocate(this%send_indexes) + if (allocated(this%recv_indexes)) deallocate(this%recv_indexes) + + this%num_neighbors = 0 + this%total_send = 0 + this%total_recv = 0 + this%is_initialized = .false. + this%comm_request = mpi_request_null + + end subroutine neighbor_topology_free + + + ! --------------------------------------------------------------- + ! neighbor_topology_sizeof + ! Return approximate memory footprint in bytes. + ! --------------------------------------------------------------- + function neighbor_topology_sizeof(this) result(val) + implicit none + class(psb_comm_neighbor_handle), intent(in) :: this + integer(psb_epk_) :: val + + val = 0 + val = val + psb_sizeof_ip * 6 ! scalar integers + logicals + if (allocated(this%send_counts)) val = val + psb_sizeof_ip * size(this%send_counts) + if (allocated(this%recv_counts)) val = val + psb_sizeof_ip * size(this%recv_counts) + if (allocated(this%send_displs)) val = val + psb_sizeof_ip * size(this%send_displs) + if (allocated(this%recv_displs)) val = val + psb_sizeof_ip * size(this%recv_displs) + if (allocated(this%send_displs_v)) val = val + psb_sizeof_ip * size(this%send_displs_v) + if (allocated(this%recv_displs_v)) val = val + psb_sizeof_ip * size(this%recv_displs_v) + if (allocated(this%send_indexes)) val = val + psb_sizeof_ip * size(this%send_indexes) + if (allocated(this%recv_indexes)) val = val + psb_sizeof_ip * size(this%recv_indexes) + + + end function neighbor_topology_sizeof + + + subroutine psb_comm_neighbor_create(this, comm_type, info) + class(psb_comm_neighbor_handle), intent(inout) :: this + integer(psb_ipk_), intent(in) :: comm_type + integer(psb_ipk_), intent(out) :: info + + info = psb_success_ + this%comm_type = comm_type + this%id = 0 + this%swap_status = 0 + this%comm_request = mpi_request_null + this%persistent_in_flight = .false. + this%persistent_request = mpi_request_null + this%persistent_request_ready = .false. + this%persistent_buffer_size = 0 + + call this%free(info) + end subroutine psb_comm_neighbor_create + + + subroutine psb_comm_neighbor_destroy(this, info) + class(psb_comm_neighbor_handle), intent(inout) :: this + integer(psb_ipk_), intent(out) :: info + + info = psb_success_ + this%comm_request = mpi_request_null + this%persistent_request = mpi_request_null + this%persistent_request_ready = .false. + this%persistent_in_flight = .false. + this%persistent_buffer_size = 0 + call this%free(info) + end subroutine psb_comm_neighbor_destroy + + + subroutine psb_comm_neighbor_set_swap_status(this, flag, info) + class(psb_comm_neighbor_handle), intent(inout) :: this + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + + info = psb_success_ + this%swap_status = flag + end subroutine psb_comm_neighbor_set_swap_status + + + subroutine psb_comm_neighbor_get_swap_status(this, flag, info) + class(psb_comm_neighbor_handle), intent(in) :: this + integer(psb_ipk_), intent(out) :: flag + integer(psb_ipk_), intent(out) :: info + + info = psb_success_ + flag = this%swap_status + end subroutine psb_comm_neighbor_get_swap_status + + subroutine psb_comm_neighbor_init(this, info) + class(psb_comm_neighbor_handle), intent(inout) :: this + integer(psb_ipk_), intent(out) :: info + info = 0 + this%comm_type = psb_comm_ineighbor_alltoallv_ + this%id = 0 + this%swap_status = 0 + this%is_initialized = .false. + this%use_persistent_buffers = .false. + this%comm_request = mpi_request_null + this%persistent_request = mpi_request_null + this%persistent_request_ready = .false. + this%persistent_in_flight = .false. + this%persistent_buffer_size = 0 + end subroutine psb_comm_neighbor_init + + +end module psb_comm_neighbor_impl_mod diff --git a/base/modules/comm/comm_schemes/psb_comm_rma_mod.F90 b/base/modules/comm/comm_schemes/psb_comm_rma_mod.F90 new file mode 100644 index 000000000..6d1a33f1d --- /dev/null +++ b/base/modules/comm/comm_schemes/psb_comm_rma_mod.F90 @@ -0,0 +1,389 @@ +module psb_comm_rma_mod + use psb_const_mod + use psb_desc_const_mod, only: psb_proc_id_, psb_n_elem_recv_, psb_elem_recv_, & + & psb_n_elem_send_, psb_elem_send_ + use psb_error_mod +#ifdef PSB_MPI_MOD + use mpi +#endif + use psb_comm_schemes_mod, only: psb_comm_handle_type, psb_comm_rma_pull_, psb_comm_rma_push_, & + & psb_comm_unknown_ + implicit none + integer(psb_mpk_), parameter :: psb_rma_meta_tag = 913 +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type, extends(psb_comm_handle_type) :: psb_comm_rma_handle + integer(psb_mpk_) :: win = mpi_win_null + logical :: window_ready = .false. + logical :: window_open = .false. + logical :: layout_ready = .false. + integer(psb_ipk_) :: layout_nnbr = -1 + integer(psb_ipk_) :: layout_send = -1 + integer(psb_ipk_) :: layout_recv = -1 + integer(psb_ipk_), allocatable :: peer_proc(:) + integer(psb_ipk_), allocatable :: peer_send_counts(:) + integer(psb_ipk_), allocatable :: peer_recv_counts(:) + integer(psb_ipk_), allocatable :: peer_send_displs(:) + integer(psb_ipk_), allocatable :: peer_recv_displs(:) + integer(psb_ipk_), allocatable :: peer_mpi_rank(:) + integer(psb_ipk_), allocatable :: peer_remote_send_displs(:) + integer(psb_ipk_), allocatable :: peer_remote_recv_displs(:) + integer(psb_ipk_), allocatable :: peer_send_indexes(:) + integer(psb_ipk_), allocatable :: peer_recv_indexes(:) + integer(psb_mpk_), allocatable :: notify_buf(:) + integer(psb_mpk_), allocatable :: notify_recv_reqs(:) + integer(psb_mpk_), allocatable :: notify_send_reqs(:) + contains + procedure, pass :: init => psb_comm_rma_init + procedure, pass :: free => psb_comm_rma_free + procedure, pass :: clear_memory_buffer_layout => psb_comm_rma_clear_memory_buffer_layout + procedure, pass :: init_memory_buffer_layout => psb_comm_rma_ini_memory_buffer_layout + procedure, pass :: init_memory_buffer_layout_tran => psb_comm_rma_ini_memory_buffer_layout_tran + procedure, pass :: set_swap_status => psb_comm_rma_set_swap_status + procedure, pass :: get_swap_status => psb_comm_rma_get_swap_status + end type psb_comm_rma_handle + +contains + + subroutine psb_comm_rma_init(this, info) + class(psb_comm_rma_handle), intent(inout) :: this + integer(psb_ipk_), intent(out) :: info + info = 0 + this%comm_type = psb_comm_unknown_ + this%id = 0 + this%swap_status = 0 + this%win = mpi_win_null + this%window_ready = .false. + this%window_open = .false. + this%layout_ready = .false. + this%layout_nnbr = -1 + this%layout_send = -1 + this%layout_recv = -1 + call this%clear_memory_buffer_layout(info) + end subroutine psb_comm_rma_init + + subroutine psb_comm_rma_clear_memory_buffer_layout(this, info) + class(psb_comm_rma_handle), intent(inout) :: this + integer(psb_ipk_), intent(out) :: info + + info = psb_success_ + if (allocated(this%peer_proc)) deallocate(this%peer_proc) + if (allocated(this%peer_send_counts)) deallocate(this%peer_send_counts) + if (allocated(this%peer_recv_counts)) deallocate(this%peer_recv_counts) + if (allocated(this%peer_send_displs)) deallocate(this%peer_send_displs) + if (allocated(this%peer_recv_displs)) deallocate(this%peer_recv_displs) + if (allocated(this%peer_mpi_rank)) deallocate(this%peer_mpi_rank) + if (allocated(this%peer_remote_send_displs)) deallocate(this%peer_remote_send_displs) + if (allocated(this%peer_remote_recv_displs)) deallocate(this%peer_remote_recv_displs) + if (allocated(this%peer_send_indexes)) deallocate(this%peer_send_indexes) + if (allocated(this%peer_recv_indexes)) deallocate(this%peer_recv_indexes) + if (allocated(this%notify_buf)) deallocate(this%notify_buf) + if (allocated(this%notify_recv_reqs)) deallocate(this%notify_recv_reqs) + if (allocated(this%notify_send_reqs)) deallocate(this%notify_send_reqs) + + this%layout_ready = .false. + this%layout_nnbr = -1 + this%layout_send = -1 + this%layout_recv = -1 + end subroutine psb_comm_rma_clear_memory_buffer_layout + + subroutine psb_comm_rma_ini_memory_buffer_layout(this, info, comm_list, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + class(psb_comm_rma_handle), intent(inout) :: this + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: comm_list(:) + integer(psb_ipk_), intent(in) :: peer_mpi_rank(:) + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + integer(psb_ipk_), intent(in) :: my_rank + integer(psb_mpk_), intent(in) :: icomm + + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size), prc_rank + integer(psb_ipk_) :: n_neighbors, send_total, recv_total + integer(psb_ipk_) :: neighbor_idx, item_idx + integer(psb_ipk_) :: list_pos, send_offset, recv_offset + integer(psb_ipk_) :: proc_to_comm, recv_count, send_count + integer(psb_ipk_) :: local_meta(4), remote_meta(4) + + call this%clear_memory_buffer_layout(info) + if (info /= psb_success_) return + + n_neighbors = num_neighbors + send_total = total_send + recv_total = total_recv + + if (n_neighbors > 0) then + allocate(this%peer_proc(n_neighbors), this%peer_send_counts(n_neighbors), & + & this%peer_recv_counts(n_neighbors), this%peer_send_displs(n_neighbors), & + & this%peer_recv_displs(n_neighbors), this%peer_mpi_rank(n_neighbors), & + & this%peer_remote_send_displs(n_neighbors), this%peer_remote_recv_displs(n_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + return + end if + allocate(this%notify_buf(n_neighbors), this%notify_recv_reqs(n_neighbors), & + & this%notify_send_reqs(n_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + return + end if + this%notify_buf = 0_psb_mpk_ + this%notify_recv_reqs = MPI_REQUEST_NULL + this%notify_send_reqs = MPI_REQUEST_NULL + end if + + if (send_total > 0) then + allocate(this%peer_send_indexes(send_total), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + return + end if + end if + + if (recv_total > 0) then + allocate(this%peer_recv_indexes(recv_total), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + return + end if + end if + + list_pos = 1 + send_offset = 0 + recv_offset = 0 + do neighbor_idx = 1, n_neighbors + proc_to_comm = comm_list(list_pos + psb_proc_id_) + recv_count = comm_list(list_pos + psb_n_elem_recv_) + send_count = comm_list(list_pos + recv_count + psb_n_elem_send_) + + this%peer_proc(neighbor_idx) = proc_to_comm + this%peer_recv_counts(neighbor_idx) = recv_count + this%peer_send_counts(neighbor_idx) = send_count + this%peer_recv_displs(neighbor_idx) = recv_offset + this%peer_send_displs(neighbor_idx) = send_offset + this%peer_mpi_rank(neighbor_idx) = peer_mpi_rank(neighbor_idx) + + if (recv_count > 0) then + do item_idx = 1, recv_count + this%peer_recv_indexes(recv_offset + item_idx) = comm_list(list_pos + psb_elem_recv_ + item_idx - 1) + end do + end if + + if (send_count > 0) then + do item_idx = 1, send_count + this%peer_send_indexes(send_offset + item_idx) = comm_list(list_pos + recv_count + psb_elem_send_ + item_idx - 1) + end do + end if + + recv_offset = recv_offset + recv_count + send_offset = send_offset + send_count + list_pos = list_pos + recv_count + send_count + 3 + end do + + do neighbor_idx = 1, n_neighbors + proc_to_comm = this%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = this%peer_mpi_rank(neighbor_idx) + local_meta = (/ this%peer_send_displs(neighbor_idx)+1, this%peer_send_counts(neighbor_idx), & + & this%peer_recv_displs(neighbor_idx)+1+send_total, this%peer_recv_counts(neighbor_idx) /) + call mpi_sendrecv(local_meta, 4, psb_mpi_mpk_, prc_rank, psb_rma_meta_tag, & + & remote_meta, 4, psb_mpi_mpk_, prc_rank, psb_rma_meta_tag, icomm, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + return + end if + this%peer_remote_send_displs(neighbor_idx) = remote_meta(1) + this%peer_remote_recv_displs(neighbor_idx) = remote_meta(3) + else + this%peer_remote_send_displs(neighbor_idx) = this%peer_send_displs(neighbor_idx)+1 + this%peer_remote_recv_displs(neighbor_idx) = this%peer_recv_displs(neighbor_idx)+1+send_total + end if + end do + + if ((send_offset /= send_total) .or. (recv_offset /= recv_total)) then + info = psb_err_internal_error_ + return + end if + + this%layout_nnbr = n_neighbors + this%layout_send = send_total + this%layout_recv = recv_total + this%layout_ready = .true. + end subroutine psb_comm_rma_ini_memory_buffer_layout + + subroutine psb_comm_rma_free(this, info) +#ifdef PSB_MPI_MOD + use mpi +#endif + class(psb_comm_rma_handle), intent(inout) :: this + integer(psb_ipk_), intent(out) :: info + integer(psb_mpk_) :: iret + + info = 0 + if (this%window_open) then + call mpi_win_unlock_all(this%win, iret) + this%window_open = .false. + end if + if (this%win /= mpi_win_null) then + call mpi_win_free(this%win, iret) + this%win = mpi_win_null + end if + this%window_ready = .false. + this%layout_ready = .false. + this%layout_nnbr = -1 + this%layout_send = -1 + this%layout_recv = -1 + call this%clear_memory_buffer_layout(info) + end subroutine psb_comm_rma_free + + ! Transpose variant: peer_send_* is filled from comm_list RECV area, + ! peer_recv_* from comm_list SEND area. Metadata exchange tells peers our + ! recv displacement so they can GET/PUT to the correct location in swaptran. + ! layout_send = total_recv (effective send), layout_recv = total_send. + subroutine psb_comm_rma_ini_memory_buffer_layout_tran(this, info, comm_list, peer_mpi_rank, & + & num_neighbors, total_send, total_recv, my_rank, icomm) + class(psb_comm_rma_handle), intent(inout) :: this + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: comm_list(:) + integer(psb_ipk_), intent(in) :: peer_mpi_rank(:) + integer(psb_ipk_), intent(in) :: num_neighbors, total_send, total_recv + integer(psb_ipk_), intent(in) :: my_rank + integer(psb_mpk_), intent(in) :: icomm + + integer(psb_mpk_) :: iret, p2pstat(mpi_status_size), prc_rank + integer(psb_ipk_) :: n_neighbors, eff_send, eff_recv + integer(psb_ipk_) :: neighbor_idx, item_idx + integer(psb_ipk_) :: list_pos, send_offset, recv_offset + integer(psb_ipk_) :: proc_to_comm, actual_recv_count, actual_send_count + integer(psb_ipk_) :: local_meta(4), remote_meta(4) + + call this%clear_memory_buffer_layout(info) + if (info /= psb_success_) return + + n_neighbors = num_neighbors + ! For transpose: effective send = actual recv, effective recv = actual send + eff_send = total_recv + eff_recv = total_send + + if (n_neighbors > 0) then + allocate(this%peer_proc(n_neighbors), this%peer_send_counts(n_neighbors), & + & this%peer_recv_counts(n_neighbors), this%peer_send_displs(n_neighbors), & + & this%peer_recv_displs(n_neighbors), this%peer_mpi_rank(n_neighbors), & + & this%peer_remote_send_displs(n_neighbors), this%peer_remote_recv_displs(n_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + return + end if + allocate(this%notify_buf(n_neighbors), this%notify_recv_reqs(n_neighbors), & + & this%notify_send_reqs(n_neighbors), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + return + end if + this%notify_buf = 0_psb_mpk_ + this%notify_recv_reqs = MPI_REQUEST_NULL + this%notify_send_reqs = MPI_REQUEST_NULL + end if + + if (eff_send > 0) then + allocate(this%peer_send_indexes(eff_send), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + return + end if + end if + + if (eff_recv > 0) then + allocate(this%peer_recv_indexes(eff_recv), stat=iret) + if (iret /= 0) then + info = psb_err_alloc_dealloc_ + return + end if + end if + + list_pos = 1 + send_offset = 0 + recv_offset = 0 + do neighbor_idx = 1, n_neighbors + proc_to_comm = comm_list(list_pos + psb_proc_id_) + actual_recv_count = comm_list(list_pos + psb_n_elem_recv_) + actual_send_count = comm_list(list_pos + actual_recv_count + psb_n_elem_send_) + + this%peer_proc(neighbor_idx) = proc_to_comm + ! Swap: effective send = actual recv, effective recv = actual send + this%peer_send_counts(neighbor_idx) = actual_recv_count + this%peer_recv_counts(neighbor_idx) = actual_send_count + this%peer_send_displs(neighbor_idx) = send_offset + this%peer_recv_displs(neighbor_idx) = recv_offset + this%peer_mpi_rank(neighbor_idx) = peer_mpi_rank(neighbor_idx) + + ! peer_send_indexes from RECV area of comm_list (these are indices we gather for "sending") + if (actual_recv_count > 0) then + do item_idx = 1, actual_recv_count + this%peer_send_indexes(send_offset + item_idx) = comm_list(list_pos + psb_elem_recv_ + item_idx - 1) + end do + end if + + ! peer_recv_indexes from SEND area of comm_list (these are indices we scatter into) + if (actual_send_count > 0) then + do item_idx = 1, actual_send_count + this%peer_recv_indexes(recv_offset + item_idx) = comm_list(list_pos + actual_recv_count + psb_elem_send_ + item_idx - 1) + end do + end if + + send_offset = send_offset + actual_recv_count + recv_offset = recv_offset + actual_send_count + list_pos = list_pos + actual_recv_count + actual_send_count + 3 + end do + + do neighbor_idx = 1, n_neighbors + proc_to_comm = this%peer_proc(neighbor_idx) + if (proc_to_comm /= my_rank) then + prc_rank = this%peer_mpi_rank(neighbor_idx) + ! Tell peer: our effective-send (=actual recv) displacement and count, + ! our effective-recv (=actual send) displacement (offset past eff_send area). + local_meta = (/ this%peer_send_displs(neighbor_idx)+1, this%peer_send_counts(neighbor_idx), & + & this%peer_recv_displs(neighbor_idx)+1+eff_send, this%peer_recv_counts(neighbor_idx) /) + call mpi_sendrecv(local_meta, 4, psb_mpi_mpk_, prc_rank, psb_rma_meta_tag, & + & remote_meta, 4, psb_mpi_mpk_, prc_rank, psb_rma_meta_tag, icomm, p2pstat, iret) + if (iret /= mpi_success) then + info = psb_err_mpi_error_ + return + end if + this%peer_remote_send_displs(neighbor_idx) = remote_meta(1) + this%peer_remote_recv_displs(neighbor_idx) = remote_meta(3) + else + this%peer_remote_send_displs(neighbor_idx) = this%peer_send_displs(neighbor_idx)+1 + this%peer_remote_recv_displs(neighbor_idx) = this%peer_recv_displs(neighbor_idx)+1+eff_send + end if + end do + + if ((send_offset /= eff_send) .or. (recv_offset /= eff_recv)) then + info = psb_err_internal_error_ + return + end if + + this%layout_nnbr = n_neighbors + this%layout_send = eff_send + this%layout_recv = eff_recv + this%layout_ready = .true. + end subroutine psb_comm_rma_ini_memory_buffer_layout_tran + + subroutine psb_comm_rma_set_swap_status(this, flag, info) + class(psb_comm_rma_handle), intent(inout) :: this + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + info = 0 + this%swap_status = flag + end subroutine psb_comm_rma_set_swap_status + + subroutine psb_comm_rma_get_swap_status(this, flag, info) + class(psb_comm_rma_handle), intent(in) :: this + integer(psb_ipk_), intent(out) :: flag + integer(psb_ipk_), intent(out) :: info + info = 0 + flag = this%swap_status + end subroutine psb_comm_rma_get_swap_status + +end module psb_comm_rma_mod \ No newline at end of file diff --git a/base/modules/comm/comm_schemes/psb_comm_schemes_mod.F90 b/base/modules/comm/comm_schemes/psb_comm_schemes_mod.F90 new file mode 100644 index 000000000..d3467a2c9 --- /dev/null +++ b/base/modules/comm/comm_schemes/psb_comm_schemes_mod.F90 @@ -0,0 +1,69 @@ +! +! psb_comm_mod - communication handle module +! +module psb_comm_schemes_mod + use psb_const_mod + implicit none + + ! Communication type enumeration (keeps compatibility with integer selectors) + enum, bind(c) + enumerator psb_comm_unknown_ + enumerator psb_comm_isend_irecv_ + enumerator psb_comm_ineighbor_alltoallv_ + enumerator psb_comm_persistent_ineighbor_alltoallv_ + enumerator psb_comm_rma_pull_ + enumerator psb_comm_rma_push_ + end enum + + enum, bind(c) + enumerator psb_comm_status_unknown_ + enumerator psb_comm_status_start_ + enumerator psb_comm_status_wait_ + enumerator psb_comm_status_sync_ ! Used in order to exchange data in a synchronous way (Start and recv in the same call) + end enum + + + ! --- comm handle type --- + type, abstract :: psb_comm_handle_type + integer(psb_ipk_) :: id = -1 + integer(psb_ipk_) :: comm_type = psb_comm_unknown_ + integer(psb_ipk_) :: swap_status = psb_comm_status_unknown_ + contains + procedure(psb_comm_set), deferred :: init + procedure(psb_comm_free), deferred :: free + procedure(psb_comm_set_swap_status), deferred :: set_swap_status + procedure(psb_comm_get_swap_status), deferred :: get_swap_status + end type psb_comm_handle_type + + ! --- abstract interfaces --- + abstract interface + subroutine psb_comm_set(this, info) + import :: psb_ipk_, psb_comm_handle_type + class(psb_comm_handle_type), intent(inout) :: this + integer(psb_ipk_), intent(out) :: info + end subroutine + + subroutine psb_comm_free(this, info) + import :: psb_ipk_, psb_comm_handle_type + class(psb_comm_handle_type), intent(inout) :: this + integer(psb_ipk_), intent(out) :: info + end subroutine + + subroutine psb_comm_set_swap_status(this, flag, info) + import :: psb_ipk_, psb_comm_handle_type + class(psb_comm_handle_type), intent(inout) :: this + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + end subroutine + + subroutine psb_comm_get_swap_status(this, flag, info) + import :: psb_ipk_, psb_comm_handle_type + class(psb_comm_handle_type), intent(in) :: this + integer(psb_ipk_), intent(out) :: flag + integer(psb_ipk_), intent(out) :: info + end subroutine + end interface + +contains + +end module psb_comm_schemes_mod diff --git a/base/modules/comm/psb_base_linmap_mod.f90 b/base/modules/comm/psb_base_linmap_mod.f90 index b06470aa6..aeb3822a3 100644 --- a/base/modules/comm/psb_base_linmap_mod.f90 +++ b/base/modules/comm/psb_base_linmap_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/comm/psb_c_comm_a_mod.f90 b/base/modules/comm/psb_c_comm_a_mod.f90 index 0fbcf01ec..c25270ecd 100644 --- a/base/modules/comm/psb_c_comm_a_mod.f90 +++ b/base/modules/comm/psb_c_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/comm/psb_c_comm_mod.f90 b/base/modules/comm/psb_c_comm_mod.f90 index 1bd461977..584589b9c 100644 --- a/base/modules/comm/psb_c_comm_mod.f90 +++ b/base/modules/comm/psb_c_comm_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -37,46 +37,42 @@ module psb_c_comm_mod use psb_c_multivect_mod, only : psb_c_multivect_type, psb_c_base_multivect_type interface psb_ovrl - subroutine psb_covrl_vect(x,desc_a,info,work,update,mode) + subroutine psb_covrl_vect(x,desc_a,info,update,mode) import implicit none - type(psb_c_vect_type), intent(inout) :: x + type(psb_c_vect_type), intent(inout) :: x type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), intent(inout), optional, target :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode end subroutine psb_covrl_vect - subroutine psb_covrl_multivect(x,desc_a,info,work,update,mode) + subroutine psb_covrl_multivect(x,desc_a,info,update,mode) import implicit none - type(psb_c_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), intent(inout), optional, target :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_c_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode end subroutine psb_covrl_multivect end interface psb_ovrl interface psb_halo - subroutine psb_chalo_vect(x,desc_a,info,work,tran,mode,data) + subroutine psb_chalo_vect(x,desc_a,info,tran,mode,data) import implicit none - type(psb_c_vect_type), intent(inout) :: x + type(psb_c_vect_type), intent(inout) :: x type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data character, intent(in), optional :: tran end subroutine psb_chalo_vect - subroutine psb_chalo_multivect(x,desc_a,info,work,tran,mode,data) + subroutine psb_chalo_multivect(x,desc_a,info,tran,mode,data) import implicit none - type(psb_c_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + type(psb_c_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran end subroutine psb_chalo_multivect end interface psb_halo diff --git a/base/modules/comm/psb_c_linmap_mod.f90 b/base/modules/comm/psb_c_linmap_mod.f90 index 07257d881..99957b00b 100644 --- a/base/modules/comm/psb_c_linmap_mod.f90 +++ b/base/modules/comm/psb_c_linmap_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -73,15 +73,14 @@ module psb_c_linmap_mod integer(psb_ipk_), intent(out) :: info complex(psb_spk_), optional :: work(:) end subroutine psb_c_map_U2V_a - subroutine psb_c_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) + subroutine psb_c_map_U2V_v(alpha,x,beta,y,map,info,vtx,vty) use psb_c_vect_mod, only : psb_c_vect_type import :: psb_ipk_, psb_spk_, psb_clinmap_type - implicit none + implicit none class(psb_clinmap_type), intent(in) :: map complex(psb_spk_), intent(in) :: alpha,beta type(psb_c_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), optional :: work(:) + integer(psb_ipk_), intent(out) :: info type(psb_c_vect_type), optional, target, intent(inout) :: vtx,vty end subroutine psb_c_map_U2V_v end interface @@ -97,15 +96,14 @@ module psb_c_linmap_mod integer(psb_ipk_), intent(out) :: info complex(psb_spk_), optional :: work(:) end subroutine psb_c_map_V2U_a - subroutine psb_c_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) + subroutine psb_c_map_V2U_v(alpha,x,beta,y,map,info,vtx,vty) use psb_c_vect_mod, only : psb_c_vect_type import :: psb_ipk_, psb_spk_, psb_clinmap_type - implicit none + implicit none class(psb_clinmap_type), intent(in) :: map complex(psb_spk_), intent(in) :: alpha,beta type(psb_c_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), optional :: work(:) + integer(psb_ipk_), intent(out) :: info type(psb_c_vect_type), optional, target, intent(inout) :: vtx,vty end subroutine psb_c_map_V2U_v end interface diff --git a/base/modules/comm/psb_comm_mod.f90 b/base/modules/comm/psb_comm_mod.f90 index 17cffe4cd..66d1ba770 100644 --- a/base/modules/comm/psb_comm_mod.f90 +++ b/base/modules/comm/psb_comm_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,6 +31,7 @@ ! module psb_comm_mod + use psb_i2_comm_a_mod use psb_m_comm_a_mod use psb_e_comm_a_mod use psb_s_comm_a_mod @@ -45,4 +46,16 @@ module psb_comm_mod use psb_c_comm_mod use psb_z_comm_mod + ! Import scheme symbols and re-export them as public symbols from this module. + use psb_comm_schemes_mod, only: psb_comm_handle_type, psb_comm_isend_irecv_, & + & psb_comm_ineighbor_alltoallv_, psb_comm_persistent_ineighbor_alltoallv_, & + & psb_comm_rma_pull_, psb_comm_rma_push_, psb_comm_unknown_, & + & psb_comm_status_unknown_, psb_comm_status_start_, psb_comm_status_wait_, & + & psb_comm_status_sync_ + + public :: psb_comm_handle_type, psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_, psb_comm_rma_pull_, psb_comm_rma_push_, & + & psb_comm_unknown_, psb_comm_status_unknown_, psb_comm_status_start_, & + & psb_comm_status_wait_, psb_comm_status_sync_ + end module psb_comm_mod diff --git a/base/modules/comm/psb_d_comm_a_mod.f90 b/base/modules/comm/psb_d_comm_a_mod.f90 index 5fb410f2d..aa3c6feb8 100644 --- a/base/modules/comm/psb_d_comm_a_mod.f90 +++ b/base/modules/comm/psb_d_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/comm/psb_d_comm_mod.f90 b/base/modules/comm/psb_d_comm_mod.f90 index 013c76e2a..51d2cb69f 100644 --- a/base/modules/comm/psb_d_comm_mod.f90 +++ b/base/modules/comm/psb_d_comm_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -37,46 +37,42 @@ module psb_d_comm_mod use psb_d_multivect_mod, only : psb_d_multivect_type, psb_d_base_multivect_type interface psb_ovrl - subroutine psb_dovrl_vect(x,desc_a,info,work,update,mode) + subroutine psb_dovrl_vect(x,desc_a,info,update,mode) import implicit none - type(psb_d_vect_type), intent(inout) :: x + type(psb_d_vect_type), intent(inout) :: x type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), intent(inout), optional, target :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode end subroutine psb_dovrl_vect - subroutine psb_dovrl_multivect(x,desc_a,info,work,update,mode) + subroutine psb_dovrl_multivect(x,desc_a,info,update,mode) import implicit none - type(psb_d_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), intent(inout), optional, target :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_d_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode end subroutine psb_dovrl_multivect end interface psb_ovrl interface psb_halo - subroutine psb_dhalo_vect(x,desc_a,info,work,tran,mode,data) + subroutine psb_dhalo_vect(x,desc_a,info,tran,mode,data) import implicit none - type(psb_d_vect_type), intent(inout) :: x + type(psb_d_vect_type), intent(inout) :: x type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data character, intent(in), optional :: tran end subroutine psb_dhalo_vect - subroutine psb_dhalo_multivect(x,desc_a,info,work,tran,mode,data) + subroutine psb_dhalo_multivect(x,desc_a,info,tran,mode,data) import implicit none - type(psb_d_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + type(psb_d_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran end subroutine psb_dhalo_multivect end interface psb_halo diff --git a/base/modules/comm/psb_d_linmap_mod.f90 b/base/modules/comm/psb_d_linmap_mod.f90 index 744cad2d0..8463cfb39 100644 --- a/base/modules/comm/psb_d_linmap_mod.f90 +++ b/base/modules/comm/psb_d_linmap_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -73,15 +73,14 @@ module psb_d_linmap_mod integer(psb_ipk_), intent(out) :: info real(psb_dpk_), optional :: work(:) end subroutine psb_d_map_U2V_a - subroutine psb_d_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) + subroutine psb_d_map_U2V_v(alpha,x,beta,y,map,info,vtx,vty) use psb_d_vect_mod, only : psb_d_vect_type import :: psb_ipk_, psb_dpk_, psb_dlinmap_type - implicit none + implicit none class(psb_dlinmap_type), intent(in) :: map real(psb_dpk_), intent(in) :: alpha,beta type(psb_d_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), optional :: work(:) + integer(psb_ipk_), intent(out) :: info type(psb_d_vect_type), optional, target, intent(inout) :: vtx,vty end subroutine psb_d_map_U2V_v end interface @@ -97,15 +96,14 @@ module psb_d_linmap_mod integer(psb_ipk_), intent(out) :: info real(psb_dpk_), optional :: work(:) end subroutine psb_d_map_V2U_a - subroutine psb_d_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) + subroutine psb_d_map_V2U_v(alpha,x,beta,y,map,info,vtx,vty) use psb_d_vect_mod, only : psb_d_vect_type import :: psb_ipk_, psb_dpk_, psb_dlinmap_type - implicit none + implicit none class(psb_dlinmap_type), intent(in) :: map real(psb_dpk_), intent(in) :: alpha,beta type(psb_d_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), optional :: work(:) + integer(psb_ipk_), intent(out) :: info type(psb_d_vect_type), optional, target, intent(inout) :: vtx,vty end subroutine psb_d_map_V2U_v end interface diff --git a/base/modules/comm/psb_e_comm_a_mod.f90 b/base/modules/comm/psb_e_comm_a_mod.f90 index 0e57a4594..b9c9b1fe0 100644 --- a/base/modules/comm/psb_e_comm_a_mod.f90 +++ b/base/modules/comm/psb_e_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/comm/psb_i2_comm_a_mod.f90 b/base/modules/comm/psb_i2_comm_a_mod.f90 index 72cdf228b..7ac24f9d1 100644 --- a/base/modules/comm/psb_i2_comm_a_mod.f90 +++ b/base/modules/comm/psb_i2_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/comm/psb_i2_comm_mod.f90 b/base/modules/comm/psb_i2_comm_mod.f90 new file mode 100644 index 000000000..30af74391 --- /dev/null +++ b/base/modules/comm/psb_i2_comm_mod.f90 @@ -0,0 +1,113 @@ +! +! Parallel Sparse BLAS version 3.5 +! (C) Copyright 2006-2018 +! Salvatore Filippone +! Alfredo Buttari +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +module psb_i2_comm_mod + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_lpk_, psb_epk_, psb_mpk_, psb_i2pk_ + + use psb_i2_vect_mod, only : psb_i2_vect_type, psb_i2_base_vect_type + use psb_i2_multivect_mod, only : psb_i2_multivect_type, psb_i2_base_multivect_type + + interface psb_ovrl + subroutine psb_i2ovrl_vect(x,desc_a,info,update,mode) + import + implicit none + type(psb_i2_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode + end subroutine psb_i2ovrl_vect + subroutine psb_i2ovrl_multivect(x,desc_a,info,update,mode) + import + implicit none + type(psb_i2_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode + end subroutine psb_i2ovrl_multivect + end interface psb_ovrl + + interface psb_halo + subroutine psb_i2halo_vect(x,desc_a,info,tran,mode,data) + import + implicit none + type(psb_i2_vect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran + end subroutine psb_i2halo_vect + subroutine psb_i2halo_multivect(x,desc_a,info,tran,mode,data) + import + implicit none + type(psb_i2_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran + end subroutine psb_i2halo_multivect + end interface psb_halo + + + interface psb_scatter + subroutine psb_i2scatter_vect(globx, locx, desc_a, info, root, mold) + import + implicit none + type(psb_i2_vect_type), intent(inout) :: locx + integer(psb_i2pk_), intent(in) :: globx(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: root + class(psb_i2_base_vect_type), intent(in), optional :: mold + end subroutine psb_i2scatter_vect + end interface psb_scatter + + interface psb_gather + subroutine psb_i2gather_vect(globx, locx, desc_a, info, root) + import + implicit none + type(psb_i2_vect_type), intent(inout) :: locx + integer(psb_i2pk_), intent(out), allocatable :: globx(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: root + end subroutine psb_i2gather_vect + subroutine psb_i2gather_multivect(globx, locx, desc_a, info, root) + import + implicit none + type(psb_i2_multivect_type), intent(inout) :: locx + integer(psb_i2pk_), intent(out), allocatable :: globx(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: root + end subroutine psb_i2gather_multivect + end interface psb_gather + +end module psb_i2_comm_mod diff --git a/base/modules/comm/psb_i_comm_mod.f90 b/base/modules/comm/psb_i_comm_mod.f90 index 25d761ba8..781a37403 100644 --- a/base/modules/comm/psb_i_comm_mod.f90 +++ b/base/modules/comm/psb_i_comm_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,52 +30,48 @@ ! ! module psb_i_comm_mod - use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_lpk_, psb_epk_, psb_mpk_ + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_lpk_, psb_epk_, psb_mpk_, psb_i2pk_ use psb_i_vect_mod, only : psb_i_vect_type, psb_i_base_vect_type use psb_i_multivect_mod, only : psb_i_multivect_type, psb_i_base_multivect_type interface psb_ovrl - subroutine psb_iovrl_vect(x,desc_a,info,work,update,mode) + subroutine psb_iovrl_vect(x,desc_a,info,update,mode) import implicit none - type(psb_i_vect_type), intent(inout) :: x + type(psb_i_vect_type), intent(inout) :: x type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), intent(inout), optional, target :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode end subroutine psb_iovrl_vect - subroutine psb_iovrl_multivect(x,desc_a,info,work,update,mode) + subroutine psb_iovrl_multivect(x,desc_a,info,update,mode) import implicit none - type(psb_i_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), intent(inout), optional, target :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_i_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode end subroutine psb_iovrl_multivect end interface psb_ovrl interface psb_halo - subroutine psb_ihalo_vect(x,desc_a,info,work,tran,mode,data) + subroutine psb_ihalo_vect(x,desc_a,info,tran,mode,data) import implicit none - type(psb_i_vect_type), intent(inout) :: x + type(psb_i_vect_type), intent(inout) :: x type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data character, intent(in), optional :: tran end subroutine psb_ihalo_vect - subroutine psb_ihalo_multivect(x,desc_a,info,work,tran,mode,data) + subroutine psb_ihalo_multivect(x,desc_a,info,tran,mode,data) import implicit none - type(psb_i_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + type(psb_i_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran end subroutine psb_ihalo_multivect end interface psb_halo diff --git a/base/modules/comm/psb_l_comm_mod.f90 b/base/modules/comm/psb_l_comm_mod.f90 index 2bba923dd..aa70f622a 100644 --- a/base/modules/comm/psb_l_comm_mod.f90 +++ b/base/modules/comm/psb_l_comm_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -30,52 +30,48 @@ ! ! module psb_l_comm_mod - use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_lpk_, psb_epk_, psb_mpk_ + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_lpk_, psb_epk_, psb_mpk_, psb_i2pk_ use psb_l_vect_mod, only : psb_l_vect_type, psb_l_base_vect_type use psb_l_multivect_mod, only : psb_l_multivect_type, psb_l_base_multivect_type interface psb_ovrl - subroutine psb_lovrl_vect(x,desc_a,info,work,update,mode) + subroutine psb_lovrl_vect(x,desc_a,info,update,mode) import implicit none - type(psb_l_vect_type), intent(inout) :: x + type(psb_l_vect_type), intent(inout) :: x type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_lpk_), intent(inout), optional, target :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode end subroutine psb_lovrl_vect - subroutine psb_lovrl_multivect(x,desc_a,info,work,update,mode) + subroutine psb_lovrl_multivect(x,desc_a,info,update,mode) import implicit none - type(psb_l_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_lpk_), intent(inout), optional, target :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_l_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode end subroutine psb_lovrl_multivect end interface psb_ovrl interface psb_halo - subroutine psb_lhalo_vect(x,desc_a,info,work,tran,mode,data) + subroutine psb_lhalo_vect(x,desc_a,info,tran,mode,data) import implicit none - type(psb_l_vect_type), intent(inout) :: x + type(psb_l_vect_type), intent(inout) :: x type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_lpk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data character, intent(in), optional :: tran end subroutine psb_lhalo_vect - subroutine psb_lhalo_multivect(x,desc_a,info,work,tran,mode,data) + subroutine psb_lhalo_multivect(x,desc_a,info,tran,mode,data) import implicit none - type(psb_l_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - integer(psb_lpk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + type(psb_l_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran end subroutine psb_lhalo_multivect end interface psb_halo diff --git a/base/modules/comm/psb_linmap_mod.f90 b/base/modules/comm/psb_linmap_mod.f90 index f27926c92..036926623 100644 --- a/base/modules/comm/psb_linmap_mod.f90 +++ b/base/modules/comm/psb_linmap_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/comm/psb_m_comm_a_mod.f90 b/base/modules/comm/psb_m_comm_a_mod.f90 index 105f14d7e..83a07e2d2 100644 --- a/base/modules/comm/psb_m_comm_a_mod.f90 +++ b/base/modules/comm/psb_m_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/comm/psb_neighbor_topology_mod.F90 b/base/modules/comm/psb_neighbor_topology_mod.F90 new file mode 100644 index 000000000..bb54da4b5 --- /dev/null +++ b/base/modules/comm/psb_neighbor_topology_mod.F90 @@ -0,0 +1,422 @@ +! +! Parallel Sparse BLAS version 3.5 +! (C) Copyright 2006-2018 +! Salvatore Filippone +! Alfredo Buttari +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! Module: psb_neighbor_topology_mod +! Provides a type to hold pre-built MPI neighborhood topology +! information for persistent/repeated halo exchanges via +! MPI_Neighbor_alltoallv (MPI >= 3.0). +! +! The topology is stored inside the vector type (psb_d_base_vect_type) +! and lazily created on the first psi_swapdata call with the +! neighbor-alltoallv communication mode. Once built it is reused +! for every subsequent halo exchange, avoiding the per-call overhead +! of re-scanning the index list and allocating temporary arrays. +! +! The graph communicator and per-neighbor counts/displacements +! are built once and reused. +! +! The gather/scatter index arrays (send_indexes, recv_indexes) record +! which local vector positions must be packed / unpacked. +! +module psb_neighbor_topology_mod + use psb_const_mod + use psb_desc_const_mod + use psb_error_mod + ! + ! Only import mpi_comm_null here (needed for type default initializer). + ! Full MPI access is done inside each contained subroutine so that + ! MPI symbols do NOT leak into modules that use psb_neighbor_topology_mod. + ! +#ifdef PSB_MPI_MOD + use mpi, only: mpi_comm_null +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + type :: psb_neighbor_topology_type + ! + ! MPI dist-graph communicator (only communicating neighbors). + ! + integer(psb_mpk_) :: graph_comm = mpi_comm_null + ! + ! Number of neighbors (processes I exchange with, excluding self). + ! + integer(psb_ipk_) :: num_neighbors = 0 + ! + ! Per-neighbor send/recv counts and displacements (units of + ! single elements; for n-column multivectors multiply by n). + ! send_counts(i) = number of elements sent to i-th neighbor + ! recv_counts(i) = number of elements received from i-th neighbor + ! send_displs(i) = displacement into contiguous send buffer + ! recv_displs(i) = displacement into contiguous recv buffer + ! + integer(psb_mpk_), allocatable :: send_counts(:), recv_counts(:) + integer(psb_mpk_), allocatable :: send_displs(:), recv_displs(:) + ! + ! Gather indexes: the k-th element of the send buffer is + ! y%v( send_indexes(k) ) + ! Scatter indexes: the k-th element of the recv buffer goes to + ! y%v( recv_indexes(k) ) + ! + integer(psb_ipk_), allocatable :: send_indexes(:) + integer(psb_ipk_), allocatable :: recv_indexes(:) + ! + ! Total number of elements to send / receive (per single column), + ! excluding self-exchange. + ! + integer(psb_ipk_) :: total_send = 0 + integer(psb_ipk_) :: total_recv = 0 + ! + + ! Initialization flag. + ! + logical :: is_initialized = .false. + contains + procedure, pass(topology) :: init => neighbor_topology_init + procedure, pass(topology) :: free => neighbor_topology_free + procedure, pass(topology) :: sizeof => neighbor_topology_sizeof + end type psb_neighbor_topology_type + +contains + + ! --------------------------------------------------------------- + ! neighbor_topology_init + ! + ! Parse the halo index list (obtained via desc_a%get_list_p) + ! and build: + ! - MPI dist-graph communicator with only the true neighbors + ! - per-neighbor send/recv counts and displacements + ! - contiguous gather/scatter index arrays + ! + ! The topology is stored inside the vector and lazily built + ! on the first psi_swapdata call that uses the neighbor-alltoallv + ! communication mode. + ! + ! Arguments: + ! topology - the persistent state (output, intent inout) + ! halo_index - halo_index array (from get_list_p, intent in) + ! num_neighbors - number of exchanges (from get_list_p) + ! total_send_elems - total send count (from get_list_p) + ! total_recv_elems - total recv count (from get_list_p) + ! ctxt - PSBLAS context + ! icomm - MPI communicator + ! info - error code (output) + ! --------------------------------------------------------------- + subroutine neighbor_topology_init(topology, halo_index, num_neighbors, & + & total_send_elems, total_recv_elems, ctxt, icomm, info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + class(psb_neighbor_topology_type), intent(inout) :: topology + integer(psb_ipk_), intent(in) :: halo_index(:) + integer(psb_ipk_), intent(in) :: num_neighbors, total_send_elems, total_recv_elems + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: icomm + integer(psb_ipk_), intent(out) :: info + + ! locals + integer(psb_mpk_) :: iret + integer(psb_ipk_) :: i, k, idx_ptr, num_elem_recv, num_elem_send, partner_proc + integer(psb_ipk_) :: neighbor_count, send_offset, recv_offset + integer(psb_mpk_), allocatable :: source_ranks(:), dest_ranks(:) + integer(psb_mpk_), allocatable :: source_weights(:), dest_weights(:) + integer(psb_mpk_) :: in_degree, out_degree + character(len=40) :: name + integer(psb_ipk_) :: proc_id + integer(psb_ipk_) :: position + integer(psb_ipk_) :: err_act + + info = psb_success_ + name = 'neighbor_topology_init' + call psb_erractionsave(err_act) + + ! Clean up any previous state + call topology%free(info) + + ! ---------------------------------------------------------- + ! First pass: count neighbors (excluding self) and totals + ! ---------------------------------------------------------- + topology%num_neighbors = 0 + topology%total_send = 0 + topology%total_recv = 0 + + if(size(halo_index) < 1) then + call psb_errpush(psb_err_topology_invalid_args_,name) + goto 9999 + end if + + allocate(source_ranks(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Source ranks allocation failed') + goto 9999 + end if + + allocate(dest_ranks(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Destination ranks allocation failed') + goto 9999 + end if + + allocate(source_weights(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Source weights allocation failed') + goto 9999 + end if + + allocate(dest_weights(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Destination weights allocation failed') + goto 9999 + end if + + allocate(topology%send_counts(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Send counts allocation failed') + goto 9999 + end if + + allocate(topology%recv_counts(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Receive counts allocation failed') + goto 9999 + end if + + allocate(topology%send_displs(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Send displacements allocation failed') + goto 9999 + end if + + allocate(topology%recv_displs(num_neighbors), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Receive displacements allocation failed') + goto 9999 + end if + + + ! ----------------------------------------------------------- + ! Allocate the gather/scatter index arrays + ! ----------------------------------------------------------- + allocate(topology%send_indexes(total_send_elems), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Send indexes allocation failed') + goto 9999 + end if + + allocate(topology%recv_indexes(total_recv_elems), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + call psb_errpush(info, name, a_err='Recv indexes allocation failed') + goto 9999 + end if + + ! ----------------------------------------------------------- + ! Fill neighbor ranks, weights, counts, displacements, + ! and gather/scatter index arrays. + ! + ! The halo_index layout per neighbor (starting at position): + ! position + 0 : process id + ! position + 1 : nerv (num recv elements) + ! position + 2 .. +1+nerv : recv element indexes + ! position + 2+nerv : nesd (num send elements) + ! position + 3+nerv .. +2+nerv+nesd : send element indexes + ! Total stride per neighbor: nerv + nesd + 3 + ! ----------------------------------------------------------- + send_offset = 0 + recv_offset = 0 + position = 1 + + do i = 1, num_neighbors + proc_id = halo_index(position) + num_elem_recv = halo_index(position + 1) + num_elem_send = halo_index(position + num_elem_recv + 2) + + ! Fill source/destination ranks and weights (weights are all 1 for now) + source_ranks(i) = int(proc_id, psb_mpk_) + dest_ranks(i) = int(proc_id, psb_mpk_) + source_weights(i) = 1 + dest_weights(i) = 1 + + ! Counts and displacements (displs set BEFORE accumulating offset) + topology%send_counts(i) = int(num_elem_send, psb_mpk_) + topology%recv_counts(i) = int(num_elem_recv, psb_mpk_) + topology%send_displs(i) = int(send_offset, psb_mpk_) + topology%recv_displs(i) = int(recv_offset, psb_mpk_) + + ! Fill recv_indexes from halo_index(position+2 .. position+1+nerv) + do k = 1, num_elem_recv + topology%recv_indexes(recv_offset + k) = halo_index(position + psb_elem_recv_ + k - 1) + end do + + ! Fill send_indexes from halo_index(position+3+nerv .. position+2+nerv+nesd) + do k = 1, num_elem_send + topology%send_indexes(send_offset + k) = halo_index(position + num_elem_recv + psb_elem_send_ + k - 1) + end do + + send_offset = send_offset + num_elem_send + recv_offset = recv_offset + num_elem_recv + + topology%num_neighbors = topology%num_neighbors + 1 + topology%total_send = topology%total_send + num_elem_send + topology%total_recv = topology%total_recv + num_elem_recv + + position = position + num_elem_recv + num_elem_send + 3 + end do + + ! ---------------------------------------------------------- + ! Sanity check: the totals computed from the neighbor list + ! should match the totals returned by get_list_p. + ! ---------------------------------------------------------- + if (topology%total_send /= total_send_elems) then + info = psb_err_topology_args_mismatch_ + call psb_errpush(info, name, a_err='Send elements mismatch') + goto 9999 + end if + + if (topology%total_recv /= total_recv_elems) then + info = psb_err_topology_args_mismatch_ + call psb_errpush(info, name, a_err='Receive elements mismatch') + goto 9999 + end if + + if(topology%num_neighbors /= num_neighbors) then + info = psb_err_topology_args_mismatch_ + call psb_errpush(info, name, a_err='Number of neighbors mismatch') + goto 9999 + end if + + + ! ---------------------------------------------------------- + ! Build the dist-graph communicator + ! ---------------------------------------------------------- + in_degree = topology%num_neighbors !! Just for clarity + out_degree = topology%num_neighbors !! Just for clarity + + call mpi_dist_graph_create_adjacent(icomm, & + & in_degree, source_ranks, source_weights, & + & out_degree, dest_ranks, dest_weights, & + & mpi_info_null, .false., & ! Check this line for optimizations + & topology%graph_comm, info) + if (info /= mpi_success) then + info = psb_err_topology_error_ + call psb_errpush(info, name) + goto 9999 + end if + + topology%is_initialized = .true. + + ! TODO: Is it safe to deallocate these temporary arrays here, or do we need them for the gather/scatter indexes? + ! deallocate(source_ranks, dest_ranks, source_weights, dest_weights) + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine neighbor_topology_init + + + ! --------------------------------------------------------------- + ! neighbor_topology_free + ! Release all resources held by the persistent state. + ! --------------------------------------------------------------- + subroutine neighbor_topology_free(topology, info) +#ifdef PSB_MPI_MOD + use mpi +#endif + implicit none +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + class(psb_neighbor_topology_type), intent(inout) :: topology + integer(psb_ipk_), intent(out) :: info + integer(psb_mpk_) :: iret + + info = psb_success_ + + if (topology%graph_comm /= mpi_comm_null) then + call mpi_comm_free(topology%graph_comm, iret) + topology%graph_comm = mpi_comm_null + end if + + if (allocated(topology%send_counts)) deallocate(topology%send_counts) + if (allocated(topology%recv_counts)) deallocate(topology%recv_counts) + if (allocated(topology%send_displs)) deallocate(topology%send_displs) + if (allocated(topology%recv_displs)) deallocate(topology%recv_displs) + if (allocated(topology%send_indexes)) deallocate(topology%send_indexes) + if (allocated(topology%recv_indexes)) deallocate(topology%recv_indexes) + + topology%num_neighbors = 0 + topology%total_send = 0 + topology%total_recv = 0 + topology%is_initialized = .false. + + end subroutine neighbor_topology_free + + + ! --------------------------------------------------------------- + ! neighbor_topology_sizeof + ! Return approximate memory footprint in bytes. + ! --------------------------------------------------------------- + function neighbor_topology_sizeof(topology) result(val) + implicit none + class(psb_neighbor_topology_type), intent(in) :: topology + integer(psb_epk_) :: val + + val = 0 + val = val + psb_sizeof_ip * 6 ! scalar integers + logicals + if (allocated(topology%send_counts)) val = val + psb_sizeof_ip * size(topology%send_counts) + if (allocated(topology%recv_counts)) val = val + psb_sizeof_ip * size(topology%recv_counts) + if (allocated(topology%send_displs)) val = val + psb_sizeof_ip * size(topology%send_displs) + if (allocated(topology%recv_displs)) val = val + psb_sizeof_ip * size(topology%recv_displs) + if (allocated(topology%send_indexes)) val = val + psb_sizeof_ip * size(topology%send_indexes) + if (allocated(topology%recv_indexes)) val = val + psb_sizeof_ip * size(topology%recv_indexes) + + + end function neighbor_topology_sizeof + +end module psb_neighbor_topology_mod \ No newline at end of file diff --git a/base/modules/comm/psb_s_comm_a_mod.f90 b/base/modules/comm/psb_s_comm_a_mod.f90 index 5ceaad8bf..8f1a88905 100644 --- a/base/modules/comm/psb_s_comm_a_mod.f90 +++ b/base/modules/comm/psb_s_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/comm/psb_s_comm_mod.f90 b/base/modules/comm/psb_s_comm_mod.f90 index a202b5b61..ddb7232a5 100644 --- a/base/modules/comm/psb_s_comm_mod.f90 +++ b/base/modules/comm/psb_s_comm_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -37,46 +37,42 @@ module psb_s_comm_mod use psb_s_multivect_mod, only : psb_s_multivect_type, psb_s_base_multivect_type interface psb_ovrl - subroutine psb_sovrl_vect(x,desc_a,info,work,update,mode) + subroutine psb_sovrl_vect(x,desc_a,info,update,mode) import implicit none - type(psb_s_vect_type), intent(inout) :: x + type(psb_s_vect_type), intent(inout) :: x type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_spk_), intent(inout), optional, target :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode end subroutine psb_sovrl_vect - subroutine psb_sovrl_multivect(x,desc_a,info,work,update,mode) + subroutine psb_sovrl_multivect(x,desc_a,info,update,mode) import implicit none - type(psb_s_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_spk_), intent(inout), optional, target :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_s_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode end subroutine psb_sovrl_multivect end interface psb_ovrl interface psb_halo - subroutine psb_shalo_vect(x,desc_a,info,work,tran,mode,data) + subroutine psb_shalo_vect(x,desc_a,info,tran,mode,data) import implicit none - type(psb_s_vect_type), intent(inout) :: x + type(psb_s_vect_type), intent(inout) :: x type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_spk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data character, intent(in), optional :: tran end subroutine psb_shalo_vect - subroutine psb_shalo_multivect(x,desc_a,info,work,tran,mode,data) + subroutine psb_shalo_multivect(x,desc_a,info,tran,mode,data) import implicit none - type(psb_s_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - real(psb_spk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + type(psb_s_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran end subroutine psb_shalo_multivect end interface psb_halo diff --git a/base/modules/comm/psb_s_linmap_mod.f90 b/base/modules/comm/psb_s_linmap_mod.f90 index 1ded2c596..8659ae1ed 100644 --- a/base/modules/comm/psb_s_linmap_mod.f90 +++ b/base/modules/comm/psb_s_linmap_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -73,15 +73,14 @@ module psb_s_linmap_mod integer(psb_ipk_), intent(out) :: info real(psb_spk_), optional :: work(:) end subroutine psb_s_map_U2V_a - subroutine psb_s_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) + subroutine psb_s_map_U2V_v(alpha,x,beta,y,map,info,vtx,vty) use psb_s_vect_mod, only : psb_s_vect_type import :: psb_ipk_, psb_spk_, psb_slinmap_type - implicit none + implicit none class(psb_slinmap_type), intent(in) :: map real(psb_spk_), intent(in) :: alpha,beta type(psb_s_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - real(psb_spk_), optional :: work(:) + integer(psb_ipk_), intent(out) :: info type(psb_s_vect_type), optional, target, intent(inout) :: vtx,vty end subroutine psb_s_map_U2V_v end interface @@ -97,15 +96,14 @@ module psb_s_linmap_mod integer(psb_ipk_), intent(out) :: info real(psb_spk_), optional :: work(:) end subroutine psb_s_map_V2U_a - subroutine psb_s_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) + subroutine psb_s_map_V2U_v(alpha,x,beta,y,map,info,vtx,vty) use psb_s_vect_mod, only : psb_s_vect_type import :: psb_ipk_, psb_spk_, psb_slinmap_type - implicit none + implicit none class(psb_slinmap_type), intent(in) :: map real(psb_spk_), intent(in) :: alpha,beta type(psb_s_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - real(psb_spk_), optional :: work(:) + integer(psb_ipk_), intent(out) :: info type(psb_s_vect_type), optional, target, intent(inout) :: vtx,vty end subroutine psb_s_map_V2U_v end interface diff --git a/base/modules/comm/psb_z_comm_a_mod.f90 b/base/modules/comm/psb_z_comm_a_mod.f90 index 708efead7..478cc99a5 100644 --- a/base/modules/comm/psb_z_comm_a_mod.f90 +++ b/base/modules/comm/psb_z_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/comm/psb_z_comm_mod.f90 b/base/modules/comm/psb_z_comm_mod.f90 index 304cdfb9b..b73f441a8 100644 --- a/base/modules/comm/psb_z_comm_mod.f90 +++ b/base/modules/comm/psb_z_comm_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -37,46 +37,42 @@ module psb_z_comm_mod use psb_z_multivect_mod, only : psb_z_multivect_type, psb_z_base_multivect_type interface psb_ovrl - subroutine psb_zovrl_vect(x,desc_a,info,work,update,mode) + subroutine psb_zovrl_vect(x,desc_a,info,update,mode) import implicit none - type(psb_z_vect_type), intent(inout) :: x + type(psb_z_vect_type), intent(inout) :: x type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), intent(inout), optional, target :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode end subroutine psb_zovrl_vect - subroutine psb_zovrl_multivect(x,desc_a,info,work,update,mode) + subroutine psb_zovrl_multivect(x,desc_a,info,update,mode) import implicit none - type(psb_z_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), intent(inout), optional, target :: work(:) - integer(psb_ipk_), intent(in), optional :: update,mode + type(psb_z_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: update,mode end subroutine psb_zovrl_multivect end interface psb_ovrl interface psb_halo - subroutine psb_zhalo_vect(x,desc_a,info,work,tran,mode,data) + subroutine psb_zhalo_vect(x,desc_a,info,tran,mode,data) import implicit none - type(psb_z_vect_type), intent(inout) :: x + type(psb_z_vect_type), intent(inout) :: x type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data character, intent(in), optional :: tran end subroutine psb_zhalo_vect - subroutine psb_zhalo_multivect(x,desc_a,info,work,tran,mode,data) + subroutine psb_zhalo_multivect(x,desc_a,info,tran,mode,data) import implicit none - type(psb_z_multivect_type), intent(inout) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), target, optional, intent(inout) :: work(:) - integer(psb_ipk_), intent(in), optional :: mode,data - character, intent(in), optional :: tran + type(psb_z_multivect_type), intent(inout) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in), optional :: mode,data + character, intent(in), optional :: tran end subroutine psb_zhalo_multivect end interface psb_halo diff --git a/base/modules/comm/psb_z_linmap_mod.f90 b/base/modules/comm/psb_z_linmap_mod.f90 index 8fe61b0a8..fa0e7a734 100644 --- a/base/modules/comm/psb_z_linmap_mod.f90 +++ b/base/modules/comm/psb_z_linmap_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -73,15 +73,14 @@ module psb_z_linmap_mod integer(psb_ipk_), intent(out) :: info complex(psb_dpk_), optional :: work(:) end subroutine psb_z_map_U2V_a - subroutine psb_z_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) + subroutine psb_z_map_U2V_v(alpha,x,beta,y,map,info,vtx,vty) use psb_z_vect_mod, only : psb_z_vect_type import :: psb_ipk_, psb_dpk_, psb_zlinmap_type - implicit none + implicit none class(psb_zlinmap_type), intent(in) :: map complex(psb_dpk_), intent(in) :: alpha,beta type(psb_z_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), optional :: work(:) + integer(psb_ipk_), intent(out) :: info type(psb_z_vect_type), optional, target, intent(inout) :: vtx,vty end subroutine psb_z_map_U2V_v end interface @@ -97,15 +96,14 @@ module psb_z_linmap_mod integer(psb_ipk_), intent(out) :: info complex(psb_dpk_), optional :: work(:) end subroutine psb_z_map_V2U_a - subroutine psb_z_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) + subroutine psb_z_map_V2U_v(alpha,x,beta,y,map,info,vtx,vty) use psb_z_vect_mod, only : psb_z_vect_type import :: psb_ipk_, psb_dpk_, psb_zlinmap_type - implicit none + implicit none class(psb_zlinmap_type), intent(in) :: map complex(psb_dpk_), intent(in) :: alpha,beta type(psb_z_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), optional :: work(:) + integer(psb_ipk_), intent(out) :: info type(psb_z_vect_type), optional, target, intent(inout) :: vtx,vty end subroutine psb_z_map_V2U_v end interface diff --git a/base/modules/comm/psi_c_comm_a_mod.f90 b/base/modules/comm/psi_c_comm_a_mod.f90 index ce2da78d7..6676e36ba 100644 --- a/base/modules/comm/psi_c_comm_a_mod.f90 +++ b/base/modules/comm/psi_c_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,48 +31,47 @@ ! module psi_c_comm_a_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, psb_spk_, psb_i_base_vect_type + use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, & + & psb_spk_, psb_i_base_vect_type interface psi_swapdata - subroutine psi_cswapdatam(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_cswapdatam(flag,n,beta,y,desc_a,work,info,data) integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:,:), beta + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:,:) complex(psb_spk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_cswapdatam - subroutine psi_cswapdatav(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_cswapdatav(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:), beta + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:) complex(psb_spk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_cswapdatav - subroutine psi_cswapidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_cswapidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:,:), beta + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:,:) complex(psb_spk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_cswapidxm - subroutine psi_cswapidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_cswapidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_Mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:), beta + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:) complex(psb_spk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_cswapidxv @@ -80,60 +79,56 @@ module psi_c_comm_a_mod interface psi_swaptran - subroutine psi_cswaptranm(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_cswaptranm(flag,n,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_Mpk_), intent(in) :: n integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:,:), beta + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:,:) complex(psb_spk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_cswaptranm - subroutine psi_cswaptranv(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_cswaptranv(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:), beta + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:) complex(psb_spk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_cswaptranv - subroutine psi_ctranidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_ctranidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:,:), beta + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:,:) complex(psb_spk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_ctranidxm - subroutine psi_ctranidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_ctranidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_spk_) :: y(:), beta + complex(psb_spk_), intent(in) :: beta + complex(psb_spk_), intent(inout) :: y(:) complex(psb_spk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_ctranidxv end interface psi_swaptran - + interface psi_ovrl_upd - subroutine psi_covrl_updr1(x,desc_a,update,info) - import + module subroutine psi_covrl_updr1(x,desc_a,update,info) complex(psb_spk_), intent(inout), target :: x(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update integer(psb_ipk_), intent(out) :: info end subroutine psi_covrl_updr1 - subroutine psi_covrl_updr2(x,desc_a,update,info) - import + module subroutine psi_covrl_updr2(x,desc_a,update,info) complex(psb_spk_), intent(inout), target :: x(:,:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update @@ -142,15 +137,13 @@ module psi_c_comm_a_mod end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_covrl_saver1(x,xs,desc_a,info) - import + module subroutine psi_covrl_saver1(x,xs,desc_a,info) complex(psb_spk_), intent(inout) :: x(:) complex(psb_spk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_covrl_saver1 - subroutine psi_covrl_saver2(x,xs,desc_a,info) - import + module subroutine psi_covrl_saver2(x,xs,desc_a,info) complex(psb_spk_), intent(inout) :: x(:,:) complex(psb_spk_), allocatable :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a @@ -159,15 +152,13 @@ module psi_c_comm_a_mod end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_covrl_restrr1(x,xs,desc_a,info) - import + module subroutine psi_covrl_restrr1(x,xs,desc_a,info) complex(psb_spk_), intent(inout) :: x(:) complex(psb_spk_) :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_covrl_restrr1 - subroutine psi_covrl_restrr2(x,xs,desc_a,info) - import + module subroutine psi_covrl_restrr2(x,xs,desc_a,info) complex(psb_spk_), intent(inout) :: x(:,:) complex(psb_spk_) :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a diff --git a/base/modules/comm/psi_c_comm_v_mod.f90 b/base/modules/comm/psi_c_comm_v_mod.f90 index 7d10a0287..d52062a65 100644 --- a/base/modules/comm/psi_c_comm_v_mod.f90 +++ b/base/modules/comm/psi_c_comm_v_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,157 +31,132 @@ ! module psi_c_comm_v_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_spk_, psb_i_base_vect_type + use psb_i_base_vect_mod, only : psb_i_base_vect_type + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_spk_ use psb_c_base_vect_mod, only : psb_c_base_vect_type use psb_c_base_multivect_mod, only : psb_c_base_multivect_type interface psi_swapdata - subroutine psi_cswapdata_vect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_vect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_cswapdata_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_cswapdata_vect - subroutine psi_cswapdata_multivect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_multivect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_cswapdata_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_cswapdata_multivect - subroutine psi_cswap_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_vect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_cswap_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_c_base_vect_type), intent(inout) :: y + complex(psb_spk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_cswap_vidx_vect - subroutine psi_cswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_multivect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_cswap_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_c_base_multivect_type), intent(inout) :: y + complex(psb_spk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_cswap_vidx_multivect end interface psi_swapdata interface psi_swaptran - subroutine psi_cswaptran_vect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_vect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_cswaptran_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_cswaptran_vect - subroutine psi_cswaptran_multivect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_multivect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_cswaptran_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_spk_), intent(in) :: beta + class(psb_c_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_cswaptran_multivect - subroutine psi_ctran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_vect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_ctran_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_c_base_vect_type), intent(inout) :: y + complex(psb_spk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_ctran_vidx_vect - subroutine psi_ctran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_c_base_multivect_type) :: y - complex(psb_spk_) :: beta - complex(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_ctran_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_c_base_multivect_type), intent(inout) :: y + complex(psb_spk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_ctran_vidx_multivect end interface psi_swaptran interface psi_ovrl_upd - subroutine psi_covrl_upd_vect(x,desc_a,update,info) - import - class(psb_c_base_vect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info + module subroutine psi_covrl_upd_vect(x,desc_a,update,info) + class(psb_c_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info end subroutine psi_covrl_upd_vect - subroutine psi_covrl_upd_multivect(x,desc_a,update,info) - import - class(psb_c_base_multivect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info + module subroutine psi_covrl_upd_multivect(x,desc_a,update,info) + class(psb_c_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info end subroutine psi_covrl_upd_multivect end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_covrl_save_vect(x,xs,desc_a,info) - import - class(psb_c_base_vect_type) :: x - complex(psb_spk_), allocatable :: xs(:) + module subroutine psi_covrl_save_vect(x,xs,desc_a,info) + class(psb_c_base_vect_type) :: x + complex(psb_spk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(out) :: info end subroutine psi_covrl_save_vect - subroutine psi_covrl_save_multivect(x,xs,desc_a,info) - import - class(psb_c_base_multivect_type) :: x - complex(psb_spk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + module subroutine psi_covrl_save_multivect(x,xs,desc_a,info) + class(psb_c_base_multivect_type) :: x + complex(psb_spk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_covrl_save_multivect end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_covrl_restr_vect(x,xs,desc_a,info) - import + module subroutine psi_covrl_restr_vect(x,xs,desc_a,info) class(psb_c_base_vect_type) :: x - complex(psb_spk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + complex(psb_spk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_covrl_restr_vect - subroutine psi_covrl_restr_multivect(x,xs,desc_a,info) - import - class(psb_c_base_multivect_type) :: x - complex(psb_spk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + module subroutine psi_covrl_restr_multivect(x,xs,desc_a,info) + class(psb_c_base_multivect_type) :: x + complex(psb_spk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_covrl_restr_multivect end interface psi_ovrl_restore diff --git a/base/modules/comm/psi_d_comm_a_mod.f90 b/base/modules/comm/psi_d_comm_a_mod.f90 index b1dda3f81..323c151c9 100644 --- a/base/modules/comm/psi_d_comm_a_mod.f90 +++ b/base/modules/comm/psi_d_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,48 +31,47 @@ ! module psi_d_comm_a_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, psb_dpk_, psb_i_base_vect_type + use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, & + & psb_dpk_, psb_i_base_vect_type interface psi_swapdata - subroutine psi_dswapdatam(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_dswapdatam(flag,n,beta,y,desc_a,work,info,data) integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:,:), beta + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:,:) real(psb_dpk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_dswapdatam - subroutine psi_dswapdatav(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_dswapdatav(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:), beta + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:) real(psb_dpk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_dswapdatav - subroutine psi_dswapidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_dswapidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:,:), beta + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:,:) real(psb_dpk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_dswapidxm - subroutine psi_dswapidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_dswapidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_Mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:), beta + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:) real(psb_dpk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_dswapidxv @@ -80,60 +79,56 @@ module psi_d_comm_a_mod interface psi_swaptran - subroutine psi_dswaptranm(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_dswaptranm(flag,n,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_Mpk_), intent(in) :: n integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:,:), beta + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:,:) real(psb_dpk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_dswaptranm - subroutine psi_dswaptranv(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_dswaptranv(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:), beta + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:) real(psb_dpk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_dswaptranv - subroutine psi_dtranidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_dtranidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:,:), beta + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:,:) real(psb_dpk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_dtranidxm - subroutine psi_dtranidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_dtranidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_dpk_) :: y(:), beta + real(psb_dpk_), intent(in) :: beta + real(psb_dpk_), intent(inout) :: y(:) real(psb_dpk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_dtranidxv end interface psi_swaptran - + interface psi_ovrl_upd - subroutine psi_dovrl_updr1(x,desc_a,update,info) - import + module subroutine psi_dovrl_updr1(x,desc_a,update,info) real(psb_dpk_), intent(inout), target :: x(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update integer(psb_ipk_), intent(out) :: info end subroutine psi_dovrl_updr1 - subroutine psi_dovrl_updr2(x,desc_a,update,info) - import + module subroutine psi_dovrl_updr2(x,desc_a,update,info) real(psb_dpk_), intent(inout), target :: x(:,:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update @@ -142,15 +137,13 @@ module psi_d_comm_a_mod end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_dovrl_saver1(x,xs,desc_a,info) - import + module subroutine psi_dovrl_saver1(x,xs,desc_a,info) real(psb_dpk_), intent(inout) :: x(:) real(psb_dpk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_dovrl_saver1 - subroutine psi_dovrl_saver2(x,xs,desc_a,info) - import + module subroutine psi_dovrl_saver2(x,xs,desc_a,info) real(psb_dpk_), intent(inout) :: x(:,:) real(psb_dpk_), allocatable :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a @@ -159,15 +152,13 @@ module psi_d_comm_a_mod end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_dovrl_restrr1(x,xs,desc_a,info) - import + module subroutine psi_dovrl_restrr1(x,xs,desc_a,info) real(psb_dpk_), intent(inout) :: x(:) real(psb_dpk_) :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_dovrl_restrr1 - subroutine psi_dovrl_restrr2(x,xs,desc_a,info) - import + module subroutine psi_dovrl_restrr2(x,xs,desc_a,info) real(psb_dpk_), intent(inout) :: x(:,:) real(psb_dpk_) :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a diff --git a/base/modules/comm/psi_d_comm_v_mod.f90 b/base/modules/comm/psi_d_comm_v_mod.f90 index b7a902da8..ee6ba89fa 100644 --- a/base/modules/comm/psi_d_comm_v_mod.f90 +++ b/base/modules/comm/psi_d_comm_v_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,157 +31,132 @@ ! module psi_d_comm_v_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_dpk_, psb_i_base_vect_type + use psb_i_base_vect_mod, only : psb_i_base_vect_type + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_dpk_ use psb_d_base_vect_mod, only : psb_d_base_vect_type use psb_d_base_multivect_mod, only : psb_d_base_multivect_type interface psi_swapdata - subroutine psi_dswapdata_vect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_vect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_dswapdata_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_dswapdata_vect - subroutine psi_dswapdata_multivect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_multivect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_dswapdata_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_dswapdata_multivect - subroutine psi_dswap_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_vect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_dswap_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_d_base_vect_type), intent(inout) :: y + real(psb_dpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_dswap_vidx_vect - subroutine psi_dswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_multivect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_dswap_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_d_base_multivect_type), intent(inout) :: y + real(psb_dpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_dswap_vidx_multivect end interface psi_swapdata interface psi_swaptran - subroutine psi_dswaptran_vect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_vect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_dswaptran_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_dswaptran_vect - subroutine psi_dswaptran_multivect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_multivect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_dswaptran_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + real(psb_dpk_), intent(in) :: beta + class(psb_d_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_dswaptran_multivect - subroutine psi_dtran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_vect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_dtran_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_d_base_vect_type), intent(inout) :: y + real(psb_dpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_dtran_vidx_vect - subroutine psi_dtran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_d_base_multivect_type) :: y - real(psb_dpk_) :: beta - real(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_dtran_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_d_base_multivect_type), intent(inout) :: y + real(psb_dpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_dtran_vidx_multivect end interface psi_swaptran interface psi_ovrl_upd - subroutine psi_dovrl_upd_vect(x,desc_a,update,info) - import - class(psb_d_base_vect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info + module subroutine psi_dovrl_upd_vect(x,desc_a,update,info) + class(psb_d_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info end subroutine psi_dovrl_upd_vect - subroutine psi_dovrl_upd_multivect(x,desc_a,update,info) - import - class(psb_d_base_multivect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info + module subroutine psi_dovrl_upd_multivect(x,desc_a,update,info) + class(psb_d_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info end subroutine psi_dovrl_upd_multivect end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_dovrl_save_vect(x,xs,desc_a,info) - import - class(psb_d_base_vect_type) :: x - real(psb_dpk_), allocatable :: xs(:) + module subroutine psi_dovrl_save_vect(x,xs,desc_a,info) + class(psb_d_base_vect_type) :: x + real(psb_dpk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(out) :: info end subroutine psi_dovrl_save_vect - subroutine psi_dovrl_save_multivect(x,xs,desc_a,info) - import - class(psb_d_base_multivect_type) :: x - real(psb_dpk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + module subroutine psi_dovrl_save_multivect(x,xs,desc_a,info) + class(psb_d_base_multivect_type) :: x + real(psb_dpk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_dovrl_save_multivect end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_dovrl_restr_vect(x,xs,desc_a,info) - import + module subroutine psi_dovrl_restr_vect(x,xs,desc_a,info) class(psb_d_base_vect_type) :: x - real(psb_dpk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + real(psb_dpk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_dovrl_restr_vect - subroutine psi_dovrl_restr_multivect(x,xs,desc_a,info) - import - class(psb_d_base_multivect_type) :: x - real(psb_dpk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + module subroutine psi_dovrl_restr_multivect(x,xs,desc_a,info) + class(psb_d_base_multivect_type) :: x + real(psb_dpk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_dovrl_restr_multivect end interface psi_ovrl_restore diff --git a/base/modules/comm/psi_e_comm_a_mod.f90 b/base/modules/comm/psi_e_comm_a_mod.f90 index 4b6c5104d..d87180d9e 100644 --- a/base/modules/comm/psi_e_comm_a_mod.f90 +++ b/base/modules/comm/psi_e_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,48 +31,47 @@ ! module psi_e_comm_a_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, psb_epk_ + use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, & + & psb_epk_, psb_i2pk_ interface psi_swapdata - subroutine psi_eswapdatam(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_eswapdatam(flag,n,beta,y,desc_a,work,info,data) integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:,:), beta + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:,:) integer(psb_epk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_eswapdatam - subroutine psi_eswapdatav(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_eswapdatav(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:), beta + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:) integer(psb_epk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_eswapdatav - subroutine psi_eswapidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_eswapidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:,:), beta + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:,:) integer(psb_epk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_eswapidxm - subroutine psi_eswapidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_eswapidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_Mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:), beta + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:) integer(psb_epk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_eswapidxv @@ -80,60 +79,56 @@ module psi_e_comm_a_mod interface psi_swaptran - subroutine psi_eswaptranm(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_eswaptranm(flag,n,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_Mpk_), intent(in) :: n integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:,:), beta + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:,:) integer(psb_epk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_eswaptranm - subroutine psi_eswaptranv(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_eswaptranv(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:), beta + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:) integer(psb_epk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_eswaptranv - subroutine psi_etranidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_etranidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:,:), beta + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:,:) integer(psb_epk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_etranidxm - subroutine psi_etranidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_etranidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_epk_) :: y(:), beta + integer(psb_epk_), intent(in) :: beta + integer(psb_epk_), intent(inout) :: y(:) integer(psb_epk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_etranidxv end interface psi_swaptran - + interface psi_ovrl_upd - subroutine psi_eovrl_updr1(x,desc_a,update,info) - import + module subroutine psi_eovrl_updr1(x,desc_a,update,info) integer(psb_epk_), intent(inout), target :: x(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update integer(psb_ipk_), intent(out) :: info end subroutine psi_eovrl_updr1 - subroutine psi_eovrl_updr2(x,desc_a,update,info) - import + module subroutine psi_eovrl_updr2(x,desc_a,update,info) integer(psb_epk_), intent(inout), target :: x(:,:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update @@ -142,15 +137,13 @@ module psi_e_comm_a_mod end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_eovrl_saver1(x,xs,desc_a,info) - import + module subroutine psi_eovrl_saver1(x,xs,desc_a,info) integer(psb_epk_), intent(inout) :: x(:) integer(psb_epk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_eovrl_saver1 - subroutine psi_eovrl_saver2(x,xs,desc_a,info) - import + module subroutine psi_eovrl_saver2(x,xs,desc_a,info) integer(psb_epk_), intent(inout) :: x(:,:) integer(psb_epk_), allocatable :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a @@ -159,15 +152,13 @@ module psi_e_comm_a_mod end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_eovrl_restrr1(x,xs,desc_a,info) - import + module subroutine psi_eovrl_restrr1(x,xs,desc_a,info) integer(psb_epk_), intent(inout) :: x(:) integer(psb_epk_) :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_eovrl_restrr1 - subroutine psi_eovrl_restrr2(x,xs,desc_a,info) - import + module subroutine psi_eovrl_restrr2(x,xs,desc_a,info) integer(psb_epk_), intent(inout) :: x(:,:) integer(psb_epk_) :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a diff --git a/base/modules/comm/psi_i2_comm_a_mod.f90 b/base/modules/comm/psi_i2_comm_a_mod.f90 index 484c98245..a12ffd8e1 100644 --- a/base/modules/comm/psi_i2_comm_a_mod.f90 +++ b/base/modules/comm/psi_i2_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,48 +31,47 @@ ! module psi_i2_comm_a_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, psb_epk_ + use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, & + & psb_epk_, psb_i2pk_ interface psi_swapdata - subroutine psi_i2swapdatam(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_i2swapdatam(flag,n,beta,y,desc_a,work,info,data) integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:,:), beta + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:,:) integer(psb_i2pk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_i2swapdatam - subroutine psi_i2swapdatav(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_i2swapdatav(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:), beta + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:) integer(psb_i2pk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_i2swapdatav - subroutine psi_i2swapidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_i2swapidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:,:), beta + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:,:) integer(psb_i2pk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_i2swapidxm - subroutine psi_i2swapidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_i2swapidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_Mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:), beta + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:) integer(psb_i2pk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_i2swapidxv @@ -80,60 +79,56 @@ module psi_i2_comm_a_mod interface psi_swaptran - subroutine psi_i2swaptranm(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_i2swaptranm(flag,n,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_Mpk_), intent(in) :: n integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:,:), beta + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:,:) integer(psb_i2pk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_i2swaptranm - subroutine psi_i2swaptranv(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_i2swaptranv(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:), beta + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:) integer(psb_i2pk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_i2swaptranv - subroutine psi_i2tranidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_i2tranidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:,:), beta + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:,:) integer(psb_i2pk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_i2tranidxm - subroutine psi_i2tranidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_i2tranidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_i2pk_) :: y(:), beta + integer(psb_i2pk_), intent(in) :: beta + integer(psb_i2pk_), intent(inout) :: y(:) integer(psb_i2pk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_i2tranidxv end interface psi_swaptran - + interface psi_ovrl_upd - subroutine psi_i2ovrl_updr1(x,desc_a,update,info) - import + module subroutine psi_i2ovrl_updr1(x,desc_a,update,info) integer(psb_i2pk_), intent(inout), target :: x(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update integer(psb_ipk_), intent(out) :: info end subroutine psi_i2ovrl_updr1 - subroutine psi_i2ovrl_updr2(x,desc_a,update,info) - import + module subroutine psi_i2ovrl_updr2(x,desc_a,update,info) integer(psb_i2pk_), intent(inout), target :: x(:,:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update @@ -142,15 +137,13 @@ module psi_i2_comm_a_mod end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_i2ovrl_saver1(x,xs,desc_a,info) - import + module subroutine psi_i2ovrl_saver1(x,xs,desc_a,info) integer(psb_i2pk_), intent(inout) :: x(:) integer(psb_i2pk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_i2ovrl_saver1 - subroutine psi_i2ovrl_saver2(x,xs,desc_a,info) - import + module subroutine psi_i2ovrl_saver2(x,xs,desc_a,info) integer(psb_i2pk_), intent(inout) :: x(:,:) integer(psb_i2pk_), allocatable :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a @@ -159,15 +152,13 @@ module psi_i2_comm_a_mod end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_i2ovrl_restrr1(x,xs,desc_a,info) - import + module subroutine psi_i2ovrl_restrr1(x,xs,desc_a,info) integer(psb_i2pk_), intent(inout) :: x(:) integer(psb_i2pk_) :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_i2ovrl_restrr1 - subroutine psi_i2ovrl_restrr2(x,xs,desc_a,info) - import + module subroutine psi_i2ovrl_restrr2(x,xs,desc_a,info) integer(psb_i2pk_), intent(inout) :: x(:,:) integer(psb_i2pk_) :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a diff --git a/base/modules/comm/psi_i2_comm_v_mod.f90 b/base/modules/comm/psi_i2_comm_v_mod.f90 new file mode 100644 index 000000000..87f4a8b33 --- /dev/null +++ b/base/modules/comm/psi_i2_comm_v_mod.f90 @@ -0,0 +1,164 @@ +! +! Parallel Sparse BLAS version 3.5 +! (C) Copyright 2006-2018 +! Salvatore Filippone +! Alfredo Buttari +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +module psi_i2_comm_v_mod + use psi_penv_mod, only : psb_ctxt_type + use psb_i_base_vect_mod, only : psb_i_base_vect_type + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_i2pk_ + use psb_i2_base_vect_mod, only : psb_i2_base_vect_type + use psb_i2_base_multivect_mod, only : psb_i2_base_multivect_type + + interface psi_swapdata + module subroutine psi_i2swapdata_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_i2pk_), intent(in) :: beta + class(psb_i2_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + end subroutine psi_i2swapdata_vect + module subroutine psi_i2swapdata_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_i2pk_), intent(in) :: beta + class(psb_i2_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + end subroutine psi_i2swapdata_multivect + module subroutine psi_i2swap_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_i2_base_vect_type), intent(inout) :: y + integer(psb_i2pk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv + end subroutine psi_i2swap_vidx_vect + module subroutine psi_i2swap_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_i2_base_multivect_type), intent(inout) :: y + integer(psb_i2pk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv + end subroutine psi_i2swap_vidx_multivect + end interface psi_swapdata + + + interface psi_swaptran + module subroutine psi_i2swaptran_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_i2pk_), intent(in) :: beta + class(psb_i2_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + end subroutine psi_i2swaptran_vect + module subroutine psi_i2swaptran_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_i2pk_), intent(in) :: beta + class(psb_i2_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data + end subroutine psi_i2swaptran_multivect + module subroutine psi_i2tran_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_i2_base_vect_type), intent(inout) :: y + integer(psb_i2pk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv + end subroutine psi_i2tran_vidx_vect + module subroutine psi_i2tran_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_i2_base_multivect_type), intent(inout) :: y + integer(psb_i2pk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv + end subroutine psi_i2tran_vidx_multivect + end interface psi_swaptran + + interface psi_ovrl_upd + module subroutine psi_i2ovrl_upd_vect(x,desc_a,update,info) + class(psb_i2_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + end subroutine psi_i2ovrl_upd_vect + module subroutine psi_i2ovrl_upd_multivect(x,desc_a,update,info) + class(psb_i2_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + end subroutine psi_i2ovrl_upd_multivect + end interface psi_ovrl_upd + + interface psi_ovrl_save + module subroutine psi_i2ovrl_save_vect(x,xs,desc_a,info) + class(psb_i2_base_vect_type) :: x + integer(psb_i2pk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + end subroutine psi_i2ovrl_save_vect + module subroutine psi_i2ovrl_save_multivect(x,xs,desc_a,info) + class(psb_i2_base_multivect_type) :: x + integer(psb_i2pk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + end subroutine psi_i2ovrl_save_multivect + end interface psi_ovrl_save + + interface psi_ovrl_restore + module subroutine psi_i2ovrl_restr_vect(x,xs,desc_a,info) + class(psb_i2_base_vect_type) :: x + integer(psb_i2pk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + end subroutine psi_i2ovrl_restr_vect + module subroutine psi_i2ovrl_restr_multivect(x,xs,desc_a,info) + class(psb_i2_base_multivect_type) :: x + integer(psb_i2pk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + end subroutine psi_i2ovrl_restr_multivect + end interface psi_ovrl_restore + +end module psi_i2_comm_v_mod + diff --git a/base/modules/comm/psi_i_comm_a_mod.f90 b/base/modules/comm/psi_i_comm_a_mod.f90 new file mode 100644 index 000000000..920a23f9b --- /dev/null +++ b/base/modules/comm/psi_i_comm_a_mod.f90 @@ -0,0 +1,170 @@ +! +! Parallel Sparse BLAS version 3.5 +! (C) Copyright 2006-2018 +! Salvatore Filippone +! Alfredo Buttari +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +module psi_i_comm_a_mod + use psi_penv_mod, only : psb_ctxt_type + use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, & + & psb_epk_, psb_i2pk_ + + interface psi_swapdata + module subroutine psi_iswapdatam(flag,n,beta,y,desc_a,work,info,data) + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: beta + integer(psb_ipk_), intent(inout) :: y(:,:) + integer(psb_ipk_),target :: work(:) + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), optional :: data + end subroutine psi_iswapdatam + module subroutine psi_iswapdatav(flag,beta,y,desc_a,work,info,data) + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: beta + integer(psb_ipk_), intent(inout) :: y(:) + integer(psb_ipk_),target :: work(:) + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), optional :: data + end subroutine psi_iswapdatav + module subroutine psi_iswapidxm(ctxt,flag,n,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: beta + integer(psb_ipk_), intent(inout) :: y(:,:) + integer(psb_ipk_),target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv + end subroutine psi_iswapidxm + module subroutine psi_iswapidxv(ctxt,flag,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: beta + integer(psb_ipk_), intent(inout) :: y(:) + integer(psb_ipk_),target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv + end subroutine psi_iswapidxv + end interface psi_swapdata + + + interface psi_swaptran + module subroutine psi_iswaptranm(flag,n,beta,y,desc_a,work,info,data) + integer(psb_ipk_), intent(in) :: flag + integer(psb_Mpk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: beta + integer(psb_ipk_), intent(inout) :: y(:,:) + integer(psb_ipk_),target :: work(:) + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), optional :: data + end subroutine psi_iswaptranm + module subroutine psi_iswaptranv(flag,beta,y,desc_a,work,info,data) + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: beta + integer(psb_ipk_), intent(inout) :: y(:) + integer(psb_ipk_),target :: work(:) + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), optional :: data + end subroutine psi_iswaptranv + module subroutine psi_itranidxm(ctxt,flag,n,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: beta + integer(psb_ipk_), intent(inout) :: y(:,:) + integer(psb_ipk_),target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv + end subroutine psi_itranidxm + module subroutine psi_itranidxv(ctxt,flag,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: beta + integer(psb_ipk_), intent(inout) :: y(:) + integer(psb_ipk_),target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv + end subroutine psi_itranidxv + end interface psi_swaptran + + interface psi_ovrl_upd + module subroutine psi_iovrl_updr1(x,desc_a,update,info) + integer(psb_ipk_), intent(inout), target :: x(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + end subroutine psi_iovrl_updr1 + module subroutine psi_iovrl_updr2(x,desc_a,update,info) + integer(psb_ipk_), intent(inout), target :: x(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + end subroutine psi_iovrl_updr2 + end interface psi_ovrl_upd + + interface psi_ovrl_save + module subroutine psi_iovrl_saver1(x,xs,desc_a,info) + integer(psb_ipk_), intent(inout) :: x(:) + integer(psb_ipk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + end subroutine psi_iovrl_saver1 + module subroutine psi_iovrl_saver2(x,xs,desc_a,info) + integer(psb_ipk_), intent(inout) :: x(:,:) + integer(psb_ipk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + end subroutine psi_iovrl_saver2 + end interface psi_ovrl_save + + interface psi_ovrl_restore + module subroutine psi_iovrl_restrr1(x,xs,desc_a,info) + integer(psb_ipk_), intent(inout) :: x(:) + integer(psb_ipk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + end subroutine psi_iovrl_restrr1 + module subroutine psi_iovrl_restrr2(x,xs,desc_a,info) + integer(psb_ipk_), intent(inout) :: x(:,:) + integer(psb_ipk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + end subroutine psi_iovrl_restrr2 + end interface psi_ovrl_restore + +end module psi_i_comm_a_mod + diff --git a/base/modules/comm/psi_i_comm_v_mod.f90 b/base/modules/comm/psi_i_comm_v_mod.f90 index 2fe3948c5..73292eb1f 100644 --- a/base/modules/comm/psi_i_comm_v_mod.f90 +++ b/base/modules/comm/psi_i_comm_v_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,158 +31,132 @@ ! module psi_i_comm_v_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, & - & psb_lpk_, psb_epk_, psb_i2pk_ + use psb_i_base_vect_mod, only : psb_i_base_vect_type + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_ipk_ use psb_i_base_vect_mod, only : psb_i_base_vect_type use psb_i_base_multivect_mod, only : psb_i_base_multivect_type interface psi_swapdata - subroutine psi_iswapdata_vect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_vect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_iswapdata_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_iswapdata_vect - subroutine psi_iswapdata_multivect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_multivect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_iswapdata_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_iswapdata_multivect - subroutine psi_iswap_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_vect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_iswap_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_i_base_vect_type), intent(inout) :: y + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_iswap_vidx_vect - subroutine psi_iswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_multivect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_iswap_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_i_base_multivect_type), intent(inout) :: y + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_iswap_vidx_multivect end interface psi_swapdata interface psi_swaptran - subroutine psi_iswaptran_vect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_vect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_iswaptran_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_iswaptran_vect - subroutine psi_iswaptran_multivect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_multivect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_iswaptran_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_iswaptran_multivect - subroutine psi_itran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_vect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_itran_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_i_base_vect_type), intent(inout) :: y + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_itran_vidx_vect - subroutine psi_itran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_i_base_multivect_type) :: y - integer(psb_ipk_) :: beta - integer(psb_ipk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_itran_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_i_base_multivect_type), intent(inout) :: y + integer(psb_ipk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_itran_vidx_multivect end interface psi_swaptran interface psi_ovrl_upd - subroutine psi_iovrl_upd_vect(x,desc_a,update,info) - import - class(psb_i_base_vect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info + module subroutine psi_iovrl_upd_vect(x,desc_a,update,info) + class(psb_i_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info end subroutine psi_iovrl_upd_vect - subroutine psi_iovrl_upd_multivect(x,desc_a,update,info) - import - class(psb_i_base_multivect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info + module subroutine psi_iovrl_upd_multivect(x,desc_a,update,info) + class(psb_i_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info end subroutine psi_iovrl_upd_multivect end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_iovrl_save_vect(x,xs,desc_a,info) - import - class(psb_i_base_vect_type) :: x - integer(psb_ipk_), allocatable :: xs(:) + module subroutine psi_iovrl_save_vect(x,xs,desc_a,info) + class(psb_i_base_vect_type) :: x + integer(psb_ipk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(out) :: info end subroutine psi_iovrl_save_vect - subroutine psi_iovrl_save_multivect(x,xs,desc_a,info) - import - class(psb_i_base_multivect_type) :: x - integer(psb_ipk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + module subroutine psi_iovrl_save_multivect(x,xs,desc_a,info) + class(psb_i_base_multivect_type) :: x + integer(psb_ipk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_iovrl_save_multivect end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_iovrl_restr_vect(x,xs,desc_a,info) - import + module subroutine psi_iovrl_restr_vect(x,xs,desc_a,info) class(psb_i_base_vect_type) :: x - integer(psb_ipk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_iovrl_restr_vect - subroutine psi_iovrl_restr_multivect(x,xs,desc_a,info) - import - class(psb_i_base_multivect_type) :: x - integer(psb_ipk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + module subroutine psi_iovrl_restr_multivect(x,xs,desc_a,info) + class(psb_i_base_multivect_type) :: x + integer(psb_ipk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_iovrl_restr_multivect end interface psi_ovrl_restore diff --git a/base/modules/comm/psi_l_comm_a_mod.f90 b/base/modules/comm/psi_l_comm_a_mod.f90 new file mode 100644 index 000000000..600da3a18 --- /dev/null +++ b/base/modules/comm/psi_l_comm_a_mod.f90 @@ -0,0 +1,170 @@ +! +! Parallel Sparse BLAS version 3.5 +! (C) Copyright 2006-2018 +! Salvatore Filippone +! Alfredo Buttari +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +module psi_l_comm_a_mod + use psi_penv_mod, only : psb_ctxt_type + use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, & + & psb_epk_, psb_i2pk_ + + interface psi_swapdata + module subroutine psi_lswapdatam(flag,n,beta,y,desc_a,work,info,data) + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_lpk_), intent(in) :: beta + integer(psb_lpk_), intent(inout) :: y(:,:) + integer(psb_lpk_),target :: work(:) + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), optional :: data + end subroutine psi_lswapdatam + module subroutine psi_lswapdatav(flag,beta,y,desc_a,work,info,data) + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_lpk_), intent(in) :: beta + integer(psb_lpk_), intent(inout) :: y(:) + integer(psb_lpk_),target :: work(:) + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), optional :: data + end subroutine psi_lswapdatav + module subroutine psi_lswapidxm(ctxt,flag,n,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_lpk_), intent(in) :: beta + integer(psb_lpk_), intent(inout) :: y(:,:) + integer(psb_lpk_),target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv + end subroutine psi_lswapidxm + module subroutine psi_lswapidxv(ctxt,flag,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_lpk_), intent(in) :: beta + integer(psb_lpk_), intent(inout) :: y(:) + integer(psb_lpk_),target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv + end subroutine psi_lswapidxv + end interface psi_swapdata + + + interface psi_swaptran + module subroutine psi_lswaptranm(flag,n,beta,y,desc_a,work,info,data) + integer(psb_ipk_), intent(in) :: flag + integer(psb_Mpk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + integer(psb_lpk_), intent(in) :: beta + integer(psb_lpk_), intent(inout) :: y(:,:) + integer(psb_lpk_),target :: work(:) + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), optional :: data + end subroutine psi_lswaptranm + module subroutine psi_lswaptranv(flag,beta,y,desc_a,work,info,data) + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_lpk_), intent(in) :: beta + integer(psb_lpk_), intent(inout) :: y(:) + integer(psb_lpk_),target :: work(:) + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), optional :: data + end subroutine psi_lswaptranv + module subroutine psi_ltranidxm(ctxt,flag,n,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_mpk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_lpk_), intent(in) :: beta + integer(psb_lpk_), intent(inout) :: y(:,:) + integer(psb_lpk_),target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv + end subroutine psi_ltranidxm + module subroutine psi_ltranidxv(ctxt,flag,beta,y,idx,& + & totxch,totsnd,totrcv,work,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: flag + integer(psb_ipk_), intent(out) :: info + integer(psb_lpk_), intent(in) :: beta + integer(psb_lpk_), intent(inout) :: y(:) + integer(psb_lpk_),target :: work(:) + integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv + end subroutine psi_ltranidxv + end interface psi_swaptran + + interface psi_ovrl_upd + module subroutine psi_lovrl_updr1(x,desc_a,update,info) + integer(psb_lpk_), intent(inout), target :: x(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + end subroutine psi_lovrl_updr1 + module subroutine psi_lovrl_updr2(x,desc_a,update,info) + integer(psb_lpk_), intent(inout), target :: x(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info + end subroutine psi_lovrl_updr2 + end interface psi_ovrl_upd + + interface psi_ovrl_save + module subroutine psi_lovrl_saver1(x,xs,desc_a,info) + integer(psb_lpk_), intent(inout) :: x(:) + integer(psb_lpk_), allocatable :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + end subroutine psi_lovrl_saver1 + module subroutine psi_lovrl_saver2(x,xs,desc_a,info) + integer(psb_lpk_), intent(inout) :: x(:,:) + integer(psb_lpk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + end subroutine psi_lovrl_saver2 + end interface psi_ovrl_save + + interface psi_ovrl_restore + module subroutine psi_lovrl_restrr1(x,xs,desc_a,info) + integer(psb_lpk_), intent(inout) :: x(:) + integer(psb_lpk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + end subroutine psi_lovrl_restrr1 + module subroutine psi_lovrl_restrr2(x,xs,desc_a,info) + integer(psb_lpk_), intent(inout) :: x(:,:) + integer(psb_lpk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info + end subroutine psi_lovrl_restrr2 + end interface psi_ovrl_restore + +end module psi_l_comm_a_mod + diff --git a/base/modules/comm/psi_l_comm_v_mod.f90 b/base/modules/comm/psi_l_comm_v_mod.f90 index b61a17b73..bb29386df 100644 --- a/base/modules/comm/psi_l_comm_v_mod.f90 +++ b/base/modules/comm/psi_l_comm_v_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,159 +31,132 @@ ! module psi_l_comm_v_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, & - & psb_lpk_, psb_epk_, psb_i2pk_ - use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_lpk_, psb_epk_, psb_i_base_vect_type + use psb_i_base_vect_mod, only : psb_i_base_vect_type + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_lpk_ use psb_l_base_vect_mod, only : psb_l_base_vect_type use psb_l_base_multivect_mod, only : psb_l_base_multivect_type interface psi_swapdata - subroutine psi_lswapdata_vect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_vect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_lswapdata_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_lswapdata_vect - subroutine psi_lswapdata_multivect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_multivect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_lswapdata_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_lswapdata_multivect - subroutine psi_lswap_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_vect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_lswap_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_l_base_vect_type), intent(inout) :: y + integer(psb_lpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_lswap_vidx_vect - subroutine psi_lswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_multivect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_lswap_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_l_base_multivect_type), intent(inout) :: y + integer(psb_lpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_lswap_vidx_multivect end interface psi_swapdata interface psi_swaptran - subroutine psi_lswaptran_vect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_vect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_lswaptran_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_lswaptran_vect - subroutine psi_lswaptran_multivect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_multivect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_lswaptran_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_lpk_), intent(in) :: beta + class(psb_l_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_lswaptran_multivect - subroutine psi_ltran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_vect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_ltran_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_l_base_vect_type), intent(inout) :: y + integer(psb_lpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_ltran_vidx_vect - subroutine psi_ltran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_l_base_multivect_type) :: y - integer(psb_lpk_) :: beta - integer(psb_lpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_ltran_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_l_base_multivect_type), intent(inout) :: y + integer(psb_lpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_ltran_vidx_multivect end interface psi_swaptran interface psi_ovrl_upd - subroutine psi_lovrl_upd_vect(x,desc_a,update,info) - import - class(psb_l_base_vect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info + module subroutine psi_lovrl_upd_vect(x,desc_a,update,info) + class(psb_l_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info end subroutine psi_lovrl_upd_vect - subroutine psi_lovrl_upd_multivect(x,desc_a,update,info) - import - class(psb_l_base_multivect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info + module subroutine psi_lovrl_upd_multivect(x,desc_a,update,info) + class(psb_l_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info end subroutine psi_lovrl_upd_multivect end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_lovrl_save_vect(x,xs,desc_a,info) - import - class(psb_l_base_vect_type) :: x - integer(psb_lpk_), allocatable :: xs(:) + module subroutine psi_lovrl_save_vect(x,xs,desc_a,info) + class(psb_l_base_vect_type) :: x + integer(psb_lpk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(out) :: info end subroutine psi_lovrl_save_vect - subroutine psi_lovrl_save_multivect(x,xs,desc_a,info) - import - class(psb_l_base_multivect_type) :: x - integer(psb_lpk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + module subroutine psi_lovrl_save_multivect(x,xs,desc_a,info) + class(psb_l_base_multivect_type) :: x + integer(psb_lpk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_lovrl_save_multivect end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_lovrl_restr_vect(x,xs,desc_a,info) - import + module subroutine psi_lovrl_restr_vect(x,xs,desc_a,info) class(psb_l_base_vect_type) :: x - integer(psb_lpk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + integer(psb_lpk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_lovrl_restr_vect - subroutine psi_lovrl_restr_multivect(x,xs,desc_a,info) - import - class(psb_l_base_multivect_type) :: x - integer(psb_lpk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + module subroutine psi_lovrl_restr_multivect(x,xs,desc_a,info) + class(psb_l_base_multivect_type) :: x + integer(psb_lpk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_lovrl_restr_multivect end interface psi_ovrl_restore diff --git a/base/modules/comm/psi_m_comm_a_mod.f90 b/base/modules/comm/psi_m_comm_a_mod.f90 index 825e1579f..8ed2ac7e6 100644 --- a/base/modules/comm/psi_m_comm_a_mod.f90 +++ b/base/modules/comm/psi_m_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,48 +31,47 @@ ! module psi_m_comm_a_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, psb_epk_ + use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, & + & psb_epk_, psb_i2pk_ interface psi_swapdata - subroutine psi_mswapdatam(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_mswapdatam(flag,n,beta,y,desc_a,work,info,data) integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:,:), beta + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:,:) integer(psb_mpk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_mswapdatam - subroutine psi_mswapdatav(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_mswapdatav(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:), beta + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:) integer(psb_mpk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_mswapdatav - subroutine psi_mswapidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_mswapidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:,:), beta + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:,:) integer(psb_mpk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_mswapidxm - subroutine psi_mswapidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_mswapidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_Mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:), beta + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:) integer(psb_mpk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_mswapidxv @@ -80,60 +79,56 @@ module psi_m_comm_a_mod interface psi_swaptran - subroutine psi_mswaptranm(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_mswaptranm(flag,n,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_Mpk_), intent(in) :: n integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:,:), beta + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:,:) integer(psb_mpk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_mswaptranm - subroutine psi_mswaptranv(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_mswaptranv(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:), beta + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:) integer(psb_mpk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_mswaptranv - subroutine psi_mtranidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_mtranidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:,:), beta + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:,:) integer(psb_mpk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_mtranidxm - subroutine psi_mtranidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_mtranidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - integer(psb_mpk_) :: y(:), beta + integer(psb_mpk_), intent(in) :: beta + integer(psb_mpk_), intent(inout) :: y(:) integer(psb_mpk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_mtranidxv end interface psi_swaptran - + interface psi_ovrl_upd - subroutine psi_movrl_updr1(x,desc_a,update,info) - import + module subroutine psi_movrl_updr1(x,desc_a,update,info) integer(psb_mpk_), intent(inout), target :: x(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update integer(psb_ipk_), intent(out) :: info end subroutine psi_movrl_updr1 - subroutine psi_movrl_updr2(x,desc_a,update,info) - import + module subroutine psi_movrl_updr2(x,desc_a,update,info) integer(psb_mpk_), intent(inout), target :: x(:,:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update @@ -142,15 +137,13 @@ module psi_m_comm_a_mod end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_movrl_saver1(x,xs,desc_a,info) - import + module subroutine psi_movrl_saver1(x,xs,desc_a,info) integer(psb_mpk_), intent(inout) :: x(:) integer(psb_mpk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_movrl_saver1 - subroutine psi_movrl_saver2(x,xs,desc_a,info) - import + module subroutine psi_movrl_saver2(x,xs,desc_a,info) integer(psb_mpk_), intent(inout) :: x(:,:) integer(psb_mpk_), allocatable :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a @@ -159,15 +152,13 @@ module psi_m_comm_a_mod end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_movrl_restrr1(x,xs,desc_a,info) - import + module subroutine psi_movrl_restrr1(x,xs,desc_a,info) integer(psb_mpk_), intent(inout) :: x(:) integer(psb_mpk_) :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_movrl_restrr1 - subroutine psi_movrl_restrr2(x,xs,desc_a,info) - import + module subroutine psi_movrl_restrr2(x,xs,desc_a,info) integer(psb_mpk_), intent(inout) :: x(:,:) integer(psb_mpk_) :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a diff --git a/base/modules/comm/psi_s_comm_a_mod.f90 b/base/modules/comm/psi_s_comm_a_mod.f90 index 10369b51e..f9a2fdc8a 100644 --- a/base/modules/comm/psi_s_comm_a_mod.f90 +++ b/base/modules/comm/psi_s_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,48 +31,47 @@ ! module psi_s_comm_a_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, psb_spk_, psb_i_base_vect_type + use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, & + & psb_spk_, psb_i_base_vect_type interface psi_swapdata - subroutine psi_sswapdatam(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_sswapdatam(flag,n,beta,y,desc_a,work,info,data) integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:,:), beta + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:,:) real(psb_spk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_sswapdatam - subroutine psi_sswapdatav(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_sswapdatav(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:), beta + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:) real(psb_spk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_sswapdatav - subroutine psi_sswapidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_sswapidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:,:), beta + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:,:) real(psb_spk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_sswapidxm - subroutine psi_sswapidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_sswapidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_Mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:), beta + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:) real(psb_spk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_sswapidxv @@ -80,60 +79,56 @@ module psi_s_comm_a_mod interface psi_swaptran - subroutine psi_sswaptranm(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_sswaptranm(flag,n,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_Mpk_), intent(in) :: n integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:,:), beta + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:,:) real(psb_spk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_sswaptranm - subroutine psi_sswaptranv(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_sswaptranv(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:), beta + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:) real(psb_spk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_sswaptranv - subroutine psi_stranidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_stranidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:,:), beta + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:,:) real(psb_spk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_stranidxm - subroutine psi_stranidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_stranidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - real(psb_spk_) :: y(:), beta + real(psb_spk_), intent(in) :: beta + real(psb_spk_), intent(inout) :: y(:) real(psb_spk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_stranidxv end interface psi_swaptran - + interface psi_ovrl_upd - subroutine psi_sovrl_updr1(x,desc_a,update,info) - import + module subroutine psi_sovrl_updr1(x,desc_a,update,info) real(psb_spk_), intent(inout), target :: x(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update integer(psb_ipk_), intent(out) :: info end subroutine psi_sovrl_updr1 - subroutine psi_sovrl_updr2(x,desc_a,update,info) - import + module subroutine psi_sovrl_updr2(x,desc_a,update,info) real(psb_spk_), intent(inout), target :: x(:,:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update @@ -142,15 +137,13 @@ module psi_s_comm_a_mod end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_sovrl_saver1(x,xs,desc_a,info) - import + module subroutine psi_sovrl_saver1(x,xs,desc_a,info) real(psb_spk_), intent(inout) :: x(:) real(psb_spk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_sovrl_saver1 - subroutine psi_sovrl_saver2(x,xs,desc_a,info) - import + module subroutine psi_sovrl_saver2(x,xs,desc_a,info) real(psb_spk_), intent(inout) :: x(:,:) real(psb_spk_), allocatable :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a @@ -159,15 +152,13 @@ module psi_s_comm_a_mod end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_sovrl_restrr1(x,xs,desc_a,info) - import + module subroutine psi_sovrl_restrr1(x,xs,desc_a,info) real(psb_spk_), intent(inout) :: x(:) real(psb_spk_) :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_sovrl_restrr1 - subroutine psi_sovrl_restrr2(x,xs,desc_a,info) - import + module subroutine psi_sovrl_restrr2(x,xs,desc_a,info) real(psb_spk_), intent(inout) :: x(:,:) real(psb_spk_) :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a diff --git a/base/modules/comm/psi_s_comm_v_mod.f90 b/base/modules/comm/psi_s_comm_v_mod.f90 index 1cf4d53ec..67fbaa25e 100644 --- a/base/modules/comm/psi_s_comm_v_mod.f90 +++ b/base/modules/comm/psi_s_comm_v_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,157 +31,132 @@ ! module psi_s_comm_v_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_spk_, psb_i_base_vect_type + use psb_i_base_vect_mod, only : psb_i_base_vect_type + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_spk_ use psb_s_base_vect_mod, only : psb_s_base_vect_type use psb_s_base_multivect_mod, only : psb_s_base_multivect_type interface psi_swapdata - subroutine psi_sswapdata_vect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_vect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_sswapdata_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_sswapdata_vect - subroutine psi_sswapdata_multivect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_multivect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_sswapdata_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_sswapdata_multivect - subroutine psi_sswap_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_vect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_sswap_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_s_base_vect_type), intent(inout) :: y + real(psb_spk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_sswap_vidx_vect - subroutine psi_sswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_multivect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_sswap_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_s_base_multivect_type), intent(inout) :: y + real(psb_spk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_sswap_vidx_multivect end interface psi_swapdata interface psi_swaptran - subroutine psi_sswaptran_vect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_vect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_sswaptran_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_sswaptran_vect - subroutine psi_sswaptran_multivect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_multivect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_sswaptran_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + real(psb_spk_), intent(in) :: beta + class(psb_s_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_sswaptran_multivect - subroutine psi_stran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_vect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_stran_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_s_base_vect_type), intent(inout) :: y + real(psb_spk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_stran_vidx_vect - subroutine psi_stran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_s_base_multivect_type) :: y - real(psb_spk_) :: beta - real(psb_spk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_stran_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_s_base_multivect_type), intent(inout) :: y + real(psb_spk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_stran_vidx_multivect end interface psi_swaptran interface psi_ovrl_upd - subroutine psi_sovrl_upd_vect(x,desc_a,update,info) - import - class(psb_s_base_vect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info + module subroutine psi_sovrl_upd_vect(x,desc_a,update,info) + class(psb_s_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info end subroutine psi_sovrl_upd_vect - subroutine psi_sovrl_upd_multivect(x,desc_a,update,info) - import - class(psb_s_base_multivect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info + module subroutine psi_sovrl_upd_multivect(x,desc_a,update,info) + class(psb_s_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info end subroutine psi_sovrl_upd_multivect end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_sovrl_save_vect(x,xs,desc_a,info) - import - class(psb_s_base_vect_type) :: x - real(psb_spk_), allocatable :: xs(:) + module subroutine psi_sovrl_save_vect(x,xs,desc_a,info) + class(psb_s_base_vect_type) :: x + real(psb_spk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(out) :: info end subroutine psi_sovrl_save_vect - subroutine psi_sovrl_save_multivect(x,xs,desc_a,info) - import - class(psb_s_base_multivect_type) :: x - real(psb_spk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + module subroutine psi_sovrl_save_multivect(x,xs,desc_a,info) + class(psb_s_base_multivect_type) :: x + real(psb_spk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_sovrl_save_multivect end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_sovrl_restr_vect(x,xs,desc_a,info) - import + module subroutine psi_sovrl_restr_vect(x,xs,desc_a,info) class(psb_s_base_vect_type) :: x - real(psb_spk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + real(psb_spk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_sovrl_restr_vect - subroutine psi_sovrl_restr_multivect(x,xs,desc_a,info) - import - class(psb_s_base_multivect_type) :: x - real(psb_spk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + module subroutine psi_sovrl_restr_multivect(x,xs,desc_a,info) + class(psb_s_base_multivect_type) :: x + real(psb_spk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_sovrl_restr_multivect end interface psi_ovrl_restore diff --git a/base/modules/comm/psi_z_comm_a_mod.f90 b/base/modules/comm/psi_z_comm_a_mod.f90 index 9f7477a16..0203660d8 100644 --- a/base/modules/comm/psi_z_comm_a_mod.f90 +++ b/base/modules/comm/psi_z_comm_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,48 +31,47 @@ ! module psi_z_comm_a_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, psb_dpk_, psb_i_base_vect_type + use psb_desc_mod, only : psb_desc_type, psb_mpk_, psb_ipk_, & + & psb_dpk_, psb_i_base_vect_type interface psi_swapdata - subroutine psi_zswapdatam(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_zswapdatam(flag,n,beta,y,desc_a,work,info,data) integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:,:), beta + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:,:) complex(psb_dpk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_zswapdatam - subroutine psi_zswapdatav(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_zswapdatav(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:), beta + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:) complex(psb_dpk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_zswapdatav - subroutine psi_zswapidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_zswapidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:,:), beta + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:,:) complex(psb_dpk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_zswapidxm - subroutine psi_zswapidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_zswapidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_Mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:), beta + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:) complex(psb_dpk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_zswapidxv @@ -80,60 +79,56 @@ module psi_z_comm_a_mod interface psi_swaptran - subroutine psi_zswaptranm(flag,n,beta,y,desc_a,work,info,data) - import + module subroutine psi_zswaptranm(flag,n,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_Mpk_), intent(in) :: n integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:,:), beta + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:,:) complex(psb_dpk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_zswaptranm - subroutine psi_zswaptranv(flag,beta,y,desc_a,work,info,data) - import + module subroutine psi_zswaptranv(flag,beta,y,desc_a,work,info,data) integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:), beta + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:) complex(psb_dpk_),target :: work(:) type(psb_desc_type), target :: desc_a integer(psb_ipk_), optional :: data end subroutine psi_zswaptranv - subroutine psi_ztranidxm(ctxt,icomm,flag,n,beta,y,idx,& + module subroutine psi_ztranidxm(ctxt,flag,n,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_mpk_), intent(in) :: n integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:,:), beta + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:,:) complex(psb_dpk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_ztranidxm - subroutine psi_ztranidxv(ctxt,icomm,flag,beta,y,idx,& + module subroutine psi_ztranidxv(ctxt,flag,beta,y,idx,& & totxch,totsnd,totrcv,work,info) - import type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm integer(psb_ipk_), intent(in) :: flag integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_) :: y(:), beta + complex(psb_dpk_), intent(in) :: beta + complex(psb_dpk_), intent(inout) :: y(:) complex(psb_dpk_),target :: work(:) integer(psb_ipk_), intent(in) :: idx(:),totxch,totsnd,totrcv end subroutine psi_ztranidxv end interface psi_swaptran - + interface psi_ovrl_upd - subroutine psi_zovrl_updr1(x,desc_a,update,info) - import + module subroutine psi_zovrl_updr1(x,desc_a,update,info) complex(psb_dpk_), intent(inout), target :: x(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update integer(psb_ipk_), intent(out) :: info end subroutine psi_zovrl_updr1 - subroutine psi_zovrl_updr2(x,desc_a,update,info) - import + module subroutine psi_zovrl_updr2(x,desc_a,update,info) complex(psb_dpk_), intent(inout), target :: x(:,:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(in) :: update @@ -142,15 +137,13 @@ module psi_z_comm_a_mod end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_zovrl_saver1(x,xs,desc_a,info) - import + module subroutine psi_zovrl_saver1(x,xs,desc_a,info) complex(psb_dpk_), intent(inout) :: x(:) complex(psb_dpk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_zovrl_saver1 - subroutine psi_zovrl_saver2(x,xs,desc_a,info) - import + module subroutine psi_zovrl_saver2(x,xs,desc_a,info) complex(psb_dpk_), intent(inout) :: x(:,:) complex(psb_dpk_), allocatable :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a @@ -159,15 +152,13 @@ module psi_z_comm_a_mod end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_zovrl_restrr1(x,xs,desc_a,info) - import + module subroutine psi_zovrl_restrr1(x,xs,desc_a,info) complex(psb_dpk_), intent(inout) :: x(:) complex(psb_dpk_) :: xs(:) type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info end subroutine psi_zovrl_restrr1 - subroutine psi_zovrl_restrr2(x,xs,desc_a,info) - import + module subroutine psi_zovrl_restrr2(x,xs,desc_a,info) complex(psb_dpk_), intent(inout) :: x(:,:) complex(psb_dpk_) :: xs(:,:) type(psb_desc_type), intent(in) :: desc_a diff --git a/base/modules/comm/psi_z_comm_v_mod.f90 b/base/modules/comm/psi_z_comm_v_mod.f90 index de8e11176..e1eb6ed52 100644 --- a/base/modules/comm/psi_z_comm_v_mod.f90 +++ b/base/modules/comm/psi_z_comm_v_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,157 +31,132 @@ ! module psi_z_comm_v_mod use psi_penv_mod, only : psb_ctxt_type - use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_dpk_, psb_i_base_vect_type + use psb_i_base_vect_mod, only : psb_i_base_vect_type + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_dpk_ use psb_z_base_vect_mod, only : psb_z_base_vect_type use psb_z_base_multivect_mod, only : psb_z_base_multivect_type interface psi_swapdata - subroutine psi_zswapdata_vect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_vect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_zswapdata_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_zswapdata_vect - subroutine psi_zswapdata_multivect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_multivect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_zswapdata_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_zswapdata_multivect - subroutine psi_zswap_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_vect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_zswap_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_z_base_vect_type), intent(inout) :: y + complex(psb_dpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_zswap_vidx_vect - subroutine psi_zswap_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_multivect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_zswap_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_z_base_multivect_type), intent(inout) :: y + complex(psb_dpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_zswap_vidx_multivect end interface psi_swapdata interface psi_swaptran - subroutine psi_zswaptran_vect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_vect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_zswaptran_vect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_vect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_zswaptran_vect - subroutine psi_zswaptran_multivect(flag,beta,y,desc_a,work,info,data) - import - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_multivect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_),target :: work(:) - type(psb_desc_type), target :: desc_a - integer(psb_ipk_), optional :: data + module subroutine psi_zswaptran_multivect(swap_status,beta,y,desc_a,info,data) + integer(psb_ipk_), intent(in) :: swap_status + complex(psb_dpk_), intent(in) :: beta + class(psb_z_base_multivect_type), intent(inout) :: y + type(psb_desc_type), target :: desc_a + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), optional :: data end subroutine psi_zswaptran_multivect - subroutine psi_ztran_vidx_vect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_vect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_ztran_vidx_vect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_z_base_vect_type), intent(inout) :: y + complex(psb_dpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_ztran_vidx_vect - subroutine psi_ztran_vidx_multivect(ctxt,icomm,flag,beta,y,idx,& - & totxch,totsnd,totrcv,work,info) - import - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_mpk_), intent(in) :: icomm - integer(psb_ipk_), intent(in) :: flag - integer(psb_ipk_), intent(out) :: info - class(psb_z_base_multivect_type) :: y - complex(psb_dpk_) :: beta - complex(psb_dpk_), target :: work(:) - class(psb_i_base_vect_type), intent(inout) :: idx - integer(psb_ipk_), intent(in) :: totxch,totsnd, totrcv + module subroutine psi_ztran_vidx_multivect(ctxt,swap_status,beta,y,idx,& + & totxch,totsnd,totrcv,info) + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(in) :: swap_status + integer(psb_ipk_), intent(out) :: info + class(psb_z_base_multivect_type), intent(inout) :: y + complex(psb_dpk_), intent(in) :: beta + class(psb_i_base_vect_type), intent(inout) :: idx + integer(psb_ipk_), intent(in) :: totxch, totsnd, totrcv end subroutine psi_ztran_vidx_multivect end interface psi_swaptran interface psi_ovrl_upd - subroutine psi_zovrl_upd_vect(x,desc_a,update,info) - import - class(psb_z_base_vect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info + module subroutine psi_zovrl_upd_vect(x,desc_a,update,info) + class(psb_z_base_vect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info end subroutine psi_zovrl_upd_vect - subroutine psi_zovrl_upd_multivect(x,desc_a,update,info) - import - class(psb_z_base_multivect_type) :: x - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(in) :: update - integer(psb_ipk_), intent(out) :: info + module subroutine psi_zovrl_upd_multivect(x,desc_a,update,info) + class(psb_z_base_multivect_type) :: x + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(in) :: update + integer(psb_ipk_), intent(out) :: info end subroutine psi_zovrl_upd_multivect end interface psi_ovrl_upd interface psi_ovrl_save - subroutine psi_zovrl_save_vect(x,xs,desc_a,info) - import - class(psb_z_base_vect_type) :: x - complex(psb_dpk_), allocatable :: xs(:) + module subroutine psi_zovrl_save_vect(x,xs,desc_a,info) + class(psb_z_base_vect_type) :: x + complex(psb_dpk_), allocatable :: xs(:) type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(out) :: info end subroutine psi_zovrl_save_vect - subroutine psi_zovrl_save_multivect(x,xs,desc_a,info) - import - class(psb_z_base_multivect_type) :: x - complex(psb_dpk_), allocatable :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + module subroutine psi_zovrl_save_multivect(x,xs,desc_a,info) + class(psb_z_base_multivect_type) :: x + complex(psb_dpk_), allocatable :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_zovrl_save_multivect end interface psi_ovrl_save interface psi_ovrl_restore - subroutine psi_zovrl_restr_vect(x,xs,desc_a,info) - import + module subroutine psi_zovrl_restr_vect(x,xs,desc_a,info) class(psb_z_base_vect_type) :: x - complex(psb_dpk_) :: xs(:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + complex(psb_dpk_) :: xs(:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_zovrl_restr_vect - subroutine psi_zovrl_restr_multivect(x,xs,desc_a,info) - import - class(psb_z_base_multivect_type) :: x - complex(psb_dpk_) :: xs(:,:) - type(psb_desc_type), intent(in) :: desc_a - integer(psb_ipk_), intent(out) :: info + module subroutine psi_zovrl_restr_multivect(x,xs,desc_a,info) + class(psb_z_base_multivect_type) :: x + complex(psb_dpk_) :: xs(:,:) + type(psb_desc_type), intent(in) :: desc_a + integer(psb_ipk_), intent(out) :: info end subroutine psi_zovrl_restr_multivect end interface psi_ovrl_restore diff --git a/base/modules/desc/psb_desc_const_mod.f90 b/base/modules/desc/psb_desc_const_mod.f90 index 173031e96..a655ec253 100644 --- a/base/modules/desc/psb_desc_const_mod.f90 +++ b/base/modules/desc/psb_desc_const_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -39,29 +39,40 @@ module psb_desc_const_mod ! ! Communication, prolongation & restriction ! - integer(psb_ipk_), parameter :: psb_nohalo_=0, psb_halo_=1 + integer(psb_ipk_), parameter :: psb_nohalo_ = 0 + integer(psb_ipk_), parameter :: psb_halo_ = 1 ! For overlap update. - integer(psb_ipk_), parameter :: psb_none_=0, psb_sum_=1 - integer(psb_ipk_), parameter :: psb_avg_=2, psb_square_root_=3 - integer(psb_ipk_), parameter :: psb_setzero_=4 + integer(psb_ipk_), parameter :: psb_none_ = 0 + integer(psb_ipk_), parameter :: psb_sum_ = 1 + integer(psb_ipk_), parameter :: psb_avg_ = 2 + integer(psb_ipk_), parameter :: psb_square_root_ = 3 + integer(psb_ipk_), parameter :: psb_setzero_ = 4 ! The following are bit fields. - integer(psb_ipk_), parameter :: psb_swap_send_=1, psb_swap_recv_=2 - integer(psb_ipk_), parameter :: psb_swap_sync_=4, psb_swap_mpi_=8 - integer(psb_ipk_), parameter :: psb_collective_start_=1, psb_collective_end_=2 - integer(psb_ipk_), parameter :: psb_collective_sync_=4 + integer(psb_ipk_), parameter :: psb_swap_send_ = 1 + integer(psb_ipk_), parameter :: psb_swap_recv_ = 2 + integer(psb_ipk_), parameter :: psb_swap_sync_ = 4 + integer(psb_ipk_), parameter :: psb_swap_mpi_ = 8 + integer(psb_ipk_), parameter :: psb_swap_start_ = 16 + integer(psb_ipk_), parameter :: psb_swap_wait_ = 32 + integer(psb_ipk_), parameter :: psb_collective_start_ = 1 + integer(psb_ipk_), parameter :: psb_collective_end_ = 2 + integer(psb_ipk_), parameter :: psb_collective_sync_ = 4 ! Choice among lists on which to base data exchange - integer(psb_ipk_), parameter :: psb_no_comm_=-1 - integer(psb_ipk_), parameter :: psb_comm_halo_=1, psb_comm_ovr_=2 - integer(psb_ipk_), parameter :: psb_comm_ext_=3, psb_comm_mov_=4 + integer(psb_ipk_), parameter :: psb_no_comm_ = -1 + integer(psb_ipk_), parameter :: psb_comm_halo_ = 1 + integer(psb_ipk_), parameter :: psb_comm_ovr_ = 2 + integer(psb_ipk_), parameter :: psb_comm_ext_ = 3 + integer(psb_ipk_), parameter :: psb_comm_mov_ = 4 ! Types of mapping between descriptors. integer(psb_ipk_), parameter :: psb_map_xhal_ = 123 integer(psb_ipk_), parameter :: psb_map_asov_ = psb_map_xhal_+1 integer(psb_ipk_), parameter :: psb_map_aggr_ = psb_map_asov_+1 integer(psb_ipk_), parameter :: psb_map_gen_linear_ = psb_map_aggr_+1 - integer(psb_ipk_), parameter :: psb_ovt_xhal_ = psb_map_xhal_, psb_ovt_asov_=psb_map_asov_ + integer(psb_ipk_), parameter :: psb_ovt_xhal_ = psb_map_xhal_ + integer(psb_ipk_), parameter :: psb_ovt_asov_ = psb_map_asov_ ! ! Entries and values in desc%matrix_data ! diff --git a/base/modules/desc/psb_desc_mod.F90 b/base/modules/desc/psb_desc_mod.F90 index 716e222c9..4b109465f 100644 --- a/base/modules/desc/psb_desc_mod.F90 +++ b/base/modules/desc/psb_desc_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -40,6 +40,7 @@ module psb_desc_mod use psb_desc_const_mod use psb_indx_map_mod use psb_i_vect_mod + use psb_comm_schemes_mod, only: psb_comm_isend_irecv_ implicit none @@ -216,6 +217,7 @@ module psb_desc_mod integer(psb_ipk_), allocatable :: lprm(:) type(psb_desc_type), pointer :: base_desc => null() integer(psb_ipk_), allocatable :: idx_space(:) + integer(psb_ipk_) :: comm_type = psb_comm_isend_irecv_ contains procedure, pass(desc) :: is_ok => psb_is_ok_desc procedure, pass(desc) :: is_valid => psb_is_valid_desc @@ -224,7 +226,6 @@ module psb_desc_mod procedure, pass(desc) :: is_asb => psb_is_asb_desc procedure, pass(desc) :: is_ovl => psb_is_ovl_desc procedure, pass(desc) :: is_repl => psb_is_repl_desc - procedure, pass(desc) :: get_mpic => psb_cd_get_mpic procedure, pass(desc) :: get_dectype => psb_cd_get_dectype procedure, pass(desc) :: get_context => psb_cd_get_context procedure, pass(desc) :: get_ctxt => psb_cd_get_context @@ -236,15 +237,16 @@ module psb_desc_mod procedure, pass(desc) :: get_p_adjcncy => cd_get_p_adjcncy procedure, pass(desc) :: set_p_adjcncy => cd_set_p_adjcncy procedure, pass(desc) :: xtnd_p_adjcncy => cd_xtnd_p_adjcncy - procedure, pass(desc) :: a_get_list => psb_cd_get_list - procedure, pass(desc) :: v_get_list => psb_cd_v_get_list - generic, public :: get_list => a_get_list, v_get_list + procedure, pass(desc) :: a_get_list_p => psb_cd_get_list_p + procedure, pass(desc) :: v_get_list_p => psb_cd_v_get_list_p + generic, public :: get_list_p => a_get_list_p, v_get_list_p procedure, pass(desc) :: sizeof => psb_cd_sizeof procedure, pass(desc) :: clone => psb_cd_clone procedure, pass(desc) :: cnv => psb_cd_cnv procedure, pass(desc) :: free => psb_cdfree procedure, pass(desc) :: destroy => psb_cd_destroy procedure, pass(desc) :: nullify => nullify_desc + procedure, pass(desc) :: check_addr => psb_cd_check_addr procedure, pass(desc) :: get_fmt => cd_get_fmt procedure, pass(desc) :: fnd_owner => cd_fnd_owner @@ -268,7 +270,7 @@ module psb_desc_mod procedure, pass(desc) :: g2lv2_ins => cd_g2lv2_ins generic, public :: g2l_ins => g2ls2_ins, g2lv2_ins generic, public :: g2lip_ins => g2ls1_ins, g2lv1_ins - + procedure, pass(desc) :: set_comm_scheme => psb_desc_set_comm_scheme end type psb_desc_type @@ -312,7 +314,16 @@ module psb_desc_mod integer(psb_lpk_), private, save :: cd_hash_threshold = psb_default_hash_threshold integer(psb_ipk_), private, save :: sp_a2av_alg = psb_sp_a2av_smpl_triad_ -contains +contains + + subroutine psb_desc_set_comm_scheme(desc, comm_type, info) + implicit none + class(psb_desc_type), intent(inout) :: desc + integer(psb_ipk_), intent(in) :: comm_type + integer(psb_ipk_), intent(out) :: info + info = psb_success_ + desc%comm_type = comm_type + end subroutine psb_desc_set_comm_scheme function psb_m_get_sp_a2av_alg() result(val) implicit none @@ -637,23 +648,6 @@ contains end function psb_cd_get_dectype - function psb_cd_get_mpic(desc) result(val) - use psb_error_mod - implicit none - integer(psb_ipk_) :: val - class(psb_desc_type), intent(in) :: desc - - if (allocated(desc%indxmap)) then - val = desc%indxmap%get_mpic() - else - val = -1 -!!$ call psb_errpush(psb_err_invalid_cd_state_,'psb_cd_get_mpic') -!!$ call psb_error() - end if - - end function psb_cd_get_mpic - - function cd_get_p_adjcncy(desc) result(val) implicit none integer(psb_ipk_), allocatable :: val(:) @@ -741,7 +735,7 @@ contains - subroutine psb_cd_get_list(data,desc,ipnt,totxch,idxr,idxs,info) + subroutine psb_cd_get_list_p(data,desc,ipnt,totxch,idxr,idxs,info) use psb_const_mod use psb_error_mod use psb_penv_mod @@ -756,7 +750,7 @@ contains type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me, err_act, debug_level, debug_unit logical, parameter :: debug=.false., debugprt=.false. - character(len=20), parameter :: name='psb_cd_get_list' + character(len=20), parameter :: name='psb_cd_get_list_p' info = psb_success_ call psb_erractionsave(err_act) @@ -768,12 +762,25 @@ contains call psb_info(ctxt, me, np) select case(data) - case(psb_comm_halo_) - ipnt => desc%halo_index + case(psb_comm_halo_) + if (allocated(desc%halo_index)) then + ipnt => desc%halo_index + else + info = psb_err_invalid_cd_state_ + end if case(psb_comm_ovr_) - ipnt => desc%ovrlap_index + if (allocated(desc%ovrlap_index)) then + ipnt => desc%ovrlap_index + else + info = psb_err_invalid_cd_state_ + end if + case(psb_comm_ext_) - ipnt => desc%ext_index + if (allocated(desc%ext_index)) then + ipnt => desc%ext_index + else + info = psb_err_invalid_cd_state_ + end if if (debug_level >= psb_debug_ext_) then if (.not.associated(desc%base_desc)) then write(debug_unit,*) trim(name),& @@ -787,12 +794,17 @@ contains end if end if case(psb_comm_mov_) - ipnt => desc%ovr_mst_idx + if (allocated(desc%ovr_mst_idx)) then + ipnt => desc%ovr_mst_idx + else + info = psb_err_invalid_cd_state_ + end if case default info=psb_err_from_subroutine_ call psb_errpush(info,name,a_err='wrong Data selector') - goto 9999 end select + if (info /= 0) goto 9999 + call psb_get_xch_idx(ipnt,totxch,idxs,idxr) @@ -804,10 +816,10 @@ contains return - end subroutine psb_cd_get_list + end subroutine psb_cd_get_list_p - subroutine psb_cd_v_get_list(data,desc,ipnt,totxch,idxr,idxs,info) + subroutine psb_cd_v_get_list_p(data,desc,ipnt,totxch,idxr,idxs,info) use psb_const_mod use psb_error_mod use psb_penv_mod @@ -821,7 +833,7 @@ contains type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me, err_act, debug_level, debug_unit logical, parameter :: debug=.false., debugprt=.false. - character(len=20), parameter :: name='psb_cd_v_get_list' + character(len=20), parameter :: name='psb_cd_v_get_list_p' info = psb_success_ call psb_erractionsave(err_act) @@ -833,18 +845,25 @@ contains call psb_info(ctxt, me, np) select case(data) - case(psb_comm_halo_) - ipnt => desc%v_halo_index%v - if (.not.allocated(desc%v_halo_index%v)) & - & info = psb_err_inconsistent_index_lists_ + case(psb_comm_halo_) + if (allocated(desc%v_halo_index%v)) then + ipnt => desc%v_halo_index%v + else + info = psb_err_inconsistent_index_lists_ + end if case(psb_comm_ovr_) - ipnt => desc%v_ovrlap_index%v - if (.not.allocated(desc%v_ovrlap_index%v)) & - & info = psb_err_inconsistent_index_lists_ + if (allocated(desc%v_ovrlap_index%v)) then + ipnt => desc%v_ovrlap_index%v + else + info = psb_err_inconsistent_index_lists_ + end if + case(psb_comm_ext_) - ipnt => desc%v_ext_index%v - if (.not.allocated(desc%v_ext_index%v)) & - & info = psb_err_inconsistent_index_lists_ + if (allocated(desc%v_ext_index%v)) then + ipnt => desc%v_ext_index%v + else + info = psb_err_inconsistent_index_lists_ + end if if (debug_level >= psb_debug_ext_) then if (.not.associated(desc%base_desc)) then write(debug_unit,*) trim(name),& @@ -858,17 +877,17 @@ contains end if end if case(psb_comm_mov_) - ipnt => desc%v_ovr_mst_idx%v - if (.not.allocated(desc%v_ovr_mst_idx%v)) & - & info = psb_err_inconsistent_index_lists_ - + if (allocated(desc%v_ovr_mst_idx%v)) then + ipnt => desc%v_ovr_mst_idx%v + else + info = psb_err_inconsistent_index_lists_ + end if case default info=psb_err_from_subroutine_ - end select - if (info /= psb_success_) then call psb_errpush(info,name,a_err='wrong Data selector') - goto 9999 - end if + end select + if (info /= 0) goto 9999 + call psb_get_v_xch_idx(ipnt,totxch,idxs,idxr) @@ -880,7 +899,7 @@ contains return - end subroutine psb_cd_v_get_list + end subroutine psb_cd_v_get_list_p ! ! Subroutine: psb_cdfree @@ -1162,6 +1181,60 @@ contains end subroutine psb_cd_clone + subroutine psb_cd_check_addr(desc, info) + + use psb_error_mod + use psb_penv_mod + use psb_realloc_mod + implicit none + !....parameters... + + class(psb_desc_type), intent(inout), target :: desc + integer(psb_ipk_), intent(out) :: info + !locals + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act + integer(psb_ipk_) :: debug_level, debug_unit + character(len=20) :: name + + debug_unit = psb_get_debug_unit() + debug_level = psb_get_debug_level() + + if (psb_get_errstatus() /= 0) return + info = psb_success_ + call psb_erractionsave(err_act) + name = 'psb_cdcpy' + + if (desc%is_asb()) then + write(0,*) 'DESC%CHECK_ADDR: v_halo, v_ext_idx, v_ovrlap_idx,v_ovr_mst' + if (info == psb_success_) & + & call desc%v_halo_index%check_addr() + if (info == psb_success_) & + & call desc%v_ext_index%check_addr() + if (info == psb_success_) & + & call desc%v_ovrlap_index%check_addr() + if (info == psb_success_) & + & call desc%v_ovr_mst_idx%check_addr() + write(0,*) 'DESC%CHECK_ADDR: done' + end if + + if (info /= psb_success_) then + info = psb_err_from_subroutine_ + call psb_errpush(info,name) + goto 9999 + endif + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': Done' + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + + end subroutine psb_cd_check_addr + Subroutine psb_cd_get_recv_idx(tmp,desc,data,info) use psb_error_mod diff --git a/base/modules/desc/psb_gen_block_map_mod.F90 b/base/modules/desc/psb_gen_block_map_mod.F90 index b52d4c599..cbcac3190 100644 --- a/base/modules/desc/psb_gen_block_map_mod.F90 +++ b/base/modules/desc/psb_gen_block_map_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -1157,7 +1157,6 @@ contains idxmap%local_cols = nl idxmap%ctxt = ctxt idxmap%state = psb_desc_bld_ - idxmap%mpic = psb_get_mpi_comm(ctxt) idxmap%min_glob_row = vnl(iam)+1 idxmap%max_glob_row = vnl(iam+1) call move_alloc(vnl,idxmap%vnl) diff --git a/base/modules/desc/psb_glist_map_mod.F90 b/base/modules/desc/psb_glist_map_mod.F90 index 4ddcdacae..e3a764ac9 100644 --- a/base/modules/desc/psb_glist_map_mod.F90 +++ b/base/modules/desc/psb_glist_map_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -126,7 +126,6 @@ contains idxmap%ctxt = ctxt idxmap%state = psb_desc_bld_ - idxmap%mpic = psb_get_mpi_comm(ctxt) nl = 0 do i=1, n diff --git a/base/modules/desc/psb_hash_map_mod.F90 b/base/modules/desc/psb_hash_map_mod.F90 index b5e135fe1..4c92a4a83 100644 --- a/base/modules/desc/psb_hash_map_mod.F90 +++ b/base/modules/desc/psb_hash_map_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -1090,7 +1090,6 @@ contains idxmap%local_cols = nl idxmap%ctxt = ctxt idxmap%state = psb_desc_bld_ - idxmap%mpic = psb_get_mpi_comm(ctxt) lc2 = int(1.5*nl) call psb_realloc(lc2,idxmap%loc_to_glob,info) diff --git a/base/modules/desc/psb_hash_mod.F90 b/base/modules/desc/psb_hash_mod.F90 index c2839cf48..f26c45c33 100644 --- a/base/modules/desc/psb_hash_mod.F90 +++ b/base/modules/desc/psb_hash_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/desc/psb_indx_map_mod.F90 b/base/modules/desc/psb_indx_map_mod.F90 index 574aa2e32..e99bbc691 100644 --- a/base/modules/desc/psb_indx_map_mod.F90 +++ b/base/modules/desc/psb_indx_map_mod.F90 @@ -15,7 +15,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -109,8 +109,6 @@ module psb_indx_map_mod integer(psb_ipk_) :: state = psb_desc_null_ !> Communication context type(psb_ctxt_type) :: ctxt - !> MPI communicator - integer(psb_mpk_) :: mpic = -1 !> Number of global rows integer(psb_lpk_) :: global_rows = -1 !> Number of global columns @@ -177,9 +175,7 @@ module psb_indx_map_mod procedure, pass(idxmap) :: xtnd_p_adjcncy => base_xtnd_p_adjcncy procedure, pass(idxmap) :: set_ctxt => base_set_ctxt - procedure, pass(idxmap) :: set_mpic => base_set_mpic procedure, pass(idxmap) :: get_ctxt => base_get_ctxt - procedure, pass(idxmap) :: get_mpic => base_get_mpic procedure, pass(idxmap) :: sizeof => base_sizeof procedure, pass(idxmap) :: set_null => base_set_null procedure, nopass :: row_extendable => base_row_extendable @@ -247,11 +243,11 @@ module psb_indx_map_mod private :: base_get_state, base_set_state, base_is_repl, base_is_bld,& & base_is_upd, base_is_asb, base_is_valid, base_is_ovl,& & base_get_gr, base_get_gc, base_get_lr, base_get_lc, base_get_ctxt,& - & base_get_mpic, base_sizeof, base_set_null, & + & base_sizeof, base_set_null, & & base_set_grl, base_set_gcl, & & base_set_lri, base_set_lci, base_set_lrl, base_set_lcl, & & base_inc_lc, base_set_ctxt,& - & base_set_mpic, base_get_fmt, base_asb, base_free,& + & base_get_fmt, base_asb, base_free,& & base_l2gs1, base_l2gs2, base_l2gv1, base_l2gv2,& & base_g2ls1, base_g2ls2, base_g2lv1, base_g2lv2,& & base_g2ls1_ins, base_g2ls2_ins, base_g2lv1_ins, base_g2lv2_ins, & @@ -263,6 +259,7 @@ module psb_indx_map_mod & base_set_halo_owner, base_get_halo_owner, & & base_qry_halo_owner_s, base_qry_halo_owner_v,& & base_get_p_adjcncy, base_set_p_adjcncy, base_xtnd_p_adjcncy + !> Function: psi_indx_map_fnd_owner !! \memberof psb_indx_map @@ -513,17 +510,6 @@ contains end function base_get_ctxt - - function base_get_mpic(idxmap) result(val) - implicit none - class(psb_indx_map), intent(in) :: idxmap - integer(psb_mpk_) :: val - - val = idxmap%mpic - - end function base_get_mpic - - subroutine base_set_state(idxmap,val) implicit none class(psb_indx_map), intent(inout) :: idxmap @@ -643,15 +629,6 @@ contains end subroutine base_xtnd_p_adjcncy - subroutine base_set_mpic(idxmap,val) - implicit none - class(psb_indx_map), intent(inout) :: idxmap - integer(psb_mpk_), intent(in) :: val - - idxmap%mpic = val - end subroutine base_set_mpic - - !> !! \memberof psb_indx_map !! \brief Is the class capable of having overlapped rows? @@ -1341,7 +1318,6 @@ contains ! almost nothing to be done here idxmap%state = -1 if (allocated(idxmap%ctxt%ctxt)) deallocate(idxmap%ctxt%ctxt) - idxmap%mpic = -1 idxmap%global_rows = -1 idxmap%global_cols = -1 idxmap%local_rows = -1 @@ -1357,7 +1333,6 @@ contains idxmap%state = psb_desc_null_ if (allocated(idxmap%ctxt%ctxt)) deallocate(idxmap%ctxt%ctxt) - idxmap%mpic = -1 idxmap%global_rows = -1 idxmap%global_cols = -1 idxmap%local_rows = -1 @@ -1444,7 +1419,6 @@ contains outmap%state = idxmap%state outmap%ctxt = idxmap%ctxt - outmap%mpic = idxmap%mpic outmap%global_rows = idxmap%global_rows outmap%global_cols = idxmap%global_cols outmap%local_rows = idxmap%local_rows diff --git a/base/modules/desc/psb_list_map_mod.F90 b/base/modules/desc/psb_list_map_mod.F90 index 3d493d516..0a88ad84b 100644 --- a/base/modules/desc/psb_list_map_mod.F90 +++ b/base/modules/desc/psb_list_map_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -992,7 +992,6 @@ contains idxmap%ctxt = ctxt idxmap%state = psb_desc_bld_ - idxmap%mpic = psb_get_mpi_comm(ctxt) do i=1, n idxmap%glob_to_loc(i) = -1 end do diff --git a/base/modules/desc/psb_repl_map_mod.F90 b/base/modules/desc/psb_repl_map_mod.F90 index eef1e5d16..e52ec9edd 100644 --- a/base/modules/desc/psb_repl_map_mod.F90 +++ b/base/modules/desc/psb_repl_map_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -817,7 +817,6 @@ contains idxmap%local_cols = nl idxmap%ctxt = ctxt idxmap%state = psb_desc_bld_ - idxmap%mpic = psb_get_mpi_comm(ctxt) call idxmap%set_state(psb_desc_bld_) end subroutine repl_init diff --git a/base/modules/error.f90 b/base/modules/error.f90 index 10cb1339f..545f4dc96 100644 --- a/base/modules/error.f90 +++ b/base/modules/error.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_c_collective_mod.F90 b/base/modules/penv/psi_c_collective_mod.F90 index 0e04fd5ed..dedd8503c 100644 --- a/base/modules/penv/psi_c_collective_mod.F90 +++ b/base/modules/penv/psi_c_collective_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_c_p2p_mod.F90 b/base/modules/penv/psi_c_p2p_mod.F90 index 183584ff9..8a5f2c20b 100644 --- a/base/modules/penv/psi_c_p2p_mod.F90 +++ b/base/modules/penv/psi_c_p2p_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_collective_mod.F90 b/base/modules/penv/psi_collective_mod.F90 index 4ca131d4b..798947d42 100644 --- a/base/modules/penv/psi_collective_mod.F90 +++ b/base/modules/penv/psi_collective_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,6 +31,7 @@ ! module psi_collective_mod use psi_penv_mod + use psi_i2_collective_mod use psi_m_collective_mod use psi_e_collective_mod use psi_s_collective_mod diff --git a/base/modules/penv/psi_d_collective_mod.F90 b/base/modules/penv/psi_d_collective_mod.F90 index bf66dc470..14e4f48a5 100644 --- a/base/modules/penv/psi_d_collective_mod.F90 +++ b/base/modules/penv/psi_d_collective_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_d_p2p_mod.F90 b/base/modules/penv/psi_d_p2p_mod.F90 index 280f328de..99369d4a1 100644 --- a/base/modules/penv/psi_d_p2p_mod.F90 +++ b/base/modules/penv/psi_d_p2p_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_e_collective_mod.F90 b/base/modules/penv/psi_e_collective_mod.F90 index 15c69864f..63ad5627d 100644 --- a/base/modules/penv/psi_e_collective_mod.F90 +++ b/base/modules/penv/psi_e_collective_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_e_p2p_mod.F90 b/base/modules/penv/psi_e_p2p_mod.F90 index f6c37d8a8..f3c4d2bac 100644 --- a/base/modules/penv/psi_e_p2p_mod.F90 +++ b/base/modules/penv/psi_e_p2p_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_i2_collective_mod.F90 b/base/modules/penv/psi_i2_collective_mod.F90 index 7ca2de155..cb2fe435c 100644 --- a/base/modules/penv/psi_i2_collective_mod.F90 +++ b/base/modules/penv/psi_i2_collective_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_i2_p2p_mod.F90 b/base/modules/penv/psi_i2_p2p_mod.F90 index 4d2d33858..eb70385e5 100644 --- a/base/modules/penv/psi_i2_p2p_mod.F90 +++ b/base/modules/penv/psi_i2_p2p_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_m_collective_mod.F90 b/base/modules/penv/psi_m_collective_mod.F90 index 0e858c03a..8db430045 100644 --- a/base/modules/penv/psi_m_collective_mod.F90 +++ b/base/modules/penv/psi_m_collective_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_m_p2p_mod.F90 b/base/modules/penv/psi_m_p2p_mod.F90 index 0132ce02c..1f1683a88 100644 --- a/base/modules/penv/psi_m_p2p_mod.F90 +++ b/base/modules/penv/psi_m_p2p_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_p2p_mod.F90 b/base/modules/penv/psi_p2p_mod.F90 index 275b5de7a..b1572a8b5 100644 --- a/base/modules/penv/psi_p2p_mod.F90 +++ b/base/modules/penv/psi_p2p_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -33,6 +33,7 @@ module psi_p2p_mod use psi_penv_mod + use psi_i2_p2p_mod use psi_m_p2p_mod use psi_e_p2p_mod use psi_s_p2p_mod diff --git a/base/modules/penv/psi_penv_mod.F90 b/base/modules/penv/psi_penv_mod.F90 index 7091411de..425a81793 100644 --- a/base/modules/penv/psi_penv_mod.F90 +++ b/base/modules/penv/psi_penv_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -49,7 +49,9 @@ module mpi integer(psb_mpk_), parameter :: mpi_integer4 = 10 integer(psb_mpk_), parameter :: mpi_comm_null = -1 integer(psb_mpk_), parameter :: mpi_comm_world = 1 - + + integer(psb_mpk_), parameter :: mpi_address_kind = psb_epk_ + !real(psb_dpk_), external :: mpi_wtime interface @@ -179,44 +181,53 @@ end module mpi module psi_penv_mod use psb_const_mod use iso_c_binding - - integer(psb_mpk_), parameter:: psb_int_tag = 543987 - integer(psb_mpk_), parameter:: psb_real_tag = psb_int_tag + 1 - integer(psb_mpk_), parameter:: psb_double_tag = psb_real_tag + 1 - integer(psb_mpk_), parameter:: psb_complex_tag = psb_double_tag + 1 - integer(psb_mpk_), parameter:: psb_dcomplex_tag = psb_complex_tag + 1 - integer(psb_mpk_), parameter:: psb_logical_tag = psb_dcomplex_tag + 1 - integer(psb_mpk_), parameter:: psb_char_tag = psb_logical_tag + 1 - integer(psb_mpk_), parameter:: psb_int8_tag = psb_char_tag + 1 - integer(psb_mpk_), parameter:: psb_int2_tag = psb_int8_tag + 1 - integer(psb_mpk_), parameter:: psb_int4_tag = psb_int2_tag + 1 - integer(psb_mpk_), parameter:: psb_long_tag = psb_int4_tag + 1 - - integer(psb_mpk_), parameter:: psb_int_swap_tag = psb_int_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_real_swap_tag = psb_real_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_double_swap_tag = psb_double_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_complex_swap_tag = psb_complex_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_dcomplex_swap_tag = psb_dcomplex_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_logical_swap_tag = psb_logical_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_char_swap_tag = psb_char_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_int8_swap_tag = psb_int8_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_int2_swap_tag = psb_int2_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_int4_swap_tag = psb_int4_tag + psb_int_tag - integer(psb_mpk_), parameter:: psb_long_swap_tag = psb_long_tag + psb_int_tag - +#ifdef PSB_MPI_MOD + use mpi +#endif +#ifdef PSB_MPI_H + include 'mpif.h' +#endif + + integer(psb_mpk_), parameter :: psb_apk_ = mpi_address_kind + + integer(psb_mpk_), parameter :: psb_tag_space = 200 + integer(psb_mpk_), parameter :: psb_tag_base = 512 + integer(psb_mpk_), parameter :: psb_int_tag = psb_tag_base + 1 + integer(psb_mpk_), parameter :: psb_real_tag = psb_int_tag + 1 + integer(psb_mpk_), parameter :: psb_double_tag = psb_real_tag + 1 + integer(psb_mpk_), parameter :: psb_complex_tag = psb_double_tag + 1 + integer(psb_mpk_), parameter :: psb_dcomplex_tag = psb_complex_tag + 1 + integer(psb_mpk_), parameter :: psb_logical_tag = psb_dcomplex_tag + 1 + integer(psb_mpk_), parameter :: psb_char_tag = psb_logical_tag + 1 + integer(psb_mpk_), parameter :: psb_int8_tag = psb_char_tag + 1 + integer(psb_mpk_), parameter :: psb_int2_tag = psb_int8_tag + 1 + integer(psb_mpk_), parameter :: psb_int4_tag = psb_int2_tag + 1 + integer(psb_mpk_), parameter :: psb_long_tag = psb_int4_tag + 1 + integer(psb_mpk_), parameter :: psb_max_simple_tag = psb_long_tag + 2 + integer(psb_mpk_), parameter :: psb_int_swap_tag = psb_max_simple_tag + 1 + integer(psb_mpk_), parameter :: psb_real_swap_tag = psb_int_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_double_swap_tag = psb_real_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_complex_swap_tag = psb_double_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_dcomplex_swap_tag = psb_complex_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_logical_swap_tag = psb_dcomplex_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_char_swap_tag = psb_logical_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_int8_swap_tag = psb_char_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_int2_swap_tag = psb_int8_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_int4_swap_tag = psb_int2_swap_tag + 1 + integer(psb_mpk_), parameter :: psb_long_swap_tag = psb_int4_swap_tag + 1 - integer(psb_mpk_), private, parameter:: psb_int_type = 987543 - integer(psb_mpk_), private, parameter:: psb_real_type = psb_int_type + 1 - integer(psb_mpk_), private, parameter:: psb_double_type = psb_real_type + 1 - integer(psb_mpk_), private, parameter:: psb_complex_type = psb_double_type + 1 - integer(psb_mpk_), private, parameter:: psb_dcomplex_type = psb_complex_type + 1 - integer(psb_mpk_), private, parameter:: psb_logical_type = psb_dcomplex_type + 1 - integer(psb_mpk_), private, parameter:: psb_char_type = psb_logical_type + 1 - integer(psb_mpk_), private, parameter:: psb_int8_type = psb_char_type + 1 - integer(psb_mpk_), private, parameter:: psb_int2_type = psb_int8_type + 1 - integer(psb_mpk_), private, parameter:: psb_int4_type = psb_int2_type + 1 - integer(psb_mpk_), private, parameter:: psb_long_type = psb_int4_type + 1 + integer(psb_mpk_), private, parameter :: psb_int_type = 200 + integer(psb_mpk_), private, parameter :: psb_real_type = psb_int_type + 1 + integer(psb_mpk_), private, parameter :: psb_double_type = psb_real_type + 1 + integer(psb_mpk_), private, parameter :: psb_complex_type = psb_double_type + 1 + integer(psb_mpk_), private, parameter :: psb_dcomplex_type = psb_complex_type + 1 + integer(psb_mpk_), private, parameter :: psb_logical_type = psb_dcomplex_type + 1 + integer(psb_mpk_), private, parameter :: psb_char_type = psb_logical_type + 1 + integer(psb_mpk_), private, parameter :: psb_int8_type = psb_char_type + 1 + integer(psb_mpk_), private, parameter :: psb_int2_type = psb_int8_type + 1 + integer(psb_mpk_), private, parameter :: psb_int4_type = psb_int2_type + 1 + integer(psb_mpk_), private, parameter :: psb_long_type = psb_int4_type + 1 type psb_buffer_node integer(psb_mpk_) :: request @@ -304,7 +315,7 @@ module psi_penv_mod #endif - private :: psi_get_sizes, psi_register_mpi_extras + private :: psi_get_sizes, psi_register_mpi_const private :: psi_i2amx_op, psi_i2amn_op private :: psi_iamx_op, psi_iamn_op private :: psi_mamx_op, psi_mamn_op @@ -341,13 +352,7 @@ contains end subroutine psb_init_queue subroutine psb_wait_buffer(node, info) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_buffer_node), intent(inout) :: node integer(psb_ipk_), intent(out) :: info integer(psb_mpk_) :: status(mpi_status_size),minfo @@ -357,13 +362,7 @@ contains end subroutine psb_wait_buffer subroutine psb_test_buffer(node, flag, info) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_buffer_node), intent(inout) :: node logical, intent(out) :: flag integer(psb_ipk_), intent(out) :: info @@ -476,13 +475,7 @@ contains ! ! !!!!!!!!!!!!!!!!! subroutine psi_msnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest integer(psb_mpk_), allocatable, intent(inout) :: buffer(:) @@ -515,13 +508,7 @@ contains subroutine psi_esnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest integer(psb_epk_), allocatable, intent(inout) :: buffer(:) @@ -552,13 +539,7 @@ contains end subroutine psi_esnd subroutine psi_i2snd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest integer(psb_i2pk_), allocatable, intent(inout) :: buffer(:) @@ -589,13 +570,7 @@ contains end subroutine psi_i2snd subroutine psi_ssnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest real(psb_spk_), allocatable, intent(inout) :: buffer(:) @@ -626,13 +601,7 @@ contains end subroutine psi_ssnd subroutine psi_dsnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest real(psb_dpk_), allocatable, intent(inout) :: buffer(:) @@ -663,13 +632,7 @@ contains end subroutine psi_dsnd subroutine psi_csnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest complex(psb_spk_), allocatable, intent(inout) :: buffer(:) @@ -700,13 +663,7 @@ contains end subroutine psi_csnd subroutine psi_zsnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest complex(psb_dpk_), allocatable, intent(inout) :: buffer(:) @@ -738,13 +695,7 @@ contains subroutine psi_logsnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest logical, allocatable, intent(inout) :: buffer(:) @@ -776,13 +727,7 @@ contains subroutine psi_hsnd(ctxt,tag,dest,buffer,mesg_queue) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: tag, dest character(len=1), allocatable, intent(inout) :: buffer(:) @@ -850,16 +795,11 @@ contains end subroutine psi_get_sizes - subroutine psi_register_mpi_extras(info) -#ifdef PSB_MPI_MOD - use mpi -#endif + subroutine psi_register_mpi_const(comm,info) implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif - integer(psb_mpk_) :: info - + integer(psb_mpk_) :: comm,info + integer(psb_mpk_) :: ierror + logical :: flag info = 0 #if 0 if (info == 0) call mpi_type_create_f90_integer(psb_ipk_, psb_mpi_ipk_ ,info) @@ -896,8 +836,7 @@ contains psb_mpi_c_dpk_ = mpi_double_complex #endif -#if defined(PSB_SERIAL_MPI) -#else +#if ! defined(PSB_SERIAL_MPI) if (info == 0) call mpi_op_create(psi_i2amx_op,.true.,mpi_i2amx_op,info) if (info == 0) call mpi_op_create(psi_i2amn_op,.true.,mpi_i2amn_op,info) if (info == 0) call mpi_op_create(psi_mamx_op,.true.,mpi_mamx_op,info) @@ -915,8 +854,7 @@ contains if (info == 0) call mpi_op_create(psi_snrm2_op,.true.,mpi_snrm2_op,info) if (info == 0) call mpi_op_create(psi_dnrm2_op,.true.,mpi_dnrm2_op,info) #endif - - end subroutine psi_register_mpi_extras + end subroutine psi_register_mpi_const #if (defined(PSB_IPK4) && defined(PSB_LPK8))||defined(PSB_IPK8) subroutine psb_info_epk(ctxt,iam,np) @@ -941,13 +879,7 @@ contains use psb_mat_mod use psb_vect_mod ! !$ use psb_rsb_mod -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type), intent(out) :: ctxt type(psb_ctxt_type), intent(in), optional :: basectxt integer(psb_mpk_), intent(in), optional :: np, ids(:), extcomm @@ -965,7 +897,7 @@ contains ctxt%ctxt = nctxt ! allocate on assignment nctxt = nctxt + 1 - call psi_register_mpi_extras(info) + call psi_register_mpi_const(nctxt,info) call psi_get_sizes() #else @@ -1054,7 +986,7 @@ contains if (info == 0) then ctxt%ctxt = icomm ! allocate on assignment end if - call psi_register_mpi_extras(info) + call psi_register_mpi_const(icomm,info) call psi_get_sizes() !if (ctxt == mpi_comm_null) return if (.not.allocated(ctxt%ctxt)) return @@ -1080,13 +1012,7 @@ contains use psb_mat_mod use psb_vect_mod ! !$ use psb_rsb_mod -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type), intent(inout) :: ctxt logical, intent(in), optional :: close logical :: close_ @@ -1109,6 +1035,8 @@ contains ! !$ call psb_error(ctxt) ! !$ endif ! !$ endif + if (close_) call psb_clear_vect_defaults() + if (close_) call psb_clear_mat_defaults() #if defined(PSB_SERIAL_MPI) ! Under serial mode, CLOSE has no effect, but reclaim ! the used ctxt number. @@ -1119,12 +1047,6 @@ contains else call psb_close_context(psb_mesg_queue,ctxt) end if - !if ((ctxt /= mpi_comm_null).and.(ctxt /= mpi_comm_world)) then - if (allocated(ctxt%ctxt)) then - !write(0,*) ctxt%ctxt,mpi_comm_world,mpi_comm_null - if ((ctxt%ctxt /= mpi_comm_world).and.(ctxt%ctxt /= mpi_comm_null)) & - & call mpi_comm_Free(ctxt%ctxt,info) - end if if (close_) then if (info == 0) call mpi_op_free(mpi_i2amx_op,info) if (info == 0) call mpi_op_free(mpi_i2amn_op,info) @@ -1143,24 +1065,22 @@ contains if (info == 0) call mpi_op_free(mpi_snrm2_op,info) if (info == 0) call mpi_op_free(mpi_dnrm2_op,info) end if + if (allocated(ctxt%ctxt)) then +!!$ write(0,*) ctxt%ctxt,mpi_comm_world,mpi_comm_null,mpi_comm_self + if ((ctxt%ctxt /= mpi_comm_world).and.(ctxt%ctxt /= mpi_comm_null).and.& + & (ctxt%ctxt /= mpi_comm_self)) & + & call mpi_comm_Free(ctxt%ctxt,info) + end if if (close_) call mpi_finalize(info) #endif - if (close_) call psb_clear_vect_defaults() - if (close_) call psb_clear_mat_defaults() end subroutine psb_exit_mpik subroutine psb_barrier_mpik(ctxt) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type), intent(in) :: ctxt integer(psb_mpk_) :: info @@ -1175,13 +1095,7 @@ contains function psb_wtime() use psb_const_mod ! use mpi_constants -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif real(psb_dpk_) :: psb_wtime psb_wtime = mpi_wtime() @@ -1210,13 +1124,7 @@ contains subroutine psb_info_mpik(ctxt,iam,np) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type), intent(in) :: ctxt integer(psb_mpk_), intent(out) :: iam, np @@ -1269,13 +1177,7 @@ contains function psb_m_get_mpi_comm(ctxt) result(comm) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: comm comm = mpi_comm_null @@ -1291,13 +1193,7 @@ contains end function psb_m_get_mpi_rank subroutine psb_get_mpicomm(ctxt,comm) -#ifdef PSB_MPI_MOD - use mpi -#endif implicit none -#ifdef PSB_MPI_H - include 'mpif.h' -#endif type(psb_ctxt_type) :: ctxt integer(psb_mpk_) :: comm comm = mpi_comm_null diff --git a/base/modules/penv/psi_s_collective_mod.F90 b/base/modules/penv/psi_s_collective_mod.F90 index 9936395ad..809ca2865 100644 --- a/base/modules/penv/psi_s_collective_mod.F90 +++ b/base/modules/penv/psi_s_collective_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_s_p2p_mod.F90 b/base/modules/penv/psi_s_p2p_mod.F90 index d8352bd5d..a1b70392d 100644 --- a/base/modules/penv/psi_s_p2p_mod.F90 +++ b/base/modules/penv/psi_s_p2p_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_z_collective_mod.F90 b/base/modules/penv/psi_z_collective_mod.F90 index de4e5bcc7..cbe434ac3 100644 --- a/base/modules/penv/psi_z_collective_mod.F90 +++ b/base/modules/penv/psi_z_collective_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/penv/psi_z_p2p_mod.F90 b/base/modules/penv/psi_z_p2p_mod.F90 index 6606d4ed1..c8ed01eb7 100644 --- a/base/modules/penv/psi_z_p2p_mod.F90 +++ b/base/modules/penv/psi_z_p2p_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/psb_base_mod.f90 b/base/modules/psb_base_mod.f90 index 78a973b64..87cc46384 100644 --- a/base/modules/psb_base_mod.f90 +++ b/base/modules/psb_base_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/psb_cbind_const_mod.F90 b/base/modules/psb_cbind_const_mod.F90 index a976d55da..901569cc1 100644 --- a/base/modules/psb_cbind_const_mod.F90 +++ b/base/modules/psb_cbind_const_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/psb_check_mod.f90 b/base/modules/psb_check_mod.f90 index 599c7197e..e352743a1 100644 --- a/base/modules/psb_check_mod.f90 +++ b/base/modules/psb_check_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/psb_config.h.in b/base/modules/psb_config.h.in index 3bf9a645d..8195027fc 100644 --- a/base/modules/psb_config.h.in +++ b/base/modules/psb_config.h.in @@ -4,6 +4,41 @@ #define PSB_ERR_ERROR -1 #define PSB_ERR_SUCCESS 0 +#define PSB_VERSION_MAJOR @PSBLASMAJOR@ +#define PSB_VERSION_MINOR @PSBLASMINOR@ +#define PSB_VERSION_PATCHLEVEL @PSBLASPATCH@ +#define PSB_VERSION_STRING @PSBLASSTRING@ + +#define PSB_DUPL_NULL @PSBLASDUPNUL@ +#define PSB_DUPL_ADD @PSBLASDUPADD@ +#define PSB_DUPL_OVWRT @PSBLASDUPOVW@ +#define PSB_DUPL_ERR @PSBLASDUPERR@ +#define PSB_DUPL_DEF @PSBLASDUPDEF@ + +#define PSB_UPD_SRCH @PSBLASUPDSRC@ +#define PSB_UPD_PERM @PSBLASUPDPRM@ +#define PSB_UPD_DFLT @PSBLASUPDDEF@ + +#define PSB_SWAP_SEND @PSBSWPSND@ +#define PSB_SWAP_RECV @PSBSWPRCV@ +#define PSB_SWAP_SYNC @PSBSWPSYN@ +#define PSB_SWAP_MPI @PSBSWPMPI@ + +#define PSB_COLLECTIVE_START @PSBCLCSTR@ +#define PSB_COLLECTIVE_END @PSBCLCEND@ +#define PSB_COLLECTIVE_SYNC @PSBCLCSYN@ + + +#define PSB_NONE @PSBNONE@ +#define PSB_SUM @PSBSUM@ +#define PSB_AVG @PSBAVG@ +#define PSB_SQUARE_ROOT @PSBSQRT@ +#define PSB_SETZERO @PSBSETZ@ + +#define PSB_MATBLD_NOREMOTE @PSBLASBLDNOR@ +#define PSB_MATBLD_REMOTE @PSBLASBLDRMT@ + + @CSERIALMPI@ @PSB_IPKDEF@ diff --git a/base/modules/psb_const_mod.F90 b/base/modules/psb_const_mod.F90 index b4cacdcab..0bdb40f7d 100644 --- a/base/modules/psb_const_mod.F90 +++ b/base/modules/psb_const_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,7 +35,7 @@ module psb_const_mod use iso_fortran_env ! This is a 2-byte integer, just in case integer, parameter :: psb_i2pk_ = int16 - ! This is always a 4-byte integer, for MPI-related stuff + ! This is always a 4-byte integer. integer, parameter :: psb_mpk_ = int32 ! This is always an 8-byte integer. integer, parameter :: psb_epk_ = int64 @@ -51,7 +51,7 @@ module psb_const_mod ! This is a 2-byte integer, just in case integer, parameter :: i2ndig=4 integer, parameter :: psb_i2pk_ = selected_int_kind(i2ndig) - ! This is always a 4-byte integer, for MPI-related stuff + ! This is always a 4-byte integer. integer, parameter :: indig=8 integer, parameter :: psb_mpk_ = selected_int_kind(indig) ! This is always an 8-byte integer. @@ -136,10 +136,10 @@ module psb_const_mod ! ! Version ! - character(len=*), parameter :: psb_version_string_ = "3.9.0" + character(len=*), parameter :: psb_version_string_ = "3.9.1" integer(psb_ipk_), parameter :: psb_version_major_ = 3 integer(psb_ipk_), parameter :: psb_version_minor_ = 9 - integer(psb_ipk_), parameter :: psb_patchlevel_ = 0 + integer(psb_ipk_), parameter :: psb_patchlevel_ = 1 ! ! Handy & miscellaneous constants @@ -185,11 +185,12 @@ module psb_const_mod ! The up/down constant are defined in pairs having ! opposite values. We make use of this fact in the heapsort routine. ! - integer(psb_ipk_), parameter :: psb_sort_up_ = 1, psb_sort_down_ = -1 - integer(psb_ipk_), parameter :: psb_lsort_up_ = 2, psb_lsort_down_ = -2 - integer(psb_ipk_), parameter :: psb_asort_up_ = 3, psb_asort_down_ = -3 - integer(psb_ipk_), parameter :: psb_alsort_up_ = 4, psb_alsort_down_ = -4 - integer(psb_ipk_), parameter :: psb_sort_ovw_idx_ = 0, psb_sort_keep_idx_ = 1 + integer(psb_ipk_), parameter :: psb_sort_up_ = 1, psb_sort_down_ = -1 + integer(psb_ipk_), parameter :: psb_lsort_up_ = 2, psb_lsort_down_ = -2 + integer(psb_ipk_), parameter :: psb_asort_up_ = 3, psb_asort_down_ = -3 + integer(psb_ipk_), parameter :: psb_alsort_up_ = 4, psb_alsort_down_ = -4 + integer(psb_ipk_), parameter :: psb_sort_ovw_idx_ = 0, psb_sort_keep_idx_ = 1 + integer(psb_ipk_), parameter :: psb_sort_reord_x_ = 0, psb_sort_noreord_x_ = 1 integer(psb_ipk_), parameter :: psb_heap_resize = 200 integer(psb_ipk_), parameter :: psb_find_any_ = 0 integer(psb_ipk_), parameter :: psb_find_first_ge_ = 1 @@ -202,13 +203,16 @@ module psb_const_mod ! ! - ! State of matrices. + ! State of matrices/vectors. ! integer(psb_ipk_), parameter :: psb_invalid_ = -1 integer(psb_ipk_), parameter :: psb_spmat_null_=0, psb_spmat_bld_=1 integer(psb_ipk_), parameter :: psb_spmat_asb_=2, psb_spmat_upd_=4 + integer(psb_ipk_), parameter :: psb_matbld_noremote_ = 0 + integer(psb_ipk_), parameter :: psb_matbld_remote_ = 1 - integer(psb_ipk_), parameter :: psb_matbld_noremote_=0, psb_matbld_remote_=1 + integer(psb_ipk_), parameter :: psb_vect_null_=0, psb_vect_bld_=1 + integer(psb_ipk_), parameter :: psb_vect_asb_=2, psb_vect_upd_=4 integer(psb_ipk_), parameter :: psb_ireg_flgs_=10, psb_ip2_=0 @@ -222,9 +226,10 @@ module psb_const_mod ! Duplicate coefficients handling ! These are usually set while calling spcnv as one of its ! optional arugments. - integer(psb_ipk_), parameter :: psb_dupl_add_ = 0 - integer(psb_ipk_), parameter :: psb_dupl_ovwrt_ = 1 - integer(psb_ipk_), parameter :: psb_dupl_err_ = 2 + integer(psb_ipk_), parameter :: psb_dupl_null_ = 0 + integer(psb_ipk_), parameter :: psb_dupl_add_ = 1 + integer(psb_ipk_), parameter :: psb_dupl_ovwrt_ = 2 + integer(psb_ipk_), parameter :: psb_dupl_err_ = 3 integer(psb_ipk_), parameter :: psb_dupl_def_ = psb_dupl_add_ ! Matrix update mode integer(psb_ipk_), parameter :: psb_upd_srch_ = 98764 @@ -282,7 +287,7 @@ module psb_const_mod integer(psb_ipk_), parameter, public :: psb_err_parm_differs_among_procs_=550 integer(psb_ipk_), parameter, public :: psb_err_entry_out_of_bounds_=551 integer(psb_ipk_), parameter, public :: psb_err_inconsistent_index_lists_=552 - integer(psb_ipk_), parameter, public :: psb_err_partfunc_toomuchprocs_=570 + integer(psb_ipk_), parameter, public :: psb_err_partfunc_toomanyprocs_=570 integer(psb_ipk_), parameter, public :: psb_err_partfunc_toofewprocs_=575 integer(psb_ipk_), parameter, public :: psb_err_partfunc_wrong_pid_=580 integer(psb_ipk_), parameter, public :: psb_err_no_optional_arg_=581 @@ -321,14 +326,22 @@ module psb_const_mod integer(psb_ipk_), parameter, public :: psb_err_invalid_irst_ =5002 integer(psb_ipk_), parameter, public :: psb_err_invalid_preci_=5003 integer(psb_ipk_), parameter, public :: psb_err_invalid_preca_=5004 - + integer(psb_ipk_), parameter, public :: psb_err_incoherent_comm_state_ = 6000 ! Used when communication type bitmask has more then one bit flipped + integer(psb_ipk_), parameter, public :: psb_err_topology_error_ = 7000 + integer(psb_ipk_), parameter, public :: psb_err_topology_invalid_args_ = 7001 + integer(psb_ipk_), parameter, public :: psb_err_topology_args_mismatch_ = 7002 type :: psb_ctxt_type integer(psb_mpk_), allocatable :: ctxt contains procedure, pass(ctxt) :: get_i_ctxt => psb_get_i_ctxt + procedure, pass(ctxt) :: get_mpic => get_mpic + procedure, pass(ctxt) :: set_mpic => set_mpic end type psb_ctxt_type + logical, parameter :: try_newins=.true. + private :: get_mpic, set_mpic + contains function psb_cmp_ctxt(ctxt1, ctxt2) result(res) @@ -357,5 +370,27 @@ contains end if end subroutine psb_get_i_ctxt + + function get_mpic(ctxt) result(val) + implicit none + integer(psb_mpk_) :: val + class(psb_ctxt_type), intent(in) :: ctxt + + if (allocated(ctxt%ctxt)) then + val = ctxt%ctxt + else + val = -1 + end if + + end function get_mpic + + subroutine set_mpic(ctxt,val) + implicit none + integer(psb_mpk_) :: val + class(psb_ctxt_type), intent(inout) :: ctxt + + ctxt%ctxt = val + + end subroutine set_mpic end module psb_const_mod diff --git a/base/modules/psb_error_mod.F90 b/base/modules/psb_error_mod.F90 index f47f884be..086c06f2d 100644 --- a/base/modules/psb_error_mod.F90 +++ b/base/modules/psb_error_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -509,7 +509,6 @@ contains write(tmpmsg,'("PSBLAS Error (",i0,") in subroutine: ",a)')& & err_c,trim(r_name) end if - select case (err_c) case(:psb_success_) @@ -750,7 +749,7 @@ contains achmsg(1) = tmpmsg write(achmsg(2),'("Index lists are inconsistent: some indices are orphans")') - case(psb_err_partfunc_toomuchprocs_) + case(psb_err_partfunc_toomanyprocs_) allocate(achmsg(4)) achmsg(1) = tmpmsg write(achmsg(2),& diff --git a/base/modules/psb_realloc_mod.F90 b/base/modules/psb_realloc_mod.F90 index fba5fd0d7..39ef9dbc2 100644 --- a/base/modules/psb_realloc_mod.F90 +++ b/base/modules/psb_realloc_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,6 +31,7 @@ ! module psb_realloc_mod use psb_const_mod + use psb_i2_realloc_mod use psb_m_realloc_mod use psb_e_realloc_mod use psb_s_realloc_mod diff --git a/base/modules/psb_timers_mod.f90 b/base/modules/psb_timers_mod.f90 index 6bf954668..cc6fe88e2 100644 --- a/base/modules/psb_timers_mod.f90 +++ b/base/modules/psb_timers_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/psblas/psb_c_psblas_mod.F90 b/base/modules/psblas/psb_c_psblas_mod.F90 index 130159bc0..6b82493bc 100644 --- a/base/modules/psblas/psb_c_psblas_mod.F90 +++ b/base/modules/psblas/psb_c_psblas_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -421,7 +421,7 @@ module psb_c_psblas_mod integer(psb_ipk_), intent(out) :: info end subroutine psb_cspmv subroutine psb_cspmv_vect(alpha, a, x, beta, y,& - & desc_a, info, trans, work,doswap) + & desc_a, info, trans,doswap) import :: psb_desc_type, psb_spk_, psb_ipk_, & & psb_c_vect_type, psb_cspmat_type type(psb_cspmat_type), intent(in) :: a @@ -430,7 +430,6 @@ module psb_c_psblas_mod complex(psb_spk_), intent(in) :: alpha, beta type(psb_desc_type), intent(in) :: desc_a character, optional, intent(in) :: trans - complex(psb_spk_), optional, intent(inout),target :: work(:) logical, optional, intent(in) :: doswap integer(psb_ipk_), intent(out) :: info end subroutine psb_cspmv_vect @@ -472,7 +471,7 @@ module psb_c_psblas_mod end subroutine psb_cspsv subroutine psb_cspsv_vect(alpha, t, x, beta, y,& & desc_a, info, trans, scale, choice,& - & diag, work) + & diag) import :: psb_desc_type, psb_spk_, psb_ipk_, & & psb_c_vect_type, psb_cspmat_type type(psb_cspmat_type), intent(inout) :: t @@ -483,7 +482,6 @@ module psb_c_psblas_mod character, optional, intent(in) :: trans, scale integer(psb_ipk_), optional, intent(in) :: choice type(psb_c_vect_type), intent(inout), optional :: diag - complex(psb_spk_), optional, intent(inout), target :: work(:) integer(psb_ipk_), intent(out) :: info end subroutine psb_cspsv_vect end interface diff --git a/base/modules/psblas/psb_d_psblas_mod.F90 b/base/modules/psblas/psb_d_psblas_mod.F90 index afc3acafa..1d5558c7b 100644 --- a/base/modules/psblas/psb_d_psblas_mod.F90 +++ b/base/modules/psblas/psb_d_psblas_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -432,7 +432,7 @@ module psb_d_psblas_mod integer(psb_ipk_), intent(out) :: info end subroutine psb_dspmv subroutine psb_dspmv_vect(alpha, a, x, beta, y,& - & desc_a, info, trans, work,doswap) + & desc_a, info, trans,doswap) import :: psb_desc_type, psb_dpk_, psb_ipk_, & & psb_d_vect_type, psb_dspmat_type type(psb_dspmat_type), intent(in) :: a @@ -441,7 +441,6 @@ module psb_d_psblas_mod real(psb_dpk_), intent(in) :: alpha, beta type(psb_desc_type), intent(in) :: desc_a character, optional, intent(in) :: trans - real(psb_dpk_), optional, intent(inout),target :: work(:) logical, optional, intent(in) :: doswap integer(psb_ipk_), intent(out) :: info end subroutine psb_dspmv_vect @@ -483,7 +482,7 @@ module psb_d_psblas_mod end subroutine psb_dspsv subroutine psb_dspsv_vect(alpha, t, x, beta, y,& & desc_a, info, trans, scale, choice,& - & diag, work) + & diag) import :: psb_desc_type, psb_dpk_, psb_ipk_, & & psb_d_vect_type, psb_dspmat_type type(psb_dspmat_type), intent(inout) :: t @@ -494,7 +493,6 @@ module psb_d_psblas_mod character, optional, intent(in) :: trans, scale integer(psb_ipk_), optional, intent(in) :: choice type(psb_d_vect_type), intent(inout), optional :: diag - real(psb_dpk_), optional, intent(inout), target :: work(:) integer(psb_ipk_), intent(out) :: info end subroutine psb_dspsv_vect end interface diff --git a/base/modules/psblas/psb_psblas_mod.f90 b/base/modules/psblas/psb_psblas_mod.f90 index d582c36f1..df0dc1a86 100644 --- a/base/modules/psblas/psb_psblas_mod.f90 +++ b/base/modules/psblas/psb_psblas_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/psblas/psb_s_psblas_mod.F90 b/base/modules/psblas/psb_s_psblas_mod.F90 index 6048d023e..6be3aca2e 100644 --- a/base/modules/psblas/psb_s_psblas_mod.F90 +++ b/base/modules/psblas/psb_s_psblas_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -432,7 +432,7 @@ module psb_s_psblas_mod integer(psb_ipk_), intent(out) :: info end subroutine psb_sspmv subroutine psb_sspmv_vect(alpha, a, x, beta, y,& - & desc_a, info, trans, work,doswap) + & desc_a, info, trans,doswap) import :: psb_desc_type, psb_spk_, psb_ipk_, & & psb_s_vect_type, psb_sspmat_type type(psb_sspmat_type), intent(in) :: a @@ -441,7 +441,6 @@ module psb_s_psblas_mod real(psb_spk_), intent(in) :: alpha, beta type(psb_desc_type), intent(in) :: desc_a character, optional, intent(in) :: trans - real(psb_spk_), optional, intent(inout),target :: work(:) logical, optional, intent(in) :: doswap integer(psb_ipk_), intent(out) :: info end subroutine psb_sspmv_vect @@ -483,7 +482,7 @@ module psb_s_psblas_mod end subroutine psb_sspsv subroutine psb_sspsv_vect(alpha, t, x, beta, y,& & desc_a, info, trans, scale, choice,& - & diag, work) + & diag) import :: psb_desc_type, psb_spk_, psb_ipk_, & & psb_s_vect_type, psb_sspmat_type type(psb_sspmat_type), intent(inout) :: t @@ -494,7 +493,6 @@ module psb_s_psblas_mod character, optional, intent(in) :: trans, scale integer(psb_ipk_), optional, intent(in) :: choice type(psb_s_vect_type), intent(inout), optional :: diag - real(psb_spk_), optional, intent(inout), target :: work(:) integer(psb_ipk_), intent(out) :: info end subroutine psb_sspsv_vect end interface diff --git a/base/modules/psblas/psb_z_psblas_mod.F90 b/base/modules/psblas/psb_z_psblas_mod.F90 index fd0cc300d..1e65f3d44 100644 --- a/base/modules/psblas/psb_z_psblas_mod.F90 +++ b/base/modules/psblas/psb_z_psblas_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -421,7 +421,7 @@ module psb_z_psblas_mod integer(psb_ipk_), intent(out) :: info end subroutine psb_zspmv subroutine psb_zspmv_vect(alpha, a, x, beta, y,& - & desc_a, info, trans, work,doswap) + & desc_a, info, trans,doswap) import :: psb_desc_type, psb_dpk_, psb_ipk_, & & psb_z_vect_type, psb_zspmat_type type(psb_zspmat_type), intent(in) :: a @@ -430,7 +430,6 @@ module psb_z_psblas_mod complex(psb_dpk_), intent(in) :: alpha, beta type(psb_desc_type), intent(in) :: desc_a character, optional, intent(in) :: trans - complex(psb_dpk_), optional, intent(inout),target :: work(:) logical, optional, intent(in) :: doswap integer(psb_ipk_), intent(out) :: info end subroutine psb_zspmv_vect @@ -472,7 +471,7 @@ module psb_z_psblas_mod end subroutine psb_zspsv subroutine psb_zspsv_vect(alpha, t, x, beta, y,& & desc_a, info, trans, scale, choice,& - & diag, work) + & diag) import :: psb_desc_type, psb_dpk_, psb_ipk_, & & psb_z_vect_type, psb_zspmat_type type(psb_zspmat_type), intent(inout) :: t @@ -483,7 +482,6 @@ module psb_z_psblas_mod character, optional, intent(in) :: trans, scale integer(psb_ipk_), optional, intent(in) :: choice type(psb_z_vect_type), intent(inout), optional :: diag - complex(psb_dpk_), optional, intent(inout), target :: work(:) integer(psb_ipk_), intent(out) :: info end subroutine psb_zspsv_vect end interface diff --git a/base/modules/psi_c_mod.F90 b/base/modules/psi_c_mod.F90 index d59d26a21..9028315c3 100644 --- a/base/modules/psi_c_mod.F90 +++ b/base/modules/psi_c_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/psi_d_mod.F90 b/base/modules/psi_d_mod.F90 index f39527f12..833e32fc8 100644 --- a/base/modules/psi_d_mod.F90 +++ b/base/modules/psi_d_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/psi_i2_mod.F90 b/base/modules/psi_i2_mod.F90 new file mode 100644 index 000000000..031bcf208 --- /dev/null +++ b/base/modules/psi_i2_mod.F90 @@ -0,0 +1,44 @@ +! +! Parallel Sparse BLAS version 3.5 +! (C) Copyright 2006-2018 +! Salvatore Filippone +! Alfredo Buttari +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +module psi_i2_mod + + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_epk_, & + & psb_lpk_, psb_i2pk_ + use psi_m_comm_a_mod + use psi_e_comm_a_mod + use psi_i2_comm_a_mod + use psb_i2_base_vect_mod, only : psb_i2_base_vect_type + use psb_i2_base_multivect_mod, only : psb_i2_base_multivect_type + use psi_i2_comm_v_mod + +end module psi_i2_mod + diff --git a/base/modules/psi_i_mod.F90 b/base/modules/psi_i_mod.F90 index 881ae078f..22df34627 100644 --- a/base/modules/psi_i_mod.F90 +++ b/base/modules/psi_i_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,9 +31,11 @@ ! module psi_i_mod - use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_epk_, psb_lpk_ + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_epk_, & + & psb_lpk_, psb_i2pk_ use psi_m_comm_a_mod use psi_e_comm_a_mod + use psi_i2_comm_a_mod use psb_i_base_vect_mod, only : psb_i_base_vect_type use psb_i_base_multivect_mod, only : psb_i_base_multivect_type use psi_i_comm_v_mod diff --git a/base/modules/psi_l_mod.F90 b/base/modules/psi_l_mod.F90 index 1ea56ad0a..6be25a134 100644 --- a/base/modules/psi_l_mod.F90 +++ b/base/modules/psi_l_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,9 +31,11 @@ ! module psi_l_mod - use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_epk_, psb_lpk_ + use psb_desc_mod, only : psb_desc_type, psb_ipk_, psb_mpk_, psb_epk_, & + & psb_lpk_, psb_i2pk_ use psi_m_comm_a_mod use psi_e_comm_a_mod + use psi_i2_comm_a_mod use psb_l_base_vect_mod, only : psb_l_base_vect_type use psb_l_base_multivect_mod, only : psb_l_base_multivect_type use psi_l_comm_v_mod diff --git a/base/modules/psi_mod.f90 b/base/modules/psi_mod.f90 index 55882c010..fa61a0220 100644 --- a/base/modules/psi_mod.f90 +++ b/base/modules/psi_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -36,6 +36,7 @@ module psi_mod use psb_const_mod use psb_error_mod use psb_penv_mod + use psi_i2_mod use psi_i_mod use psi_l_mod use psi_s_mod diff --git a/base/modules/psi_s_mod.F90 b/base/modules/psi_s_mod.F90 index cac4d0f6d..b87cade1c 100644 --- a/base/modules/psi_s_mod.F90 +++ b/base/modules/psi_s_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/psi_z_mod.F90 b/base/modules/psi_z_mod.F90 index dc102323f..1ce783151 100644 --- a/base/modules/psi_z_mod.F90 +++ b/base/modules/psi_z_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/serial/psb_base_mat_mod.F90 b/base/modules/serial/psb_base_mat_mod.F90 index 42d480d87..0fc1115a3 100644 --- a/base/modules/serial/psb_base_mat_mod.F90 +++ b/base/modules/serial/psb_base_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -128,7 +128,7 @@ module psb_base_mat_mod !! in already existing entries. !! The transitions among the states are detailed in !! psb_T_mat_mod. - integer(psb_ipk_), private :: state + integer(psb_ipk_), private :: bldstate !> How to treat duplicate elements when !! transitioning from the BUILD to the ASSEMBLED state. !! While many formats would allow for duplicate @@ -137,7 +137,7 @@ module psb_base_mat_mod !! BUILD state; in our overall design, only COO matrices !! can ever be in the BUILD state, hence all other formats !! cannot have duplicate entries. - integer(psb_ipk_), private :: duplicate + integer(psb_ipk_), private :: duplicate = psb_dupl_null_ !> Is the matrix symmetric? (must also be square) logical, private :: symmetric !> Is the matrix triangular? (must also be square) @@ -503,7 +503,7 @@ module psb_base_mat_mod !! in already existing entries. !! The transitions among the states are detailed in !! psb_T_mat_mod. - integer(psb_ipk_), private :: state + integer(psb_ipk_), private :: bldstate !> How to treat duplicate elements when !! transitioning from the BUILD to the ASSEMBLED state. !! While many formats would allow for duplicate @@ -909,7 +909,7 @@ contains implicit none class(psb_base_sparse_mat), intent(in) :: a integer(psb_ipk_) :: res - res = a%state + res = a%bldstate end function psb_base_get_state function psb_base_get_nrows(a) result(res) @@ -945,7 +945,7 @@ contains implicit none class(psb_base_sparse_mat), intent(inout) :: a integer(psb_ipk_), intent(in) :: n - a%state = n + a%bldstate = n end subroutine psb_base_set_state @@ -960,28 +960,28 @@ contains implicit none class(psb_base_sparse_mat), intent(inout) :: a - a%state = psb_spmat_null_ + a%bldstate = psb_spmat_null_ end subroutine psb_base_set_null subroutine psb_base_set_bld(a) implicit none class(psb_base_sparse_mat), intent(inout) :: a - a%state = psb_spmat_bld_ + a%bldstate = psb_spmat_bld_ end subroutine psb_base_set_bld subroutine psb_base_set_upd(a) implicit none class(psb_base_sparse_mat), intent(inout) :: a - a%state = psb_spmat_upd_ + a%bldstate = psb_spmat_upd_ end subroutine psb_base_set_upd subroutine psb_base_set_asb(a) implicit none class(psb_base_sparse_mat), intent(inout) :: a - a%state = psb_spmat_asb_ + a%bldstate = psb_spmat_asb_ end subroutine psb_base_set_asb subroutine psb_base_set_sorted(a,val) @@ -1107,28 +1107,28 @@ contains implicit none class(psb_base_sparse_mat), intent(in) :: a logical :: res - res = (a%state == psb_spmat_null_) + res = (a%bldstate == psb_spmat_null_) end function psb_base_is_null function psb_base_is_bld(a) result(res) implicit none class(psb_base_sparse_mat), intent(in) :: a logical :: res - res = (a%state == psb_spmat_bld_) + res = (a%bldstate == psb_spmat_bld_) end function psb_base_is_bld function psb_base_is_upd(a) result(res) implicit none class(psb_base_sparse_mat), intent(in) :: a logical :: res - res = (a%state == psb_spmat_upd_) + res = (a%bldstate == psb_spmat_upd_) end function psb_base_is_upd function psb_base_is_asb(a) result(res) implicit none class(psb_base_sparse_mat), intent(in) :: a logical :: res - res = (a%state == psb_spmat_asb_) + res = (a%bldstate == psb_spmat_asb_) end function psb_base_is_asb function psb_base_is_sorted(a) result(res) @@ -1185,7 +1185,7 @@ contains b%m = a%n b%n = a%m - b%state = a%state + b%bldstate = a%bldstate b%duplicate = a%duplicate b%triangle = a%triangle b%symmetric = a%symmetric @@ -1205,7 +1205,7 @@ contains b%m = a%n b%n = a%m - b%state = a%state + b%bldstate = a%bldstate b%duplicate = a%duplicate b%triangle = a%triangle b%symmetric = a%symmetric @@ -1225,7 +1225,7 @@ contains itmp = a%m a%m = a%n a%n = itmp - a%state = a%state + a%bldstate = a%bldstate a%duplicate = a%duplicate a%triangle = a%triangle a%unitd = a%unitd @@ -1402,7 +1402,7 @@ contains implicit none class(psb_lbase_sparse_mat), intent(in) :: a integer(psb_ipk_) :: res - res = a%state + res = a%bldstate end function psb_lbase_get_state function psb_lbase_get_nrows(a) result(res) @@ -1479,7 +1479,7 @@ contains implicit none class(psb_lbase_sparse_mat), intent(inout) :: a integer(psb_lpk_), intent(in) :: n - a%state = n + a%bldstate = n end subroutine psb_lbase_set_state @@ -1494,28 +1494,28 @@ contains implicit none class(psb_lbase_sparse_mat), intent(inout) :: a - a%state = psb_spmat_null_ + a%bldstate = psb_spmat_null_ end subroutine psb_lbase_set_null subroutine psb_lbase_set_bld(a) implicit none class(psb_lbase_sparse_mat), intent(inout) :: a - a%state = psb_spmat_bld_ + a%bldstate = psb_spmat_bld_ end subroutine psb_lbase_set_bld subroutine psb_lbase_set_upd(a) implicit none class(psb_lbase_sparse_mat), intent(inout) :: a - a%state = psb_spmat_upd_ + a%bldstate = psb_spmat_upd_ end subroutine psb_lbase_set_upd subroutine psb_lbase_set_asb(a) implicit none class(psb_lbase_sparse_mat), intent(inout) :: a - a%state = psb_spmat_asb_ + a%bldstate = psb_spmat_asb_ end subroutine psb_lbase_set_asb subroutine psb_lbase_set_sorted(a,val) @@ -1652,28 +1652,28 @@ contains implicit none class(psb_lbase_sparse_mat), intent(in) :: a logical :: res - res = (a%state == psb_spmat_null_) + res = (a%bldstate == psb_spmat_null_) end function psb_lbase_is_null function psb_lbase_is_bld(a) result(res) implicit none class(psb_lbase_sparse_mat), intent(in) :: a logical :: res - res = (a%state == psb_spmat_bld_) + res = (a%bldstate == psb_spmat_bld_) end function psb_lbase_is_bld function psb_lbase_is_upd(a) result(res) implicit none class(psb_lbase_sparse_mat), intent(in) :: a logical :: res - res = (a%state == psb_spmat_upd_) + res = (a%bldstate == psb_spmat_upd_) end function psb_lbase_is_upd function psb_lbase_is_asb(a) result(res) implicit none class(psb_lbase_sparse_mat), intent(in) :: a logical :: res - res = (a%state == psb_spmat_asb_) + res = (a%bldstate == psb_spmat_asb_) end function psb_lbase_is_asb function psb_lbase_is_sorted(a) result(res) @@ -1719,7 +1719,7 @@ contains b%m = a%n b%n = a%m - b%state = a%state + b%bldstate = a%bldstate b%duplicate = a%duplicate b%triangle = a%triangle b%unitd = a%unitd @@ -1738,7 +1738,7 @@ contains b%m = a%n b%n = a%m - b%state = a%state + b%bldstate = a%bldstate b%duplicate = a%duplicate b%triangle = a%triangle b%unitd = a%unitd @@ -1757,7 +1757,7 @@ contains itmp = a%m a%m = a%n a%n = itmp - a%state = a%state + a%bldstate = a%bldstate a%duplicate = a%duplicate a%triangle = a%triangle a%unitd = a%unitd @@ -1891,7 +1891,7 @@ contains lb%m = ib%m lb%n = ib%n - lb%state = ib%state + lb%bldstate = ib%bldstate lb%duplicate = ib%duplicate lb%triangle = ib%triangle lb%unitd = ib%unitd @@ -1907,7 +1907,7 @@ contains ib%m = lb%m ib%n = lb%n - ib%state = lb%state + ib%bldstate = lb%bldstate ib%duplicate = lb%duplicate ib%triangle = lb%triangle ib%unitd = lb%unitd diff --git a/base/modules/serial/psb_c_base_mat_mod.F90 b/base/modules/serial/psb_c_base_mat_mod.F90 index a5537034e..2e83ab4e5 100644 --- a/base/modules/serial/psb_c_base_mat_mod.F90 +++ b/base/modules/serial/psb_c_base_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/serial/psb_c_base_vect_mod.F90 b/base/modules/serial/psb_c_base_vect_mod.F90 index 65286969a..b2106a545 100644 --- a/base/modules/serial/psb_c_base_vect_mod.F90 +++ b/base/modules/serial/psb_c_base_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -33,7 +33,7 @@ ! package: psb_c_base_vect_mod ! ! This module contains the definition of the psb_c_base_vect type which -! is a container for dense vectors. +! is a container for dense vectors.\ ! This is encapsulated instead of being just a simple array to allow for ! more complicated situations, such as GPU programming, where the memory ! area we are interested in is not easily accessible from the host/Fortran @@ -47,6 +47,8 @@ module psb_c_base_vect_mod use psb_const_mod use psb_error_mod use psb_realloc_mod + use psb_comm_schemes_mod, only: psb_comm_handle_type, psb_comm_isend_irecv_, psb_comm_unknown_ + use psb_comm_factory_mod, only: psb_comm_set, psb_comm_free use psb_i_base_vect_mod use psb_l_base_vect_mod @@ -62,9 +64,22 @@ module psb_c_base_vect_mod !! type psb_c_base_vect_type !> Values. - complex(psb_spk_), allocatable :: v(:) - complex(psb_spk_), allocatable :: combuf(:) - integer(psb_mpk_), allocatable :: comid(:,:) + complex(psb_spk_), allocatable :: v(:) + complex(psb_spk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) contains ! ! Constructors/allocators @@ -88,6 +103,22 @@ module psb_c_base_vect_mod procedure, pass(x) :: asb_e => c_base_asb_e generic, public :: asb => asb_m, asb_e procedure, pass(x) :: free => c_base_free + procedure, pass(x) :: reinit => c_base_reinit + procedure, pass(x) :: set_ncfs => c_base_set_ncfs + procedure, pass(x) :: get_ncfs => c_base_get_ncfs + procedure, pass(x) :: set_dupl => c_base_set_dupl + procedure, pass(x) :: get_dupl => c_base_get_dupl + procedure, pass(x) :: set_state => c_base_set_state + procedure, pass(x) :: set_null => c_base_set_null + procedure, pass(x) :: set_bld => c_base_set_bld + procedure, pass(x) :: set_upd => c_base_set_upd + procedure, pass(x) :: set_asb => c_base_set_asb + procedure, pass(x) :: get_state => c_base_get_state + procedure, pass(x) :: is_null => c_base_is_null + procedure, pass(x) :: is_bld => c_base_is_bld + procedure, pass(x) :: is_upd => c_base_is_upd + procedure, pass(x) :: is_asb => c_base_is_asb + procedure, pass(x) :: base_cpy => c_base_cpy ! ! Sync: centerpiece of handling of external storage. ! Any derived class having extra storage upon sync @@ -112,9 +143,7 @@ module psb_c_base_vect_mod procedure, nopass :: device_wait => c_base_device_wait procedure, pass(x) :: maybe_free_buffer => c_base_maybe_free_buffer procedure, pass(x) :: free_buffer => c_base_free_buffer - procedure, pass(x) :: new_comid => c_base_new_comid - procedure, pass(x) :: free_comid => c_base_free_comid - + ! ! Basic info procedure, pass(x) :: get_nrows => c_base_get_nrows @@ -129,6 +158,7 @@ module psb_c_base_vect_mod procedure, pass(x) :: set_vect => c_base_set_vect generic, public :: set => set_vect, set_scal procedure, pass(x) :: get_entry=> c_base_get_entry + procedure, pass(x) :: set_entry=> c_base_set_entry ! ! Gather/scatter. These are needed for MPI interfacing. ! May have to be reworked. @@ -143,6 +173,9 @@ module psb_c_base_vect_mod procedure, pass(y) :: sctb_buf => c_base_sctb_buf generic, public :: sct => sctb, sctb_x, sctb_buf + procedure, pass(x) :: check_addr => c_base_check_addr + + ! ! Dot product and AXPBY @@ -211,8 +244,6 @@ module psb_c_base_vect_mod generic, public :: addconst => addconst_a2,addconst_v2 - - end type psb_c_base_vect_type public :: psb_c_base_vect @@ -263,14 +294,22 @@ contains !! \brief Build method from an array !! \param x(:) input array to be copied !! - subroutine c_base_bld_x(x,this) + subroutine c_base_bld_x(x,this,scratch) use psb_realloc_mod implicit none complex(psb_spk_), intent(in) :: this(:) class(psb_c_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info integer(psb_ipk_) :: i + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(size(this),x%v,info) if (info /= 0) then call psb_errpush(psb_err_alloc_dealloc_,'base_vect_bld') @@ -295,15 +334,23 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine c_base_bld_mn(x,n) + subroutine c_base_bld_mn(x,n,scratch) use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_c_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(n,x%v,info) - call x%asb(n,info) + call x%asb(n,info,scratch=scratch_) end subroutine c_base_bld_mn @@ -312,15 +359,23 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine c_base_bld_en(x,n) + subroutine c_base_bld_en(x,n,scratch) use psb_realloc_mod implicit none integer(psb_epk_), intent(in) :: n class(psb_c_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(n,x%v,info) - call x%asb(n,info) + call x%asb(n,info,scratch=scratch_) end subroutine c_base_bld_en @@ -340,6 +395,10 @@ contains integer(psb_ipk_), intent(out) :: info call psb_realloc(n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if end subroutine c_base_all @@ -361,6 +420,31 @@ contains end subroutine c_base_mold + subroutine c_base_reinit(x, info,clear) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_c_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + logical :: clear_ + + info = 0 + if (present(clear)) then + clear_ = clear + else + clear_ = .true. + end if + + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + if (clear_) x%v(:) = czero + call x%set_host() + call x%set_upd() + end if + + end subroutine c_base_reinit + ! ! Insert a bunch of values at specified positions. ! @@ -388,55 +472,118 @@ contains !! \param info return code !! ! - subroutine c_base_ins_a(n,irl,val,dupl,x,info) + subroutine c_base_ins_a(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_c_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr integer(psb_ipk_), intent(in) :: irl(:) complex(psb_spk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_) :: i, isz + integer(psb_ipk_) :: i, isz, dupl_, ncfs_, k info = 0 if (psb_errstatus_fatal()) return - if (.not.allocated(x%v)) then - info = psb_err_invalid_vect_state_ - else if (n > min(size(irl),size(val))) then - info = psb_err_invalid_input_ - - else - isz = size(x%v) - select case(dupl) - case(psb_dupl_ovwrt_) + if (try_newins) then + if (x%is_bld()) then + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_ensure_size(isz,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ do i = 1, n !loop over all val's rows ! row actual block row - if ((1 <= irl(i)).and.(irl(i) <= isz)) then + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 ! this row belongs to me ! copy i-th row of block val in x - x%v(irl(i)) = val(i) + x%v(k) = val(i) + x%iv(k) = irl(i) end if enddo + call x%set_ncfs(k) - case(psb_dupl_add_) + else if (x%is_upd()) then - do i = 1, n - !loop over all val's rows - if ((1 <= irl(i)).and.(irl(i) <= isz)) then - ! this row belongs to me - ! copy i-th row of block val in x - x%v(irl(i)) = x%v(irl(i)) + val(i) - end if - enddo + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ - case default - info = 321 - ! !$ call psb_errpush(info,name) - ! !$ goto 9999 - end select + else + isz = size(x%v) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if end if call x%set_host() if (info /= 0) then @@ -446,11 +593,11 @@ contains end subroutine c_base_ins_a - subroutine c_base_ins_v(n,irl,val,dupl,x,info) + subroutine c_base_ins_v(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_c_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr class(psb_i_base_vect_type), intent(inout) :: irl class(psb_c_base_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -463,7 +610,7 @@ contains if (irl%is_dev()) call irl%sync() if (val%is_dev()) call val%sync() if (x%is_dev()) call x%sync() - call x%ins(n,irl%v,val%v,dupl,info) + call x%ins(n,irl%v,val%v,dupl,maxr,info) if (info /= 0) then call psb_errpush(info,'base_vect_ins') @@ -507,19 +654,72 @@ contains !! ! - subroutine c_base_asb_m(n, x, info) + subroutine c_base_asb_m(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_c_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + complex(psb_spk_), allocatable :: vv(:) info = 0 - if (x%get_nrows() < n) & - & call psb_realloc(n,x%v,info) - if (info /= 0) & - & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (x%is_bld()) then + ncfs = x%get_ncfs() + xvsz = psb_size(x%v) + call psb_realloc(n,vv,info) + vv(:) = czero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,ncfs + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,ncfs + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,ncfs + if (vv(x%iv(i)).ne. czero) then + call psb_errpush(psb_err_duplicate_coo,'vect-asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() call x%sync() end subroutine c_base_asb_m @@ -537,19 +737,72 @@ contains !! ! - subroutine c_base_asb_e(n, x, info) + subroutine c_base_asb_e(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_epk_), intent(in) :: n class(psb_c_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + complex(psb_spk_), allocatable :: vv(:) info = 0 - if (x%get_nrows() < n) & - & call psb_realloc(n,x%v,info) - if (info /= 0) & - & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb unhandled') + if (x%is_bld()) then + call psb_realloc(n,vv,info) + vv(:) = czero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,x%get_ncfs() + if (vv(x%iv(i)).ne. czero) then + call psb_errpush(psb_err_duplicate_coo,'vect_asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() call x%sync() end subroutine c_base_asb_e @@ -566,19 +819,22 @@ contains use psb_realloc_mod implicit none class(psb_c_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: info_comm + integer(psb_ipk_), intent(out) :: info info = 0 if (allocated(x%v)) deallocate(x%v, stat=info) if ((info == 0).and.allocated(x%combuf)) call x%free_buffer(info) - if ((info == 0).and.allocated(x%comid)) call x%free_comid(info) + if ((info == 0).and.allocated(x%iv)) deallocate(x%iv, stat=info) + if ((info == 0).and.allocated(x%comm_handle)) then + call psb_comm_free(x%comm_handle, info_comm) + if (info_comm /= psb_success_) info = info_comm + end if if (info /= 0) call & & psb_errpush(psb_err_alloc_dealloc_,'vect_free') - + call x%set_null() end subroutine c_base_free - - ! !> Function base_free_buffer: !! \memberof psb_c_base_vect_type @@ -619,25 +875,104 @@ contains & call x%free_buffer(info) end subroutine c_base_maybe_free_buffer + + function c_base_get_ncfs(x) result(res) + implicit none + class(psb_c_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%ncfs + end function c_base_get_ncfs - ! - !> Function base_free_comid: - !! \memberof psb_c_base_vect_type - !! \brief Free aux MPI communication id buffer - !! - !! \param info return code - !! - ! - subroutine c_base_free_comid(x,info) - use psb_realloc_mod + function c_base_get_dupl(x) result(res) + implicit none + class(psb_c_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%dupl + end function c_base_get_dupl + + function c_base_get_state(x) result(res) + implicit none + class(psb_c_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%bldstate + end function c_base_get_state + + function c_base_is_null(x) result(res) + implicit none + class(psb_c_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_null_) + end function c_base_is_null + + function c_base_is_bld(x) result(res) + implicit none + class(psb_c_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_bld_) + end function c_base_is_bld + + function c_base_is_upd(x) result(res) + implicit none + class(psb_c_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_upd_) + end function c_base_is_upd + + function c_base_is_asb(x) result(res) + implicit none + class(psb_c_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_asb_) + end function c_base_is_asb + + subroutine c_base_set_ncfs(n,x) implicit none class(psb_c_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: n + x%ncfs = n + end subroutine c_base_set_ncfs + + subroutine c_base_set_dupl(n,x) + implicit none + class(psb_c_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%dupl = n + end subroutine c_base_set_dupl + + subroutine c_base_set_state(n,x) + implicit none + class(psb_c_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%bldstate = n + end subroutine c_base_set_state + + subroutine c_base_set_null(x) + implicit none + class(psb_c_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_null_ + end subroutine c_base_set_null + + subroutine c_base_set_bld(x) + implicit none + class(psb_c_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_bld_ + end subroutine c_base_set_bld - if (allocated(x%comid)) & - & deallocate(x%comid,stat=info) - end subroutine c_base_free_comid + subroutine c_base_set_upd(x) + implicit none + class(psb_c_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_upd_ + end subroutine c_base_set_upd + subroutine c_base_set_asb(x) + implicit none + class(psb_c_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_asb_ + end subroutine c_base_set_asb ! ! The base version of SYNC & friends does nothing, it's just @@ -733,6 +1068,24 @@ contains res = .true. end function c_base_is_sync + !> Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine c_base_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_c_base_vect_type), intent(in) :: x + class(psb_c_base_vect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine c_base_cpy ! ! Size info. @@ -891,6 +1244,13 @@ contains end subroutine c_base_set_vect + subroutine c_base_check_addr(x) + class(psb_c_base_vect_type), intent(inout) :: x + + write(0,*) 'Check addr: base version, do nothing' + + end subroutine c_base_check_addr + ! ! Get entry. @@ -903,15 +1263,33 @@ contains ! function c_base_get_entry(x, index) result(res) implicit none - class(psb_c_base_vect_type), intent(in) :: x + class(psb_c_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in) :: index complex(psb_spk_) :: res res = 0 - if (allocated(x%v)) res = x%v(index) + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + res = x%v(index) + end if end function c_base_get_entry + subroutine c_base_set_entry(x, index, val) + implicit none + class(psb_c_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: index + complex(psb_spk_) :: val + + + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + x%v(index) =val + call x%set_host() + end if + + end subroutine c_base_set_entry + ! ! Overwrite with absolute value ! @@ -1910,17 +2288,6 @@ contains call psb_realloc(n,x%combuf,info) end subroutine c_base_new_buffer - subroutine c_base_new_comid(n,x,info) - use psb_realloc_mod - implicit none - class(psb_c_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n - integer(psb_ipk_), intent(out) :: info - - call psb_realloc(n,2_psb_ipk_,x%comid,info) - end subroutine c_base_new_comid - - ! ! shortcut alpha=1 beta=0 ! @@ -2084,9 +2451,22 @@ module psb_c_base_multivect_mod type psb_c_base_multivect_type !> Values. - complex(psb_spk_), allocatable :: v(:,:) - complex(psb_spk_), allocatable :: combuf(:) - integer(psb_mpk_), allocatable :: comid(:,:) + complex(psb_spk_), allocatable :: v(:,:) + complex(psb_spk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) contains ! ! Constructors/allocators @@ -2105,6 +2485,22 @@ module psb_c_base_multivect_mod procedure, pass(x) :: zero => c_base_mlv_zero procedure, pass(x) :: asb => c_base_mlv_asb procedure, pass(x) :: free => c_base_mlv_free + procedure, pass(x) :: reinit => c_base_mlv_reinit + procedure, pass(x) :: set_ncfs => c_base_mlv_set_ncfs + procedure, pass(x) :: get_ncfs => c_base_mlv_get_ncfs + procedure, pass(x) :: set_dupl => c_base_mlv_set_dupl + procedure, pass(x) :: get_dupl => c_base_mlv_get_dupl + procedure, pass(x) :: set_state => c_base_mlv_set_state + procedure, pass(x) :: set_null => c_base_mlv_set_null + procedure, pass(x) :: set_bld => c_base_mlv_set_bld + procedure, pass(x) :: set_upd => c_base_mlv_set_upd + procedure, pass(x) :: set_asb => c_base_mlv_set_asb + procedure, pass(x) :: get_state => c_base_mlv_get_state + procedure, pass(x) :: is_null => c_base_mlv_is_null + procedure, pass(x) :: is_bld => c_base_mlv_is_bld + procedure, pass(x) :: is_upd => c_base_mlv_is_upd + procedure, pass(x) :: is_asb => c_base_mlv_is_asb + procedure, pass(x) :: base_cpy => c_base_mlv_cpy ! ! Sync: centerpiece of handling of external storage. ! Any derived class having extra storage upon sync @@ -2178,8 +2574,6 @@ module psb_c_base_multivect_mod procedure, nopass :: device_wait => c_base_mlv_device_wait procedure, pass(x) :: maybe_free_buffer => c_base_mlv_maybe_free_buffer procedure, pass(x) :: free_buffer => c_base_mlv_free_buffer - procedure, pass(x) :: new_comid => c_base_mlv_new_comid - procedure, pass(x) :: free_comid => c_base_mlv_free_comid ! ! Gather/scatter. These are needed for MPI interfacing. @@ -2218,7 +2612,8 @@ contains integer(psb_ipk_) :: info this%v = x - call this%asb(size(x,dim=1,kind=psb_ipk_),size(x,dim=2,kind=psb_ipk_),info) + call this%asb(size(x,dim=1,kind=psb_ipk_),& + & size(x,dim=2,kind=psb_ipk_),info) end function constructor @@ -2268,14 +2663,15 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine c_base_mlv_bld_n(x,m,n) + subroutine c_base_mlv_bld_n(x,m,n,scratch) use psb_realloc_mod integer(psb_ipk_), intent(in) :: m,n class(psb_c_base_multivect_type), intent(inout) :: x integer(psb_ipk_) :: info + logical, intent(in), optional :: scratch call psb_realloc(m,n,x%v,info) - call x%asb(m,n,info) + call x%asb(m,n,info,scratch=scratch) end subroutine c_base_mlv_bld_n @@ -2295,6 +2691,10 @@ contains integer(psb_ipk_), intent(out) :: info call psb_realloc(m,n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if end subroutine c_base_mlv_all @@ -2316,6 +2716,23 @@ contains end subroutine c_base_mlv_mold + subroutine c_base_mlv_reinit(x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_c_base_multivect_type), intent(out) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(x%v)) then + call x%sync() + x%v(:,:) = czero + call x%set_host() + call x%set_upd() + end if + + end subroutine c_base_mlv_reinit + ! ! Insert a bunch of values at specified positions. ! @@ -2343,57 +2760,123 @@ contains !! \param info return code !! ! - subroutine c_base_mlv_ins(n,irl,val,dupl,x,info) + subroutine c_base_mlv_ins(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_c_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl,maxr integer(psb_ipk_), intent(in) :: irl(:) complex(psb_spk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_) :: i, isz + integer(psb_ipk_) :: i, isz, nc, dupl_, ncfs_, k info = 0 if (psb_errstatus_fatal()) return - if (.not.allocated(x%v)) then - info = psb_err_invalid_vect_state_ - else if (n > min(size(irl),size(val))) then - info = psb_err_invalid_input_ - - else - isz = size(x%v,1) - select case(dupl) - case(psb_dupl_ovwrt_) + if (try_newins) then + if (x%is_bld()) then + nc = size(x%v,2) + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_realloc(isz,nc,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ do i = 1, n !loop over all val's rows - ! row actual block row - if ((1 <= irl(i)).and.(irl(i) <= isz)) then + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 ! this row belongs to me ! copy i-th row of block val in x - x%v(irl(i),:) = val(i,:) + x%v(k,:) = val(i,:) + x%iv(k) = irl(i) end if enddo + call x%set_ncfs(k) - case(psb_dupl_add_) + else if (x%is_upd()) then - do i = 1, n - !loop over all val's rows - if ((1 <= irl(i)).and.(irl(i) <= isz)) then - ! this row belongs to me - ! copy i-th row of block val in x - x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) - end if - enddo + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ - case default - info = 321 - ! !$ call psb_errpush(info,name) - ! !$ goto 9999 - end select + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if end if + call x%set_host() if (info /= 0) then call psb_errpush(info,'base_mlv_vect_ins') return @@ -2413,6 +2896,7 @@ contains class(psb_c_base_multivect_type), intent(inout) :: x if (allocated(x%v)) x%v=czero + call x%set_host() end subroutine c_base_mlv_zero @@ -2431,19 +2915,78 @@ contains !! ! - subroutine c_base_mlv_asb(m,n, x, info) + subroutine c_base_mlv_asb(m,n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: m,n class(psb_c_base_multivect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch - if ((x%get_nrows() < m).or.(x%get_ncols() Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine c_base_mlv_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_c_base_multivect_type), intent(in) :: x + class(psb_c_base_multivect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine c_base_mlv_cpy + ! ! Size info. @@ -2607,7 +3266,7 @@ contains integer(psb_epk_) :: res ! Force 8-byte integers. - res = (1_psb_epk_ * psb_sizeof_ip) * x%get_nrows() * x%get_ncols() + res = (1_psb_epk_ * (2*psb_sizeof_sp)) * x%get_nrows() * x%get_ncols() end function c_base_mlv_sizeof @@ -3194,16 +3853,6 @@ contains call psb_realloc(n*nc,x%combuf,info) end subroutine c_base_mlv_new_buffer - subroutine c_base_mlv_new_comid(n,x,info) - use psb_realloc_mod - implicit none - class(psb_c_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n - integer(psb_ipk_), intent(out) :: info - - call psb_realloc(n,2_psb_ipk_,x%comid,info) - end subroutine c_base_mlv_new_comid - subroutine c_base_mlv_maybe_free_buffer(x,info) use psb_realloc_mod @@ -3228,17 +3877,6 @@ contains & deallocate(x%combuf,stat=info) end subroutine c_base_mlv_free_buffer - subroutine c_base_mlv_free_comid(x,info) - use psb_realloc_mod - implicit none - class(psb_c_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - - if (allocated(x%comid)) & - & deallocate(x%comid,stat=info) - end subroutine c_base_mlv_free_comid - - ! ! Gather: Y = beta * Y + alpha * X(IDX(:)) ! diff --git a/base/modules/serial/psb_c_csc_mat_mod.f90 b/base/modules/serial/psb_c_csc_mat_mod.f90 index 5ccdd19ad..7cf1b0e37 100644 --- a/base/modules/serial/psb_c_csc_mat_mod.f90 +++ b/base/modules/serial/psb_c_csc_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -912,6 +912,23 @@ module psb_c_csc_mat_mod end subroutine psb_lc_csc_scals end interface + interface + subroutine psb_ccscspspmm(a,b,c,info) + import + implicit none + class(psb_c_csc_sparse_mat), intent(in) :: a,b + type(psb_c_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ccscspspmm + subroutine psb_lccscspspmm(a,b,c,info) + import + implicit none + class(psb_lc_csc_sparse_mat), intent(in) :: a,b + type(psb_lc_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lccscspspmm + end interface + contains ! == =================================== diff --git a/base/modules/serial/psb_c_csr_mat_mod.f90 b/base/modules/serial/psb_c_csr_mat_mod.f90 index a39c204b1..6a4afc295 100644 --- a/base/modules/serial/psb_c_csr_mat_mod.f90 +++ b/base/modules/serial/psb_c_csr_mat_mod.f90 @@ -15,7 +15,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -1162,6 +1162,23 @@ module psb_c_csr_mat_mod end subroutine psb_lc_csr_aclsum end interface + ! Interfaces for SPSPMM + interface + subroutine psb_ccsrspspmm(a,b,c,info) + import + implicit none + class(psb_c_csr_sparse_mat), intent(in) :: a,b + type(psb_c_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ccsrspspmm + subroutine psb_lccsrspspmm(a,b,c,info) + import + implicit none + class(psb_lc_csr_sparse_mat), intent(in) :: a,b + type(psb_lc_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lccsrspspmm + end interface contains diff --git a/base/modules/serial/psb_c_mat_mod.F90 b/base/modules/serial/psb_c_mat_mod.F90 index 165a54518..628aae1c5 100644 --- a/base/modules/serial/psb_c_mat_mod.F90 +++ b/base/modules/serial/psb_c_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -78,6 +78,8 @@ ! module psb_c_mat_mod + use psb_c_vect_mod + use psb_i_vect_mod use psb_c_base_mat_mod use psb_c_csr_mat_mod, only : psb_c_csr_sparse_mat, psb_lc_csr_sparse_mat,& & psb_c_ecsr_sparse_mat @@ -661,9 +663,8 @@ module psb_c_mat_mod interface subroutine psb_c_csput_v(nz,ia,ja,val,a,imin,imax,jmin,jmax,info) - use psb_c_vect_mod, only : psb_c_vect_type - use psb_i_vect_mod, only : psb_i_vect_type - import :: psb_ipk_, psb_lpk_, psb_cspmat_type + import :: psb_ipk_, psb_lpk_, psb_cspmat_type, & + & psb_c_vect_type, psb_i_vect_type class(psb_cspmat_type), intent(inout) :: a type(psb_c_vect_type), intent(inout) :: val type(psb_i_vect_type), intent(inout) :: ia, ja diff --git a/base/modules/serial/psb_c_serial_mod.f90 b/base/modules/serial/psb_c_serial_mod.f90 index 9c43f3e76..db590ea4b 100644 --- a/base/modules/serial/psb_c_serial_mod.f90 +++ b/base/modules/serial/psb_c_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -60,24 +60,8 @@ module psb_c_serial_mod type(psb_cspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_cspspmm - subroutine psb_ccsrspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_c_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_c_csr_sparse_mat), intent(in) :: a,b - type(psb_c_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ccsrspspmm - subroutine psb_ccscspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_c_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_c_csc_sparse_mat), intent(in) :: a,b - type(psb_c_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ccscspspmm - end interface - + end interface psb_spspmm + interface psb_symbmm subroutine psb_csymbmm(a,b,c,info) use psb_c_mat_mod, only : psb_cspmat_type @@ -114,6 +98,16 @@ module psb_c_serial_mod end subroutine psb_cbase_numbmm end interface psb_numbmm + interface psb_aplusat + subroutine psb_caplusat(ain,aout,info) + use psb_c_mat_mod, only : psb_cspmat_type + import :: psb_ipk_ + implicit none + type(psb_cspmat_type) :: ain, aout + integer(psb_ipk_) :: info + end subroutine psb_caplusat + end interface + interface psb_rwextd subroutine psb_crwextd(nr,a,info,b,rowscale) use psb_c_mat_mod, only : psb_cspmat_type @@ -232,22 +226,6 @@ module psb_c_serial_mod type(psb_lcspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_lcspspmm - subroutine psb_lccsrspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_lc_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lc_csr_sparse_mat), intent(in) :: a,b - type(psb_lc_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lccsrspspmm - subroutine psb_lccscspspmm(a,b,c,info) - use psb_c_mat_mod, only : psb_lc_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lc_csc_sparse_mat), intent(in) :: a,b - type(psb_lc_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lccscspspmm end interface psb_spspmm interface psb_symbmm diff --git a/base/modules/serial/psb_c_vect_mod.F90 b/base/modules/serial/psb_c_vect_mod.F90 index 9effe9efd..5e628ff97 100644 --- a/base/modules/serial/psb_c_vect_mod.F90 +++ b/base/modules/serial/psb_c_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -56,14 +56,28 @@ module psb_c_vect_mod procedure, pass(x) :: get_fmt => c_vect_get_fmt procedure, pass(x) :: is_remote_build => c_vect_is_remote_build procedure, pass(x) :: set_remote_build => c_vect_set_remote_build - procedure, pass(x) :: get_dupl => c_vect_get_dupl - procedure, pass(x) :: set_dupl => c_vect_set_dupl procedure, pass(x) :: get_nrmv => c_vect_get_nrmv procedure, pass(x) :: set_nrmv => c_vect_set_nrmv procedure, pass(x) :: all => c_vect_all procedure, pass(x) :: reall => c_vect_reall procedure, pass(x) :: zero => c_vect_zero procedure, pass(x) :: asb => c_vect_asb + procedure, pass(x) :: set_dupl => c_vect_set_dupl + procedure, pass(x) :: get_dupl => c_vect_get_dupl + procedure, pass(x) :: set_ncfs => c_vect_set_ncfs + procedure, pass(x) :: get_ncfs => c_vect_get_ncfs + procedure, pass(x) :: set_state => c_vect_set_state + procedure, pass(x) :: set_null => c_vect_set_null + procedure, pass(x) :: set_bld => c_vect_set_bld + procedure, pass(x) :: set_upd => c_vect_set_upd + procedure, pass(x) :: set_asb => c_vect_set_asb + procedure, pass(x) :: get_state => c_vect_get_state + procedure, pass(x) :: is_null => c_vect_is_null + procedure, pass(x) :: is_bld => c_vect_is_bld + procedure, pass(x) :: is_upd => c_vect_is_upd + procedure, pass(x) :: is_asb => c_vect_is_asb + procedure, pass(x) :: reinit => c_vect_reinit + procedure, pass(x) :: gthab => c_vect_gthab procedure, pass(x) :: gthzv => c_vect_gthzv generic, public :: gth => gthab, gthzv @@ -91,8 +105,10 @@ module psb_c_vect_mod procedure, pass(x) :: set_host => c_vect_set_host procedure, pass(x) :: set_dev => c_vect_set_dev procedure, pass(x) :: set_sync => c_vect_set_sync + procedure, pass(x) :: check_addr => c_vect_check_addr procedure, pass(x) :: get_entry => c_vect_get_entry + procedure, pass(x) :: set_entry => c_vect_set_entry procedure, pass(x) :: dot_v => c_vect_dot_v procedure, pass(x) :: dot_a => c_vect_dot_a @@ -187,7 +203,11 @@ contains implicit none class(psb_c_vect_type), intent(in) :: x integer(psb_ipk_) :: res - res = x%dupl + if (allocated(x%v)) then + res = x%v%get_dupl() + else + res = psb_dupl_null_ + end if end function c_vect_get_dupl subroutine c_vect_set_dupl(x,val) @@ -195,13 +215,117 @@ contains class(psb_c_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in), optional :: val - if (present(val)) then - x%dupl = val - else - x%dupl = psb_dupl_def_ + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_dupl(val) + else + call x%v%set_dupl(psb_dupl_def_) + end if end if end subroutine c_vect_set_dupl + function c_vect_get_ncfs(x) result(res) + implicit none + class(psb_c_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_ncfs() + else + res = 0 + end if + end function c_vect_get_ncfs + + subroutine c_vect_set_ncfs(x,val) + implicit none + class(psb_c_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in), optional :: val + + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_ncfs(val) + else + call x%v%set_ncfs(0) + end if + end if + end subroutine c_vect_set_ncfs + + function c_vect_get_state(x) result(res) + implicit none + class(psb_c_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_state() + else + res = psb_vect_null_ + end if + end function c_vect_get_state + + function c_vect_is_null(x) result(res) + implicit none + class(psb_c_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_null_) + end function c_vect_is_null + + function c_vect_is_bld(x) result(res) + implicit none + class(psb_c_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_bld_) + end function c_vect_is_bld + + function c_vect_is_upd(x) result(res) + implicit none + class(psb_c_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_upd_) + end function c_vect_is_upd + + function c_vect_is_asb(x) result(res) + implicit none + class(psb_c_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_asb_) + end function c_vect_is_asb + + subroutine c_vect_set_state(n,x) + implicit none + class(psb_c_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + if (allocated(x%v)) then + call x%v%set_state(n) + end if + end subroutine c_vect_set_state + + + subroutine c_vect_set_null(x) + implicit none + class(psb_c_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_null_) + end subroutine c_vect_set_null + + subroutine c_vect_set_bld(x) + implicit none + class(psb_c_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_bld_) + end subroutine c_vect_set_bld + + subroutine c_vect_set_upd(x) + implicit none + class(psb_c_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_upd_) + end subroutine c_vect_set_upd + + subroutine c_vect_set_asb(x) + implicit none + class(psb_c_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_asb_) + end subroutine c_vect_set_asb + function c_vect_get_nrmv(x) result(res) implicit none class(psb_c_vect_type), intent(in) :: x @@ -216,7 +340,6 @@ contains x%nrmv = val end subroutine c_vect_set_nrmv - function c_vect_is_remote_build(x) result(res) implicit none @@ -287,16 +410,31 @@ contains info = psb_success_ call y%free(info) if ((info==0).and.allocated(x%v)) then + ! + ! Using sourced allocation here creates + ! problems with handling of memory allocated + ! elsewhere (e.g. accelerators), hence delegation + ! to %bld method + ! call y%bld(x%get_vect(),mold=x%v) end if end subroutine c_vect_clone - subroutine c_vect_bld_x(x,invect,mold) + subroutine c_vect_bld_x(x,invect,mold,scratch) complex(psb_spk_), intent(in) :: invect(:) class(psb_c_vect_type), intent(inout) :: x class(psb_c_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + info = psb_success_ if (allocated(x%v)) & & call x%free(info) @@ -307,17 +445,25 @@ contains allocate(x%v,stat=info, mold=psb_c_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(invect) + if (info == psb_success_) call x%v%bld(invect,scratch=scratch_) end subroutine c_vect_bld_x - subroutine c_vect_bld_mn(x,n,mold) + subroutine c_vect_bld_mn(x,n,mold,scratch) integer(psb_mpk_), intent(in) :: n class(psb_c_vect_type), intent(inout) :: x class(psb_c_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info class(psb_c_base_vect_type), pointer :: mld + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if info = psb_success_ if (allocated(x%v)) & @@ -328,17 +474,25 @@ contains else allocate(x%v,stat=info, mold=psb_c_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(n) + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) end subroutine c_vect_bld_mn - subroutine c_vect_bld_en(x,n,mold) + subroutine c_vect_bld_en(x,n,mold,scratch) integer(psb_epk_), intent(in) :: n class(psb_c_vect_type), intent(inout) :: x class(psb_c_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (allocated(x%v)) & & call x%free(info) @@ -348,7 +502,7 @@ contains else allocate(x%v,stat=info, mold=psb_c_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(n) + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) end subroutine c_vect_bld_en @@ -383,6 +537,13 @@ contains end subroutine c_vect_set_vect + subroutine c_vect_check_addr(x) + class(psb_c_vect_type), intent(inout) :: x + + integer(psb_ipk_) :: info + if (allocated(x%v)) call x%v%check_addr() + + end subroutine c_vect_check_addr function constructor(x) result(this) complex(psb_spk_) :: x(:) @@ -450,8 +611,20 @@ contains else info = psb_err_alloc_dealloc_ end if + call x%set_bld() end subroutine c_vect_all + subroutine c_vect_reinit(x, info, clear) + implicit none + class(psb_c_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + + if (allocated(x%v)) call x%v%reinit(info,clear) + call x%set_upd() + + end subroutine c_vect_reinit + subroutine c_vect_reall(n, x, info) implicit none @@ -476,16 +649,18 @@ contains end subroutine c_vect_zero - subroutine c_vect_asb(n, x, info) + subroutine c_vect_asb(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: n class(psb_c_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch if (allocated(x%v)) then - call x%v%asb(n,info) + call x%v%asb(n,info,scratch=scratch) + call x%set_asb() end if end subroutine c_vect_asb @@ -540,11 +715,11 @@ contains end subroutine c_vect_free - subroutine c_vect_ins_a(n,irl,val,x,info) + subroutine c_vect_ins_a(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_c_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n, maxr integer(psb_ipk_), intent(in) :: irl(:) complex(psb_spk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info @@ -557,15 +732,15 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl,val,dupl,info) + call x%v%ins(n,irl,val,dupl,maxr,info) end subroutine c_vect_ins_a - subroutine c_vect_ins_v(n,irl,val,x,info) + subroutine c_vect_ins_v(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_c_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n, maxr class(psb_i_vect_type), intent(inout) :: irl class(psb_c_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -578,7 +753,7 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl%v,val%v,dupl,info) + call x%v%ins(n,irl%v,val%v,dupl,maxr,info) end subroutine c_vect_ins_v @@ -600,6 +775,7 @@ contains if (allocated(x%v%v)) then call x%v%sync() if (info == psb_success_) call tmp%bld(x%v%v) + call x%v%base_cpy(tmp) call x%v%free(info) endif end if @@ -680,13 +856,21 @@ contains function c_vect_get_entry(x,index) result(res) implicit none - class(psb_c_vect_type), intent(in) :: x + class(psb_c_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in) :: index complex(psb_spk_) :: res - res = 0 + res = czero if (allocated(x%v)) res = x%v%get_entry(index) end function c_vect_get_entry + subroutine c_vect_set_entry(x,index,val) + implicit none + class(psb_c_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: index + complex(psb_spk_) :: val + if (allocated(x%v)) call x%v%set_entry(index,val) + end subroutine c_vect_set_entry + function c_vect_dot_v(n,x,y) result(res) implicit none class(psb_c_vect_type), intent(inout) :: x, y @@ -1485,19 +1669,20 @@ contains end subroutine c_mvect_bld_x - subroutine c_mvect_bld_n(x,m,n,mold) + subroutine c_mvect_bld_n(x,m,n,mold,scratch) integer(psb_ipk_), intent(in) :: m,n class(psb_c_multivect_type), intent(out) :: x class(psb_c_base_multivect_type), intent(in), optional :: mold integer(psb_ipk_) :: info - + logical, intent(in), optional :: scratch + info = psb_success_ if (present(mold)) then allocate(x%v,stat=info,mold=mold) else allocate(x%v,stat=info, mold=psb_c_get_base_multivect_default()) endif - if (info == psb_success_) call x%v%bld(m,n) + if (info == psb_success_) call x%v%bld(m,n,scratch=scratch) end subroutine c_mvect_bld_n @@ -1727,11 +1912,11 @@ contains end subroutine c_mvect_free - subroutine c_mvect_ins(n,irl,val,x,info) + subroutine c_mvect_ins(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_c_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n,maxr integer(psb_ipk_), intent(in) :: irl(:) complex(psb_spk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(out) :: info @@ -1744,7 +1929,7 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl,val,dupl,info) + call x%v%ins(n,irl,val,dupl,maxr,info) end subroutine c_mvect_ins @@ -1978,3 +2163,4 @@ contains !!$ end function c_mvect_asum end module psb_c_multivect_mod + diff --git a/base/modules/serial/psb_d_base_mat_mod.F90 b/base/modules/serial/psb_d_base_mat_mod.F90 index b2f49f2d2..24c2097f7 100644 --- a/base/modules/serial/psb_d_base_mat_mod.F90 +++ b/base/modules/serial/psb_d_base_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/serial/psb_d_base_vect_mod.F90 b/base/modules/serial/psb_d_base_vect_mod.F90 index 8bc8a171b..df7b45f80 100644 --- a/base/modules/serial/psb_d_base_vect_mod.F90 +++ b/base/modules/serial/psb_d_base_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -33,7 +33,7 @@ ! package: psb_d_base_vect_mod ! ! This module contains the definition of the psb_d_base_vect type which -! is a container for dense vectors. +! is a container for dense vectors.\ ! This is encapsulated instead of being just a simple array to allow for ! more complicated situations, such as GPU programming, where the memory ! area we are interested in is not easily accessible from the host/Fortran @@ -47,6 +47,8 @@ module psb_d_base_vect_mod use psb_const_mod use psb_error_mod use psb_realloc_mod + use psb_comm_schemes_mod, only: psb_comm_handle_type, psb_comm_isend_irecv_, psb_comm_unknown_ + use psb_comm_factory_mod, only: psb_comm_set, psb_comm_free use psb_i_base_vect_mod use psb_l_base_vect_mod @@ -62,9 +64,22 @@ module psb_d_base_vect_mod !! type psb_d_base_vect_type !> Values. - real(psb_dpk_), allocatable :: v(:) - real(psb_dpk_), allocatable :: combuf(:) - integer(psb_mpk_), allocatable :: comid(:,:) + real(psb_dpk_), allocatable :: v(:) + real(psb_dpk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) contains ! ! Constructors/allocators @@ -88,6 +103,22 @@ module psb_d_base_vect_mod procedure, pass(x) :: asb_e => d_base_asb_e generic, public :: asb => asb_m, asb_e procedure, pass(x) :: free => d_base_free + procedure, pass(x) :: reinit => d_base_reinit + procedure, pass(x) :: set_ncfs => d_base_set_ncfs + procedure, pass(x) :: get_ncfs => d_base_get_ncfs + procedure, pass(x) :: set_dupl => d_base_set_dupl + procedure, pass(x) :: get_dupl => d_base_get_dupl + procedure, pass(x) :: set_state => d_base_set_state + procedure, pass(x) :: set_null => d_base_set_null + procedure, pass(x) :: set_bld => d_base_set_bld + procedure, pass(x) :: set_upd => d_base_set_upd + procedure, pass(x) :: set_asb => d_base_set_asb + procedure, pass(x) :: get_state => d_base_get_state + procedure, pass(x) :: is_null => d_base_is_null + procedure, pass(x) :: is_bld => d_base_is_bld + procedure, pass(x) :: is_upd => d_base_is_upd + procedure, pass(x) :: is_asb => d_base_is_asb + procedure, pass(x) :: base_cpy => d_base_cpy ! ! Sync: centerpiece of handling of external storage. ! Any derived class having extra storage upon sync @@ -112,9 +143,7 @@ module psb_d_base_vect_mod procedure, nopass :: device_wait => d_base_device_wait procedure, pass(x) :: maybe_free_buffer => d_base_maybe_free_buffer procedure, pass(x) :: free_buffer => d_base_free_buffer - procedure, pass(x) :: new_comid => d_base_new_comid - procedure, pass(x) :: free_comid => d_base_free_comid - + ! ! Basic info procedure, pass(x) :: get_nrows => d_base_get_nrows @@ -129,6 +158,7 @@ module psb_d_base_vect_mod procedure, pass(x) :: set_vect => d_base_set_vect generic, public :: set => set_vect, set_scal procedure, pass(x) :: get_entry=> d_base_get_entry + procedure, pass(x) :: set_entry=> d_base_set_entry ! ! Gather/scatter. These are needed for MPI interfacing. ! May have to be reworked. @@ -143,6 +173,9 @@ module psb_d_base_vect_mod procedure, pass(y) :: sctb_buf => d_base_sctb_buf generic, public :: sct => sctb, sctb_x, sctb_buf + procedure, pass(x) :: check_addr => d_base_check_addr + + ! ! Dot product and AXPBY @@ -218,8 +251,6 @@ module psb_d_base_vect_mod procedure, pass(x) :: minquotient_a2 => d_base_minquotient_a2 generic, public :: minquotient => minquotient_v, minquotient_a2 - - end type psb_d_base_vect_type public :: psb_d_base_vect @@ -270,14 +301,22 @@ contains !! \brief Build method from an array !! \param x(:) input array to be copied !! - subroutine d_base_bld_x(x,this) + subroutine d_base_bld_x(x,this,scratch) use psb_realloc_mod implicit none real(psb_dpk_), intent(in) :: this(:) class(psb_d_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info integer(psb_ipk_) :: i + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(size(this),x%v,info) if (info /= 0) then call psb_errpush(psb_err_alloc_dealloc_,'base_vect_bld') @@ -302,15 +341,23 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine d_base_bld_mn(x,n) + subroutine d_base_bld_mn(x,n,scratch) use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_d_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(n,x%v,info) - call x%asb(n,info) + call x%asb(n,info,scratch=scratch_) end subroutine d_base_bld_mn @@ -319,15 +366,23 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine d_base_bld_en(x,n) + subroutine d_base_bld_en(x,n,scratch) use psb_realloc_mod implicit none integer(psb_epk_), intent(in) :: n class(psb_d_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(n,x%v,info) - call x%asb(n,info) + call x%asb(n,info,scratch=scratch_) end subroutine d_base_bld_en @@ -347,6 +402,10 @@ contains integer(psb_ipk_), intent(out) :: info call psb_realloc(n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if end subroutine d_base_all @@ -368,6 +427,31 @@ contains end subroutine d_base_mold + subroutine d_base_reinit(x, info,clear) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_d_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + logical :: clear_ + + info = 0 + if (present(clear)) then + clear_ = clear + else + clear_ = .true. + end if + + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + if (clear_) x%v(:) = dzero + call x%set_host() + call x%set_upd() + end if + + end subroutine d_base_reinit + ! ! Insert a bunch of values at specified positions. ! @@ -395,55 +479,118 @@ contains !! \param info return code !! ! - subroutine d_base_ins_a(n,irl,val,dupl,x,info) + subroutine d_base_ins_a(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_d_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr integer(psb_ipk_), intent(in) :: irl(:) real(psb_dpk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_) :: i, isz + integer(psb_ipk_) :: i, isz, dupl_, ncfs_, k info = 0 if (psb_errstatus_fatal()) return - if (.not.allocated(x%v)) then - info = psb_err_invalid_vect_state_ - else if (n > min(size(irl),size(val))) then - info = psb_err_invalid_input_ - - else - isz = size(x%v) - select case(dupl) - case(psb_dupl_ovwrt_) + if (try_newins) then + if (x%is_bld()) then + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_ensure_size(isz,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ do i = 1, n !loop over all val's rows ! row actual block row - if ((1 <= irl(i)).and.(irl(i) <= isz)) then + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 ! this row belongs to me ! copy i-th row of block val in x - x%v(irl(i)) = val(i) + x%v(k) = val(i) + x%iv(k) = irl(i) end if enddo + call x%set_ncfs(k) - case(psb_dupl_add_) + else if (x%is_upd()) then - do i = 1, n - !loop over all val's rows - if ((1 <= irl(i)).and.(irl(i) <= isz)) then - ! this row belongs to me - ! copy i-th row of block val in x - x%v(irl(i)) = x%v(irl(i)) + val(i) - end if - enddo + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ - case default - info = 321 - ! !$ call psb_errpush(info,name) - ! !$ goto 9999 - end select + else + isz = size(x%v) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if end if call x%set_host() if (info /= 0) then @@ -453,11 +600,11 @@ contains end subroutine d_base_ins_a - subroutine d_base_ins_v(n,irl,val,dupl,x,info) + subroutine d_base_ins_v(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_d_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr class(psb_i_base_vect_type), intent(inout) :: irl class(psb_d_base_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -470,7 +617,7 @@ contains if (irl%is_dev()) call irl%sync() if (val%is_dev()) call val%sync() if (x%is_dev()) call x%sync() - call x%ins(n,irl%v,val%v,dupl,info) + call x%ins(n,irl%v,val%v,dupl,maxr,info) if (info /= 0) then call psb_errpush(info,'base_vect_ins') @@ -514,19 +661,72 @@ contains !! ! - subroutine d_base_asb_m(n, x, info) + subroutine d_base_asb_m(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_d_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + real(psb_dpk_), allocatable :: vv(:) info = 0 - if (x%get_nrows() < n) & - & call psb_realloc(n,x%v,info) - if (info /= 0) & - & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (x%is_bld()) then + ncfs = x%get_ncfs() + xvsz = psb_size(x%v) + call psb_realloc(n,vv,info) + vv(:) = dzero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,ncfs + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,ncfs + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,ncfs + if (vv(x%iv(i)).ne. dzero) then + call psb_errpush(psb_err_duplicate_coo,'vect-asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() call x%sync() end subroutine d_base_asb_m @@ -544,19 +744,72 @@ contains !! ! - subroutine d_base_asb_e(n, x, info) + subroutine d_base_asb_e(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_epk_), intent(in) :: n class(psb_d_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + real(psb_dpk_), allocatable :: vv(:) info = 0 - if (x%get_nrows() < n) & - & call psb_realloc(n,x%v,info) - if (info /= 0) & - & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb unhandled') + if (x%is_bld()) then + call psb_realloc(n,vv,info) + vv(:) = dzero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,x%get_ncfs() + if (vv(x%iv(i)).ne. dzero) then + call psb_errpush(psb_err_duplicate_coo,'vect_asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() call x%sync() end subroutine d_base_asb_e @@ -573,19 +826,22 @@ contains use psb_realloc_mod implicit none class(psb_d_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: info_comm + integer(psb_ipk_), intent(out) :: info info = 0 if (allocated(x%v)) deallocate(x%v, stat=info) if ((info == 0).and.allocated(x%combuf)) call x%free_buffer(info) - if ((info == 0).and.allocated(x%comid)) call x%free_comid(info) + if ((info == 0).and.allocated(x%iv)) deallocate(x%iv, stat=info) + if ((info == 0).and.allocated(x%comm_handle)) then + call psb_comm_free(x%comm_handle, info_comm) + if (info_comm /= psb_success_) info = info_comm + end if if (info /= 0) call & & psb_errpush(psb_err_alloc_dealloc_,'vect_free') - + call x%set_null() end subroutine d_base_free - - ! !> Function base_free_buffer: !! \memberof psb_d_base_vect_type @@ -626,25 +882,104 @@ contains & call x%free_buffer(info) end subroutine d_base_maybe_free_buffer + + function d_base_get_ncfs(x) result(res) + implicit none + class(psb_d_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%ncfs + end function d_base_get_ncfs - ! - !> Function base_free_comid: - !! \memberof psb_d_base_vect_type - !! \brief Free aux MPI communication id buffer - !! - !! \param info return code - !! - ! - subroutine d_base_free_comid(x,info) - use psb_realloc_mod + function d_base_get_dupl(x) result(res) + implicit none + class(psb_d_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%dupl + end function d_base_get_dupl + + function d_base_get_state(x) result(res) + implicit none + class(psb_d_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%bldstate + end function d_base_get_state + + function d_base_is_null(x) result(res) + implicit none + class(psb_d_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_null_) + end function d_base_is_null + + function d_base_is_bld(x) result(res) + implicit none + class(psb_d_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_bld_) + end function d_base_is_bld + + function d_base_is_upd(x) result(res) + implicit none + class(psb_d_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_upd_) + end function d_base_is_upd + + function d_base_is_asb(x) result(res) + implicit none + class(psb_d_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_asb_) + end function d_base_is_asb + + subroutine d_base_set_ncfs(n,x) implicit none class(psb_d_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: n + x%ncfs = n + end subroutine d_base_set_ncfs - if (allocated(x%comid)) & - & deallocate(x%comid,stat=info) - end subroutine d_base_free_comid + subroutine d_base_set_dupl(n,x) + implicit none + class(psb_d_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%dupl = n + end subroutine d_base_set_dupl + + subroutine d_base_set_state(n,x) + implicit none + class(psb_d_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%bldstate = n + end subroutine d_base_set_state + + subroutine d_base_set_null(x) + implicit none + class(psb_d_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_null_ + end subroutine d_base_set_null + + subroutine d_base_set_bld(x) + implicit none + class(psb_d_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_bld_ + end subroutine d_base_set_bld + + subroutine d_base_set_upd(x) + implicit none + class(psb_d_base_vect_type), intent(inout) :: x + x%bldstate = psb_vect_upd_ + end subroutine d_base_set_upd + + subroutine d_base_set_asb(x) + implicit none + class(psb_d_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_asb_ + end subroutine d_base_set_asb ! ! The base version of SYNC & friends does nothing, it's just @@ -740,6 +1075,24 @@ contains res = .true. end function d_base_is_sync + !> Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine d_base_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_d_base_vect_type), intent(in) :: x + class(psb_d_base_vect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine d_base_cpy ! ! Size info. @@ -898,6 +1251,13 @@ contains end subroutine d_base_set_vect + subroutine d_base_check_addr(x) + class(psb_d_base_vect_type), intent(inout) :: x + + write(0,*) 'Check addr: base version, do nothing' + + end subroutine d_base_check_addr + ! ! Get entry. @@ -910,15 +1270,33 @@ contains ! function d_base_get_entry(x, index) result(res) implicit none - class(psb_d_base_vect_type), intent(in) :: x + class(psb_d_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in) :: index real(psb_dpk_) :: res res = 0 - if (allocated(x%v)) res = x%v(index) + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + res = x%v(index) + end if end function d_base_get_entry + subroutine d_base_set_entry(x, index, val) + implicit none + class(psb_d_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: index + real(psb_dpk_) :: val + + + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + x%v(index) =val + call x%set_host() + end if + + end subroutine d_base_set_entry + ! ! Overwrite with absolute value ! @@ -1817,6 +2195,10 @@ contains res = min(res,abs(x%v(i))) end do #else + ! + ! From M&R&C: if the array is of size zero, MINVAL + ! returns the largest positive value + ! res = minval(x%v(1:n)) #endif end function d_base_min @@ -1997,17 +2379,6 @@ contains call psb_realloc(n,x%combuf,info) end subroutine d_base_new_buffer - subroutine d_base_new_comid(n,x,info) - use psb_realloc_mod - implicit none - class(psb_d_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n - integer(psb_ipk_), intent(out) :: info - - call psb_realloc(n,2_psb_ipk_,x%comid,info) - end subroutine d_base_new_comid - - ! ! shortcut alpha=1 beta=0 ! @@ -2263,9 +2634,22 @@ module psb_d_base_multivect_mod type psb_d_base_multivect_type !> Values. - real(psb_dpk_), allocatable :: v(:,:) - real(psb_dpk_), allocatable :: combuf(:) - integer(psb_mpk_), allocatable :: comid(:,:) + real(psb_dpk_), allocatable :: v(:,:) + real(psb_dpk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) contains ! ! Constructors/allocators @@ -2284,6 +2668,22 @@ module psb_d_base_multivect_mod procedure, pass(x) :: zero => d_base_mlv_zero procedure, pass(x) :: asb => d_base_mlv_asb procedure, pass(x) :: free => d_base_mlv_free + procedure, pass(x) :: reinit => d_base_mlv_reinit + procedure, pass(x) :: set_ncfs => d_base_mlv_set_ncfs + procedure, pass(x) :: get_ncfs => d_base_mlv_get_ncfs + procedure, pass(x) :: set_dupl => d_base_mlv_set_dupl + procedure, pass(x) :: get_dupl => d_base_mlv_get_dupl + procedure, pass(x) :: set_state => d_base_mlv_set_state + procedure, pass(x) :: set_null => d_base_mlv_set_null + procedure, pass(x) :: set_bld => d_base_mlv_set_bld + procedure, pass(x) :: set_upd => d_base_mlv_set_upd + procedure, pass(x) :: set_asb => d_base_mlv_set_asb + procedure, pass(x) :: get_state => d_base_mlv_get_state + procedure, pass(x) :: is_null => d_base_mlv_is_null + procedure, pass(x) :: is_bld => d_base_mlv_is_bld + procedure, pass(x) :: is_upd => d_base_mlv_is_upd + procedure, pass(x) :: is_asb => d_base_mlv_is_asb + procedure, pass(x) :: base_cpy => d_base_mlv_cpy ! ! Sync: centerpiece of handling of external storage. ! Any derived class having extra storage upon sync @@ -2357,8 +2757,6 @@ module psb_d_base_multivect_mod procedure, nopass :: device_wait => d_base_mlv_device_wait procedure, pass(x) :: maybe_free_buffer => d_base_mlv_maybe_free_buffer procedure, pass(x) :: free_buffer => d_base_mlv_free_buffer - procedure, pass(x) :: new_comid => d_base_mlv_new_comid - procedure, pass(x) :: free_comid => d_base_mlv_free_comid ! ! Gather/scatter. These are needed for MPI interfacing. @@ -2397,7 +2795,8 @@ contains integer(psb_ipk_) :: info this%v = x - call this%asb(size(x,dim=1,kind=psb_ipk_),size(x,dim=2,kind=psb_ipk_),info) + call this%asb(size(x,dim=1,kind=psb_ipk_),& + & size(x,dim=2,kind=psb_ipk_),info) end function constructor @@ -2447,14 +2846,15 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine d_base_mlv_bld_n(x,m,n) + subroutine d_base_mlv_bld_n(x,m,n,scratch) use psb_realloc_mod integer(psb_ipk_), intent(in) :: m,n class(psb_d_base_multivect_type), intent(inout) :: x integer(psb_ipk_) :: info + logical, intent(in), optional :: scratch call psb_realloc(m,n,x%v,info) - call x%asb(m,n,info) + call x%asb(m,n,info,scratch=scratch) end subroutine d_base_mlv_bld_n @@ -2474,6 +2874,10 @@ contains integer(psb_ipk_), intent(out) :: info call psb_realloc(m,n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if end subroutine d_base_mlv_all @@ -2495,6 +2899,23 @@ contains end subroutine d_base_mlv_mold + subroutine d_base_mlv_reinit(x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_d_base_multivect_type), intent(out) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(x%v)) then + call x%sync() + x%v(:,:) = dzero + call x%set_host() + call x%set_upd() + end if + + end subroutine d_base_mlv_reinit + ! ! Insert a bunch of values at specified positions. ! @@ -2522,57 +2943,123 @@ contains !! \param info return code !! ! - subroutine d_base_mlv_ins(n,irl,val,dupl,x,info) + subroutine d_base_mlv_ins(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_d_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl,maxr integer(psb_ipk_), intent(in) :: irl(:) real(psb_dpk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_) :: i, isz + integer(psb_ipk_) :: i, isz, nc, dupl_, ncfs_, k info = 0 if (psb_errstatus_fatal()) return - if (.not.allocated(x%v)) then - info = psb_err_invalid_vect_state_ - else if (n > min(size(irl),size(val))) then - info = psb_err_invalid_input_ - - else - isz = size(x%v,1) - select case(dupl) - case(psb_dupl_ovwrt_) + if (try_newins) then + if (x%is_bld()) then + nc = size(x%v,2) + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_realloc(isz,nc,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ do i = 1, n !loop over all val's rows - ! row actual block row - if ((1 <= irl(i)).and.(irl(i) <= isz)) then + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 ! this row belongs to me ! copy i-th row of block val in x - x%v(irl(i),:) = val(i,:) + x%v(k,:) = val(i,:) + x%iv(k) = irl(i) end if enddo + call x%set_ncfs(k) - case(psb_dupl_add_) + else if (x%is_upd()) then - do i = 1, n - !loop over all val's rows - if ((1 <= irl(i)).and.(irl(i) <= isz)) then - ! this row belongs to me - ! copy i-th row of block val in x - x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) - end if - enddo + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ - case default - info = 321 - ! !$ call psb_errpush(info,name) - ! !$ goto 9999 - end select + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if end if + call x%set_host() if (info /= 0) then call psb_errpush(info,'base_mlv_vect_ins') return @@ -2592,6 +3079,7 @@ contains class(psb_d_base_multivect_type), intent(inout) :: x if (allocated(x%v)) x%v=dzero + call x%set_host() end subroutine d_base_mlv_zero @@ -2610,19 +3098,78 @@ contains !! ! - subroutine d_base_mlv_asb(m,n, x, info) + subroutine d_base_mlv_asb(m,n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: m,n class(psb_d_base_multivect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch - if ((x%get_nrows() < m).or.(x%get_ncols() Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine d_base_mlv_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_d_base_multivect_type), intent(in) :: x + class(psb_d_base_multivect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine d_base_mlv_cpy + ! ! Size info. @@ -2786,7 +3449,7 @@ contains integer(psb_epk_) :: res ! Force 8-byte integers. - res = (1_psb_epk_ * psb_sizeof_ip) * x%get_nrows() * x%get_ncols() + res = (1_psb_epk_ * psb_sizeof_dp) * x%get_nrows() * x%get_ncols() end function d_base_mlv_sizeof @@ -3373,16 +4036,6 @@ contains call psb_realloc(n*nc,x%combuf,info) end subroutine d_base_mlv_new_buffer - subroutine d_base_mlv_new_comid(n,x,info) - use psb_realloc_mod - implicit none - class(psb_d_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n - integer(psb_ipk_), intent(out) :: info - - call psb_realloc(n,2_psb_ipk_,x%comid,info) - end subroutine d_base_mlv_new_comid - subroutine d_base_mlv_maybe_free_buffer(x,info) use psb_realloc_mod @@ -3407,17 +4060,6 @@ contains & deallocate(x%combuf,stat=info) end subroutine d_base_mlv_free_buffer - subroutine d_base_mlv_free_comid(x,info) - use psb_realloc_mod - implicit none - class(psb_d_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - - if (allocated(x%comid)) & - & deallocate(x%comid,stat=info) - end subroutine d_base_mlv_free_comid - - ! ! Gather: Y = beta * Y + alpha * X(IDX(:)) ! diff --git a/base/modules/serial/psb_d_csc_mat_mod.f90 b/base/modules/serial/psb_d_csc_mat_mod.f90 index 08d312565..05af6923b 100644 --- a/base/modules/serial/psb_d_csc_mat_mod.f90 +++ b/base/modules/serial/psb_d_csc_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -912,6 +912,23 @@ module psb_d_csc_mat_mod end subroutine psb_ld_csc_scals end interface + interface + subroutine psb_dcscspspmm(a,b,c,info) + import + implicit none + class(psb_d_csc_sparse_mat), intent(in) :: a,b + type(psb_d_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_dcscspspmm + subroutine psb_ldcscspspmm(a,b,c,info) + import + implicit none + class(psb_ld_csc_sparse_mat), intent(in) :: a,b + type(psb_ld_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ldcscspspmm + end interface + contains ! == =================================== diff --git a/base/modules/serial/psb_d_csr_mat_mod.f90 b/base/modules/serial/psb_d_csr_mat_mod.f90 index 0669725f1..caa20db24 100644 --- a/base/modules/serial/psb_d_csr_mat_mod.f90 +++ b/base/modules/serial/psb_d_csr_mat_mod.f90 @@ -15,7 +15,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -1162,6 +1162,23 @@ module psb_d_csr_mat_mod end subroutine psb_ld_csr_aclsum end interface + ! Interfaces for SPSPMM + interface + subroutine psb_dcsrspspmm(a,b,c,info) + import + implicit none + class(psb_d_csr_sparse_mat), intent(in) :: a,b + type(psb_d_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_dcsrspspmm + subroutine psb_ldcsrspspmm(a,b,c,info) + import + implicit none + class(psb_ld_csr_sparse_mat), intent(in) :: a,b + type(psb_ld_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_ldcsrspspmm + end interface contains diff --git a/base/modules/serial/psb_d_mat_mod.F90 b/base/modules/serial/psb_d_mat_mod.F90 index a4318ba4f..bd4ccc458 100644 --- a/base/modules/serial/psb_d_mat_mod.F90 +++ b/base/modules/serial/psb_d_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -78,6 +78,8 @@ ! module psb_d_mat_mod + use psb_d_vect_mod + use psb_i_vect_mod use psb_d_base_mat_mod use psb_d_csr_mat_mod, only : psb_d_csr_sparse_mat, psb_ld_csr_sparse_mat,& & psb_d_ecsr_sparse_mat @@ -661,9 +663,8 @@ module psb_d_mat_mod interface subroutine psb_d_csput_v(nz,ia,ja,val,a,imin,imax,jmin,jmax,info) - use psb_d_vect_mod, only : psb_d_vect_type - use psb_i_vect_mod, only : psb_i_vect_type - import :: psb_ipk_, psb_lpk_, psb_dspmat_type + import :: psb_ipk_, psb_lpk_, psb_dspmat_type, & + & psb_d_vect_type, psb_i_vect_type class(psb_dspmat_type), intent(inout) :: a type(psb_d_vect_type), intent(inout) :: val type(psb_i_vect_type), intent(inout) :: ia, ja diff --git a/base/modules/serial/psb_d_serial_mod.f90 b/base/modules/serial/psb_d_serial_mod.f90 index 523282f5c..fb0bb1b53 100644 --- a/base/modules/serial/psb_d_serial_mod.f90 +++ b/base/modules/serial/psb_d_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -60,24 +60,8 @@ module psb_d_serial_mod type(psb_dspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_dspspmm - subroutine psb_dcsrspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_d_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_d_csr_sparse_mat), intent(in) :: a,b - type(psb_d_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_dcsrspspmm - subroutine psb_dcscspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_d_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_d_csc_sparse_mat), intent(in) :: a,b - type(psb_d_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_dcscspspmm - end interface - + end interface psb_spspmm + interface psb_symbmm subroutine psb_dsymbmm(a,b,c,info) use psb_d_mat_mod, only : psb_dspmat_type @@ -114,6 +98,16 @@ module psb_d_serial_mod end subroutine psb_dbase_numbmm end interface psb_numbmm + interface psb_aplusat + subroutine psb_daplusat(ain,aout,info) + use psb_d_mat_mod, only : psb_dspmat_type + import :: psb_ipk_ + implicit none + type(psb_dspmat_type) :: ain, aout + integer(psb_ipk_) :: info + end subroutine psb_daplusat + end interface + interface psb_rwextd subroutine psb_drwextd(nr,a,info,b,rowscale) use psb_d_mat_mod, only : psb_dspmat_type @@ -232,22 +226,6 @@ module psb_d_serial_mod type(psb_ldspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_ldspspmm - subroutine psb_ldcsrspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_ld_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ld_csr_sparse_mat), intent(in) :: a,b - type(psb_ld_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ldcsrspspmm - subroutine psb_ldcscspspmm(a,b,c,info) - use psb_d_mat_mod, only : psb_ld_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ld_csc_sparse_mat), intent(in) :: a,b - type(psb_ld_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_ldcscspspmm end interface psb_spspmm interface psb_symbmm diff --git a/base/modules/serial/psb_d_vect_mod.F90 b/base/modules/serial/psb_d_vect_mod.F90 index 302e6fc1c..cfa3fe6fb 100644 --- a/base/modules/serial/psb_d_vect_mod.F90 +++ b/base/modules/serial/psb_d_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -56,14 +56,28 @@ module psb_d_vect_mod procedure, pass(x) :: get_fmt => d_vect_get_fmt procedure, pass(x) :: is_remote_build => d_vect_is_remote_build procedure, pass(x) :: set_remote_build => d_vect_set_remote_build - procedure, pass(x) :: get_dupl => d_vect_get_dupl - procedure, pass(x) :: set_dupl => d_vect_set_dupl procedure, pass(x) :: get_nrmv => d_vect_get_nrmv procedure, pass(x) :: set_nrmv => d_vect_set_nrmv procedure, pass(x) :: all => d_vect_all procedure, pass(x) :: reall => d_vect_reall procedure, pass(x) :: zero => d_vect_zero procedure, pass(x) :: asb => d_vect_asb + procedure, pass(x) :: set_dupl => d_vect_set_dupl + procedure, pass(x) :: get_dupl => d_vect_get_dupl + procedure, pass(x) :: set_ncfs => d_vect_set_ncfs + procedure, pass(x) :: get_ncfs => d_vect_get_ncfs + procedure, pass(x) :: set_state => d_vect_set_state + procedure, pass(x) :: set_null => d_vect_set_null + procedure, pass(x) :: set_bld => d_vect_set_bld + procedure, pass(x) :: set_upd => d_vect_set_upd + procedure, pass(x) :: set_asb => d_vect_set_asb + procedure, pass(x) :: get_state => d_vect_get_state + procedure, pass(x) :: is_null => d_vect_is_null + procedure, pass(x) :: is_bld => d_vect_is_bld + procedure, pass(x) :: is_upd => d_vect_is_upd + procedure, pass(x) :: is_asb => d_vect_is_asb + procedure, pass(x) :: reinit => d_vect_reinit + procedure, pass(x) :: gthab => d_vect_gthab procedure, pass(x) :: gthzv => d_vect_gthzv generic, public :: gth => gthab, gthzv @@ -91,8 +105,10 @@ module psb_d_vect_mod procedure, pass(x) :: set_host => d_vect_set_host procedure, pass(x) :: set_dev => d_vect_set_dev procedure, pass(x) :: set_sync => d_vect_set_sync + procedure, pass(x) :: check_addr => d_vect_check_addr procedure, pass(x) :: get_entry => d_vect_get_entry + procedure, pass(x) :: set_entry => d_vect_set_entry procedure, pass(x) :: dot_v => d_vect_dot_v procedure, pass(x) :: dot_a => d_vect_dot_a @@ -194,7 +210,11 @@ contains implicit none class(psb_d_vect_type), intent(in) :: x integer(psb_ipk_) :: res - res = x%dupl + if (allocated(x%v)) then + res = x%v%get_dupl() + else + res = psb_dupl_null_ + end if end function d_vect_get_dupl subroutine d_vect_set_dupl(x,val) @@ -202,13 +222,117 @@ contains class(psb_d_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in), optional :: val - if (present(val)) then - x%dupl = val - else - x%dupl = psb_dupl_def_ + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_dupl(val) + else + call x%v%set_dupl(psb_dupl_def_) + end if end if end subroutine d_vect_set_dupl + function d_vect_get_ncfs(x) result(res) + implicit none + class(psb_d_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_ncfs() + else + res = 0 + end if + end function d_vect_get_ncfs + + subroutine d_vect_set_ncfs(x,val) + implicit none + class(psb_d_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in), optional :: val + + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_ncfs(val) + else + call x%v%set_ncfs(0) + end if + end if + end subroutine d_vect_set_ncfs + + function d_vect_get_state(x) result(res) + implicit none + class(psb_d_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_state() + else + res = psb_vect_null_ + end if + end function d_vect_get_state + + function d_vect_is_null(x) result(res) + implicit none + class(psb_d_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_null_) + end function d_vect_is_null + + function d_vect_is_bld(x) result(res) + implicit none + class(psb_d_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_bld_) + end function d_vect_is_bld + + function d_vect_is_upd(x) result(res) + implicit none + class(psb_d_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_upd_) + end function d_vect_is_upd + + function d_vect_is_asb(x) result(res) + implicit none + class(psb_d_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_asb_) + end function d_vect_is_asb + + subroutine d_vect_set_state(n,x) + implicit none + class(psb_d_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + if (allocated(x%v)) then + call x%v%set_state(n) + end if + end subroutine d_vect_set_state + + + subroutine d_vect_set_null(x) + implicit none + class(psb_d_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_null_) + end subroutine d_vect_set_null + + subroutine d_vect_set_bld(x) + implicit none + class(psb_d_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_bld_) + end subroutine d_vect_set_bld + + subroutine d_vect_set_upd(x) + implicit none + class(psb_d_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_upd_) + end subroutine d_vect_set_upd + + subroutine d_vect_set_asb(x) + implicit none + class(psb_d_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_asb_) + end subroutine d_vect_set_asb + function d_vect_get_nrmv(x) result(res) implicit none class(psb_d_vect_type), intent(in) :: x @@ -223,7 +347,6 @@ contains x%nrmv = val end subroutine d_vect_set_nrmv - function d_vect_is_remote_build(x) result(res) implicit none @@ -294,16 +417,31 @@ contains info = psb_success_ call y%free(info) if ((info==0).and.allocated(x%v)) then + ! + ! Using sourced allocation here creates + ! problems with handling of memory allocated + ! elsewhere (e.g. accelerators), hence delegation + ! to %bld method + ! call y%bld(x%get_vect(),mold=x%v) end if end subroutine d_vect_clone - subroutine d_vect_bld_x(x,invect,mold) + subroutine d_vect_bld_x(x,invect,mold,scratch) real(psb_dpk_), intent(in) :: invect(:) class(psb_d_vect_type), intent(inout) :: x class(psb_d_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + info = psb_success_ if (allocated(x%v)) & & call x%free(info) @@ -314,17 +452,25 @@ contains allocate(x%v,stat=info, mold=psb_d_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(invect) + if (info == psb_success_) call x%v%bld(invect,scratch=scratch_) end subroutine d_vect_bld_x - subroutine d_vect_bld_mn(x,n,mold) + subroutine d_vect_bld_mn(x,n,mold,scratch) integer(psb_mpk_), intent(in) :: n class(psb_d_vect_type), intent(inout) :: x class(psb_d_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info class(psb_d_base_vect_type), pointer :: mld + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if info = psb_success_ if (allocated(x%v)) & @@ -335,17 +481,25 @@ contains else allocate(x%v,stat=info, mold=psb_d_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(n) + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) end subroutine d_vect_bld_mn - subroutine d_vect_bld_en(x,n,mold) + subroutine d_vect_bld_en(x,n,mold,scratch) integer(psb_epk_), intent(in) :: n class(psb_d_vect_type), intent(inout) :: x class(psb_d_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (allocated(x%v)) & & call x%free(info) @@ -355,7 +509,7 @@ contains else allocate(x%v,stat=info, mold=psb_d_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(n) + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) end subroutine d_vect_bld_en @@ -390,6 +544,13 @@ contains end subroutine d_vect_set_vect + subroutine d_vect_check_addr(x) + class(psb_d_vect_type), intent(inout) :: x + + integer(psb_ipk_) :: info + if (allocated(x%v)) call x%v%check_addr() + + end subroutine d_vect_check_addr function constructor(x) result(this) real(psb_dpk_) :: x(:) @@ -457,8 +618,20 @@ contains else info = psb_err_alloc_dealloc_ end if + call x%set_bld() end subroutine d_vect_all + subroutine d_vect_reinit(x, info, clear) + implicit none + class(psb_d_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + + if (allocated(x%v)) call x%v%reinit(info,clear) + call x%set_upd() + + end subroutine d_vect_reinit + subroutine d_vect_reall(n, x, info) implicit none @@ -483,16 +656,18 @@ contains end subroutine d_vect_zero - subroutine d_vect_asb(n, x, info) + subroutine d_vect_asb(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: n class(psb_d_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch if (allocated(x%v)) then - call x%v%asb(n,info) + call x%v%asb(n,info,scratch=scratch) + call x%set_asb() end if end subroutine d_vect_asb @@ -547,11 +722,11 @@ contains end subroutine d_vect_free - subroutine d_vect_ins_a(n,irl,val,x,info) + subroutine d_vect_ins_a(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_d_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n, maxr integer(psb_ipk_), intent(in) :: irl(:) real(psb_dpk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info @@ -564,15 +739,15 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl,val,dupl,info) + call x%v%ins(n,irl,val,dupl,maxr,info) end subroutine d_vect_ins_a - subroutine d_vect_ins_v(n,irl,val,x,info) + subroutine d_vect_ins_v(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_d_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n, maxr class(psb_i_vect_type), intent(inout) :: irl class(psb_d_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -585,7 +760,7 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl%v,val%v,dupl,info) + call x%v%ins(n,irl%v,val%v,dupl,maxr,info) end subroutine d_vect_ins_v @@ -607,6 +782,7 @@ contains if (allocated(x%v%v)) then call x%v%sync() if (info == psb_success_) call tmp%bld(x%v%v) + call x%v%base_cpy(tmp) call x%v%free(info) endif end if @@ -687,13 +863,21 @@ contains function d_vect_get_entry(x,index) result(res) implicit none - class(psb_d_vect_type), intent(in) :: x + class(psb_d_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in) :: index real(psb_dpk_) :: res - res = 0 + res = dzero if (allocated(x%v)) res = x%v%get_entry(index) end function d_vect_get_entry + subroutine d_vect_set_entry(x,index,val) + implicit none + class(psb_d_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: index + real(psb_dpk_) :: val + if (allocated(x%v)) call x%v%set_entry(index,val) + end subroutine d_vect_set_entry + function d_vect_dot_v(n,x,y) result(res) implicit none class(psb_d_vect_type), intent(inout) :: x, y @@ -1255,7 +1439,7 @@ contains if (allocated(x%v)) then res = x%v%minreal(n) else - res = dzero + res = HUGE(done) end if end function d_vect_min @@ -1564,19 +1748,20 @@ contains end subroutine d_mvect_bld_x - subroutine d_mvect_bld_n(x,m,n,mold) + subroutine d_mvect_bld_n(x,m,n,mold,scratch) integer(psb_ipk_), intent(in) :: m,n class(psb_d_multivect_type), intent(out) :: x class(psb_d_base_multivect_type), intent(in), optional :: mold integer(psb_ipk_) :: info - + logical, intent(in), optional :: scratch + info = psb_success_ if (present(mold)) then allocate(x%v,stat=info,mold=mold) else allocate(x%v,stat=info, mold=psb_d_get_base_multivect_default()) endif - if (info == psb_success_) call x%v%bld(m,n) + if (info == psb_success_) call x%v%bld(m,n,scratch=scratch) end subroutine d_mvect_bld_n @@ -1806,11 +1991,11 @@ contains end subroutine d_mvect_free - subroutine d_mvect_ins(n,irl,val,x,info) + subroutine d_mvect_ins(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_d_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n,maxr integer(psb_ipk_), intent(in) :: irl(:) real(psb_dpk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(out) :: info @@ -1823,7 +2008,7 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl,val,dupl,info) + call x%v%ins(n,irl,val,dupl,maxr,info) end subroutine d_mvect_ins @@ -2057,3 +2242,4 @@ contains !!$ end function d_mvect_asum end module psb_d_multivect_mod + diff --git a/base/modules/serial/psb_i2_base_vect_mod.F90 b/base/modules/serial/psb_i2_base_vect_mod.F90 new file mode 100644 index 000000000..2393272ff --- /dev/null +++ b/base/modules/serial/psb_i2_base_vect_mod.F90 @@ -0,0 +1,2583 @@ +! +! Parallel Sparse BLAS version 3.5 +! (C) Copyright 2006-2018 +! Salvatore Filippone +! Alfredo Buttari +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! package: psb_i2_base_vect_mod +! +! This module contains the definition of the psb_i2_base_vect type which +! is a container for dense vectors. +! This is encapsulated instead of being just a simple array to allow for +! more complicated situations, such as GPU programming, where the memory +! area we are interested in is not easily accessible from the host/Fortran +! side. It is also meant to be encapsulated in an outer type, to allow +! runtime switching as per the STATE design pattern, similar to the +! sparse matrix types. +! +! +module psb_i2_base_vect_mod + + use psb_const_mod + use psb_error_mod + use psb_realloc_mod + use psb_comm_schemes_mod, only: psb_comm_handle_type, psb_comm_isend_irecv_, psb_comm_unknown_ + use psb_comm_factory_mod, only: psb_comm_set, psb_comm_free + use psb_i_base_vect_mod + + !> \namespace psb_base_mod \class psb_i2_base_vect_type + !! The psb_i2_base_vect_type + !! defines a middle level integer(psb_i2pk_) encapsulated dense vector. + !! The encapsulation is needed, in place of a simple array, to allow + !! for complicated situations, such as GPU programming, where the memory + !! area we are interested in is not easily accessible from the host/Fortran + !! side. It is also meant to be encapsulated in an outer type, to allow + !! runtime switching as per the STATE design pattern, similar to the + !! sparse matrix types. + !! + type psb_i2_base_vect_type + !> Values. + integer(psb_i2pk_), allocatable :: v(:) + integer(psb_i2pk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + integer(psb_mpk_), allocatable :: comid(:,:) + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) + contains + ! + ! Constructors/allocators + ! + procedure, pass(x) :: bld_x => i2_base_bld_x + procedure, pass(x) :: bld_mn => i2_base_bld_mn + procedure, pass(x) :: bld_en => i2_base_bld_en + generic, public :: bld => bld_x, bld_mn, bld_en + procedure, pass(x) :: all => i2_base_all + procedure, pass(x) :: mold => i2_base_mold + ! + ! Insert/set. Assembly and free. + ! Assembly does almost nothing here, but is important + ! in derived classes. + ! + procedure, pass(x) :: ins_a => i2_base_ins_a + procedure, pass(x) :: ins_v => i2_base_ins_v + generic, public :: ins => ins_a, ins_v + procedure, pass(x) :: zero => i2_base_zero + procedure, pass(x) :: asb_m => i2_base_asb_m + procedure, pass(x) :: asb_e => i2_base_asb_e + generic, public :: asb => asb_m, asb_e + procedure, pass(x) :: free => i2_base_free + procedure, pass(x) :: reinit => i2_base_reinit + procedure, pass(x) :: set_ncfs => i2_base_set_ncfs + procedure, pass(x) :: get_ncfs => i2_base_get_ncfs + procedure, pass(x) :: set_dupl => i2_base_set_dupl + procedure, pass(x) :: get_dupl => i2_base_get_dupl + procedure, pass(x) :: set_state => i2_base_set_state + procedure, pass(x) :: set_null => i2_base_set_null + procedure, pass(x) :: set_bld => i2_base_set_bld + procedure, pass(x) :: set_upd => i2_base_set_upd + procedure, pass(x) :: set_asb => i2_base_set_asb + procedure, pass(x) :: get_state => i2_base_get_state + procedure, pass(x) :: is_null => i2_base_is_null + procedure, pass(x) :: is_bld => i2_base_is_bld + procedure, pass(x) :: is_upd => i2_base_is_upd + procedure, pass(x) :: is_asb => i2_base_is_asb + procedure, pass(x) :: base_cpy => i2_base_cpy + ! + ! Sync: centerpiece of handling of external storage. + ! Any derived class having extra storage upon sync + ! will guarantee that both fortran/host side and + ! external side contain the same data. The base + ! version is only a placeholder. + ! + procedure, pass(x) :: sync => i2_base_sync + procedure, pass(x) :: is_host => i2_base_is_host + procedure, pass(x) :: is_dev => i2_base_is_dev + procedure, pass(x) :: is_sync => i2_base_is_sync + procedure, pass(x) :: set_host => i2_base_set_host + procedure, pass(x) :: set_dev => i2_base_set_dev + procedure, pass(x) :: set_sync => i2_base_set_sync + + ! + ! These are for handling gather/scatter in new + ! comm internals implementation. + ! + procedure, nopass :: use_buffer => i2_base_use_buffer + procedure, pass(x) :: new_buffer => i2_base_new_buffer + procedure, nopass :: device_wait => i2_base_device_wait + procedure, pass(x) :: maybe_free_buffer => i2_base_maybe_free_buffer + procedure, pass(x) :: free_buffer => i2_base_free_buffer + procedure, pass(x) :: new_comid => i2_base_new_comid + procedure, pass(x) :: free_comid => i2_base_free_comid + + ! + ! Basic info + procedure, pass(x) :: get_nrows => i2_base_get_nrows + procedure, pass(x) :: sizeof => i2_base_sizeof + procedure, nopass :: get_fmt => i2_base_get_fmt + ! + ! Set/get data from/to an external array; also + ! overload assignment. + ! + procedure, pass(x) :: get_vect => i2_base_get_vect + procedure, pass(x) :: set_scal => i2_base_set_scal + procedure, pass(x) :: set_vect => i2_base_set_vect + generic, public :: set => set_vect, set_scal + ! + ! Gather/scatter. These are needed for MPI interfacing. + ! May have to be reworked. + ! + procedure, pass(x) :: gthab => i2_base_gthab + procedure, pass(x) :: gthzv => i2_base_gthzv + procedure, pass(x) :: gthzv_x => i2_base_gthzv_x + procedure, pass(x) :: gthzbuf => i2_base_gthzbuf + generic, public :: gth => gthab, gthzv, gthzv_x, gthzbuf + procedure, pass(y) :: sctb => i2_base_sctb + procedure, pass(y) :: sctb_x => i2_base_sctb_x + procedure, pass(y) :: sctb_buf => i2_base_sctb_buf + generic, public :: sct => sctb, sctb_x, sctb_buf + + procedure, pass(x) :: check_addr => i2_base_check_addr + + + + + + + end type psb_i2_base_vect_type + + public :: psb_i2_base_vect + private :: constructor, size_const + interface psb_i2_base_vect + module procedure constructor, size_const + end interface psb_i2_base_vect + +contains + + ! + ! Constructors. + ! + + !> Function constructor: + !! \brief Constructor from an array + !! \param x(:) input array to be copied + !! + function constructor(x) result(this) + integer(psb_i2pk_) :: x(:) + type(psb_i2_base_vect_type) :: this + integer(psb_ipk_) :: info + + this%v = x + call this%asb(size(x,kind=psb_ipk_),info) + end function constructor + + + !> Function constructor: + !! \brief Constructor from size + !! \param n Size of vector to be built. + !! + function size_const(n) result(this) + integer(psb_ipk_), intent(in) :: n + type(psb_i2_base_vect_type) :: this + integer(psb_ipk_) :: info + + call this%asb(n,info) + + end function size_const + + ! + ! Build from a sample + ! + + !> Function bld_x: + !! \memberof psb_i2_base_vect_type + !! \brief Build method from an array + !! \param x(:) input array to be copied + !! + subroutine i2_base_bld_x(x,this,scratch) + use psb_realloc_mod + implicit none + integer(psb_i2pk_), intent(in) :: this(:) + class(psb_i2_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: info + integer(psb_ipk_) :: i + + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + call psb_realloc(size(this),x%v,info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,'base_vect_bld') + return + end if +#if defined (PSB_OPENMP) + !$omp parallel do private(i) + do i = 1, size(this) + x%v(i) = this(i) + end do +#else + x%v(:) = this(:) +#endif + end subroutine i2_base_bld_x + + ! + ! Create with size, but no initialization + ! + + !> Function bld_mn: + !! \memberof psb_i2_base_vect_type + !! \brief Build method with size (uninitialized data) + !! \param n size to be allocated. + !! + subroutine i2_base_bld_mn(x,n,scratch) + use psb_realloc_mod + implicit none + integer(psb_mpk_), intent(in) :: n + class(psb_i2_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: info + + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + call psb_realloc(n,x%v,info) + call x%asb(n,info,scratch=scratch_) + + end subroutine i2_base_bld_mn + + !> Function bld_en: + !! \memberof psb_i2_base_vect_type + !! \brief Build method with size (uninitialized data) + !! \param n size to be allocated. + !! + subroutine i2_base_bld_en(x,n,scratch) + use psb_realloc_mod + implicit none + integer(psb_epk_), intent(in) :: n + class(psb_i2_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: info + + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + call psb_realloc(n,x%v,info) + call x%asb(n,info,scratch=scratch_) + + end subroutine i2_base_bld_en + + !> Function base_all: + !! \memberof psb_i2_base_vect_type + !! \brief Build method with size (uninitialized data) and + !! allocation return code. + !! \param n size to be allocated. + !! \param info return code + !! + subroutine i2_base_all(n, x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + integer(psb_ipk_), intent(in) :: n + class(psb_i2_base_vect_type), intent(out) :: x + integer(psb_ipk_), intent(out) :: info + + call psb_realloc(n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if + + end subroutine i2_base_all + + !> Function base_mold: + !! \memberof psb_i2_base_vect_type + !! \brief Mold method: return a variable with the same dynamic type + !! \param y returned variable + !! \param info return code + !! + subroutine i2_base_mold(x, y, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + class(psb_i2_base_vect_type), intent(out), allocatable :: y + integer(psb_ipk_), intent(out) :: info + + allocate(psb_i2_base_vect_type :: y, stat=info) + + end subroutine i2_base_mold + + subroutine i2_base_reinit(x, info,clear) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + logical :: clear_ + + info = 0 + if (present(clear)) then + clear_ = clear + else + clear_ = .true. + end if + + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + if (clear_) x%v(:) = i2zero + call x%set_host() + call x%set_upd() + end if + + end subroutine i2_base_reinit + + ! + ! Insert a bunch of values at specified positions. + ! + !> Function base_ins: + !! \memberof psb_i2_base_vect_type + !! \brief Insert coefficients. + !! + !! + !! Given a list of N pairs + !! (IRL(i),VAL(i)) + !! record a new coefficient in X such that + !! X(IRL(1:N)) = VAL(1:N). + !! + !! - the update operation will perform either + !! X(IRL(1:n)) = VAL(1:N) + !! or + !! X(IRL(1:n)) = X(IRL(1:n))+VAL(1:N) + !! according to the value of DUPLICATE. + !! + !! + !! \param n number of pairs in input + !! \param irl(:) the input row indices + !! \param val(:) the input coefficients + !! \param dupl how to treat duplicate entries + !! \param info return code + !! + ! + subroutine i2_base_ins_a(n,irl,val,dupl,x,maxr,info) + use psi_serial_mod + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n, dupl, maxr + integer(psb_ipk_), intent(in) :: irl(:) + integer(psb_i2pk_), intent(in) :: val(:) + integer(psb_ipk_), intent(out) :: info + + integer(psb_ipk_) :: i, isz, dupl_, ncfs_, k + + info = 0 + if (psb_errstatus_fatal()) return + + if (try_newins) then + if (x%is_bld()) then + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_ensure_size(isz,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 + ! this row belongs to me + ! copy i-th row of block val in x + x%v(k) = val(i) + x%iv(k) = irl(i) + end if + enddo + call x%set_ncfs(k) + + else if (x%is_upd()) then + + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + + else + isz = size(x%v) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + end if + call x%set_host() + if (info /= 0) then + call psb_errpush(info,'base_vect_ins') + return + end if + + end subroutine i2_base_ins_a + + subroutine i2_base_ins_v(n,irl,val,dupl,x,maxr,info) + use psi_serial_mod + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n, dupl, maxr + class(psb_i_base_vect_type), intent(inout) :: irl + class(psb_i2_base_vect_type), intent(inout) :: val + integer(psb_ipk_), intent(out) :: info + + integer(psb_ipk_) :: isz + + info = 0 + if (psb_errstatus_fatal()) return + + if (irl%is_dev()) call irl%sync() + if (val%is_dev()) call val%sync() + if (x%is_dev()) call x%sync() + call x%ins(n,irl%v,val%v,dupl,maxr,info) + + if (info /= 0) then + call psb_errpush(info,'base_vect_ins') + return + end if + + end subroutine i2_base_ins_v + + + ! + !> Function base_zero + !! \memberof psb_i2_base_vect_type + !! \brief Zero out contents + !! + ! + subroutine i2_base_zero(x) + use psi_serial_mod + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + + if (allocated(x%v)) then + !$omp workshare + x%v(:)=i2zero + !$omp end workshare + end if + call x%set_host() + end subroutine i2_base_zero + + + ! + ! Assembly. + ! For derived classes: after this the vector + ! storage is supposed to be in sync. + ! + !> Function base_asb: + !! \memberof psb_i2_base_vect_type + !! \brief Assemble vector: reallocate as necessary. + !! + !! \param n final size + !! \param info return code + !! + ! + + subroutine i2_base_asb_m(n, x, info, scratch) + use psi_serial_mod + use psb_realloc_mod + implicit none + integer(psb_mpk_), intent(in) :: n + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + integer(psb_i2pk_), allocatable :: vv(:) + + info = 0 + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (x%is_bld()) then + ncfs = x%get_ncfs() + xvsz = psb_size(x%v) + call psb_realloc(n,vv,info) + vv(:) = i2zero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,ncfs + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,ncfs + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,ncfs + if (vv(x%iv(i)).ne. i2zero) then + call psb_errpush(psb_err_duplicate_coo,'vect-asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() + call x%sync() + end subroutine i2_base_asb_m + + ! + ! Assembly. + ! For derived classes: after this the vector + ! storage is supposed to be in sync. + ! + !> Function base_asb: + !! \memberof psb_i2_base_vect_type + !! \brief Assemble vector: reallocate as necessary. + !! + !! \param n final size + !! \param info return code + !! + ! + + subroutine i2_base_asb_e(n, x, info, scratch) + use psi_serial_mod + use psb_realloc_mod + implicit none + integer(psb_epk_), intent(in) :: n + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + integer(psb_i2pk_), allocatable :: vv(:) + + info = 0 + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb unhandled') + if (x%is_bld()) then + call psb_realloc(n,vv,info) + vv(:) = i2zero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,x%get_ncfs() + if (vv(x%iv(i)).ne. i2zero) then + call psb_errpush(psb_err_duplicate_coo,'vect_asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() + call x%sync() + end subroutine i2_base_asb_e + + ! + !> Function base_free: + !! \memberof psb_i2_base_vect_type + !! \brief Free vector + !! + !! \param info return code + !! + ! + subroutine i2_base_free(x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_) :: info_comm + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(x%v)) deallocate(x%v, stat=info) + if ((info == 0).and.allocated(x%combuf)) call x%free_buffer(info) + if ((info == 0).and.allocated(x%comid)) call x%free_comid(info) + if ((info == 0).and.allocated(x%iv)) deallocate(x%iv, stat=info) + if ((info == 0).and.allocated(x%comm_handle)) then + call psb_comm_free(x%comm_handle, info_comm) + if (info_comm /= psb_success_) info = info_comm + end if + if (info /= 0) call & + & psb_errpush(psb_err_alloc_dealloc_,'vect_free') + call x%set_null() + end subroutine i2_base_free + + ! + !> Function base_free_buffer: + !! \memberof psb_i2_base_vect_type + !! \brief Free aux buffer + !! + !! \param info return code + !! + ! + subroutine i2_base_free_buffer(x,info) + use psb_realloc_mod + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + + if (allocated(x%combuf)) & + & deallocate(x%combuf,stat=info) + end subroutine i2_base_free_buffer + + ! + !> Function base_maybe_free_buffer: + !! \memberof psb_i2_base_vect_type + !! \brief Conditionally Free aux buffer. + !! In some derived classes, e.g. GPU, + !! does not really frees to avoid runtime + !! costs + !! + !! \param info return code + !! + ! + subroutine i2_base_maybe_free_buffer(x,info) + use psb_realloc_mod + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (psb_get_maybe_free_buffer())& + & call x%free_buffer(info) + + end subroutine i2_base_maybe_free_buffer + + ! + !> Function base_free_comid: + !! \memberof psb_i2_base_vect_type + !! \brief Free aux MPI communication id buffer + !! + !! \param info return code + !! + ! + subroutine i2_base_free_comid(x,info) + use psb_realloc_mod + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + + if (allocated(x%comid)) & + & deallocate(x%comid,stat=info) + end subroutine i2_base_free_comid + + function i2_base_get_ncfs(x) result(res) + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%ncfs + end function i2_base_get_ncfs + + function i2_base_get_dupl(x) result(res) + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%dupl + end function i2_base_get_dupl + + function i2_base_get_state(x) result(res) + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%bldstate + end function i2_base_get_state + + function i2_base_is_null(x) result(res) + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_null_) + end function i2_base_is_null + + function i2_base_is_bld(x) result(res) + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_bld_) + end function i2_base_is_bld + + function i2_base_is_upd(x) result(res) + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_upd_) + end function i2_base_is_upd + + function i2_base_is_asb(x) result(res) + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_asb_) + end function i2_base_is_asb + + subroutine i2_base_set_ncfs(n,x) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%ncfs = n + end subroutine i2_base_set_ncfs + + subroutine i2_base_set_dupl(n,x) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%dupl = n + end subroutine i2_base_set_dupl + + subroutine i2_base_set_state(n,x) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%bldstate = n + end subroutine i2_base_set_state + + subroutine i2_base_set_null(x) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_null_ + end subroutine i2_base_set_null + + subroutine i2_base_set_bld(x) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_bld_ + end subroutine i2_base_set_bld + + subroutine i2_base_set_upd(x) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_upd_ + end subroutine i2_base_set_upd + + subroutine i2_base_set_asb(x) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_asb_ + end subroutine i2_base_set_asb + + ! + ! The base version of SYNC & friends does nothing, it's just + ! a placeholder. + ! + ! + !> Function base_sync: + !! \memberof psb_i2_base_vect_type + !! \brief Sync: base version is a no-op. + !! + ! + subroutine i2_base_sync(x) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + + end subroutine i2_base_sync + + ! + !> Function base_set_host: + !! \memberof psb_i2_base_vect_type + !! \brief Set_host: base version is a no-op. + !! + ! + subroutine i2_base_set_host(x) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + + end subroutine i2_base_set_host + + ! + !> Function base_set_dev: + !! \memberof psb_i2_base_vect_type + !! \brief Set_dev: base version is a no-op. + !! + ! + subroutine i2_base_set_dev(x) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + + end subroutine i2_base_set_dev + + ! + !> Function base_set_sync: + !! \memberof psb_i2_base_vect_type + !! \brief Set_sync: base version is a no-op. + !! + ! + subroutine i2_base_set_sync(x) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + + end subroutine i2_base_set_sync + + ! + !> Function base_is_dev: + !! \memberof psb_i2_base_vect_type + !! \brief Is vector on external device . + !! + ! + function i2_base_is_dev(x) result(res) + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + logical :: res + + res = .false. + end function i2_base_is_dev + + ! + !> Function base_is_host + !! \memberof psb_i2_base_vect_type + !! \brief Is vector on standard memory . + !! + ! + function i2_base_is_host(x) result(res) + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + logical :: res + + res = .true. + end function i2_base_is_host + + ! + !> Function base_is_sync + !! \memberof psb_i2_base_vect_type + !! \brief Is vector on sync . + !! + ! + function i2_base_is_sync(x) result(res) + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + logical :: res + + res = .true. + end function i2_base_is_sync + + !> Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine i2_base_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + class(psb_i2_base_vect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine i2_base_cpy + + ! + ! Size info. + ! + ! + !> Function base_get_nrows + !! \memberof psb_i2_base_vect_type + !! \brief Number of entries + !! + ! + function i2_base_get_nrows(x) result(res) + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + + res = 0 + if (allocated(x%v)) res = size(x%v) + + end function i2_base_get_nrows + + ! + !> Function base_get_sizeof + !! \memberof psb_i2_base_vect_type + !! \brief Size in bytes + !! + ! + function i2_base_sizeof(x) result(res) + implicit none + class(psb_i2_base_vect_type), intent(in) :: x + integer(psb_epk_) :: res + + ! Force 8-byte integers. + res = (1_psb_epk_ * psb_sizeof_i2p) * x%get_nrows() + + end function i2_base_sizeof + + ! + !> Function base_get_fmt + !! \memberof psb_i2_base_vect_type + !! \brief Format + !! + ! + function i2_base_get_fmt() result(res) + implicit none + character(len=5) :: res + res = 'BASE' + end function i2_base_get_fmt + + + ! + ! + ! + !> Function base_get_vect + !! \memberof psb_i2_base_vect_type + !! \brief Extract a copy of the contents + !! + ! + function i2_base_get_vect(x,n) result(res) + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_i2pk_), allocatable :: res(:) + integer(psb_ipk_) :: info + integer(psb_ipk_), optional :: n + ! Local variables + integer(psb_ipk_) :: isz, i + + if (.not.allocated(x%v)) return + if (.not.x%is_host()) call x%sync() + isz = x%get_nrows() + if (present(n)) isz = max(0,min(isz,n)) + allocate(res(isz),stat=info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,'base_get_vect') + return + end if + if (.false.) then + res(1:isz) = x%v(1:isz) + else + !$omp parallel do private(i) + do i=1, isz + res(i) = x%v(i) + end do + end if + + end function i2_base_get_vect + + ! + ! Reset all values + ! + ! + !> Function base_set_scal + !! \memberof psb_i2_base_vect_type + !! \brief Set all entries + !! \param val The value to set + !! + subroutine i2_base_set_scal(x,val,first,last) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_i2pk_), intent(in) :: val + integer(psb_ipk_), optional :: first, last + + integer(psb_ipk_) :: first_, last_, i + + first_=1 + last_=size(x%v) + if (present(first)) first_ = max(1,first) + if (present(last)) last_ = min(last,last_) + + if (x%is_dev()) call x%sync() +#if defined(PSB_OPENMP) + !$omp parallel do private(i) + do i = first_, last_ + x%v(i) = val + end do +#else + x%v(first_:last_) = val +#endif + call x%set_host() + + end subroutine i2_base_set_scal + + + ! + !> Function base_set_vect + !! \memberof psb_i2_base_vect_type + !! \brief Set all entries + !! \param val(:) The vector to be copied in + !! + subroutine i2_base_set_vect(x,val,first,last) + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_i2pk_), intent(in) :: val(:) + integer(psb_ipk_), optional :: first, last + + integer(psb_ipk_) :: first_, last_, i, info + + if (.not.allocated(x%v)) then + call psb_realloc(size(val),x%v,info) + end if + + first_ = 1 + if (present(first)) first_ = max(1,first) + last_ = min(psb_size(x%v),first_+size(val)-1) + if (present(last)) last_ = min(last,last_) + + if (x%is_dev()) call x%sync() + +#if defined(PSB_OPENMP) + !$omp parallel do private(i) + do i = first_, last_ + x%v(i) = val(i-first_+1) + end do +#else + x%v(first_:last_) = val(1:last_-first_+1) +#endif + call x%set_host() + + end subroutine i2_base_set_vect + + subroutine i2_base_check_addr(x) + class(psb_i2_base_vect_type), intent(inout) :: x + + write(0,*) 'Check addr: base version, do nothing' + + end subroutine i2_base_check_addr + + + + ! + ! Gather: Y = beta * Y + alpha * X(IDX(:)) + ! + ! + !> Function base_gthab + !! \memberof psb_i2_base_vect_type + !! \brief gather into an array + !! Y = beta * Y + alpha * X(IDX(:)) + !! \param n how many entries to consider + !! \param idx(:) indices + !! \param alpha + !! \param beta + subroutine i2_base_gthab(n,idx,alpha,x,beta,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: alpha, beta, y(:) + class(psb_i2_base_vect_type) :: x + + if (x%is_dev()) call x%sync() + call psi_gth(n,idx,alpha,x%v,beta,y) + + end subroutine i2_base_gthab + ! + ! shortcut alpha=1 beta=0 + ! + !> Function base_gthzv + !! \memberof psb_i2_base_vect_type + !! \brief gather into an array special alpha=1 beta=0 + !! Y = X(IDX(:)) + !! \param n how many entries to consider + !! \param idx(:) indices + subroutine i2_base_gthzv_x(i,n,idx,x,y) + use psi_serial_mod + implicit none + integer(psb_ipk_) :: i + integer(psb_mpk_) :: n + class(psb_i_base_vect_type) :: idx + integer(psb_i2pk_) :: y(:) + class(psb_i2_base_vect_type) :: x + + if (idx%is_dev()) call idx%sync() + call x%gth(n,idx%v(i:),y) + + end subroutine i2_base_gthzv_x + + ! + ! New comm internals impl. + ! + subroutine i2_base_gthzbuf(i,n,idx,x) + use psi_serial_mod + implicit none + integer(psb_ipk_) :: i + integer(psb_mpk_) :: n + class(psb_i_base_vect_type) :: idx + class(psb_i2_base_vect_type) :: x + + if (.not.allocated(x%combuf)) then + call psb_errpush(psb_err_alloc_dealloc_,'gthzbuf') + return + end if + if (idx%is_dev()) call idx%sync() + if (x%is_dev()) call x%sync() + call x%gth(n,idx%v(i:),x%combuf(i:)) + + end subroutine i2_base_gthzbuf + ! + !> Function base_device_wait: + !! \memberof psb_i2_base_vect_type + !! \brief device_wait: base version is a no-op. + !! + ! + subroutine i2_base_device_wait() + implicit none + + end subroutine i2_base_device_wait + + function i2_base_use_buffer() result(res) + logical :: res + + res = .true. + end function i2_base_use_buffer + + subroutine i2_base_new_buffer(n,x,info) + use psb_realloc_mod + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + + call psb_realloc(n,x%combuf,info) + end subroutine i2_base_new_buffer + + subroutine i2_base_new_comid(n,x,info) + use psb_realloc_mod + implicit none + class(psb_i2_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + + call psb_realloc(n,2_psb_ipk_,x%comid,info) + end subroutine i2_base_new_comid + + + ! + ! shortcut alpha=1 beta=0 + ! + !> Function base_gthzv + !! \memberof psb_i2_base_vect_type + !! \brief gather into an array special alpha=1 beta=0 + !! Y = X(IDX(:)) + !! \param n how many entries to consider + !! \param idx(:) indices + subroutine i2_base_gthzv(n,idx,x,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: y(:) + class(psb_i2_base_vect_type) :: x + + if (x%is_dev()) call x%sync() + call psi_gth(n,idx,x%v,y) + + end subroutine i2_base_gthzv + + ! + ! Scatter: + ! Y(IDX(:)) = beta*Y(IDX(:)) + X(:) + ! + ! + !> Function base_sctb + !! \memberof psb_i2_base_vect_type + !! \brief scatter into a class(base_vect) + !! Y(IDX(:)) = beta * Y(IDX(:)) + X(:) + !! \param n how many entries to consider + !! \param idx(:) indices + !! \param beta + !! \param x(:) + subroutine i2_base_sctb(n,idx,x,beta,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: beta, x(:) + class(psb_i2_base_vect_type) :: y + + if (y%is_dev()) call y%sync() + call psi_sct(n,idx,x,beta,y%v) + call y%set_host() + + end subroutine i2_base_sctb + + subroutine i2_base_sctb_x(i,n,idx,x,beta,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: i + class(psb_i_base_vect_type) :: idx + integer(psb_i2pk_) :: beta, x(:) + class(psb_i2_base_vect_type) :: y + + if (idx%is_dev()) call idx%sync() + call y%sct(n,idx%v(i:),x,beta) + call y%set_host() + + end subroutine i2_base_sctb_x + + subroutine i2_base_sctb_buf(i,n,idx,beta,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: i + class(psb_i_base_vect_type) :: idx + integer(psb_i2pk_) :: beta + class(psb_i2_base_vect_type) :: y + + + if (.not.allocated(y%combuf)) then + call psb_errpush(psb_err_alloc_dealloc_,'sctb_buf') + return + end if + if (y%is_dev()) call y%sync() + if (idx%is_dev()) call idx%sync() + call y%sct(n,idx%v(i:),y%combuf(i:),beta) + call y%set_host() + + end subroutine i2_base_sctb_buf + + +end module psb_i2_base_vect_mod + + +module psb_i2_base_multivect_mod + + use psb_const_mod + use psb_error_mod + use psb_realloc_mod + use psb_i2_base_vect_mod + + !> \namespace psb_base_mod \class psb_i2_base_vect_type + !! The psb_i2_base_vect_type + !! defines a middle level integer(psb_ipk_) encapsulated dense vector. + !! The encapsulation is needed, in place of a simple array, to allow + !! for complicated situations, such as GPU programming, where the memory + !! area we are interested in is not easily accessible from the host/Fortran + !! side. It is also meant to be encapsulated in an outer type, to allow + !! runtime switching as per the STATE design pattern, similar to the + !! sparse matrix types. + !! + private + public :: psb_i2_base_multivect, psb_i2_base_multivect_type + + type psb_i2_base_multivect_type + !> Values. + integer(psb_i2pk_), allocatable :: v(:,:) + integer(psb_i2pk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + integer(psb_mpk_), allocatable :: comid(:,:) + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) + contains + ! + ! Constructors/allocators + ! + procedure, pass(x) :: bld_x => i2_base_mlv_bld_x + procedure, pass(x) :: bld_n => i2_base_mlv_bld_n + generic, public :: bld => bld_x, bld_n + procedure, pass(x) :: all => i2_base_mlv_all + procedure, pass(x) :: mold => i2_base_mlv_mold + ! + ! Insert/set. Assembly and free. + ! Assembly does almost nothing here, but is important + ! in derived classes. + ! + procedure, pass(x) :: ins => i2_base_mlv_ins + procedure, pass(x) :: zero => i2_base_mlv_zero + procedure, pass(x) :: asb => i2_base_mlv_asb + procedure, pass(x) :: free => i2_base_mlv_free + procedure, pass(x) :: reinit => i2_base_mlv_reinit + procedure, pass(x) :: set_ncfs => i2_base_mlv_set_ncfs + procedure, pass(x) :: get_ncfs => i2_base_mlv_get_ncfs + procedure, pass(x) :: set_dupl => i2_base_mlv_set_dupl + procedure, pass(x) :: get_dupl => i2_base_mlv_get_dupl + procedure, pass(x) :: set_state => i2_base_mlv_set_state + procedure, pass(x) :: set_null => i2_base_mlv_set_null + procedure, pass(x) :: set_bld => i2_base_mlv_set_bld + procedure, pass(x) :: set_upd => i2_base_mlv_set_upd + procedure, pass(x) :: set_asb => i2_base_mlv_set_asb + procedure, pass(x) :: get_state => i2_base_mlv_get_state + procedure, pass(x) :: is_null => i2_base_mlv_is_null + procedure, pass(x) :: is_bld => i2_base_mlv_is_bld + procedure, pass(x) :: is_upd => i2_base_mlv_is_upd + procedure, pass(x) :: is_asb => i2_base_mlv_is_asb + procedure, pass(x) :: base_cpy => i2_base_mlv_cpy + ! + ! Sync: centerpiece of handling of external storage. + ! Any derived class having extra storage upon sync + ! will guarantee that both fortran/host side and + ! external side contain the same data. The base + ! version is only a placeholder. + ! + procedure, pass(x) :: sync => i2_base_mlv_sync + procedure, pass(x) :: is_host => i2_base_mlv_is_host + procedure, pass(x) :: is_dev => i2_base_mlv_is_dev + procedure, pass(x) :: is_sync => i2_base_mlv_is_sync + procedure, pass(x) :: set_host => i2_base_mlv_set_host + procedure, pass(x) :: set_dev => i2_base_mlv_set_dev + procedure, pass(x) :: set_sync => i2_base_mlv_set_sync + + ! + ! Basic info + procedure, pass(x) :: get_nrows => i2_base_mlv_get_nrows + procedure, pass(x) :: get_ncols => i2_base_mlv_get_ncols + procedure, pass(x) :: sizeof => i2_base_mlv_sizeof + procedure, nopass :: get_fmt => i2_base_mlv_get_fmt + ! + ! Set/get data from/to an external array; also + ! overload assignment. + ! + procedure, pass(x) :: get_vect => i2_base_mlv_get_vect + procedure, pass(x) :: set_scal => i2_base_mlv_set_scal + procedure, pass(x) :: set_vect => i2_base_mlv_set_vect + generic, public :: set => set_vect, set_scal + + + ! + ! These are for handling gather/scatter in new + ! comm internals implementation. + ! + procedure, nopass :: use_buffer => i2_base_mlv_use_buffer + procedure, pass(x) :: new_buffer => i2_base_mlv_new_buffer + procedure, nopass :: device_wait => i2_base_mlv_device_wait + procedure, pass(x) :: maybe_free_buffer => i2_base_mlv_maybe_free_buffer + procedure, pass(x) :: free_buffer => i2_base_mlv_free_buffer + procedure, pass(x) :: new_comid => i2_base_mlv_new_comid + procedure, pass(x) :: free_comid => i2_base_mlv_free_comid + + ! + ! Gather/scatter. These are needed for MPI interfacing. + ! May have to be reworked. + ! + procedure, pass(x) :: gthab => i2_base_mlv_gthab + procedure, pass(x) :: gthzv => i2_base_mlv_gthzv + procedure, pass(x) :: gthzm => i2_base_mlv_gthzm + procedure, pass(x) :: gthzv_x => i2_base_mlv_gthzv_x + procedure, pass(x) :: gthzbuf => i2_base_mlv_gthzbuf + generic, public :: gth => gthab, gthzv, gthzm, gthzv_x, gthzbuf + procedure, pass(y) :: sctb => i2_base_mlv_sctb + procedure, pass(y) :: sctbr2 => i2_base_mlv_sctbr2 + procedure, pass(y) :: sctb_x => i2_base_mlv_sctb_x + procedure, pass(y) :: sctb_buf => i2_base_mlv_sctb_buf + generic, public :: sct => sctb, sctbr2, sctb_x, sctb_buf + end type psb_i2_base_multivect_type + + interface psb_i2_base_multivect + module procedure constructor, size_const + end interface psb_i2_base_multivect + +contains + + ! + ! Constructors. + ! + + !> Function constructor: + !! \brief Constructor from an array + !! \param x(:) input array to be copied + !! + function constructor(x) result(this) + integer(psb_i2pk_) :: x(:,:) + type(psb_i2_base_multivect_type) :: this + integer(psb_ipk_) :: info + + this%v = x + call this%asb(size(x,dim=1,kind=psb_ipk_),& + & size(x,dim=2,kind=psb_ipk_),info) + end function constructor + + + !> Function constructor: + !! \brief Constructor from size + !! \param n Size of vector to be built. + !! + function size_const(m,n) result(this) + integer(psb_ipk_), intent(in) :: m,n + type(psb_i2_base_multivect_type) :: this + integer(psb_ipk_) :: info + + call this%asb(m,n,info) + + end function size_const + + ! + ! Build from a sample + ! + + !> Function bld_x: + !! \memberof psb_i2_base_multivect_type + !! \brief Build method from an array + !! \param x(:) input array to be copied + !! + subroutine i2_base_mlv_bld_x(x,this) + use psb_realloc_mod + integer(psb_i2pk_), intent(in) :: this(:,:) + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_) :: info + + call psb_realloc(size(this,1),size(this,2),x%v,info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,'base_mlv_vect_bld') + return + end if + x%v(:,:) = this(:,:) + + end subroutine i2_base_mlv_bld_x + + ! + ! Create with size, but no initialization + ! + + !> Function bld_n: + !! \memberof psb_i2_base_multivect_type + !! \brief Build method with size (uninitialized data) + !! \param n size to be allocated. + !! + subroutine i2_base_mlv_bld_n(x,m,n,scratch) + use psb_realloc_mod + integer(psb_ipk_), intent(in) :: m,n + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_) :: info + logical, intent(in), optional :: scratch + + call psb_realloc(m,n,x%v,info) + call x%asb(m,n,info,scratch=scratch) + + end subroutine i2_base_mlv_bld_n + + !> Function base_mlv_all: + !! \memberof psb_i2_base_multivect_type + !! \brief Build method with size (uninitialized data) and + !! allocation return code. + !! \param n size to be allocated. + !! \param info return code + !! + subroutine i2_base_mlv_all(m,n, x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + integer(psb_ipk_), intent(in) :: m,n + class(psb_i2_base_multivect_type), intent(out) :: x + integer(psb_ipk_), intent(out) :: info + + call psb_realloc(m,n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if + + end subroutine i2_base_mlv_all + + !> Function base_mlv_mold: + !! \memberof psb_i2_base_multivect_type + !! \brief Mold method: return a variable with the same dynamic type + !! \param y returned variable + !! \param info return code + !! + subroutine i2_base_mlv_mold(x, y, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + class(psb_i2_base_multivect_type), intent(out), allocatable :: y + integer(psb_ipk_), intent(out) :: info + + allocate(psb_i2_base_multivect_type :: y, stat=info) + + end subroutine i2_base_mlv_mold + + subroutine i2_base_mlv_reinit(x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i2_base_multivect_type), intent(out) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(x%v)) then + call x%sync() + x%v(:,:) = i2zero + call x%set_host() + call x%set_upd() + end if + + end subroutine i2_base_mlv_reinit + + ! + ! Insert a bunch of values at specified positions. + ! + !> Function base_mlv_ins: + !! \memberof psb_i2_base_multivect_type + !! \brief Insert coefficients. + !! + !! + !! Given a list of N pairs + !! (IRL(i),VAL(i)) + !! record a new coefficient in X such that + !! X(IRL(1:N)) = VAL(1:N). + !! + !! - the update operation will perform either + !! X(IRL(1:n)) = VAL(1:N) + !! or + !! X(IRL(1:n)) = X(IRL(1:n))+VAL(1:N) + !! according to the value of DUPLICATE. + !! + !! + !! \param n number of pairs in input + !! \param irl(:) the input row indices + !! \param val(:) the input coefficients + !! \param dupl how to treat duplicate entries + !! \param info return code + !! + ! + subroutine i2_base_mlv_ins(n,irl,val,dupl,x,maxr,info) + use psi_serial_mod + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n, dupl,maxr + integer(psb_ipk_), intent(in) :: irl(:) + integer(psb_i2pk_), intent(in) :: val(:,:) + integer(psb_ipk_), intent(out) :: info + + integer(psb_ipk_) :: i, isz, nc, dupl_, ncfs_, k + + info = 0 + if (psb_errstatus_fatal()) return + + if (try_newins) then + if (x%is_bld()) then + nc = size(x%v,2) + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_realloc(isz,nc,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 + ! this row belongs to me + ! copy i-th row of block val in x + x%v(k,:) = val(i,:) + x%iv(k) = irl(i) + end if + enddo + call x%set_ncfs(k) + + else if (x%is_upd()) then + + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + end if + call x%set_host() + if (info /= 0) then + call psb_errpush(info,'base_mlv_vect_ins') + return + end if + + end subroutine i2_base_mlv_ins + + ! + !> Function base_mlv_zero + !! \memberof psb_i2_base_multivect_type + !! \brief Zero out contents + !! + ! + subroutine i2_base_mlv_zero(x) + use psi_serial_mod + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + + if (allocated(x%v)) x%v=i2zero + call x%set_host() + + end subroutine i2_base_mlv_zero + + + ! + ! Assembly. + ! For derived classes: after this the vector + ! storage is supposed to be in sync. + ! + !> Function base_mlv_asb: + !! \memberof psb_i2_base_multivect_type + !! \brief Assemble vector: reallocate as necessary. + !! + !! \param n final size + !! \param info return code + !! + ! + + subroutine i2_base_mlv_asb(m,n, x, info, scratch) + use psi_serial_mod + use psb_realloc_mod + implicit none + integer(psb_ipk_), intent(in) :: m,n + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + integer(psb_i2pk_), allocatable :: vv(:,:) + + info = 0 + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (x%is_bld()) then + ncfs = x%get_ncfs() + xvsz = psb_size(x%v) + call psb_realloc(m,n,vv,info) + vv(:,:) = i2zero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,ncfs + vv(x%iv(i),:) = vv(x%iv(i),:) + x%v(i,:) + end do + case(psb_dupl_ovwrt_) + do i=1,ncfs + vv(x%iv(i),:) = x%v(i,:) + end do + case(psb_dupl_err_) + do i=1,ncfs + if (any(vv(x%iv(i),:).ne.i2zero)) then + info = psb_err_duplicate_coo + call psb_errpush(info,'mvect-asb') + return + else + vv(x%iv(i),:) = x%v(i,:) + end if + end do + case default + write(psb_err_unit,*) 'Error in mvect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if ((x%get_nrows() < m).or.(x%get_ncols() Function base_mlv_free: + !! \memberof psb_i2_base_multivect_type + !! \brief Free vector + !! + !! \param info return code + !! + ! + subroutine i2_base_mlv_free(x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(x%v)) deallocate(x%v, stat=info) + if (info /= 0) call & + & psb_errpush(psb_err_alloc_dealloc_,'vect_free') + + end subroutine i2_base_mlv_free + + function i2_base_mlv_get_ncfs(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%ncfs + end function i2_base_mlv_get_ncfs + + function i2_base_mlv_get_dupl(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%dupl + end function i2_base_mlv_get_dupl + + function i2_base_mlv_get_state(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%bldstate + end function i2_base_mlv_get_state + + function i2_base_mlv_is_null(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_null_) + end function i2_base_mlv_is_null + + function i2_base_mlv_is_bld(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_bld_) + end function i2_base_mlv_is_bld + + function i2_base_mlv_is_upd(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_upd_) + end function i2_base_mlv_is_upd + + function i2_base_mlv_is_asb(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_asb_) + end function i2_base_mlv_is_asb + + subroutine i2_base_mlv_set_ncfs(n,x) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%ncfs = n + end subroutine i2_base_mlv_set_ncfs + + subroutine i2_base_mlv_set_dupl(n,x) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%dupl = n + end subroutine i2_base_mlv_set_dupl + + subroutine i2_base_mlv_set_state(n,x) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%bldstate = n + end subroutine i2_base_mlv_set_state + + subroutine i2_base_mlv_set_null(x) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + + x%bldstate = psb_vect_null_ + end subroutine i2_base_mlv_set_null + + subroutine i2_base_mlv_set_bld(x) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + + x%bldstate = psb_vect_bld_ + end subroutine i2_base_mlv_set_bld + + subroutine i2_base_mlv_set_upd(x) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + + x%bldstate = psb_vect_upd_ + end subroutine i2_base_mlv_set_upd + + subroutine i2_base_mlv_set_asb(x) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + + x%bldstate = psb_vect_asb_ + end subroutine i2_base_mlv_set_asb + + + ! + ! The base version of SYNC & friends does nothing, it's just + ! a placeholder. + ! + ! + !> Function base_mlv_sync: + !! \memberof psb_i2_base_multivect_type + !! \brief Sync: base version is a no-op. + !! + ! + subroutine i2_base_mlv_sync(x) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + + end subroutine i2_base_mlv_sync + + ! + !> Function base_mlv_set_host: + !! \memberof psb_i2_base_multivect_type + !! \brief Set_host: base version is a no-op. + !! + ! + subroutine i2_base_mlv_set_host(x) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + + end subroutine i2_base_mlv_set_host + + ! + !> Function base_mlv_set_dev: + !! \memberof psb_i2_base_multivect_type + !! \brief Set_dev: base version is a no-op. + !! + ! + subroutine i2_base_mlv_set_dev(x) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + + end subroutine i2_base_mlv_set_dev + + ! + !> Function base_mlv_set_sync: + !! \memberof psb_i2_base_multivect_type + !! \brief Set_sync: base version is a no-op. + !! + ! + subroutine i2_base_mlv_set_sync(x) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + + end subroutine i2_base_mlv_set_sync + + ! + !> Function base_mlv_is_dev: + !! \memberof psb_i2_base_multivect_type + !! \brief Is vector on external device . + !! + ! + function i2_base_mlv_is_dev(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + logical :: res + + res = .false. + end function i2_base_mlv_is_dev + + ! + !> Function base_mlv_is_host + !! \memberof psb_i2_base_multivect_type + !! \brief Is vector on standard memory . + !! + ! + function i2_base_mlv_is_host(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + logical :: res + + res = .true. + end function i2_base_mlv_is_host + + ! + !> Function base_mlv_is_sync + !! \memberof psb_i2_base_multivect_type + !! \brief Is vector on sync . + !! + ! + function i2_base_mlv_is_sync(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + logical :: res + + res = .true. + end function i2_base_mlv_is_sync + + !> Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine i2_base_mlv_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + class(psb_i2_base_multivect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine i2_base_mlv_cpy + + + ! + ! Size info. + ! + ! + !> Function base_mlv_get_nrows + !! \memberof psb_i2_base_multivect_type + !! \brief Number of entries + !! + ! + function i2_base_mlv_get_nrows(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + integer(psb_ipk_) :: res + + res = 0 + if (allocated(x%v)) res = size(x%v,1) + + end function i2_base_mlv_get_nrows + + function i2_base_mlv_get_ncols(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + integer(psb_ipk_) :: res + + res = 0 + if (allocated(x%v)) res = size(x%v,2) + + end function i2_base_mlv_get_ncols + + ! + !> Function base_mlv_get_sizeof + !! \memberof psb_i2_base_multivect_type + !! \brief Size in bytesa + !! + ! + function i2_base_mlv_sizeof(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: x + integer(psb_epk_) :: res + + ! Force 8-byte integers. + res = (1_psb_epk_ * psb_sizeof_i2p) * x%get_nrows() * x%get_ncols() + + end function i2_base_mlv_sizeof + + ! + !> Function base_mlv_get_fmt + !! \memberof psb_i2_base_multivect_type + !! \brief Format + !! + ! + function i2_base_mlv_get_fmt() result(res) + implicit none + character(len=5) :: res + res = 'BASE' + end function i2_base_mlv_get_fmt + + + ! + ! + ! + !> Function base_mlv_get_vect + !! \memberof psb_i2_base_multivect_type + !! \brief Extract a copy of the contents + !! + ! + function i2_base_mlv_get_vect(x) result(res) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_i2pk_), allocatable :: res(:,:) + integer(psb_ipk_) :: info,m,n + m = x%get_nrows() + n = x%get_ncols() + if (.not.allocated(x%v)) return + call x%sync() + allocate(res(m,n),stat=info) + if (info /= 0) then + call psb_errpush(psb_err_alloc_dealloc_,'base_mlv_get_vect') + return + end if + res(1:m,1:n) = x%v(1:m,1:n) + end function i2_base_mlv_get_vect + + ! + ! Reset all values + ! + ! + !> Function base_mlv_set_scal + !! \memberof psb_i2_base_multivect_type + !! \brief Set all entries + !! \param val The value to set + !! + subroutine i2_base_mlv_set_scal(x,val) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_i2pk_), intent(in) :: val + + integer(psb_ipk_) :: info + x%v = val + + end subroutine i2_base_mlv_set_scal + + ! + !> Function base_mlv_set_vect + !! \memberof psb_i2_base_multivect_type + !! \brief Set all entries + !! \param val(:) The vector to be copied in + !! + subroutine i2_base_mlv_set_vect(x,val) + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_i2pk_), intent(in) :: val(:,:) + integer(psb_ipk_) :: nr, nc + integer(psb_ipk_) :: info + + if (allocated(x%v)) then + nr = min(size(x%v,1),size(val,1)) + nc = min(size(x%v,2),size(val,2)) + + x%v(1:nr,1:nc) = val(1:nr,1:nc) + else + x%v = val + end if + + end subroutine i2_base_mlv_set_vect + + + function i2_base_mlv_use_buffer() result(res) + implicit none + logical :: res + + res = .true. + end function i2_base_mlv_use_buffer + + subroutine i2_base_mlv_new_buffer(n,x,info) + use psb_realloc_mod + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + + integer(psb_ipk_) :: nc + nc = x%get_ncols() + call psb_realloc(n*nc,x%combuf,info) + end subroutine i2_base_mlv_new_buffer + + subroutine i2_base_mlv_new_comid(n,x,info) + use psb_realloc_mod + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(out) :: info + + call psb_realloc(n,2_psb_ipk_,x%comid,info) + end subroutine i2_base_mlv_new_comid + + + subroutine i2_base_mlv_maybe_free_buffer(x,info) + use psb_realloc_mod + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + + + info = 0 + if (psb_get_maybe_free_buffer())& + & call x%free_buffer(info) + + end subroutine i2_base_mlv_maybe_free_buffer + + subroutine i2_base_mlv_free_buffer(x,info) + use psb_realloc_mod + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + + if (allocated(x%combuf)) & + & deallocate(x%combuf,stat=info) + end subroutine i2_base_mlv_free_buffer + + subroutine i2_base_mlv_free_comid(x,info) + use psb_realloc_mod + implicit none + class(psb_i2_base_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + + if (allocated(x%comid)) & + & deallocate(x%comid,stat=info) + end subroutine i2_base_mlv_free_comid + + + ! + ! Gather: Y = beta * Y + alpha * X(IDX(:)) + ! + ! + !> Function base_mlv_gthab + !! \memberof psb_i2_base_multivect_type + !! \brief gather into an array + !! Y = beta * Y + alpha * X(IDX(:)) + !! \param n how many entries to consider + !! \param idx(:) indices + !! \param alpha + !! \param beta + subroutine i2_base_mlv_gthab(n,idx,alpha,x,beta,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: alpha, beta, y(:) + class(psb_i2_base_multivect_type) :: x + integer(psb_mpk_) :: nc + + if (x%is_dev()) call x%sync() + if (.not.allocated(x%v)) then + return + end if + nc = psb_size(x%v,2_psb_ipk_) + call psi_gth(n,nc,idx,alpha,x%v,beta,y) + + end subroutine i2_base_mlv_gthab + ! + ! shortcut alpha=1 beta=0 + ! + !> Function base_mlv_gthzv + !! \memberof psb_i2_base_multivect_type + !! \brief gather into an array special alpha=1 beta=0 + !! Y = X(IDX(:)) + !! \param n how many entries to consider + !! \param idx(:) indices + subroutine i2_base_mlv_gthzv_x(i,n,idx,x,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: i + class(psb_i_base_vect_type) :: idx + integer(psb_i2pk_) :: y(:) + class(psb_i2_base_multivect_type) :: x + + if (x%is_dev()) call x%sync() + call x%gth(n,idx%v(i:),y) + + end subroutine i2_base_mlv_gthzv_x + + ! + ! shortcut alpha=1 beta=0 + ! + !> Function base_mlv_gthzv + !! \memberof psb_i2_base_multivect_type + !! \brief gather into an array special alpha=1 beta=0 + !! Y = X(IDX(:)) + !! \param n how many entries to consider + !! \param idx(:) indices + subroutine i2_base_mlv_gthzv(n,idx,x,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: y(:) + class(psb_i2_base_multivect_type) :: x + integer(psb_mpk_) :: nc + + if (x%is_dev()) call x%sync() + if (.not.allocated(x%v)) then + return + end if + nc = psb_size(x%v,2_psb_ipk_) + + call psi_gth(n,nc,idx,x%v,y) + + end subroutine i2_base_mlv_gthzv + ! + ! shortcut alpha=1 beta=0 + ! + !> Function base_mlv_gthzv + !! \memberof psb_i2_base_multivect_type + !! \brief gather into an array special alpha=1 beta=0 + !! Y = X(IDX(:)) + !! \param n how many entries to consider + !! \param idx(:) indices + subroutine i2_base_mlv_gthzm(n,idx,x,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: y(:,:) + class(psb_i2_base_multivect_type) :: x + integer(psb_mpk_) :: nc + + if (x%is_dev()) call x%sync() + if (.not.allocated(x%v)) then + return + end if + nc = psb_size(x%v,2_psb_ipk_) + + call psi_gth(n,nc,idx,x%v,y) + + end subroutine i2_base_mlv_gthzm + + ! + ! New comm internals impl. + ! + subroutine i2_base_mlv_gthzbuf(i,ixb,n,idx,x) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: i, ixb + class(psb_i_base_vect_type) :: idx + class(psb_i2_base_multivect_type) :: x + integer(psb_ipk_) :: nc + + if (.not.allocated(x%combuf)) then + call psb_errpush(psb_err_alloc_dealloc_,'gthzbuf') + return + end if + if (idx%is_dev()) call idx%sync() + if (x%is_dev()) call x%sync() + nc = x%get_ncols() + call x%gth(n,idx%v(i:),x%combuf(ixb:)) + + end subroutine i2_base_mlv_gthzbuf + + ! + ! Scatter: + ! Y(IDX(:),:) = beta*Y(IDX(:),:) + X(:) + ! + ! + !> Function base_mlv_sctb + !! \memberof psb_i2_base_multivect_type + !! \brief scatter into a class(base_mlv_vect) + !! Y(IDX(:)) = beta * Y(IDX(:)) + X(:) + !! \param n how many entries to consider + !! \param idx(:) indices + !! \param beta + !! \param x(:) + subroutine i2_base_mlv_sctb(n,idx,x,beta,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: beta, x(:) + class(psb_i2_base_multivect_type) :: y + integer(psb_mpk_) :: nc + + if (y%is_dev()) call y%sync() + nc = psb_size(y%v,2_psb_ipk_) + call psi_sct(n,nc,idx,x,beta,y%v) + call y%set_host() + + end subroutine i2_base_mlv_sctb + + subroutine i2_base_mlv_sctbr2(n,idx,x,beta,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: beta, x(:,:) + class(psb_i2_base_multivect_type) :: y + integer(psb_mpk_) :: nc + + if (y%is_dev()) call y%sync() + nc = y%get_ncols() + call psi_sct(n,nc,idx,x,beta,y%v) + call y%set_host() + + end subroutine i2_base_mlv_sctbr2 + + subroutine i2_base_mlv_sctb_x(i,n,idx,x,beta,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: i + class(psb_i_base_vect_type) :: idx + integer( psb_i2pk_) :: beta, x(:) + class(psb_i2_base_multivect_type) :: y + + call y%sct(n,idx%v(i:),x,beta) + + end subroutine i2_base_mlv_sctb_x + + subroutine i2_base_mlv_sctb_buf(i,iyb,n,idx,beta,y) + use psi_serial_mod + implicit none + integer(psb_mpk_) :: n + integer(psb_ipk_) :: i, iyb + class(psb_i_base_vect_type) :: idx + integer(psb_i2pk_) :: beta + class(psb_i2_base_multivect_type) :: y + integer(psb_ipk_) :: nc + + if (.not.allocated(y%combuf)) then + call psb_errpush(psb_err_alloc_dealloc_,'sctb_buf') + return + end if + if (y%is_dev()) call y%sync() + if (idx%is_dev()) call idx%sync() + nc = y%get_ncols() + call y%sct(n,idx%v(i:),y%combuf(iyb:),beta) + call y%set_host() + + end subroutine i2_base_mlv_sctb_buf + + ! + !> Function base_device_wait: + !! \memberof psb_i2_base_vect_type + !! \brief device_wait: base version is a no-op. + !! + ! + subroutine i2_base_mlv_device_wait() + implicit none + + end subroutine i2_base_mlv_device_wait + +end module psb_i2_base_multivect_mod diff --git a/base/modules/serial/psb_i2_vect_mod.F90 b/base/modules/serial/psb_i2_vect_mod.F90 new file mode 100644 index 000000000..136d9329f --- /dev/null +++ b/base/modules/serial/psb_i2_vect_mod.F90 @@ -0,0 +1,1273 @@ +! +! Parallel Sparse BLAS version 3.5 +! (C) Copyright 2006-2018 +! Salvatore Filippone +! Alfredo Buttari +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! package: psb_i2_vect_mod +! +! This module contains the definition of the psb_i2_vect type which +! is the outer container for dense vectors. +! Therefore all methods simply invoke the corresponding methods of the +! inner component. +! +module psb_i2_vect_mod + + use psb_realloc_mod + use psb_i2_base_vect_mod + use psb_i_vect_mod + + type psb_i2_vect_type + class(psb_i2_base_vect_type), allocatable :: v + integer(psb_ipk_) :: nrmv = 0 + integer(psb_ipk_) :: remote_build=psb_matbld_noremote_ + integer(psb_ipk_) :: dupl = psb_dupl_add_ + integer(psb_i2pk_), allocatable :: rmtv(:) + integer(psb_lpk_), allocatable :: rmidx(:) + contains + procedure, pass(x) :: get_nrows => i2_vect_get_nrows + procedure, pass(x) :: sizeof => i2_vect_sizeof + procedure, pass(x) :: get_fmt => i2_vect_get_fmt + procedure, pass(x) :: is_remote_build => i2_vect_is_remote_build + procedure, pass(x) :: set_remote_build => i2_vect_set_remote_build + procedure, pass(x) :: get_nrmv => i2_vect_get_nrmv + procedure, pass(x) :: set_nrmv => i2_vect_set_nrmv + procedure, pass(x) :: all => i2_vect_all + procedure, pass(x) :: reall => i2_vect_reall + procedure, pass(x) :: zero => i2_vect_zero + procedure, pass(x) :: asb => i2_vect_asb + procedure, pass(x) :: set_dupl => i2_vect_set_dupl + procedure, pass(x) :: get_dupl => i2_vect_get_dupl + procedure, pass(x) :: set_ncfs => i2_vect_set_ncfs + procedure, pass(x) :: get_ncfs => i2_vect_get_ncfs + procedure, pass(x) :: set_state => i2_vect_set_state + procedure, pass(x) :: set_null => i2_vect_set_null + procedure, pass(x) :: set_bld => i2_vect_set_bld + procedure, pass(x) :: set_upd => i2_vect_set_upd + procedure, pass(x) :: set_asb => i2_vect_set_asb + procedure, pass(x) :: get_state => i2_vect_get_state + procedure, pass(x) :: is_null => i2_vect_is_null + procedure, pass(x) :: is_bld => i2_vect_is_bld + procedure, pass(x) :: is_upd => i2_vect_is_upd + procedure, pass(x) :: is_asb => i2_vect_is_asb + procedure, pass(x) :: reinit => i2_vect_reinit + + procedure, pass(x) :: gthab => i2_vect_gthab + procedure, pass(x) :: gthzv => i2_vect_gthzv + generic, public :: gth => gthab, gthzv + procedure, pass(y) :: sctb => i2_vect_sctb + generic, public :: sct => sctb + procedure, pass(x) :: free => i2_vect_free + procedure, pass(x) :: ins_a => i2_vect_ins_a + procedure, pass(x) :: ins_v => i2_vect_ins_v + generic, public :: ins => ins_v, ins_a + procedure, pass(x) :: bld_x => i2_vect_bld_x + procedure, pass(x) :: bld_mn => i2_vect_bld_mn + procedure, pass(x) :: bld_en => i2_vect_bld_en + generic, public :: bld => bld_x, bld_mn, bld_en + procedure, pass(x) :: get_vect => i2_vect_get_vect + procedure, pass(x) :: cnv => i2_vect_cnv + procedure, pass(x) :: set_scal => i2_vect_set_scal + procedure, pass(x) :: set_vect => i2_vect_set_vect + generic, public :: set => set_vect, set_scal + procedure, pass(x) :: clone => i2_vect_clone + + procedure, pass(x) :: sync => i2_vect_sync + procedure, pass(x) :: is_host => i2_vect_is_host + procedure, pass(x) :: is_dev => i2_vect_is_dev + procedure, pass(x) :: is_sync => i2_vect_is_sync + procedure, pass(x) :: set_host => i2_vect_set_host + procedure, pass(x) :: set_dev => i2_vect_set_dev + procedure, pass(x) :: set_sync => i2_vect_set_sync + procedure, pass(x) :: check_addr => i2_vect_check_addr + + + + end type psb_i2_vect_type + + public :: psb_i2_vect + private :: constructor, size_const + interface psb_i2_vect + module procedure constructor, size_const + end interface psb_i2_vect + + private :: i2_vect_get_nrows, i2_vect_sizeof, i2_vect_get_fmt, & + & i2_vect_all, i2_vect_reall, i2_vect_zero, i2_vect_asb, & + & i2_vect_gthab, i2_vect_gthzv, i2_vect_sctb, & + & i2_vect_free, i2_vect_ins_a, i2_vect_ins_v, i2_vect_bld_x, & + & i2_vect_bld_mn, i2_vect_bld_en, i2_vect_get_vect, & + & i2_vect_cnv, i2_vect_set_scal, & + & i2_vect_set_vect, i2_vect_clone, i2_vect_sync, i2_vect_is_host, & + & i2_vect_is_dev, i2_vect_is_sync, i2_vect_set_host, & + & i2_vect_set_dev, i2_vect_set_sync, & + & i2_vect_set_remote_build, i2_is_remote_build, & + & i2_vect_set_dupl, i2_get_dupl, i2_vect_set_nrmv, i2_get_nrmv + + + class(psb_i2_base_vect_type), allocatable, target,& + & save, private :: psb_i2_base_vect_default + + interface psb_set_vect_default + module procedure psb_i2_set_vect_default + end interface psb_set_vect_default + + interface psb_get_vect_default + module procedure psb_i2_get_vect_default + end interface psb_get_vect_default + + +contains + + function i2_vect_get_dupl(x) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_dupl() + else + res = psb_dupl_null_ + end if + end function i2_vect_get_dupl + + subroutine i2_vect_set_dupl(x,val) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in), optional :: val + + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_dupl(val) + else + call x%v%set_dupl(psb_dupl_def_) + end if + end if + end subroutine i2_vect_set_dupl + + function i2_vect_get_ncfs(x) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_ncfs() + else + res = 0 + end if + end function i2_vect_get_ncfs + + subroutine i2_vect_set_ncfs(x,val) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in), optional :: val + + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_ncfs(val) + else + call x%v%set_ncfs(0) + end if + end if + end subroutine i2_vect_set_ncfs + + function i2_vect_get_state(x) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_state() + else + res = psb_vect_null_ + end if + end function i2_vect_get_state + + function i2_vect_is_null(x) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_null_) + end function i2_vect_is_null + + function i2_vect_is_bld(x) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_bld_) + end function i2_vect_is_bld + + function i2_vect_is_upd(x) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_upd_) + end function i2_vect_is_upd + + function i2_vect_is_asb(x) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_asb_) + end function i2_vect_is_asb + + subroutine i2_vect_set_state(n,x) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + if (allocated(x%v)) then + call x%v%set_state(n) + end if + end subroutine i2_vect_set_state + + + subroutine i2_vect_set_null(x) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_null_) + end subroutine i2_vect_set_null + + subroutine i2_vect_set_bld(x) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_bld_) + end subroutine i2_vect_set_bld + + subroutine i2_vect_set_upd(x) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_upd_) + end subroutine i2_vect_set_upd + + subroutine i2_vect_set_asb(x) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_asb_) + end subroutine i2_vect_set_asb + + function i2_vect_get_nrmv(x) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%nrmv + end function i2_vect_get_nrmv + + subroutine i2_vect_set_nrmv(x,val) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: val + + x%nrmv = val + end subroutine i2_vect_set_nrmv + + function i2_vect_is_remote_build(x) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: x + logical :: res + res = (x%remote_build == psb_matbld_remote_) + end function i2_vect_is_remote_build + + subroutine i2_vect_set_remote_build(x,val) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in), optional :: val + + if (present(val)) then + x%remote_build = val + else + x%remote_build = psb_matbld_remote_ + end if + end subroutine i2_vect_set_remote_build + + subroutine psb_i2_set_vect_default(v) + implicit none + class(psb_i2_base_vect_type), intent(in) :: v + + if (allocated(psb_i2_base_vect_default)) then + deallocate(psb_i2_base_vect_default) + end if + allocate(psb_i2_base_vect_default, mold=v) + + end subroutine psb_i2_set_vect_default + + function psb_i2_get_vect_default(v) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: v + class(psb_i2_base_vect_type), pointer :: res + + res => psb_i2_get_base_vect_default() + + end function psb_i2_get_vect_default + + subroutine psb_i2_clear_vect_default() + implicit none + + if (allocated(psb_i2_base_vect_default)) then + deallocate(psb_i2_base_vect_default) + end if + + end subroutine psb_i2_clear_vect_default + + function psb_i2_get_base_vect_default() result(res) + implicit none + class(psb_i2_base_vect_type), pointer :: res + + if (.not.allocated(psb_i2_base_vect_default)) then + allocate(psb_i2_base_vect_type :: psb_i2_base_vect_default) + end if + + res => psb_i2_base_vect_default + + end function psb_i2_get_base_vect_default + + subroutine i2_vect_clone(x,y,info) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + class(psb_i2_vect_type), intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + + info = psb_success_ + call y%free(info) + if ((info==0).and.allocated(x%v)) then + ! + ! Using sourced allocation here creates + ! problems with handling of memory allocated + ! elsewhere (e.g. accelerators), hence delegation + ! to %bld method + ! + call y%bld(x%get_vect(),mold=x%v) + end if + end subroutine i2_vect_clone + + subroutine i2_vect_bld_x(x,invect,mold,scratch) + integer(psb_i2pk_), intent(in) :: invect(:) + class(psb_i2_vect_type), intent(inout) :: x + class(psb_i2_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: info + + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + + info = psb_success_ + if (allocated(x%v)) & + & call x%free(info) + + if (present(mold)) then + allocate(x%v,stat=info,mold=mold) + else + allocate(x%v,stat=info, mold=psb_i2_get_base_vect_default()) + endif + + if (info == psb_success_) call x%v%bld(invect,scratch=scratch_) + + end subroutine i2_vect_bld_x + + + subroutine i2_vect_bld_mn(x,n,mold,scratch) + integer(psb_mpk_), intent(in) :: n + class(psb_i2_vect_type), intent(inout) :: x + class(psb_i2_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: info + class(psb_i2_base_vect_type), pointer :: mld + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + + info = psb_success_ + if (allocated(x%v)) & + & call x%free(info) + + if (present(mold)) then + allocate(x%v,stat=info,mold=mold) + else + allocate(x%v,stat=info, mold=psb_i2_get_base_vect_default()) + endif + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) + + end subroutine i2_vect_bld_mn + + subroutine i2_vect_bld_en(x,n,mold,scratch) + integer(psb_epk_), intent(in) :: n + class(psb_i2_vect_type), intent(inout) :: x + class(psb_i2_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: info + + info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + + if (allocated(x%v)) & + & call x%free(info) + + if (present(mold)) then + allocate(x%v,stat=info,mold=mold) + else + allocate(x%v,stat=info, mold=psb_i2_get_base_vect_default()) + endif + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) + + end subroutine i2_vect_bld_en + + function i2_vect_get_vect(x,n) result(res) + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_i2pk_), allocatable :: res(:) + integer(psb_ipk_) :: info + integer(psb_ipk_), optional :: n + + if (allocated(x%v)) then + res = x%v%get_vect(n) + end if + end function i2_vect_get_vect + + subroutine i2_vect_set_scal(x,val,first,last) + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_i2pk_), intent(in) :: val + integer(psb_ipk_), optional :: first, last + + integer(psb_ipk_) :: info + if (allocated(x%v)) call x%v%set(val,first,last) + + end subroutine i2_vect_set_scal + + subroutine i2_vect_set_vect(x,val,first,last) + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_i2pk_), intent(in) :: val(:) + integer(psb_ipk_), optional :: first, last + + integer(psb_ipk_) :: info + if (allocated(x%v)) call x%v%set(val,first,last) + + end subroutine i2_vect_set_vect + + subroutine i2_vect_check_addr(x) + class(psb_i2_vect_type), intent(inout) :: x + + integer(psb_ipk_) :: info + if (allocated(x%v)) call x%v%check_addr() + + end subroutine i2_vect_check_addr + + function constructor(x) result(this) + integer(psb_i2pk_) :: x(:) + type(psb_i2_vect_type) :: this + integer(psb_ipk_) :: info + + call this%bld(x) + call this%asb(size(x,kind=psb_ipk_),info) + + end function constructor + + + function size_const(n) result(this) + integer(psb_ipk_), intent(in) :: n + type(psb_i2_vect_type) :: this + integer(psb_ipk_) :: info + + call this%bld(n) + call this%asb(n,info) + + end function size_const + + function i2_vect_get_nrows(x) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = 0 + if (allocated(x%v)) res = x%v%get_nrows() + end function i2_vect_get_nrows + + function i2_vect_sizeof(x) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: x + integer(psb_epk_) :: res + res = 0 + if (allocated(x%v)) res = x%v%sizeof() + end function i2_vect_sizeof + + function i2_vect_get_fmt(x) result(res) + implicit none + class(psb_i2_vect_type), intent(in) :: x + character(len=5) :: res + res = 'NULL' + if (allocated(x%v)) res = x%v%get_fmt() + end function i2_vect_get_fmt + + subroutine i2_vect_all(n, x, info, mold) + + implicit none + integer(psb_ipk_), intent(in) :: n + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + class(psb_i2_base_vect_type), intent(in), optional :: mold + + if (allocated(x%v)) & + & call x%free(info) + + if (present(mold)) then + allocate(x%v,stat=info,mold=mold) + else + allocate(psb_i2_base_vect_type :: x%v,stat=info) + endif + if (info == 0) then + call x%v%all(n,info) + else + info = psb_err_alloc_dealloc_ + end if + call x%set_bld() + end subroutine i2_vect_all + + subroutine i2_vect_reinit(x, info, clear) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + + if (allocated(x%v)) call x%v%reinit(info,clear) + call x%set_upd() + + end subroutine i2_vect_reinit + + subroutine i2_vect_reall(n, x, info) + + implicit none + integer(psb_ipk_), intent(in) :: n + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (.not.allocated(x%v)) & + & call x%all(n,info) + if (info == 0) & + & call x%asb(n,info) + + end subroutine i2_vect_reall + + subroutine i2_vect_zero(x) + use psi_serial_mod + implicit none + class(psb_i2_vect_type), intent(inout) :: x + + if (allocated(x%v)) call x%v%zero() + + end subroutine i2_vect_zero + + subroutine i2_vect_asb(n, x, info, scratch) + use psi_serial_mod + use psb_realloc_mod + implicit none + integer(psb_ipk_), intent(in) :: n + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + if (allocated(x%v)) then + call x%v%asb(n,info,scratch=scratch) + call x%set_asb() + end if + end subroutine i2_vect_asb + + subroutine i2_vect_gthab(n,idx,alpha,x,beta,y) + use psi_serial_mod + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: alpha, beta, y(:) + class(psb_i2_vect_type) :: x + + if (allocated(x%v)) & + & call x%v%gth(n,idx,alpha,beta,y) + + end subroutine i2_vect_gthab + + subroutine i2_vect_gthzv(n,idx,x,y) + use psi_serial_mod + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: y(:) + class(psb_i2_vect_type) :: x + + if (allocated(x%v)) & + & call x%v%gth(n,idx,y) + + end subroutine i2_vect_gthzv + + subroutine i2_vect_sctb(n,idx,x,beta,y) + use psi_serial_mod + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: beta, x(:) + class(psb_i2_vect_type) :: y + + if (allocated(y%v)) & + & call y%v%sct(n,idx,x,beta) + + end subroutine i2_vect_sctb + + subroutine i2_vect_free(x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(x%v)) then + call x%v%free(info) + if (info == 0) deallocate(x%v,stat=info) + end if + + end subroutine i2_vect_free + + subroutine i2_vect_ins_a(n,irl,val,x,maxr,info) + use psi_serial_mod + implicit none + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n, maxr + integer(psb_ipk_), intent(in) :: irl(:) + integer(psb_i2pk_), intent(in) :: val(:) + integer(psb_ipk_), intent(out) :: info + + integer(psb_ipk_) :: i, dupl + + info = 0 + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + return + end if + dupl = x%get_dupl() + call x%v%ins(n,irl,val,dupl,maxr,info) + + end subroutine i2_vect_ins_a + + subroutine i2_vect_ins_v(n,irl,val,x,maxr,info) + use psi_serial_mod + implicit none + class(psb_i2_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n, maxr + class(psb_i_vect_type), intent(inout) :: irl + class(psb_i2_vect_type), intent(inout) :: val + integer(psb_ipk_), intent(out) :: info + + integer(psb_ipk_) :: i, dupl + + info = 0 + if (.not.(allocated(x%v).and.allocated(irl%v).and.allocated(val%v))) then + info = psb_err_invalid_vect_state_ + return + end if + dupl = x%get_dupl() + call x%v%ins(n,irl%v,val%v,dupl,maxr,info) + + end subroutine i2_vect_ins_v + + + subroutine i2_vect_cnv(x,mold) + class(psb_i2_vect_type), intent(inout) :: x + class(psb_i2_base_vect_type), intent(in), optional :: mold + class(psb_i2_base_vect_type), allocatable :: tmp + + integer(psb_ipk_) :: info + + info = psb_success_ + if (present(mold)) then + allocate(tmp,stat=info,mold=mold) + else + allocate(tmp,stat=info,mold=psb_i2_get_base_vect_default()) + end if + if (allocated(x%v)) then + if (allocated(x%v%v)) then + call x%v%sync() + if (info == psb_success_) call tmp%bld(x%v%v) + call x%v%base_cpy(tmp) + call x%v%free(info) + endif + end if + call move_alloc(tmp,x%v) + + end subroutine i2_vect_cnv + + + subroutine i2_vect_sync(x) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + + if (allocated(x%v)) & + & call x%v%sync() + + end subroutine i2_vect_sync + + subroutine i2_vect_set_sync(x) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + + if (allocated(x%v)) & + & call x%v%set_sync() + + end subroutine i2_vect_set_sync + + subroutine i2_vect_set_host(x) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + + if (allocated(x%v)) & + & call x%v%set_host() + + end subroutine i2_vect_set_host + + subroutine i2_vect_set_dev(x) + implicit none + class(psb_i2_vect_type), intent(inout) :: x + + if (allocated(x%v)) & + & call x%v%set_dev() + + end subroutine i2_vect_set_dev + + function i2_vect_is_sync(x) result(res) + implicit none + logical :: res + class(psb_i2_vect_type), intent(inout) :: x + + res = .true. + if (allocated(x%v)) & + & res = x%v%is_sync() + + end function i2_vect_is_sync + + function i2_vect_is_host(x) result(res) + implicit none + logical :: res + class(psb_i2_vect_type), intent(inout) :: x + + res = .true. + if (allocated(x%v)) & + & res = x%v%is_host() + + end function i2_vect_is_host + + function i2_vect_is_dev(x) result(res) + implicit none + logical :: res + class(psb_i2_vect_type), intent(inout) :: x + + res = .false. + if (allocated(x%v)) & + & res = x%v%is_dev() + + end function i2_vect_is_dev + + + + +end module psb_i2_vect_mod + + +module psb_i2_multivect_mod + + use psb_i2_base_multivect_mod + use psb_const_mod + use psb_i_vect_mod + + + !private + + type psb_i2_multivect_type + class(psb_i2_base_multivect_type), allocatable :: v + integer(psb_ipk_) :: nrmv = 0 + integer(psb_ipk_) :: remote_build=psb_matbld_noremote_ + integer(psb_ipk_) :: dupl = psb_dupl_add_ + integer(psb_i2pk_), allocatable :: rmtv(:,:) + contains + procedure, pass(x) :: get_nrows => i2_mvect_get_nrows + procedure, pass(x) :: get_ncols => i2_mvect_get_ncols + procedure, pass(x) :: sizeof => i2_mvect_sizeof + procedure, pass(x) :: get_fmt => i2_mvect_get_fmt + procedure, pass(x) :: is_remote_build => i2_mvect_is_remote_build + procedure, pass(x) :: set_remote_build => i2_mvect_set_remote_build + procedure, pass(x) :: get_dupl => i2_mvect_get_dupl + procedure, pass(x) :: set_dupl => i2_mvect_set_dupl + + procedure, pass(x) :: all => i2_mvect_all + procedure, pass(x) :: reall => i2_mvect_reall + procedure, pass(x) :: zero => i2_mvect_zero + procedure, pass(x) :: asb => i2_mvect_asb + procedure, pass(x) :: sync => i2_mvect_sync + procedure, pass(x) :: free => i2_mvect_free + procedure, pass(x) :: ins => i2_mvect_ins + procedure, pass(x) :: bld_x => i2_mvect_bld_x + procedure, pass(x) :: bld_n => i2_mvect_bld_n + generic, public :: bld => bld_x, bld_n + procedure, pass(x) :: get_vect => i2_mvect_get_vect + procedure, pass(x) :: cnv => i2_mvect_cnv + procedure, pass(x) :: set_scal => i2_mvect_set_scal + procedure, pass(x) :: set_vect => i2_mvect_set_vect + generic, public :: set => set_vect, set_scal + procedure, pass(x) :: clone => i2_mvect_clone + procedure, pass(x) :: gthab => i2_mvect_gthab + procedure, pass(x) :: gthzv => i2_mvect_gthzv + procedure, pass(x) :: gthzv_x => i2_mvect_gthzv_x + generic, public :: gth => gthab, gthzv + procedure, pass(y) :: sctb => i2_mvect_sctb + procedure, pass(y) :: sctb_x => i2_mvect_sctb_x + generic, public :: sct => sctb, sctb_x + end type psb_i2_multivect_type + + public :: psb_i2_multivect, psb_i2_multivect_type,& + & psb_set_multivect_default, psb_get_multivect_default, & + & psb_i2_base_multivect_type + + private + interface psb_i2_multivect + module procedure constructor, size_const + end interface psb_i2_multivect + + class(psb_i2_base_multivect_type), allocatable, target,& + & save, private :: psb_i2_base_multivect_default + + interface psb_set_multivect_default + module procedure psb_i2_set_multivect_default + end interface psb_set_multivect_default + + interface psb_get_multivect_default + module procedure psb_i2_get_multivect_default + end interface psb_get_multivect_default + + +contains + + + function i2_mvect_get_dupl(x) result(res) + implicit none + class(psb_i2_multivect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%dupl + end function i2_mvect_get_dupl + + subroutine i2_mvect_set_dupl(x,val) + implicit none + class(psb_i2_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(in), optional :: val + + if (present(val)) then + x%dupl = val + else + x%dupl = psb_dupl_def_ + end if + end subroutine i2_mvect_set_dupl + + + function i2_mvect_is_remote_build(x) result(res) + implicit none + class(psb_i2_multivect_type), intent(in) :: x + logical :: res + res = (x%remote_build == psb_matbld_remote_) + end function i2_mvect_is_remote_build + + subroutine i2_mvect_set_remote_build(x,val) + implicit none + class(psb_i2_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(in), optional :: val + + if (present(val)) then + x%remote_build = val + else + x%remote_build = psb_matbld_remote_ + end if + end subroutine i2_mvect_set_remote_build + + + subroutine psb_i2_set_multivect_default(v) + implicit none + class(psb_i2_base_multivect_type), intent(in) :: v + + if (allocated(psb_i2_base_multivect_default)) then + deallocate(psb_i2_base_multivect_default) + end if + allocate(psb_i2_base_multivect_default, mold=v) + + end subroutine psb_i2_set_multivect_default + + function psb_i2_get_multivect_default(v) result(res) + implicit none + class(psb_i2_multivect_type), intent(in) :: v + class(psb_i2_base_multivect_type), pointer :: res + + res => psb_i2_get_base_multivect_default() + + end function psb_i2_get_multivect_default + + + function psb_i2_get_base_multivect_default() result(res) + implicit none + class(psb_i2_base_multivect_type), pointer :: res + + if (.not.allocated(psb_i2_base_multivect_default)) then + allocate(psb_i2_base_multivect_type :: psb_i2_base_multivect_default) + end if + + res => psb_i2_base_multivect_default + + end function psb_i2_get_base_multivect_default + + + subroutine i2_mvect_clone(x,y,info) + implicit none + class(psb_i2_multivect_type), intent(inout) :: x + class(psb_i2_multivect_type), intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + + info = psb_success_ + call y%free(info) + if ((info==0).and.allocated(x%v)) then + call y%bld_x(x%get_vect(),mold=x%v) + end if + end subroutine i2_mvect_clone + + subroutine i2_mvect_bld_x(x,invect,mold) + integer(psb_i2pk_), intent(in) :: invect(:,:) + class(psb_i2_multivect_type), intent(out) :: x + class(psb_i2_base_multivect_type), intent(in), optional :: mold + integer(psb_ipk_) :: info + class(psb_i2_base_multivect_type), pointer :: mld + + info = psb_success_ + if (present(mold)) then + allocate(x%v,stat=info,mold=mold) + else + allocate(x%v,stat=info, mold=psb_i2_get_base_multivect_default()) + endif + + if (info == psb_success_) call x%v%bld(invect) + + end subroutine i2_mvect_bld_x + + + subroutine i2_mvect_bld_n(x,m,n,mold,scratch) + integer(psb_ipk_), intent(in) :: m,n + class(psb_i2_multivect_type), intent(out) :: x + class(psb_i2_base_multivect_type), intent(in), optional :: mold + integer(psb_ipk_) :: info + logical, intent(in), optional :: scratch + + info = psb_success_ + if (present(mold)) then + allocate(x%v,stat=info,mold=mold) + else + allocate(x%v,stat=info, mold=psb_i2_get_base_multivect_default()) + endif + if (info == psb_success_) call x%v%bld(m,n,scratch=scratch) + + end subroutine i2_mvect_bld_n + + function i2_mvect_get_vect(x) result(res) + class(psb_i2_multivect_type), intent(inout) :: x + integer(psb_i2pk_), allocatable :: res(:,:) + integer(psb_ipk_) :: info + + if (allocated(x%v)) then + res = x%v%get_vect() + end if + end function i2_mvect_get_vect + + subroutine i2_mvect_set_scal(x,val) + class(psb_i2_multivect_type), intent(inout) :: x + integer(psb_i2pk_), intent(in) :: val + + integer(psb_ipk_) :: info + if (allocated(x%v)) call x%v%set(val) + + end subroutine i2_mvect_set_scal + + subroutine i2_mvect_set_vect(x,val) + class(psb_i2_multivect_type), intent(inout) :: x + integer(psb_i2pk_), intent(in) :: val(:,:) + + integer(psb_ipk_) :: info + if (allocated(x%v)) call x%v%set(val) + + end subroutine i2_mvect_set_vect + + + function constructor(x) result(this) + integer(psb_i2pk_) :: x(:,:) + type(psb_i2_multivect_type) :: this + integer(psb_ipk_) :: info + + call this%bld_x(x) + call this%asb(size(x,dim=1,kind=psb_ipk_),size(x,dim=2,kind=psb_ipk_),info) + + end function constructor + + + function size_const(m,n) result(this) + integer(psb_ipk_), intent(in) :: m,n + type(psb_i2_multivect_type) :: this + integer(psb_ipk_) :: info + + call this%bld_n(m,n) + call this%asb(m,n,info) + + end function size_const + + function i2_mvect_get_nrows(x) result(res) + implicit none + class(psb_i2_multivect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = 0 + if (allocated(x%v)) res = x%v%get_nrows() + end function i2_mvect_get_nrows + + function i2_mvect_get_ncols(x) result(res) + implicit none + class(psb_i2_multivect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = 0 + if (allocated(x%v)) res = x%v%get_ncols() + end function i2_mvect_get_ncols + + function i2_mvect_sizeof(x) result(res) + implicit none + class(psb_i2_multivect_type), intent(in) :: x + integer(psb_epk_) :: res + res = 0 + if (allocated(x%v)) res = x%v%sizeof() + end function i2_mvect_sizeof + + function i2_mvect_get_fmt(x) result(res) + implicit none + class(psb_i2_multivect_type), intent(in) :: x + character(len=5) :: res + res = 'NULL' + if (allocated(x%v)) res = x%v%get_fmt() + end function i2_mvect_get_fmt + + subroutine i2_mvect_all(m,n, x, info, mold) + + implicit none + integer(psb_ipk_), intent(in) :: m,n + class(psb_i2_multivect_type), intent(out) :: x + class(psb_i2_base_multivect_type), intent(in), optional :: mold + integer(psb_ipk_), intent(out) :: info + + if (present(mold)) then + allocate(x%v,stat=info,mold=mold) + else + allocate(psb_i2_base_multivect_type :: x%v,stat=info) + endif + if (info == 0) then + call x%v%all(m,n,info) + else + info = psb_err_alloc_dealloc_ + end if + + end subroutine i2_mvect_all + + subroutine i2_mvect_reall(m,n, x, info) + + implicit none + integer(psb_ipk_), intent(in) :: m,n + class(psb_i2_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (.not.allocated(x%v)) & + & call x%all(m,n,info) + if (info == 0) & + & call x%asb(m,n,info) + + end subroutine i2_mvect_reall + + subroutine i2_mvect_zero(x) + use psi_serial_mod + implicit none + class(psb_i2_multivect_type), intent(inout) :: x + + if (allocated(x%v)) call x%v%zero() + + end subroutine i2_mvect_zero + + subroutine i2_mvect_asb(m,n, x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + integer(psb_ipk_), intent(in) :: m,n + class(psb_i2_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + + if (allocated(x%v)) & + & call x%v%asb(m,n,info) + + end subroutine i2_mvect_asb + + subroutine i2_mvect_sync(x) + implicit none + class(psb_i2_multivect_type), intent(inout) :: x + + if (allocated(x%v)) & + & call x%v%sync() + + end subroutine i2_mvect_sync + + subroutine i2_mvect_gthab(n,idx,alpha,x,beta,y) + use psi_serial_mod + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: alpha, beta, y(:) + class(psb_i2_multivect_type) :: x + + if (allocated(x%v)) & + & call x%v%gth(n,idx,alpha,beta,y) + + end subroutine i2_mvect_gthab + + subroutine i2_mvect_gthzv(n,idx,x,y) + use psi_serial_mod + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: y(:) + class(psb_i2_multivect_type) :: x + + if (allocated(x%v)) & + & call x%v%gth(n,idx,y) + + end subroutine i2_mvect_gthzv + + subroutine i2_mvect_gthzv_x(i,n,idx,x,y) + use psi_serial_mod + integer(psb_mpk_) :: n + integer(psb_ipk_) :: i + class(psb_i_base_vect_type) :: idx + integer(psb_i2pk_) :: y(:) + class(psb_i2_multivect_type) :: x + + if (allocated(x%v)) & + & call x%v%gth(i,n,idx,y) + + end subroutine i2_mvect_gthzv_x + + subroutine i2_mvect_sctb(n,idx,x,beta,y) + use psi_serial_mod + integer(psb_mpk_) :: n + integer(psb_ipk_) :: idx(:) + integer(psb_i2pk_) :: beta, x(:) + class(psb_i2_multivect_type) :: y + + if (allocated(y%v)) & + & call y%v%sct(n,idx,x,beta) + + end subroutine i2_mvect_sctb + + subroutine i2_mvect_sctb_x(i,n,idx,x,beta,y) + use psi_serial_mod + integer(psb_mpk_) :: n + integer(psb_ipk_) :: i + class(psb_i_base_vect_type) :: idx + integer(psb_i2pk_) :: beta, x(:) + class(psb_i2_multivect_type) :: y + + if (allocated(y%v)) & + & call y%v%sct(i,n,idx,x,beta) + + end subroutine i2_mvect_sctb_x + + subroutine i2_mvect_free(x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i2_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(x%v)) then + call x%v%free(info) + if (info == 0) deallocate(x%v,stat=info) + end if + + end subroutine i2_mvect_free + + subroutine i2_mvect_ins(n,irl,val,x,maxr,info) + use psi_serial_mod + implicit none + class(psb_i2_multivect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n,maxr + integer(psb_ipk_), intent(in) :: irl(:) + integer(psb_i2pk_), intent(in) :: val(:,:) + integer(psb_ipk_), intent(out) :: info + + integer(psb_ipk_) :: i, dupl + + info = 0 + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + return + end if + dupl = x%get_dupl() + call x%v%ins(n,irl,val,dupl,maxr,info) + + end subroutine i2_mvect_ins + + + subroutine i2_mvect_cnv(x,mold) + class(psb_i2_multivect_type), intent(inout) :: x + class(psb_i2_base_multivect_type), intent(in), optional :: mold + class(psb_i2_base_multivect_type), allocatable :: tmp + integer(psb_ipk_) :: info + + if (present(mold)) then + allocate(tmp,stat=info,mold=mold) + else + allocate(tmp,stat=info, mold=psb_i2_get_base_multivect_default()) + endif + if (allocated(x%v)) then + call x%v%sync() + if (info == psb_success_) call tmp%bld(x%v%v) + call x%v%free(info) + end if + call move_alloc(tmp,x%v) + end subroutine i2_mvect_cnv + + +end module psb_i2_multivect_mod + diff --git a/base/modules/serial/psb_i_base_vect_mod.F90 b/base/modules/serial/psb_i_base_vect_mod.F90 index e2c64af37..b95d4a6bc 100644 --- a/base/modules/serial/psb_i_base_vect_mod.F90 +++ b/base/modules/serial/psb_i_base_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -33,7 +33,7 @@ ! package: psb_i_base_vect_mod ! ! This module contains the definition of the psb_i_base_vect type which -! is a container for dense vectors. +! is a container for dense vectors.\ ! This is encapsulated instead of being just a simple array to allow for ! more complicated situations, such as GPU programming, where the memory ! area we are interested in is not easily accessible from the host/Fortran @@ -47,6 +47,8 @@ module psb_i_base_vect_mod use psb_const_mod use psb_error_mod use psb_realloc_mod + use psb_comm_schemes_mod, only: psb_comm_handle_type, psb_comm_isend_irecv_, psb_comm_unknown_ + use psb_comm_factory_mod, only: psb_comm_set, psb_comm_free !> \namespace psb_base_mod \class psb_i_base_vect_type !! The psb_i_base_vect_type @@ -60,9 +62,22 @@ module psb_i_base_vect_mod !! type psb_i_base_vect_type !> Values. - integer(psb_ipk_), allocatable :: v(:) - integer(psb_ipk_), allocatable :: combuf(:) - integer(psb_mpk_), allocatable :: comid(:,:) + integer(psb_ipk_), allocatable :: v(:) + integer(psb_ipk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) contains ! ! Constructors/allocators @@ -86,6 +101,22 @@ module psb_i_base_vect_mod procedure, pass(x) :: asb_e => i_base_asb_e generic, public :: asb => asb_m, asb_e procedure, pass(x) :: free => i_base_free + procedure, pass(x) :: reinit => i_base_reinit + procedure, pass(x) :: set_ncfs => i_base_set_ncfs + procedure, pass(x) :: get_ncfs => i_base_get_ncfs + procedure, pass(x) :: set_dupl => i_base_set_dupl + procedure, pass(x) :: get_dupl => i_base_get_dupl + procedure, pass(x) :: set_state => i_base_set_state + procedure, pass(x) :: set_null => i_base_set_null + procedure, pass(x) :: set_bld => i_base_set_bld + procedure, pass(x) :: set_upd => i_base_set_upd + procedure, pass(x) :: set_asb => i_base_set_asb + procedure, pass(x) :: get_state => i_base_get_state + procedure, pass(x) :: is_null => i_base_is_null + procedure, pass(x) :: is_bld => i_base_is_bld + procedure, pass(x) :: is_upd => i_base_is_upd + procedure, pass(x) :: is_asb => i_base_is_asb + procedure, pass(x) :: base_cpy => i_base_cpy ! ! Sync: centerpiece of handling of external storage. ! Any derived class having extra storage upon sync @@ -110,9 +141,7 @@ module psb_i_base_vect_mod procedure, nopass :: device_wait => i_base_device_wait procedure, pass(x) :: maybe_free_buffer => i_base_maybe_free_buffer procedure, pass(x) :: free_buffer => i_base_free_buffer - procedure, pass(x) :: new_comid => i_base_new_comid - procedure, pass(x) :: free_comid => i_base_free_comid - + ! ! Basic info procedure, pass(x) :: get_nrows => i_base_get_nrows @@ -140,6 +169,7 @@ module psb_i_base_vect_mod procedure, pass(y) :: sctb_buf => i_base_sctb_buf generic, public :: sct => sctb, sctb_x, sctb_buf + procedure, pass(x) :: check_addr => i_base_check_addr @@ -196,14 +226,22 @@ contains !! \brief Build method from an array !! \param x(:) input array to be copied !! - subroutine i_base_bld_x(x,this) + subroutine i_base_bld_x(x,this,scratch) use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: this(:) class(psb_i_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info integer(psb_ipk_) :: i + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(size(this),x%v,info) if (info /= 0) then call psb_errpush(psb_err_alloc_dealloc_,'base_vect_bld') @@ -228,15 +266,23 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine i_base_bld_mn(x,n) + subroutine i_base_bld_mn(x,n,scratch) use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_i_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(n,x%v,info) - call x%asb(n,info) + call x%asb(n,info,scratch=scratch_) end subroutine i_base_bld_mn @@ -245,15 +291,23 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine i_base_bld_en(x,n) + subroutine i_base_bld_en(x,n,scratch) use psb_realloc_mod implicit none integer(psb_epk_), intent(in) :: n class(psb_i_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(n,x%v,info) - call x%asb(n,info) + call x%asb(n,info,scratch=scratch_) end subroutine i_base_bld_en @@ -273,6 +327,10 @@ contains integer(psb_ipk_), intent(out) :: info call psb_realloc(n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if end subroutine i_base_all @@ -294,6 +352,31 @@ contains end subroutine i_base_mold + subroutine i_base_reinit(x, info,clear) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + logical :: clear_ + + info = 0 + if (present(clear)) then + clear_ = clear + else + clear_ = .true. + end if + + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + if (clear_) x%v(:) = izero + call x%set_host() + call x%set_upd() + end if + + end subroutine i_base_reinit + ! ! Insert a bunch of values at specified positions. ! @@ -321,55 +404,118 @@ contains !! \param info return code !! ! - subroutine i_base_ins_a(n,irl,val,dupl,x,info) + subroutine i_base_ins_a(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_i_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr integer(psb_ipk_), intent(in) :: irl(:) integer(psb_ipk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_) :: i, isz + integer(psb_ipk_) :: i, isz, dupl_, ncfs_, k info = 0 if (psb_errstatus_fatal()) return - if (.not.allocated(x%v)) then - info = psb_err_invalid_vect_state_ - else if (n > min(size(irl),size(val))) then - info = psb_err_invalid_input_ - - else - isz = size(x%v) - select case(dupl) - case(psb_dupl_ovwrt_) + if (try_newins) then + if (x%is_bld()) then + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_ensure_size(isz,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ do i = 1, n !loop over all val's rows ! row actual block row - if ((1 <= irl(i)).and.(irl(i) <= isz)) then - ! this row belongs to me - ! copy i-th row of block val in x - x%v(irl(i)) = val(i) - end if - enddo - - case(psb_dupl_add_) - - do i = 1, n - !loop over all val's rows - if ((1 <= irl(i)).and.(irl(i) <= isz)) then + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 ! this row belongs to me ! copy i-th row of block val in x - x%v(irl(i)) = x%v(irl(i)) + val(i) + x%v(k) = val(i) + x%iv(k) = irl(i) end if enddo - - case default - info = 321 - ! !$ call psb_errpush(info,name) - ! !$ goto 9999 - end select + call x%set_ncfs(k) + + else if (x%is_upd()) then + + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + + else + isz = size(x%v) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if end if call x%set_host() if (info /= 0) then @@ -379,11 +525,11 @@ contains end subroutine i_base_ins_a - subroutine i_base_ins_v(n,irl,val,dupl,x,info) + subroutine i_base_ins_v(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_i_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr class(psb_i_base_vect_type), intent(inout) :: irl class(psb_i_base_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -396,7 +542,7 @@ contains if (irl%is_dev()) call irl%sync() if (val%is_dev()) call val%sync() if (x%is_dev()) call x%sync() - call x%ins(n,irl%v,val%v,dupl,info) + call x%ins(n,irl%v,val%v,dupl,maxr,info) if (info /= 0) then call psb_errpush(info,'base_vect_ins') @@ -440,19 +586,72 @@ contains !! ! - subroutine i_base_asb_m(n, x, info) + subroutine i_base_asb_m(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_i_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + integer(psb_ipk_), allocatable :: vv(:) info = 0 - if (x%get_nrows() < n) & - & call psb_realloc(n,x%v,info) - if (info /= 0) & - & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (x%is_bld()) then + ncfs = x%get_ncfs() + xvsz = psb_size(x%v) + call psb_realloc(n,vv,info) + vv(:) = izero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,ncfs + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,ncfs + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,ncfs + if (vv(x%iv(i)).ne. izero) then + call psb_errpush(psb_err_duplicate_coo,'vect-asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() call x%sync() end subroutine i_base_asb_m @@ -470,19 +669,72 @@ contains !! ! - subroutine i_base_asb_e(n, x, info) + subroutine i_base_asb_e(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_epk_), intent(in) :: n class(psb_i_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + integer(psb_ipk_), allocatable :: vv(:) info = 0 - if (x%get_nrows() < n) & - & call psb_realloc(n,x%v,info) - if (info /= 0) & - & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb unhandled') + if (x%is_bld()) then + call psb_realloc(n,vv,info) + vv(:) = izero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,x%get_ncfs() + if (vv(x%iv(i)).ne. izero) then + call psb_errpush(psb_err_duplicate_coo,'vect_asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() call x%sync() end subroutine i_base_asb_e @@ -499,19 +751,22 @@ contains use psb_realloc_mod implicit none class(psb_i_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: info_comm + integer(psb_ipk_), intent(out) :: info info = 0 if (allocated(x%v)) deallocate(x%v, stat=info) if ((info == 0).and.allocated(x%combuf)) call x%free_buffer(info) - if ((info == 0).and.allocated(x%comid)) call x%free_comid(info) + if ((info == 0).and.allocated(x%iv)) deallocate(x%iv, stat=info) + if ((info == 0).and.allocated(x%comm_handle)) then + call psb_comm_free(x%comm_handle, info_comm) + if (info_comm /= psb_success_) info = info_comm + end if if (info /= 0) call & & psb_errpush(psb_err_alloc_dealloc_,'vect_free') - + call x%set_null() end subroutine i_base_free - - ! !> Function base_free_buffer: !! \memberof psb_i_base_vect_type @@ -552,25 +807,104 @@ contains & call x%free_buffer(info) end subroutine i_base_maybe_free_buffer + + function i_base_get_ncfs(x) result(res) + implicit none + class(psb_i_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%ncfs + end function i_base_get_ncfs - ! - !> Function base_free_comid: - !! \memberof psb_i_base_vect_type - !! \brief Free aux MPI communication id buffer - !! - !! \param info return code - !! - ! - subroutine i_base_free_comid(x,info) - use psb_realloc_mod + function i_base_get_dupl(x) result(res) + implicit none + class(psb_i_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%dupl + end function i_base_get_dupl + + function i_base_get_state(x) result(res) + implicit none + class(psb_i_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%bldstate + end function i_base_get_state + + function i_base_is_null(x) result(res) + implicit none + class(psb_i_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_null_) + end function i_base_is_null + + function i_base_is_bld(x) result(res) + implicit none + class(psb_i_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_bld_) + end function i_base_is_bld + + function i_base_is_upd(x) result(res) + implicit none + class(psb_i_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_upd_) + end function i_base_is_upd + + function i_base_is_asb(x) result(res) + implicit none + class(psb_i_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_asb_) + end function i_base_is_asb + + subroutine i_base_set_ncfs(n,x) implicit none class(psb_i_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: n + x%ncfs = n + end subroutine i_base_set_ncfs + + subroutine i_base_set_dupl(n,x) + implicit none + class(psb_i_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%dupl = n + end subroutine i_base_set_dupl + + subroutine i_base_set_state(n,x) + implicit none + class(psb_i_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%bldstate = n + end subroutine i_base_set_state + + subroutine i_base_set_null(x) + implicit none + class(psb_i_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_null_ + end subroutine i_base_set_null + + subroutine i_base_set_bld(x) + implicit none + class(psb_i_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_bld_ + end subroutine i_base_set_bld - if (allocated(x%comid)) & - & deallocate(x%comid,stat=info) - end subroutine i_base_free_comid + subroutine i_base_set_upd(x) + implicit none + class(psb_i_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_upd_ + end subroutine i_base_set_upd + + subroutine i_base_set_asb(x) + implicit none + class(psb_i_base_vect_type), intent(inout) :: x + x%bldstate = psb_vect_asb_ + end subroutine i_base_set_asb ! ! The base version of SYNC & friends does nothing, it's just @@ -666,6 +1000,24 @@ contains res = .true. end function i_base_is_sync + !> Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine i_base_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i_base_vect_type), intent(in) :: x + class(psb_i_base_vect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine i_base_cpy ! ! Size info. @@ -824,6 +1176,13 @@ contains end subroutine i_base_set_vect + subroutine i_base_check_addr(x) + class(psb_i_base_vect_type), intent(inout) :: x + + write(0,*) 'Check addr: base version, do nothing' + + end subroutine i_base_check_addr + ! @@ -920,17 +1279,6 @@ contains call psb_realloc(n,x%combuf,info) end subroutine i_base_new_buffer - subroutine i_base_new_comid(n,x,info) - use psb_realloc_mod - implicit none - class(psb_i_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n - integer(psb_ipk_), intent(out) :: info - - call psb_realloc(n,2_psb_ipk_,x%comid,info) - end subroutine i_base_new_comid - - ! ! shortcut alpha=1 beta=0 ! @@ -1042,9 +1390,22 @@ module psb_i_base_multivect_mod type psb_i_base_multivect_type !> Values. - integer(psb_ipk_), allocatable :: v(:,:) - integer(psb_ipk_), allocatable :: combuf(:) - integer(psb_mpk_), allocatable :: comid(:,:) + integer(psb_ipk_), allocatable :: v(:,:) + integer(psb_ipk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) contains ! ! Constructors/allocators @@ -1063,6 +1424,22 @@ module psb_i_base_multivect_mod procedure, pass(x) :: zero => i_base_mlv_zero procedure, pass(x) :: asb => i_base_mlv_asb procedure, pass(x) :: free => i_base_mlv_free + procedure, pass(x) :: reinit => i_base_mlv_reinit + procedure, pass(x) :: set_ncfs => i_base_mlv_set_ncfs + procedure, pass(x) :: get_ncfs => i_base_mlv_get_ncfs + procedure, pass(x) :: set_dupl => i_base_mlv_set_dupl + procedure, pass(x) :: get_dupl => i_base_mlv_get_dupl + procedure, pass(x) :: set_state => i_base_mlv_set_state + procedure, pass(x) :: set_null => i_base_mlv_set_null + procedure, pass(x) :: set_bld => i_base_mlv_set_bld + procedure, pass(x) :: set_upd => i_base_mlv_set_upd + procedure, pass(x) :: set_asb => i_base_mlv_set_asb + procedure, pass(x) :: get_state => i_base_mlv_get_state + procedure, pass(x) :: is_null => i_base_mlv_is_null + procedure, pass(x) :: is_bld => i_base_mlv_is_bld + procedure, pass(x) :: is_upd => i_base_mlv_is_upd + procedure, pass(x) :: is_asb => i_base_mlv_is_asb + procedure, pass(x) :: base_cpy => i_base_mlv_cpy ! ! Sync: centerpiece of handling of external storage. ! Any derived class having extra storage upon sync @@ -1103,8 +1480,6 @@ module psb_i_base_multivect_mod procedure, nopass :: device_wait => i_base_mlv_device_wait procedure, pass(x) :: maybe_free_buffer => i_base_mlv_maybe_free_buffer procedure, pass(x) :: free_buffer => i_base_mlv_free_buffer - procedure, pass(x) :: new_comid => i_base_mlv_new_comid - procedure, pass(x) :: free_comid => i_base_mlv_free_comid ! ! Gather/scatter. These are needed for MPI interfacing. @@ -1143,7 +1518,8 @@ contains integer(psb_ipk_) :: info this%v = x - call this%asb(size(x,dim=1,kind=psb_ipk_),size(x,dim=2,kind=psb_ipk_),info) + call this%asb(size(x,dim=1,kind=psb_ipk_),& + & size(x,dim=2,kind=psb_ipk_),info) end function constructor @@ -1193,14 +1569,15 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine i_base_mlv_bld_n(x,m,n) + subroutine i_base_mlv_bld_n(x,m,n,scratch) use psb_realloc_mod integer(psb_ipk_), intent(in) :: m,n class(psb_i_base_multivect_type), intent(inout) :: x integer(psb_ipk_) :: info + logical, intent(in), optional :: scratch call psb_realloc(m,n,x%v,info) - call x%asb(m,n,info) + call x%asb(m,n,info,scratch=scratch) end subroutine i_base_mlv_bld_n @@ -1220,6 +1597,10 @@ contains integer(psb_ipk_), intent(out) :: info call psb_realloc(m,n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if end subroutine i_base_mlv_all @@ -1241,6 +1622,23 @@ contains end subroutine i_base_mlv_mold + subroutine i_base_mlv_reinit(x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i_base_multivect_type), intent(out) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(x%v)) then + call x%sync() + x%v(:,:) = izero + call x%set_host() + call x%set_upd() + end if + + end subroutine i_base_mlv_reinit + ! ! Insert a bunch of values at specified positions. ! @@ -1268,57 +1666,123 @@ contains !! \param info return code !! ! - subroutine i_base_mlv_ins(n,irl,val,dupl,x,info) + subroutine i_base_mlv_ins(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_i_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl,maxr integer(psb_ipk_), intent(in) :: irl(:) integer(psb_ipk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_) :: i, isz + integer(psb_ipk_) :: i, isz, nc, dupl_, ncfs_, k info = 0 if (psb_errstatus_fatal()) return - if (.not.allocated(x%v)) then - info = psb_err_invalid_vect_state_ - else if (n > min(size(irl),size(val))) then - info = psb_err_invalid_input_ - - else - isz = size(x%v,1) - select case(dupl) - case(psb_dupl_ovwrt_) + if (try_newins) then + if (x%is_bld()) then + nc = size(x%v,2) + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_realloc(isz,nc,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ do i = 1, n !loop over all val's rows - ! row actual block row - if ((1 <= irl(i)).and.(irl(i) <= isz)) then - ! this row belongs to me - ! copy i-th row of block val in x - x%v(irl(i),:) = val(i,:) - end if - enddo - - case(psb_dupl_add_) - - do i = 1, n - !loop over all val's rows - if ((1 <= irl(i)).and.(irl(i) <= isz)) then + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 ! this row belongs to me ! copy i-th row of block val in x - x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + x%v(k,:) = val(i,:) + x%iv(k) = irl(i) end if enddo - - case default - info = 321 - ! !$ call psb_errpush(info,name) - ! !$ goto 9999 - end select + call x%set_ncfs(k) + + else if (x%is_upd()) then + + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if end if + call x%set_host() if (info /= 0) then call psb_errpush(info,'base_mlv_vect_ins') return @@ -1338,6 +1802,7 @@ contains class(psb_i_base_multivect_type), intent(inout) :: x if (allocated(x%v)) x%v=izero + call x%set_host() end subroutine i_base_mlv_zero @@ -1356,19 +1821,78 @@ contains !! ! - subroutine i_base_mlv_asb(m,n, x, info) + subroutine i_base_mlv_asb(m,n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: m,n class(psb_i_base_multivect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch - if ((x%get_nrows() < m).or.(x%get_ncols() Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine i_base_mlv_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_i_base_multivect_type), intent(in) :: x + class(psb_i_base_multivect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine i_base_mlv_cpy + ! ! Size info. @@ -1637,16 +2277,6 @@ contains call psb_realloc(n*nc,x%combuf,info) end subroutine i_base_mlv_new_buffer - subroutine i_base_mlv_new_comid(n,x,info) - use psb_realloc_mod - implicit none - class(psb_i_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n - integer(psb_ipk_), intent(out) :: info - - call psb_realloc(n,2_psb_ipk_,x%comid,info) - end subroutine i_base_mlv_new_comid - subroutine i_base_mlv_maybe_free_buffer(x,info) use psb_realloc_mod @@ -1671,17 +2301,6 @@ contains & deallocate(x%combuf,stat=info) end subroutine i_base_mlv_free_buffer - subroutine i_base_mlv_free_comid(x,info) - use psb_realloc_mod - implicit none - class(psb_i_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - - if (allocated(x%comid)) & - & deallocate(x%comid,stat=info) - end subroutine i_base_mlv_free_comid - - ! ! Gather: Y = beta * Y + alpha * X(IDX(:)) ! diff --git a/base/modules/serial/psb_i_vect_mod.F90 b/base/modules/serial/psb_i_vect_mod.F90 index 55ed7e9df..aa8646ee8 100644 --- a/base/modules/serial/psb_i_vect_mod.F90 +++ b/base/modules/serial/psb_i_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -55,14 +55,28 @@ module psb_i_vect_mod procedure, pass(x) :: get_fmt => i_vect_get_fmt procedure, pass(x) :: is_remote_build => i_vect_is_remote_build procedure, pass(x) :: set_remote_build => i_vect_set_remote_build - procedure, pass(x) :: get_dupl => i_vect_get_dupl - procedure, pass(x) :: set_dupl => i_vect_set_dupl procedure, pass(x) :: get_nrmv => i_vect_get_nrmv procedure, pass(x) :: set_nrmv => i_vect_set_nrmv procedure, pass(x) :: all => i_vect_all procedure, pass(x) :: reall => i_vect_reall procedure, pass(x) :: zero => i_vect_zero procedure, pass(x) :: asb => i_vect_asb + procedure, pass(x) :: set_dupl => i_vect_set_dupl + procedure, pass(x) :: get_dupl => i_vect_get_dupl + procedure, pass(x) :: set_ncfs => i_vect_set_ncfs + procedure, pass(x) :: get_ncfs => i_vect_get_ncfs + procedure, pass(x) :: set_state => i_vect_set_state + procedure, pass(x) :: set_null => i_vect_set_null + procedure, pass(x) :: set_bld => i_vect_set_bld + procedure, pass(x) :: set_upd => i_vect_set_upd + procedure, pass(x) :: set_asb => i_vect_set_asb + procedure, pass(x) :: get_state => i_vect_get_state + procedure, pass(x) :: is_null => i_vect_is_null + procedure, pass(x) :: is_bld => i_vect_is_bld + procedure, pass(x) :: is_upd => i_vect_is_upd + procedure, pass(x) :: is_asb => i_vect_is_asb + procedure, pass(x) :: reinit => i_vect_reinit + procedure, pass(x) :: gthab => i_vect_gthab procedure, pass(x) :: gthzv => i_vect_gthzv generic, public :: gth => gthab, gthzv @@ -90,6 +104,7 @@ module psb_i_vect_mod procedure, pass(x) :: set_host => i_vect_set_host procedure, pass(x) :: set_dev => i_vect_set_dev procedure, pass(x) :: set_sync => i_vect_set_sync + procedure, pass(x) :: check_addr => i_vect_check_addr @@ -132,7 +147,11 @@ contains implicit none class(psb_i_vect_type), intent(in) :: x integer(psb_ipk_) :: res - res = x%dupl + if (allocated(x%v)) then + res = x%v%get_dupl() + else + res = psb_dupl_null_ + end if end function i_vect_get_dupl subroutine i_vect_set_dupl(x,val) @@ -140,13 +159,117 @@ contains class(psb_i_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in), optional :: val - if (present(val)) then - x%dupl = val - else - x%dupl = psb_dupl_def_ + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_dupl(val) + else + call x%v%set_dupl(psb_dupl_def_) + end if end if end subroutine i_vect_set_dupl + function i_vect_get_ncfs(x) result(res) + implicit none + class(psb_i_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_ncfs() + else + res = 0 + end if + end function i_vect_get_ncfs + + subroutine i_vect_set_ncfs(x,val) + implicit none + class(psb_i_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in), optional :: val + + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_ncfs(val) + else + call x%v%set_ncfs(0) + end if + end if + end subroutine i_vect_set_ncfs + + function i_vect_get_state(x) result(res) + implicit none + class(psb_i_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_state() + else + res = psb_vect_null_ + end if + end function i_vect_get_state + + function i_vect_is_null(x) result(res) + implicit none + class(psb_i_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_null_) + end function i_vect_is_null + + function i_vect_is_bld(x) result(res) + implicit none + class(psb_i_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_bld_) + end function i_vect_is_bld + + function i_vect_is_upd(x) result(res) + implicit none + class(psb_i_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_upd_) + end function i_vect_is_upd + + function i_vect_is_asb(x) result(res) + implicit none + class(psb_i_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_asb_) + end function i_vect_is_asb + + subroutine i_vect_set_state(n,x) + implicit none + class(psb_i_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + if (allocated(x%v)) then + call x%v%set_state(n) + end if + end subroutine i_vect_set_state + + + subroutine i_vect_set_null(x) + implicit none + class(psb_i_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_null_) + end subroutine i_vect_set_null + + subroutine i_vect_set_bld(x) + implicit none + class(psb_i_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_bld_) + end subroutine i_vect_set_bld + + subroutine i_vect_set_upd(x) + implicit none + class(psb_i_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_upd_) + end subroutine i_vect_set_upd + + subroutine i_vect_set_asb(x) + implicit none + class(psb_i_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_asb_) + end subroutine i_vect_set_asb + function i_vect_get_nrmv(x) result(res) implicit none class(psb_i_vect_type), intent(in) :: x @@ -161,7 +284,6 @@ contains x%nrmv = val end subroutine i_vect_set_nrmv - function i_vect_is_remote_build(x) result(res) implicit none @@ -232,16 +354,31 @@ contains info = psb_success_ call y%free(info) if ((info==0).and.allocated(x%v)) then + ! + ! Using sourced allocation here creates + ! problems with handling of memory allocated + ! elsewhere (e.g. accelerators), hence delegation + ! to %bld method + ! call y%bld(x%get_vect(),mold=x%v) end if end subroutine i_vect_clone - subroutine i_vect_bld_x(x,invect,mold) + subroutine i_vect_bld_x(x,invect,mold,scratch) integer(psb_ipk_), intent(in) :: invect(:) class(psb_i_vect_type), intent(inout) :: x class(psb_i_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + info = psb_success_ if (allocated(x%v)) & & call x%free(info) @@ -252,17 +389,25 @@ contains allocate(x%v,stat=info, mold=psb_i_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(invect) + if (info == psb_success_) call x%v%bld(invect,scratch=scratch_) end subroutine i_vect_bld_x - subroutine i_vect_bld_mn(x,n,mold) + subroutine i_vect_bld_mn(x,n,mold,scratch) integer(psb_mpk_), intent(in) :: n class(psb_i_vect_type), intent(inout) :: x class(psb_i_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info class(psb_i_base_vect_type), pointer :: mld + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if info = psb_success_ if (allocated(x%v)) & @@ -273,17 +418,25 @@ contains else allocate(x%v,stat=info, mold=psb_i_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(n) + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) end subroutine i_vect_bld_mn - subroutine i_vect_bld_en(x,n,mold) + subroutine i_vect_bld_en(x,n,mold,scratch) integer(psb_epk_), intent(in) :: n class(psb_i_vect_type), intent(inout) :: x class(psb_i_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (allocated(x%v)) & & call x%free(info) @@ -293,7 +446,7 @@ contains else allocate(x%v,stat=info, mold=psb_i_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(n) + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) end subroutine i_vect_bld_en @@ -328,6 +481,13 @@ contains end subroutine i_vect_set_vect + subroutine i_vect_check_addr(x) + class(psb_i_vect_type), intent(inout) :: x + + integer(psb_ipk_) :: info + if (allocated(x%v)) call x%v%check_addr() + + end subroutine i_vect_check_addr function constructor(x) result(this) integer(psb_ipk_) :: x(:) @@ -395,8 +555,20 @@ contains else info = psb_err_alloc_dealloc_ end if + call x%set_bld() end subroutine i_vect_all + subroutine i_vect_reinit(x, info, clear) + implicit none + class(psb_i_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + + if (allocated(x%v)) call x%v%reinit(info,clear) + call x%set_upd() + + end subroutine i_vect_reinit + subroutine i_vect_reall(n, x, info) implicit none @@ -421,16 +593,18 @@ contains end subroutine i_vect_zero - subroutine i_vect_asb(n, x, info) + subroutine i_vect_asb(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: n class(psb_i_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch if (allocated(x%v)) then - call x%v%asb(n,info) + call x%v%asb(n,info,scratch=scratch) + call x%set_asb() end if end subroutine i_vect_asb @@ -485,11 +659,11 @@ contains end subroutine i_vect_free - subroutine i_vect_ins_a(n,irl,val,x,info) + subroutine i_vect_ins_a(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_i_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n, maxr integer(psb_ipk_), intent(in) :: irl(:) integer(psb_ipk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info @@ -502,15 +676,15 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl,val,dupl,info) + call x%v%ins(n,irl,val,dupl,maxr,info) end subroutine i_vect_ins_a - subroutine i_vect_ins_v(n,irl,val,x,info) + subroutine i_vect_ins_v(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_i_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n, maxr class(psb_i_vect_type), intent(inout) :: irl class(psb_i_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -523,7 +697,7 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl%v,val%v,dupl,info) + call x%v%ins(n,irl%v,val%v,dupl,maxr,info) end subroutine i_vect_ins_v @@ -545,6 +719,7 @@ contains if (allocated(x%v%v)) then call x%v%sync() if (info == psb_success_) call tmp%bld(x%v%v) + call x%v%base_cpy(tmp) call x%v%free(info) endif end if @@ -808,19 +983,20 @@ contains end subroutine i_mvect_bld_x - subroutine i_mvect_bld_n(x,m,n,mold) + subroutine i_mvect_bld_n(x,m,n,mold,scratch) integer(psb_ipk_), intent(in) :: m,n class(psb_i_multivect_type), intent(out) :: x class(psb_i_base_multivect_type), intent(in), optional :: mold integer(psb_ipk_) :: info - + logical, intent(in), optional :: scratch + info = psb_success_ if (present(mold)) then allocate(x%v,stat=info,mold=mold) else allocate(x%v,stat=info, mold=psb_i_get_base_multivect_default()) endif - if (info == psb_success_) call x%v%bld(m,n) + if (info == psb_success_) call x%v%bld(m,n,scratch=scratch) end subroutine i_mvect_bld_n @@ -1050,11 +1226,11 @@ contains end subroutine i_mvect_free - subroutine i_mvect_ins(n,irl,val,x,info) + subroutine i_mvect_ins(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_i_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n,maxr integer(psb_ipk_), intent(in) :: irl(:) integer(psb_ipk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(out) :: info @@ -1067,7 +1243,7 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl,val,dupl,info) + call x%v%ins(n,irl,val,dupl,maxr,info) end subroutine i_mvect_ins @@ -1093,3 +1269,4 @@ contains end module psb_i_multivect_mod + diff --git a/base/modules/serial/psb_l_base_vect_mod.F90 b/base/modules/serial/psb_l_base_vect_mod.F90 index cf30db749..0cba091c4 100644 --- a/base/modules/serial/psb_l_base_vect_mod.F90 +++ b/base/modules/serial/psb_l_base_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -33,7 +33,7 @@ ! package: psb_l_base_vect_mod ! ! This module contains the definition of the psb_l_base_vect type which -! is a container for dense vectors. +! is a container for dense vectors.\ ! This is encapsulated instead of being just a simple array to allow for ! more complicated situations, such as GPU programming, where the memory ! area we are interested in is not easily accessible from the host/Fortran @@ -47,6 +47,8 @@ module psb_l_base_vect_mod use psb_const_mod use psb_error_mod use psb_realloc_mod + use psb_comm_schemes_mod, only: psb_comm_handle_type, psb_comm_isend_irecv_, psb_comm_unknown_ + use psb_comm_factory_mod, only: psb_comm_set, psb_comm_free use psb_i_base_vect_mod !> \namespace psb_base_mod \class psb_l_base_vect_type @@ -61,9 +63,22 @@ module psb_l_base_vect_mod !! type psb_l_base_vect_type !> Values. - integer(psb_lpk_), allocatable :: v(:) - integer(psb_lpk_), allocatable :: combuf(:) - integer(psb_mpk_), allocatable :: comid(:,:) + integer(psb_lpk_), allocatable :: v(:) + integer(psb_lpk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) contains ! ! Constructors/allocators @@ -87,6 +102,22 @@ module psb_l_base_vect_mod procedure, pass(x) :: asb_e => l_base_asb_e generic, public :: asb => asb_m, asb_e procedure, pass(x) :: free => l_base_free + procedure, pass(x) :: reinit => l_base_reinit + procedure, pass(x) :: set_ncfs => l_base_set_ncfs + procedure, pass(x) :: get_ncfs => l_base_get_ncfs + procedure, pass(x) :: set_dupl => l_base_set_dupl + procedure, pass(x) :: get_dupl => l_base_get_dupl + procedure, pass(x) :: set_state => l_base_set_state + procedure, pass(x) :: set_null => l_base_set_null + procedure, pass(x) :: set_bld => l_base_set_bld + procedure, pass(x) :: set_upd => l_base_set_upd + procedure, pass(x) :: set_asb => l_base_set_asb + procedure, pass(x) :: get_state => l_base_get_state + procedure, pass(x) :: is_null => l_base_is_null + procedure, pass(x) :: is_bld => l_base_is_bld + procedure, pass(x) :: is_upd => l_base_is_upd + procedure, pass(x) :: is_asb => l_base_is_asb + procedure, pass(x) :: base_cpy => l_base_cpy ! ! Sync: centerpiece of handling of external storage. ! Any derived class having extra storage upon sync @@ -111,9 +142,7 @@ module psb_l_base_vect_mod procedure, nopass :: device_wait => l_base_device_wait procedure, pass(x) :: maybe_free_buffer => l_base_maybe_free_buffer procedure, pass(x) :: free_buffer => l_base_free_buffer - procedure, pass(x) :: new_comid => l_base_new_comid - procedure, pass(x) :: free_comid => l_base_free_comid - + ! ! Basic info procedure, pass(x) :: get_nrows => l_base_get_nrows @@ -141,6 +170,7 @@ module psb_l_base_vect_mod procedure, pass(y) :: sctb_buf => l_base_sctb_buf generic, public :: sct => sctb, sctb_x, sctb_buf + procedure, pass(x) :: check_addr => l_base_check_addr @@ -197,14 +227,22 @@ contains !! \brief Build method from an array !! \param x(:) input array to be copied !! - subroutine l_base_bld_x(x,this) + subroutine l_base_bld_x(x,this,scratch) use psb_realloc_mod implicit none integer(psb_lpk_), intent(in) :: this(:) class(psb_l_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info integer(psb_ipk_) :: i + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(size(this),x%v,info) if (info /= 0) then call psb_errpush(psb_err_alloc_dealloc_,'base_vect_bld') @@ -229,15 +267,23 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine l_base_bld_mn(x,n) + subroutine l_base_bld_mn(x,n,scratch) use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_l_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(n,x%v,info) - call x%asb(n,info) + call x%asb(n,info,scratch=scratch_) end subroutine l_base_bld_mn @@ -246,15 +292,23 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine l_base_bld_en(x,n) + subroutine l_base_bld_en(x,n,scratch) use psb_realloc_mod implicit none integer(psb_epk_), intent(in) :: n class(psb_l_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(n,x%v,info) - call x%asb(n,info) + call x%asb(n,info,scratch=scratch_) end subroutine l_base_bld_en @@ -274,6 +328,10 @@ contains integer(psb_ipk_), intent(out) :: info call psb_realloc(n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if end subroutine l_base_all @@ -295,6 +353,31 @@ contains end subroutine l_base_mold + subroutine l_base_reinit(x, info,clear) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_l_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + logical :: clear_ + + info = 0 + if (present(clear)) then + clear_ = clear + else + clear_ = .true. + end if + + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + if (clear_) x%v(:) = lzero + call x%set_host() + call x%set_upd() + end if + + end subroutine l_base_reinit + ! ! Insert a bunch of values at specified positions. ! @@ -322,55 +405,118 @@ contains !! \param info return code !! ! - subroutine l_base_ins_a(n,irl,val,dupl,x,info) + subroutine l_base_ins_a(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_l_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr integer(psb_ipk_), intent(in) :: irl(:) integer(psb_lpk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_) :: i, isz + integer(psb_ipk_) :: i, isz, dupl_, ncfs_, k info = 0 if (psb_errstatus_fatal()) return - if (.not.allocated(x%v)) then - info = psb_err_invalid_vect_state_ - else if (n > min(size(irl),size(val))) then - info = psb_err_invalid_input_ - - else - isz = size(x%v) - select case(dupl) - case(psb_dupl_ovwrt_) + if (try_newins) then + if (x%is_bld()) then + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_ensure_size(isz,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ do i = 1, n !loop over all val's rows ! row actual block row - if ((1 <= irl(i)).and.(irl(i) <= isz)) then - ! this row belongs to me - ! copy i-th row of block val in x - x%v(irl(i)) = val(i) - end if - enddo - - case(psb_dupl_add_) - - do i = 1, n - !loop over all val's rows - if ((1 <= irl(i)).and.(irl(i) <= isz)) then + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 ! this row belongs to me ! copy i-th row of block val in x - x%v(irl(i)) = x%v(irl(i)) + val(i) + x%v(k) = val(i) + x%iv(k) = irl(i) end if enddo - - case default - info = 321 - ! !$ call psb_errpush(info,name) - ! !$ goto 9999 - end select + call x%set_ncfs(k) + + else if (x%is_upd()) then + + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + + else + isz = size(x%v) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if end if call x%set_host() if (info /= 0) then @@ -380,11 +526,11 @@ contains end subroutine l_base_ins_a - subroutine l_base_ins_v(n,irl,val,dupl,x,info) + subroutine l_base_ins_v(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_l_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr class(psb_i_base_vect_type), intent(inout) :: irl class(psb_l_base_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -397,7 +543,7 @@ contains if (irl%is_dev()) call irl%sync() if (val%is_dev()) call val%sync() if (x%is_dev()) call x%sync() - call x%ins(n,irl%v,val%v,dupl,info) + call x%ins(n,irl%v,val%v,dupl,maxr,info) if (info /= 0) then call psb_errpush(info,'base_vect_ins') @@ -441,19 +587,72 @@ contains !! ! - subroutine l_base_asb_m(n, x, info) + subroutine l_base_asb_m(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_l_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + integer(psb_lpk_), allocatable :: vv(:) info = 0 - if (x%get_nrows() < n) & - & call psb_realloc(n,x%v,info) - if (info /= 0) & - & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (x%is_bld()) then + ncfs = x%get_ncfs() + xvsz = psb_size(x%v) + call psb_realloc(n,vv,info) + vv(:) = lzero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,ncfs + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,ncfs + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,ncfs + if (vv(x%iv(i)).ne. lzero) then + call psb_errpush(psb_err_duplicate_coo,'vect-asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() call x%sync() end subroutine l_base_asb_m @@ -471,19 +670,72 @@ contains !! ! - subroutine l_base_asb_e(n, x, info) + subroutine l_base_asb_e(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_epk_), intent(in) :: n class(psb_l_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + integer(psb_lpk_), allocatable :: vv(:) info = 0 - if (x%get_nrows() < n) & - & call psb_realloc(n,x%v,info) - if (info /= 0) & - & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb unhandled') + if (x%is_bld()) then + call psb_realloc(n,vv,info) + vv(:) = lzero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,x%get_ncfs() + if (vv(x%iv(i)).ne. lzero) then + call psb_errpush(psb_err_duplicate_coo,'vect_asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() call x%sync() end subroutine l_base_asb_e @@ -500,19 +752,22 @@ contains use psb_realloc_mod implicit none class(psb_l_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: info_comm + integer(psb_ipk_), intent(out) :: info info = 0 if (allocated(x%v)) deallocate(x%v, stat=info) if ((info == 0).and.allocated(x%combuf)) call x%free_buffer(info) - if ((info == 0).and.allocated(x%comid)) call x%free_comid(info) + if ((info == 0).and.allocated(x%iv)) deallocate(x%iv, stat=info) + if ((info == 0).and.allocated(x%comm_handle)) then + call psb_comm_free(x%comm_handle, info_comm) + if (info_comm /= psb_success_) info = info_comm + end if if (info /= 0) call & & psb_errpush(psb_err_alloc_dealloc_,'vect_free') - + call x%set_null() end subroutine l_base_free - - ! !> Function base_free_buffer: !! \memberof psb_l_base_vect_type @@ -553,25 +808,104 @@ contains & call x%free_buffer(info) end subroutine l_base_maybe_free_buffer + + function l_base_get_ncfs(x) result(res) + implicit none + class(psb_l_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%ncfs + end function l_base_get_ncfs - ! - !> Function base_free_comid: - !! \memberof psb_l_base_vect_type - !! \brief Free aux MPI communication id buffer - !! - !! \param info return code - !! - ! - subroutine l_base_free_comid(x,info) - use psb_realloc_mod + function l_base_get_dupl(x) result(res) + implicit none + class(psb_l_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%dupl + end function l_base_get_dupl + + function l_base_get_state(x) result(res) + implicit none + class(psb_l_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%bldstate + end function l_base_get_state + + function l_base_is_null(x) result(res) + implicit none + class(psb_l_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_null_) + end function l_base_is_null + + function l_base_is_bld(x) result(res) + implicit none + class(psb_l_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_bld_) + end function l_base_is_bld + + function l_base_is_upd(x) result(res) + implicit none + class(psb_l_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_upd_) + end function l_base_is_upd + + function l_base_is_asb(x) result(res) + implicit none + class(psb_l_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_asb_) + end function l_base_is_asb + + subroutine l_base_set_ncfs(n,x) implicit none class(psb_l_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: n + x%ncfs = n + end subroutine l_base_set_ncfs + + subroutine l_base_set_dupl(n,x) + implicit none + class(psb_l_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%dupl = n + end subroutine l_base_set_dupl + + subroutine l_base_set_state(n,x) + implicit none + class(psb_l_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%bldstate = n + end subroutine l_base_set_state + + subroutine l_base_set_null(x) + implicit none + class(psb_l_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_null_ + end subroutine l_base_set_null + + subroutine l_base_set_bld(x) + implicit none + class(psb_l_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_bld_ + end subroutine l_base_set_bld - if (allocated(x%comid)) & - & deallocate(x%comid,stat=info) - end subroutine l_base_free_comid + subroutine l_base_set_upd(x) + implicit none + class(psb_l_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_upd_ + end subroutine l_base_set_upd + + subroutine l_base_set_asb(x) + implicit none + class(psb_l_base_vect_type), intent(inout) :: x + x%bldstate = psb_vect_asb_ + end subroutine l_base_set_asb ! ! The base version of SYNC & friends does nothing, it's just @@ -667,6 +1001,24 @@ contains res = .true. end function l_base_is_sync + !> Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine l_base_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_l_base_vect_type), intent(in) :: x + class(psb_l_base_vect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine l_base_cpy ! ! Size info. @@ -825,6 +1177,13 @@ contains end subroutine l_base_set_vect + subroutine l_base_check_addr(x) + class(psb_l_base_vect_type), intent(inout) :: x + + write(0,*) 'Check addr: base version, do nothing' + + end subroutine l_base_check_addr + ! @@ -921,17 +1280,6 @@ contains call psb_realloc(n,x%combuf,info) end subroutine l_base_new_buffer - subroutine l_base_new_comid(n,x,info) - use psb_realloc_mod - implicit none - class(psb_l_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n - integer(psb_ipk_), intent(out) :: info - - call psb_realloc(n,2_psb_ipk_,x%comid,info) - end subroutine l_base_new_comid - - ! ! shortcut alpha=1 beta=0 ! @@ -1043,9 +1391,22 @@ module psb_l_base_multivect_mod type psb_l_base_multivect_type !> Values. - integer(psb_lpk_), allocatable :: v(:,:) - integer(psb_lpk_), allocatable :: combuf(:) - integer(psb_mpk_), allocatable :: comid(:,:) + integer(psb_lpk_), allocatable :: v(:,:) + integer(psb_lpk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) contains ! ! Constructors/allocators @@ -1064,6 +1425,22 @@ module psb_l_base_multivect_mod procedure, pass(x) :: zero => l_base_mlv_zero procedure, pass(x) :: asb => l_base_mlv_asb procedure, pass(x) :: free => l_base_mlv_free + procedure, pass(x) :: reinit => l_base_mlv_reinit + procedure, pass(x) :: set_ncfs => l_base_mlv_set_ncfs + procedure, pass(x) :: get_ncfs => l_base_mlv_get_ncfs + procedure, pass(x) :: set_dupl => l_base_mlv_set_dupl + procedure, pass(x) :: get_dupl => l_base_mlv_get_dupl + procedure, pass(x) :: set_state => l_base_mlv_set_state + procedure, pass(x) :: set_null => l_base_mlv_set_null + procedure, pass(x) :: set_bld => l_base_mlv_set_bld + procedure, pass(x) :: set_upd => l_base_mlv_set_upd + procedure, pass(x) :: set_asb => l_base_mlv_set_asb + procedure, pass(x) :: get_state => l_base_mlv_get_state + procedure, pass(x) :: is_null => l_base_mlv_is_null + procedure, pass(x) :: is_bld => l_base_mlv_is_bld + procedure, pass(x) :: is_upd => l_base_mlv_is_upd + procedure, pass(x) :: is_asb => l_base_mlv_is_asb + procedure, pass(x) :: base_cpy => l_base_mlv_cpy ! ! Sync: centerpiece of handling of external storage. ! Any derived class having extra storage upon sync @@ -1104,8 +1481,6 @@ module psb_l_base_multivect_mod procedure, nopass :: device_wait => l_base_mlv_device_wait procedure, pass(x) :: maybe_free_buffer => l_base_mlv_maybe_free_buffer procedure, pass(x) :: free_buffer => l_base_mlv_free_buffer - procedure, pass(x) :: new_comid => l_base_mlv_new_comid - procedure, pass(x) :: free_comid => l_base_mlv_free_comid ! ! Gather/scatter. These are needed for MPI interfacing. @@ -1144,7 +1519,8 @@ contains integer(psb_ipk_) :: info this%v = x - call this%asb(size(x,dim=1,kind=psb_ipk_),size(x,dim=2,kind=psb_ipk_),info) + call this%asb(size(x,dim=1,kind=psb_ipk_),& + & size(x,dim=2,kind=psb_ipk_),info) end function constructor @@ -1194,14 +1570,15 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine l_base_mlv_bld_n(x,m,n) + subroutine l_base_mlv_bld_n(x,m,n,scratch) use psb_realloc_mod integer(psb_ipk_), intent(in) :: m,n class(psb_l_base_multivect_type), intent(inout) :: x integer(psb_ipk_) :: info + logical, intent(in), optional :: scratch call psb_realloc(m,n,x%v,info) - call x%asb(m,n,info) + call x%asb(m,n,info,scratch=scratch) end subroutine l_base_mlv_bld_n @@ -1221,6 +1598,10 @@ contains integer(psb_ipk_), intent(out) :: info call psb_realloc(m,n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if end subroutine l_base_mlv_all @@ -1242,6 +1623,23 @@ contains end subroutine l_base_mlv_mold + subroutine l_base_mlv_reinit(x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_l_base_multivect_type), intent(out) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(x%v)) then + call x%sync() + x%v(:,:) = lzero + call x%set_host() + call x%set_upd() + end if + + end subroutine l_base_mlv_reinit + ! ! Insert a bunch of values at specified positions. ! @@ -1269,57 +1667,123 @@ contains !! \param info return code !! ! - subroutine l_base_mlv_ins(n,irl,val,dupl,x,info) + subroutine l_base_mlv_ins(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_l_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl,maxr integer(psb_ipk_), intent(in) :: irl(:) integer(psb_lpk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_) :: i, isz + integer(psb_ipk_) :: i, isz, nc, dupl_, ncfs_, k info = 0 if (psb_errstatus_fatal()) return - if (.not.allocated(x%v)) then - info = psb_err_invalid_vect_state_ - else if (n > min(size(irl),size(val))) then - info = psb_err_invalid_input_ - - else - isz = size(x%v,1) - select case(dupl) - case(psb_dupl_ovwrt_) + if (try_newins) then + if (x%is_bld()) then + nc = size(x%v,2) + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_realloc(isz,nc,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ do i = 1, n !loop over all val's rows - ! row actual block row - if ((1 <= irl(i)).and.(irl(i) <= isz)) then - ! this row belongs to me - ! copy i-th row of block val in x - x%v(irl(i),:) = val(i,:) - end if - enddo - - case(psb_dupl_add_) - - do i = 1, n - !loop over all val's rows - if ((1 <= irl(i)).and.(irl(i) <= isz)) then + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 ! this row belongs to me ! copy i-th row of block val in x - x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + x%v(k,:) = val(i,:) + x%iv(k) = irl(i) end if enddo - - case default - info = 321 - ! !$ call psb_errpush(info,name) - ! !$ goto 9999 - end select + call x%set_ncfs(k) + + else if (x%is_upd()) then + + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if end if + call x%set_host() if (info /= 0) then call psb_errpush(info,'base_mlv_vect_ins') return @@ -1339,6 +1803,7 @@ contains class(psb_l_base_multivect_type), intent(inout) :: x if (allocated(x%v)) x%v=lzero + call x%set_host() end subroutine l_base_mlv_zero @@ -1357,19 +1822,78 @@ contains !! ! - subroutine l_base_mlv_asb(m,n, x, info) + subroutine l_base_mlv_asb(m,n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: m,n class(psb_l_base_multivect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch - if ((x%get_nrows() < m).or.(x%get_ncols() Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine l_base_mlv_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_l_base_multivect_type), intent(in) :: x + class(psb_l_base_multivect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine l_base_mlv_cpy + ! ! Size info. @@ -1533,7 +2173,7 @@ contains integer(psb_epk_) :: res ! Force 8-byte integers. - res = (1_psb_epk_ * psb_sizeof_ip) * x%get_nrows() * x%get_ncols() + res = (1_psb_epk_ * psb_sizeof_lp) * x%get_nrows() * x%get_ncols() end function l_base_mlv_sizeof @@ -1638,16 +2278,6 @@ contains call psb_realloc(n*nc,x%combuf,info) end subroutine l_base_mlv_new_buffer - subroutine l_base_mlv_new_comid(n,x,info) - use psb_realloc_mod - implicit none - class(psb_l_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n - integer(psb_ipk_), intent(out) :: info - - call psb_realloc(n,2_psb_ipk_,x%comid,info) - end subroutine l_base_mlv_new_comid - subroutine l_base_mlv_maybe_free_buffer(x,info) use psb_realloc_mod @@ -1672,17 +2302,6 @@ contains & deallocate(x%combuf,stat=info) end subroutine l_base_mlv_free_buffer - subroutine l_base_mlv_free_comid(x,info) - use psb_realloc_mod - implicit none - class(psb_l_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - - if (allocated(x%comid)) & - & deallocate(x%comid,stat=info) - end subroutine l_base_mlv_free_comid - - ! ! Gather: Y = beta * Y + alpha * X(IDX(:)) ! diff --git a/base/modules/serial/psb_l_vect_mod.F90 b/base/modules/serial/psb_l_vect_mod.F90 index 6936e75f4..d876d21ee 100644 --- a/base/modules/serial/psb_l_vect_mod.F90 +++ b/base/modules/serial/psb_l_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -56,14 +56,28 @@ module psb_l_vect_mod procedure, pass(x) :: get_fmt => l_vect_get_fmt procedure, pass(x) :: is_remote_build => l_vect_is_remote_build procedure, pass(x) :: set_remote_build => l_vect_set_remote_build - procedure, pass(x) :: get_dupl => l_vect_get_dupl - procedure, pass(x) :: set_dupl => l_vect_set_dupl procedure, pass(x) :: get_nrmv => l_vect_get_nrmv procedure, pass(x) :: set_nrmv => l_vect_set_nrmv procedure, pass(x) :: all => l_vect_all procedure, pass(x) :: reall => l_vect_reall procedure, pass(x) :: zero => l_vect_zero procedure, pass(x) :: asb => l_vect_asb + procedure, pass(x) :: set_dupl => l_vect_set_dupl + procedure, pass(x) :: get_dupl => l_vect_get_dupl + procedure, pass(x) :: set_ncfs => l_vect_set_ncfs + procedure, pass(x) :: get_ncfs => l_vect_get_ncfs + procedure, pass(x) :: set_state => l_vect_set_state + procedure, pass(x) :: set_null => l_vect_set_null + procedure, pass(x) :: set_bld => l_vect_set_bld + procedure, pass(x) :: set_upd => l_vect_set_upd + procedure, pass(x) :: set_asb => l_vect_set_asb + procedure, pass(x) :: get_state => l_vect_get_state + procedure, pass(x) :: is_null => l_vect_is_null + procedure, pass(x) :: is_bld => l_vect_is_bld + procedure, pass(x) :: is_upd => l_vect_is_upd + procedure, pass(x) :: is_asb => l_vect_is_asb + procedure, pass(x) :: reinit => l_vect_reinit + procedure, pass(x) :: gthab => l_vect_gthab procedure, pass(x) :: gthzv => l_vect_gthzv generic, public :: gth => gthab, gthzv @@ -91,6 +105,7 @@ module psb_l_vect_mod procedure, pass(x) :: set_host => l_vect_set_host procedure, pass(x) :: set_dev => l_vect_set_dev procedure, pass(x) :: set_sync => l_vect_set_sync + procedure, pass(x) :: check_addr => l_vect_check_addr @@ -133,7 +148,11 @@ contains implicit none class(psb_l_vect_type), intent(in) :: x integer(psb_ipk_) :: res - res = x%dupl + if (allocated(x%v)) then + res = x%v%get_dupl() + else + res = psb_dupl_null_ + end if end function l_vect_get_dupl subroutine l_vect_set_dupl(x,val) @@ -141,13 +160,117 @@ contains class(psb_l_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in), optional :: val - if (present(val)) then - x%dupl = val - else - x%dupl = psb_dupl_def_ + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_dupl(val) + else + call x%v%set_dupl(psb_dupl_def_) + end if end if end subroutine l_vect_set_dupl + function l_vect_get_ncfs(x) result(res) + implicit none + class(psb_l_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_ncfs() + else + res = 0 + end if + end function l_vect_get_ncfs + + subroutine l_vect_set_ncfs(x,val) + implicit none + class(psb_l_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in), optional :: val + + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_ncfs(val) + else + call x%v%set_ncfs(0) + end if + end if + end subroutine l_vect_set_ncfs + + function l_vect_get_state(x) result(res) + implicit none + class(psb_l_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_state() + else + res = psb_vect_null_ + end if + end function l_vect_get_state + + function l_vect_is_null(x) result(res) + implicit none + class(psb_l_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_null_) + end function l_vect_is_null + + function l_vect_is_bld(x) result(res) + implicit none + class(psb_l_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_bld_) + end function l_vect_is_bld + + function l_vect_is_upd(x) result(res) + implicit none + class(psb_l_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_upd_) + end function l_vect_is_upd + + function l_vect_is_asb(x) result(res) + implicit none + class(psb_l_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_asb_) + end function l_vect_is_asb + + subroutine l_vect_set_state(n,x) + implicit none + class(psb_l_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + if (allocated(x%v)) then + call x%v%set_state(n) + end if + end subroutine l_vect_set_state + + + subroutine l_vect_set_null(x) + implicit none + class(psb_l_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_null_) + end subroutine l_vect_set_null + + subroutine l_vect_set_bld(x) + implicit none + class(psb_l_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_bld_) + end subroutine l_vect_set_bld + + subroutine l_vect_set_upd(x) + implicit none + class(psb_l_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_upd_) + end subroutine l_vect_set_upd + + subroutine l_vect_set_asb(x) + implicit none + class(psb_l_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_asb_) + end subroutine l_vect_set_asb + function l_vect_get_nrmv(x) result(res) implicit none class(psb_l_vect_type), intent(in) :: x @@ -162,7 +285,6 @@ contains x%nrmv = val end subroutine l_vect_set_nrmv - function l_vect_is_remote_build(x) result(res) implicit none @@ -233,16 +355,31 @@ contains info = psb_success_ call y%free(info) if ((info==0).and.allocated(x%v)) then + ! + ! Using sourced allocation here creates + ! problems with handling of memory allocated + ! elsewhere (e.g. accelerators), hence delegation + ! to %bld method + ! call y%bld(x%get_vect(),mold=x%v) end if end subroutine l_vect_clone - subroutine l_vect_bld_x(x,invect,mold) + subroutine l_vect_bld_x(x,invect,mold,scratch) integer(psb_lpk_), intent(in) :: invect(:) class(psb_l_vect_type), intent(inout) :: x class(psb_l_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + info = psb_success_ if (allocated(x%v)) & & call x%free(info) @@ -253,17 +390,25 @@ contains allocate(x%v,stat=info, mold=psb_l_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(invect) + if (info == psb_success_) call x%v%bld(invect,scratch=scratch_) end subroutine l_vect_bld_x - subroutine l_vect_bld_mn(x,n,mold) + subroutine l_vect_bld_mn(x,n,mold,scratch) integer(psb_mpk_), intent(in) :: n class(psb_l_vect_type), intent(inout) :: x class(psb_l_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info class(psb_l_base_vect_type), pointer :: mld + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if info = psb_success_ if (allocated(x%v)) & @@ -274,17 +419,25 @@ contains else allocate(x%v,stat=info, mold=psb_l_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(n) + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) end subroutine l_vect_bld_mn - subroutine l_vect_bld_en(x,n,mold) + subroutine l_vect_bld_en(x,n,mold,scratch) integer(psb_epk_), intent(in) :: n class(psb_l_vect_type), intent(inout) :: x class(psb_l_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (allocated(x%v)) & & call x%free(info) @@ -294,7 +447,7 @@ contains else allocate(x%v,stat=info, mold=psb_l_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(n) + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) end subroutine l_vect_bld_en @@ -329,6 +482,13 @@ contains end subroutine l_vect_set_vect + subroutine l_vect_check_addr(x) + class(psb_l_vect_type), intent(inout) :: x + + integer(psb_ipk_) :: info + if (allocated(x%v)) call x%v%check_addr() + + end subroutine l_vect_check_addr function constructor(x) result(this) integer(psb_lpk_) :: x(:) @@ -396,8 +556,20 @@ contains else info = psb_err_alloc_dealloc_ end if + call x%set_bld() end subroutine l_vect_all + subroutine l_vect_reinit(x, info, clear) + implicit none + class(psb_l_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + + if (allocated(x%v)) call x%v%reinit(info,clear) + call x%set_upd() + + end subroutine l_vect_reinit + subroutine l_vect_reall(n, x, info) implicit none @@ -422,16 +594,18 @@ contains end subroutine l_vect_zero - subroutine l_vect_asb(n, x, info) + subroutine l_vect_asb(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: n class(psb_l_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch if (allocated(x%v)) then - call x%v%asb(n,info) + call x%v%asb(n,info,scratch=scratch) + call x%set_asb() end if end subroutine l_vect_asb @@ -486,11 +660,11 @@ contains end subroutine l_vect_free - subroutine l_vect_ins_a(n,irl,val,x,info) + subroutine l_vect_ins_a(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_l_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n, maxr integer(psb_ipk_), intent(in) :: irl(:) integer(psb_lpk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info @@ -503,15 +677,15 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl,val,dupl,info) + call x%v%ins(n,irl,val,dupl,maxr,info) end subroutine l_vect_ins_a - subroutine l_vect_ins_v(n,irl,val,x,info) + subroutine l_vect_ins_v(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_l_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n, maxr class(psb_i_vect_type), intent(inout) :: irl class(psb_l_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -524,7 +698,7 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl%v,val%v,dupl,info) + call x%v%ins(n,irl%v,val%v,dupl,maxr,info) end subroutine l_vect_ins_v @@ -546,6 +720,7 @@ contains if (allocated(x%v%v)) then call x%v%sync() if (info == psb_success_) call tmp%bld(x%v%v) + call x%v%base_cpy(tmp) call x%v%free(info) endif end if @@ -809,19 +984,20 @@ contains end subroutine l_mvect_bld_x - subroutine l_mvect_bld_n(x,m,n,mold) + subroutine l_mvect_bld_n(x,m,n,mold,scratch) integer(psb_ipk_), intent(in) :: m,n class(psb_l_multivect_type), intent(out) :: x class(psb_l_base_multivect_type), intent(in), optional :: mold integer(psb_ipk_) :: info - + logical, intent(in), optional :: scratch + info = psb_success_ if (present(mold)) then allocate(x%v,stat=info,mold=mold) else allocate(x%v,stat=info, mold=psb_l_get_base_multivect_default()) endif - if (info == psb_success_) call x%v%bld(m,n) + if (info == psb_success_) call x%v%bld(m,n,scratch=scratch) end subroutine l_mvect_bld_n @@ -1051,11 +1227,11 @@ contains end subroutine l_mvect_free - subroutine l_mvect_ins(n,irl,val,x,info) + subroutine l_mvect_ins(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_l_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n,maxr integer(psb_ipk_), intent(in) :: irl(:) integer(psb_lpk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(out) :: info @@ -1068,7 +1244,7 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl,val,dupl,info) + call x%v%ins(n,irl,val,dupl,maxr,info) end subroutine l_mvect_ins @@ -1094,3 +1270,4 @@ contains end module psb_l_multivect_mod + diff --git a/base/modules/serial/psb_s_base_mat_mod.F90 b/base/modules/serial/psb_s_base_mat_mod.F90 index 27803e0fb..9f787856e 100644 --- a/base/modules/serial/psb_s_base_mat_mod.F90 +++ b/base/modules/serial/psb_s_base_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/serial/psb_s_base_vect_mod.F90 b/base/modules/serial/psb_s_base_vect_mod.F90 index 702a1af35..ddc9207d0 100644 --- a/base/modules/serial/psb_s_base_vect_mod.F90 +++ b/base/modules/serial/psb_s_base_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -33,7 +33,7 @@ ! package: psb_s_base_vect_mod ! ! This module contains the definition of the psb_s_base_vect type which -! is a container for dense vectors. +! is a container for dense vectors.\ ! This is encapsulated instead of being just a simple array to allow for ! more complicated situations, such as GPU programming, where the memory ! area we are interested in is not easily accessible from the host/Fortran @@ -47,6 +47,8 @@ module psb_s_base_vect_mod use psb_const_mod use psb_error_mod use psb_realloc_mod + use psb_comm_schemes_mod, only: psb_comm_handle_type, psb_comm_isend_irecv_, psb_comm_unknown_ + use psb_comm_factory_mod, only: psb_comm_set, psb_comm_free use psb_i_base_vect_mod use psb_l_base_vect_mod @@ -62,9 +64,22 @@ module psb_s_base_vect_mod !! type psb_s_base_vect_type !> Values. - real(psb_spk_), allocatable :: v(:) - real(psb_spk_), allocatable :: combuf(:) - integer(psb_mpk_), allocatable :: comid(:,:) + real(psb_spk_), allocatable :: v(:) + real(psb_spk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) contains ! ! Constructors/allocators @@ -88,6 +103,22 @@ module psb_s_base_vect_mod procedure, pass(x) :: asb_e => s_base_asb_e generic, public :: asb => asb_m, asb_e procedure, pass(x) :: free => s_base_free + procedure, pass(x) :: reinit => s_base_reinit + procedure, pass(x) :: set_ncfs => s_base_set_ncfs + procedure, pass(x) :: get_ncfs => s_base_get_ncfs + procedure, pass(x) :: set_dupl => s_base_set_dupl + procedure, pass(x) :: get_dupl => s_base_get_dupl + procedure, pass(x) :: set_state => s_base_set_state + procedure, pass(x) :: set_null => s_base_set_null + procedure, pass(x) :: set_bld => s_base_set_bld + procedure, pass(x) :: set_upd => s_base_set_upd + procedure, pass(x) :: set_asb => s_base_set_asb + procedure, pass(x) :: get_state => s_base_get_state + procedure, pass(x) :: is_null => s_base_is_null + procedure, pass(x) :: is_bld => s_base_is_bld + procedure, pass(x) :: is_upd => s_base_is_upd + procedure, pass(x) :: is_asb => s_base_is_asb + procedure, pass(x) :: base_cpy => s_base_cpy ! ! Sync: centerpiece of handling of external storage. ! Any derived class having extra storage upon sync @@ -112,9 +143,7 @@ module psb_s_base_vect_mod procedure, nopass :: device_wait => s_base_device_wait procedure, pass(x) :: maybe_free_buffer => s_base_maybe_free_buffer procedure, pass(x) :: free_buffer => s_base_free_buffer - procedure, pass(x) :: new_comid => s_base_new_comid - procedure, pass(x) :: free_comid => s_base_free_comid - + ! ! Basic info procedure, pass(x) :: get_nrows => s_base_get_nrows @@ -129,6 +158,7 @@ module psb_s_base_vect_mod procedure, pass(x) :: set_vect => s_base_set_vect generic, public :: set => set_vect, set_scal procedure, pass(x) :: get_entry=> s_base_get_entry + procedure, pass(x) :: set_entry=> s_base_set_entry ! ! Gather/scatter. These are needed for MPI interfacing. ! May have to be reworked. @@ -143,6 +173,9 @@ module psb_s_base_vect_mod procedure, pass(y) :: sctb_buf => s_base_sctb_buf generic, public :: sct => sctb, sctb_x, sctb_buf + procedure, pass(x) :: check_addr => s_base_check_addr + + ! ! Dot product and AXPBY @@ -218,8 +251,6 @@ module psb_s_base_vect_mod procedure, pass(x) :: minquotient_a2 => s_base_minquotient_a2 generic, public :: minquotient => minquotient_v, minquotient_a2 - - end type psb_s_base_vect_type public :: psb_s_base_vect @@ -270,14 +301,22 @@ contains !! \brief Build method from an array !! \param x(:) input array to be copied !! - subroutine s_base_bld_x(x,this) + subroutine s_base_bld_x(x,this,scratch) use psb_realloc_mod implicit none real(psb_spk_), intent(in) :: this(:) class(psb_s_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info integer(psb_ipk_) :: i + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(size(this),x%v,info) if (info /= 0) then call psb_errpush(psb_err_alloc_dealloc_,'base_vect_bld') @@ -302,15 +341,23 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine s_base_bld_mn(x,n) + subroutine s_base_bld_mn(x,n,scratch) use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_s_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(n,x%v,info) - call x%asb(n,info) + call x%asb(n,info,scratch=scratch_) end subroutine s_base_bld_mn @@ -319,15 +366,23 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine s_base_bld_en(x,n) + subroutine s_base_bld_en(x,n,scratch) use psb_realloc_mod implicit none integer(psb_epk_), intent(in) :: n class(psb_s_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(n,x%v,info) - call x%asb(n,info) + call x%asb(n,info,scratch=scratch_) end subroutine s_base_bld_en @@ -347,6 +402,10 @@ contains integer(psb_ipk_), intent(out) :: info call psb_realloc(n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if end subroutine s_base_all @@ -368,6 +427,31 @@ contains end subroutine s_base_mold + subroutine s_base_reinit(x, info,clear) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_s_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + logical :: clear_ + + info = 0 + if (present(clear)) then + clear_ = clear + else + clear_ = .true. + end if + + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + if (clear_) x%v(:) = szero + call x%set_host() + call x%set_upd() + end if + + end subroutine s_base_reinit + ! ! Insert a bunch of values at specified positions. ! @@ -395,55 +479,118 @@ contains !! \param info return code !! ! - subroutine s_base_ins_a(n,irl,val,dupl,x,info) + subroutine s_base_ins_a(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_s_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr integer(psb_ipk_), intent(in) :: irl(:) real(psb_spk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_) :: i, isz + integer(psb_ipk_) :: i, isz, dupl_, ncfs_, k info = 0 if (psb_errstatus_fatal()) return - if (.not.allocated(x%v)) then - info = psb_err_invalid_vect_state_ - else if (n > min(size(irl),size(val))) then - info = psb_err_invalid_input_ - - else - isz = size(x%v) - select case(dupl) - case(psb_dupl_ovwrt_) + if (try_newins) then + if (x%is_bld()) then + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_ensure_size(isz,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ do i = 1, n !loop over all val's rows ! row actual block row - if ((1 <= irl(i)).and.(irl(i) <= isz)) then + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 ! this row belongs to me ! copy i-th row of block val in x - x%v(irl(i)) = val(i) + x%v(k) = val(i) + x%iv(k) = irl(i) end if enddo + call x%set_ncfs(k) - case(psb_dupl_add_) + else if (x%is_upd()) then - do i = 1, n - !loop over all val's rows - if ((1 <= irl(i)).and.(irl(i) <= isz)) then - ! this row belongs to me - ! copy i-th row of block val in x - x%v(irl(i)) = x%v(irl(i)) + val(i) - end if - enddo + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ - case default - info = 321 - ! !$ call psb_errpush(info,name) - ! !$ goto 9999 - end select + else + isz = size(x%v) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if end if call x%set_host() if (info /= 0) then @@ -453,11 +600,11 @@ contains end subroutine s_base_ins_a - subroutine s_base_ins_v(n,irl,val,dupl,x,info) + subroutine s_base_ins_v(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_s_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr class(psb_i_base_vect_type), intent(inout) :: irl class(psb_s_base_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -470,7 +617,7 @@ contains if (irl%is_dev()) call irl%sync() if (val%is_dev()) call val%sync() if (x%is_dev()) call x%sync() - call x%ins(n,irl%v,val%v,dupl,info) + call x%ins(n,irl%v,val%v,dupl,maxr,info) if (info /= 0) then call psb_errpush(info,'base_vect_ins') @@ -514,19 +661,72 @@ contains !! ! - subroutine s_base_asb_m(n, x, info) + subroutine s_base_asb_m(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_s_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + real(psb_spk_), allocatable :: vv(:) info = 0 - if (x%get_nrows() < n) & - & call psb_realloc(n,x%v,info) - if (info /= 0) & - & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (x%is_bld()) then + ncfs = x%get_ncfs() + xvsz = psb_size(x%v) + call psb_realloc(n,vv,info) + vv(:) = szero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,ncfs + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,ncfs + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,ncfs + if (vv(x%iv(i)).ne. szero) then + call psb_errpush(psb_err_duplicate_coo,'vect-asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() call x%sync() end subroutine s_base_asb_m @@ -544,19 +744,72 @@ contains !! ! - subroutine s_base_asb_e(n, x, info) + subroutine s_base_asb_e(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_epk_), intent(in) :: n class(psb_s_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + real(psb_spk_), allocatable :: vv(:) info = 0 - if (x%get_nrows() < n) & - & call psb_realloc(n,x%v,info) - if (info /= 0) & - & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb unhandled') + if (x%is_bld()) then + call psb_realloc(n,vv,info) + vv(:) = szero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,x%get_ncfs() + if (vv(x%iv(i)).ne. szero) then + call psb_errpush(psb_err_duplicate_coo,'vect_asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() call x%sync() end subroutine s_base_asb_e @@ -573,19 +826,22 @@ contains use psb_realloc_mod implicit none class(psb_s_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: info_comm + integer(psb_ipk_), intent(out) :: info info = 0 if (allocated(x%v)) deallocate(x%v, stat=info) if ((info == 0).and.allocated(x%combuf)) call x%free_buffer(info) - if ((info == 0).and.allocated(x%comid)) call x%free_comid(info) + if ((info == 0).and.allocated(x%iv)) deallocate(x%iv, stat=info) + if ((info == 0).and.allocated(x%comm_handle)) then + call psb_comm_free(x%comm_handle, info_comm) + if (info_comm /= psb_success_) info = info_comm + end if if (info /= 0) call & & psb_errpush(psb_err_alloc_dealloc_,'vect_free') - + call x%set_null() end subroutine s_base_free - - ! !> Function base_free_buffer: !! \memberof psb_s_base_vect_type @@ -626,25 +882,104 @@ contains & call x%free_buffer(info) end subroutine s_base_maybe_free_buffer + + function s_base_get_ncfs(x) result(res) + implicit none + class(psb_s_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%ncfs + end function s_base_get_ncfs - ! - !> Function base_free_comid: - !! \memberof psb_s_base_vect_type - !! \brief Free aux MPI communication id buffer - !! - !! \param info return code - !! - ! - subroutine s_base_free_comid(x,info) - use psb_realloc_mod + function s_base_get_dupl(x) result(res) + implicit none + class(psb_s_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%dupl + end function s_base_get_dupl + + function s_base_get_state(x) result(res) + implicit none + class(psb_s_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%bldstate + end function s_base_get_state + + function s_base_is_null(x) result(res) + implicit none + class(psb_s_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_null_) + end function s_base_is_null + + function s_base_is_bld(x) result(res) + implicit none + class(psb_s_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_bld_) + end function s_base_is_bld + + function s_base_is_upd(x) result(res) + implicit none + class(psb_s_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_upd_) + end function s_base_is_upd + + function s_base_is_asb(x) result(res) + implicit none + class(psb_s_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_asb_) + end function s_base_is_asb + + subroutine s_base_set_ncfs(n,x) implicit none class(psb_s_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: n + x%ncfs = n + end subroutine s_base_set_ncfs + + subroutine s_base_set_dupl(n,x) + implicit none + class(psb_s_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%dupl = n + end subroutine s_base_set_dupl + + subroutine s_base_set_state(n,x) + implicit none + class(psb_s_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%bldstate = n + end subroutine s_base_set_state + + subroutine s_base_set_null(x) + implicit none + class(psb_s_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_null_ + end subroutine s_base_set_null + + subroutine s_base_set_bld(x) + implicit none + class(psb_s_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_bld_ + end subroutine s_base_set_bld + + subroutine s_base_set_upd(x) + implicit none + class(psb_s_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_upd_ + end subroutine s_base_set_upd - if (allocated(x%comid)) & - & deallocate(x%comid,stat=info) - end subroutine s_base_free_comid + subroutine s_base_set_asb(x) + implicit none + class(psb_s_base_vect_type), intent(inout) :: x + x%bldstate = psb_vect_asb_ + end subroutine s_base_set_asb ! ! The base version of SYNC & friends does nothing, it's just @@ -740,6 +1075,24 @@ contains res = .true. end function s_base_is_sync + !> Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine s_base_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_s_base_vect_type), intent(in) :: x + class(psb_s_base_vect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine s_base_cpy ! ! Size info. @@ -898,6 +1251,13 @@ contains end subroutine s_base_set_vect + subroutine s_base_check_addr(x) + class(psb_s_base_vect_type), intent(inout) :: x + + write(0,*) 'Check addr: base version, do nothing' + + end subroutine s_base_check_addr + ! ! Get entry. @@ -910,15 +1270,33 @@ contains ! function s_base_get_entry(x, index) result(res) implicit none - class(psb_s_base_vect_type), intent(in) :: x + class(psb_s_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in) :: index real(psb_spk_) :: res res = 0 - if (allocated(x%v)) res = x%v(index) + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + res = x%v(index) + end if end function s_base_get_entry + subroutine s_base_set_entry(x, index, val) + implicit none + class(psb_s_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: index + real(psb_spk_) :: val + + + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + x%v(index) =val + call x%set_host() + end if + + end subroutine s_base_set_entry + ! ! Overwrite with absolute value ! @@ -1817,6 +2195,10 @@ contains res = min(res,abs(x%v(i))) end do #else + ! + ! From M&R&C: if the array is of size zero, MINVAL + ! returns the largest positive value + ! res = minval(x%v(1:n)) #endif end function s_base_min @@ -1997,17 +2379,6 @@ contains call psb_realloc(n,x%combuf,info) end subroutine s_base_new_buffer - subroutine s_base_new_comid(n,x,info) - use psb_realloc_mod - implicit none - class(psb_s_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n - integer(psb_ipk_), intent(out) :: info - - call psb_realloc(n,2_psb_ipk_,x%comid,info) - end subroutine s_base_new_comid - - ! ! shortcut alpha=1 beta=0 ! @@ -2263,9 +2634,22 @@ module psb_s_base_multivect_mod type psb_s_base_multivect_type !> Values. - real(psb_spk_), allocatable :: v(:,:) - real(psb_spk_), allocatable :: combuf(:) - integer(psb_mpk_), allocatable :: comid(:,:) + real(psb_spk_), allocatable :: v(:,:) + real(psb_spk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) contains ! ! Constructors/allocators @@ -2284,6 +2668,22 @@ module psb_s_base_multivect_mod procedure, pass(x) :: zero => s_base_mlv_zero procedure, pass(x) :: asb => s_base_mlv_asb procedure, pass(x) :: free => s_base_mlv_free + procedure, pass(x) :: reinit => s_base_mlv_reinit + procedure, pass(x) :: set_ncfs => s_base_mlv_set_ncfs + procedure, pass(x) :: get_ncfs => s_base_mlv_get_ncfs + procedure, pass(x) :: set_dupl => s_base_mlv_set_dupl + procedure, pass(x) :: get_dupl => s_base_mlv_get_dupl + procedure, pass(x) :: set_state => s_base_mlv_set_state + procedure, pass(x) :: set_null => s_base_mlv_set_null + procedure, pass(x) :: set_bld => s_base_mlv_set_bld + procedure, pass(x) :: set_upd => s_base_mlv_set_upd + procedure, pass(x) :: set_asb => s_base_mlv_set_asb + procedure, pass(x) :: get_state => s_base_mlv_get_state + procedure, pass(x) :: is_null => s_base_mlv_is_null + procedure, pass(x) :: is_bld => s_base_mlv_is_bld + procedure, pass(x) :: is_upd => s_base_mlv_is_upd + procedure, pass(x) :: is_asb => s_base_mlv_is_asb + procedure, pass(x) :: base_cpy => s_base_mlv_cpy ! ! Sync: centerpiece of handling of external storage. ! Any derived class having extra storage upon sync @@ -2357,8 +2757,6 @@ module psb_s_base_multivect_mod procedure, nopass :: device_wait => s_base_mlv_device_wait procedure, pass(x) :: maybe_free_buffer => s_base_mlv_maybe_free_buffer procedure, pass(x) :: free_buffer => s_base_mlv_free_buffer - procedure, pass(x) :: new_comid => s_base_mlv_new_comid - procedure, pass(x) :: free_comid => s_base_mlv_free_comid ! ! Gather/scatter. These are needed for MPI interfacing. @@ -2397,7 +2795,8 @@ contains integer(psb_ipk_) :: info this%v = x - call this%asb(size(x,dim=1,kind=psb_ipk_),size(x,dim=2,kind=psb_ipk_),info) + call this%asb(size(x,dim=1,kind=psb_ipk_),& + & size(x,dim=2,kind=psb_ipk_),info) end function constructor @@ -2447,14 +2846,15 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine s_base_mlv_bld_n(x,m,n) + subroutine s_base_mlv_bld_n(x,m,n,scratch) use psb_realloc_mod integer(psb_ipk_), intent(in) :: m,n class(psb_s_base_multivect_type), intent(inout) :: x integer(psb_ipk_) :: info + logical, intent(in), optional :: scratch call psb_realloc(m,n,x%v,info) - call x%asb(m,n,info) + call x%asb(m,n,info,scratch=scratch) end subroutine s_base_mlv_bld_n @@ -2474,6 +2874,10 @@ contains integer(psb_ipk_), intent(out) :: info call psb_realloc(m,n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if end subroutine s_base_mlv_all @@ -2495,6 +2899,23 @@ contains end subroutine s_base_mlv_mold + subroutine s_base_mlv_reinit(x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_s_base_multivect_type), intent(out) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(x%v)) then + call x%sync() + x%v(:,:) = szero + call x%set_host() + call x%set_upd() + end if + + end subroutine s_base_mlv_reinit + ! ! Insert a bunch of values at specified positions. ! @@ -2522,57 +2943,123 @@ contains !! \param info return code !! ! - subroutine s_base_mlv_ins(n,irl,val,dupl,x,info) + subroutine s_base_mlv_ins(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_s_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl,maxr integer(psb_ipk_), intent(in) :: irl(:) real(psb_spk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_) :: i, isz + integer(psb_ipk_) :: i, isz, nc, dupl_, ncfs_, k info = 0 if (psb_errstatus_fatal()) return - if (.not.allocated(x%v)) then - info = psb_err_invalid_vect_state_ - else if (n > min(size(irl),size(val))) then - info = psb_err_invalid_input_ - - else - isz = size(x%v,1) - select case(dupl) - case(psb_dupl_ovwrt_) + if (try_newins) then + if (x%is_bld()) then + nc = size(x%v,2) + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_realloc(isz,nc,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ do i = 1, n !loop over all val's rows - ! row actual block row - if ((1 <= irl(i)).and.(irl(i) <= isz)) then + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 ! this row belongs to me ! copy i-th row of block val in x - x%v(irl(i),:) = val(i,:) + x%v(k,:) = val(i,:) + x%iv(k) = irl(i) end if enddo + call x%set_ncfs(k) - case(psb_dupl_add_) + else if (x%is_upd()) then - do i = 1, n - !loop over all val's rows - if ((1 <= irl(i)).and.(irl(i) <= isz)) then - ! this row belongs to me - ! copy i-th row of block val in x - x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) - end if - enddo + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ - case default - info = 321 - ! !$ call psb_errpush(info,name) - ! !$ goto 9999 - end select + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if end if + call x%set_host() if (info /= 0) then call psb_errpush(info,'base_mlv_vect_ins') return @@ -2592,6 +3079,7 @@ contains class(psb_s_base_multivect_type), intent(inout) :: x if (allocated(x%v)) x%v=szero + call x%set_host() end subroutine s_base_mlv_zero @@ -2610,19 +3098,78 @@ contains !! ! - subroutine s_base_mlv_asb(m,n, x, info) + subroutine s_base_mlv_asb(m,n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: m,n class(psb_s_base_multivect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch - if ((x%get_nrows() < m).or.(x%get_ncols() Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine s_base_mlv_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_s_base_multivect_type), intent(in) :: x + class(psb_s_base_multivect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine s_base_mlv_cpy + ! ! Size info. @@ -2786,7 +3449,7 @@ contains integer(psb_epk_) :: res ! Force 8-byte integers. - res = (1_psb_epk_ * psb_sizeof_ip) * x%get_nrows() * x%get_ncols() + res = (1_psb_epk_ * psb_sizeof_sp) * x%get_nrows() * x%get_ncols() end function s_base_mlv_sizeof @@ -3373,16 +4036,6 @@ contains call psb_realloc(n*nc,x%combuf,info) end subroutine s_base_mlv_new_buffer - subroutine s_base_mlv_new_comid(n,x,info) - use psb_realloc_mod - implicit none - class(psb_s_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n - integer(psb_ipk_), intent(out) :: info - - call psb_realloc(n,2_psb_ipk_,x%comid,info) - end subroutine s_base_mlv_new_comid - subroutine s_base_mlv_maybe_free_buffer(x,info) use psb_realloc_mod @@ -3407,17 +4060,6 @@ contains & deallocate(x%combuf,stat=info) end subroutine s_base_mlv_free_buffer - subroutine s_base_mlv_free_comid(x,info) - use psb_realloc_mod - implicit none - class(psb_s_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - - if (allocated(x%comid)) & - & deallocate(x%comid,stat=info) - end subroutine s_base_mlv_free_comid - - ! ! Gather: Y = beta * Y + alpha * X(IDX(:)) ! diff --git a/base/modules/serial/psb_s_csc_mat_mod.f90 b/base/modules/serial/psb_s_csc_mat_mod.f90 index db8746003..c91ecb7ce 100644 --- a/base/modules/serial/psb_s_csc_mat_mod.f90 +++ b/base/modules/serial/psb_s_csc_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -912,6 +912,23 @@ module psb_s_csc_mat_mod end subroutine psb_ls_csc_scals end interface + interface + subroutine psb_scscspspmm(a,b,c,info) + import + implicit none + class(psb_s_csc_sparse_mat), intent(in) :: a,b + type(psb_s_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_scscspspmm + subroutine psb_lscscspspmm(a,b,c,info) + import + implicit none + class(psb_ls_csc_sparse_mat), intent(in) :: a,b + type(psb_ls_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lscscspspmm + end interface + contains ! == =================================== diff --git a/base/modules/serial/psb_s_csr_mat_mod.f90 b/base/modules/serial/psb_s_csr_mat_mod.f90 index 356e5b325..d9318aef7 100644 --- a/base/modules/serial/psb_s_csr_mat_mod.f90 +++ b/base/modules/serial/psb_s_csr_mat_mod.f90 @@ -15,7 +15,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -1162,6 +1162,23 @@ module psb_s_csr_mat_mod end subroutine psb_ls_csr_aclsum end interface + ! Interfaces for SPSPMM + interface + subroutine psb_scsrspspmm(a,b,c,info) + import + implicit none + class(psb_s_csr_sparse_mat), intent(in) :: a,b + type(psb_s_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_scsrspspmm + subroutine psb_lscsrspspmm(a,b,c,info) + import + implicit none + class(psb_ls_csr_sparse_mat), intent(in) :: a,b + type(psb_ls_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lscsrspspmm + end interface contains diff --git a/base/modules/serial/psb_s_mat_mod.F90 b/base/modules/serial/psb_s_mat_mod.F90 index e342ed8cc..5fe57038d 100644 --- a/base/modules/serial/psb_s_mat_mod.F90 +++ b/base/modules/serial/psb_s_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -78,6 +78,8 @@ ! module psb_s_mat_mod + use psb_s_vect_mod + use psb_i_vect_mod use psb_s_base_mat_mod use psb_s_csr_mat_mod, only : psb_s_csr_sparse_mat, psb_ls_csr_sparse_mat,& & psb_s_ecsr_sparse_mat @@ -661,9 +663,8 @@ module psb_s_mat_mod interface subroutine psb_s_csput_v(nz,ia,ja,val,a,imin,imax,jmin,jmax,info) - use psb_s_vect_mod, only : psb_s_vect_type - use psb_i_vect_mod, only : psb_i_vect_type - import :: psb_ipk_, psb_lpk_, psb_sspmat_type + import :: psb_ipk_, psb_lpk_, psb_sspmat_type, & + & psb_s_vect_type, psb_i_vect_type class(psb_sspmat_type), intent(inout) :: a type(psb_s_vect_type), intent(inout) :: val type(psb_i_vect_type), intent(inout) :: ia, ja diff --git a/base/modules/serial/psb_s_serial_mod.f90 b/base/modules/serial/psb_s_serial_mod.f90 index 81583f64e..f0e5475fe 100644 --- a/base/modules/serial/psb_s_serial_mod.f90 +++ b/base/modules/serial/psb_s_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -60,24 +60,8 @@ module psb_s_serial_mod type(psb_sspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_sspspmm - subroutine psb_scsrspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_s_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_s_csr_sparse_mat), intent(in) :: a,b - type(psb_s_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_scsrspspmm - subroutine psb_scscspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_s_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_s_csc_sparse_mat), intent(in) :: a,b - type(psb_s_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_scscspspmm - end interface - + end interface psb_spspmm + interface psb_symbmm subroutine psb_ssymbmm(a,b,c,info) use psb_s_mat_mod, only : psb_sspmat_type @@ -114,6 +98,16 @@ module psb_s_serial_mod end subroutine psb_sbase_numbmm end interface psb_numbmm + interface psb_aplusat + subroutine psb_saplusat(ain,aout,info) + use psb_s_mat_mod, only : psb_sspmat_type + import :: psb_ipk_ + implicit none + type(psb_sspmat_type) :: ain, aout + integer(psb_ipk_) :: info + end subroutine psb_saplusat + end interface + interface psb_rwextd subroutine psb_srwextd(nr,a,info,b,rowscale) use psb_s_mat_mod, only : psb_sspmat_type @@ -232,22 +226,6 @@ module psb_s_serial_mod type(psb_lsspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_lsspspmm - subroutine psb_lscsrspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_ls_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ls_csr_sparse_mat), intent(in) :: a,b - type(psb_ls_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lscsrspspmm - subroutine psb_lscscspspmm(a,b,c,info) - use psb_s_mat_mod, only : psb_ls_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_ls_csc_sparse_mat), intent(in) :: a,b - type(psb_ls_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lscscspspmm end interface psb_spspmm interface psb_symbmm diff --git a/base/modules/serial/psb_s_vect_mod.F90 b/base/modules/serial/psb_s_vect_mod.F90 index 3e27495ac..3128866a5 100644 --- a/base/modules/serial/psb_s_vect_mod.F90 +++ b/base/modules/serial/psb_s_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -56,14 +56,28 @@ module psb_s_vect_mod procedure, pass(x) :: get_fmt => s_vect_get_fmt procedure, pass(x) :: is_remote_build => s_vect_is_remote_build procedure, pass(x) :: set_remote_build => s_vect_set_remote_build - procedure, pass(x) :: get_dupl => s_vect_get_dupl - procedure, pass(x) :: set_dupl => s_vect_set_dupl procedure, pass(x) :: get_nrmv => s_vect_get_nrmv procedure, pass(x) :: set_nrmv => s_vect_set_nrmv procedure, pass(x) :: all => s_vect_all procedure, pass(x) :: reall => s_vect_reall procedure, pass(x) :: zero => s_vect_zero procedure, pass(x) :: asb => s_vect_asb + procedure, pass(x) :: set_dupl => s_vect_set_dupl + procedure, pass(x) :: get_dupl => s_vect_get_dupl + procedure, pass(x) :: set_ncfs => s_vect_set_ncfs + procedure, pass(x) :: get_ncfs => s_vect_get_ncfs + procedure, pass(x) :: set_state => s_vect_set_state + procedure, pass(x) :: set_null => s_vect_set_null + procedure, pass(x) :: set_bld => s_vect_set_bld + procedure, pass(x) :: set_upd => s_vect_set_upd + procedure, pass(x) :: set_asb => s_vect_set_asb + procedure, pass(x) :: get_state => s_vect_get_state + procedure, pass(x) :: is_null => s_vect_is_null + procedure, pass(x) :: is_bld => s_vect_is_bld + procedure, pass(x) :: is_upd => s_vect_is_upd + procedure, pass(x) :: is_asb => s_vect_is_asb + procedure, pass(x) :: reinit => s_vect_reinit + procedure, pass(x) :: gthab => s_vect_gthab procedure, pass(x) :: gthzv => s_vect_gthzv generic, public :: gth => gthab, gthzv @@ -91,8 +105,10 @@ module psb_s_vect_mod procedure, pass(x) :: set_host => s_vect_set_host procedure, pass(x) :: set_dev => s_vect_set_dev procedure, pass(x) :: set_sync => s_vect_set_sync + procedure, pass(x) :: check_addr => s_vect_check_addr procedure, pass(x) :: get_entry => s_vect_get_entry + procedure, pass(x) :: set_entry => s_vect_set_entry procedure, pass(x) :: dot_v => s_vect_dot_v procedure, pass(x) :: dot_a => s_vect_dot_a @@ -194,7 +210,11 @@ contains implicit none class(psb_s_vect_type), intent(in) :: x integer(psb_ipk_) :: res - res = x%dupl + if (allocated(x%v)) then + res = x%v%get_dupl() + else + res = psb_dupl_null_ + end if end function s_vect_get_dupl subroutine s_vect_set_dupl(x,val) @@ -202,13 +222,117 @@ contains class(psb_s_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in), optional :: val - if (present(val)) then - x%dupl = val - else - x%dupl = psb_dupl_def_ + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_dupl(val) + else + call x%v%set_dupl(psb_dupl_def_) + end if end if end subroutine s_vect_set_dupl + function s_vect_get_ncfs(x) result(res) + implicit none + class(psb_s_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_ncfs() + else + res = 0 + end if + end function s_vect_get_ncfs + + subroutine s_vect_set_ncfs(x,val) + implicit none + class(psb_s_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in), optional :: val + + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_ncfs(val) + else + call x%v%set_ncfs(0) + end if + end if + end subroutine s_vect_set_ncfs + + function s_vect_get_state(x) result(res) + implicit none + class(psb_s_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_state() + else + res = psb_vect_null_ + end if + end function s_vect_get_state + + function s_vect_is_null(x) result(res) + implicit none + class(psb_s_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_null_) + end function s_vect_is_null + + function s_vect_is_bld(x) result(res) + implicit none + class(psb_s_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_bld_) + end function s_vect_is_bld + + function s_vect_is_upd(x) result(res) + implicit none + class(psb_s_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_upd_) + end function s_vect_is_upd + + function s_vect_is_asb(x) result(res) + implicit none + class(psb_s_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_asb_) + end function s_vect_is_asb + + subroutine s_vect_set_state(n,x) + implicit none + class(psb_s_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + if (allocated(x%v)) then + call x%v%set_state(n) + end if + end subroutine s_vect_set_state + + + subroutine s_vect_set_null(x) + implicit none + class(psb_s_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_null_) + end subroutine s_vect_set_null + + subroutine s_vect_set_bld(x) + implicit none + class(psb_s_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_bld_) + end subroutine s_vect_set_bld + + subroutine s_vect_set_upd(x) + implicit none + class(psb_s_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_upd_) + end subroutine s_vect_set_upd + + subroutine s_vect_set_asb(x) + implicit none + class(psb_s_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_asb_) + end subroutine s_vect_set_asb + function s_vect_get_nrmv(x) result(res) implicit none class(psb_s_vect_type), intent(in) :: x @@ -223,7 +347,6 @@ contains x%nrmv = val end subroutine s_vect_set_nrmv - function s_vect_is_remote_build(x) result(res) implicit none @@ -294,16 +417,31 @@ contains info = psb_success_ call y%free(info) if ((info==0).and.allocated(x%v)) then + ! + ! Using sourced allocation here creates + ! problems with handling of memory allocated + ! elsewhere (e.g. accelerators), hence delegation + ! to %bld method + ! call y%bld(x%get_vect(),mold=x%v) end if end subroutine s_vect_clone - subroutine s_vect_bld_x(x,invect,mold) + subroutine s_vect_bld_x(x,invect,mold,scratch) real(psb_spk_), intent(in) :: invect(:) class(psb_s_vect_type), intent(inout) :: x class(psb_s_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + info = psb_success_ if (allocated(x%v)) & & call x%free(info) @@ -314,17 +452,25 @@ contains allocate(x%v,stat=info, mold=psb_s_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(invect) + if (info == psb_success_) call x%v%bld(invect,scratch=scratch_) end subroutine s_vect_bld_x - subroutine s_vect_bld_mn(x,n,mold) + subroutine s_vect_bld_mn(x,n,mold,scratch) integer(psb_mpk_), intent(in) :: n class(psb_s_vect_type), intent(inout) :: x class(psb_s_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info class(psb_s_base_vect_type), pointer :: mld + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if info = psb_success_ if (allocated(x%v)) & @@ -335,17 +481,25 @@ contains else allocate(x%v,stat=info, mold=psb_s_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(n) + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) end subroutine s_vect_bld_mn - subroutine s_vect_bld_en(x,n,mold) + subroutine s_vect_bld_en(x,n,mold,scratch) integer(psb_epk_), intent(in) :: n class(psb_s_vect_type), intent(inout) :: x class(psb_s_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (allocated(x%v)) & & call x%free(info) @@ -355,7 +509,7 @@ contains else allocate(x%v,stat=info, mold=psb_s_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(n) + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) end subroutine s_vect_bld_en @@ -390,6 +544,13 @@ contains end subroutine s_vect_set_vect + subroutine s_vect_check_addr(x) + class(psb_s_vect_type), intent(inout) :: x + + integer(psb_ipk_) :: info + if (allocated(x%v)) call x%v%check_addr() + + end subroutine s_vect_check_addr function constructor(x) result(this) real(psb_spk_) :: x(:) @@ -457,8 +618,20 @@ contains else info = psb_err_alloc_dealloc_ end if + call x%set_bld() end subroutine s_vect_all + subroutine s_vect_reinit(x, info, clear) + implicit none + class(psb_s_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + + if (allocated(x%v)) call x%v%reinit(info,clear) + call x%set_upd() + + end subroutine s_vect_reinit + subroutine s_vect_reall(n, x, info) implicit none @@ -483,16 +656,18 @@ contains end subroutine s_vect_zero - subroutine s_vect_asb(n, x, info) + subroutine s_vect_asb(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: n class(psb_s_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch if (allocated(x%v)) then - call x%v%asb(n,info) + call x%v%asb(n,info,scratch=scratch) + call x%set_asb() end if end subroutine s_vect_asb @@ -547,11 +722,11 @@ contains end subroutine s_vect_free - subroutine s_vect_ins_a(n,irl,val,x,info) + subroutine s_vect_ins_a(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_s_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n, maxr integer(psb_ipk_), intent(in) :: irl(:) real(psb_spk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info @@ -564,15 +739,15 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl,val,dupl,info) + call x%v%ins(n,irl,val,dupl,maxr,info) end subroutine s_vect_ins_a - subroutine s_vect_ins_v(n,irl,val,x,info) + subroutine s_vect_ins_v(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_s_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n, maxr class(psb_i_vect_type), intent(inout) :: irl class(psb_s_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -585,7 +760,7 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl%v,val%v,dupl,info) + call x%v%ins(n,irl%v,val%v,dupl,maxr,info) end subroutine s_vect_ins_v @@ -607,6 +782,7 @@ contains if (allocated(x%v%v)) then call x%v%sync() if (info == psb_success_) call tmp%bld(x%v%v) + call x%v%base_cpy(tmp) call x%v%free(info) endif end if @@ -687,13 +863,21 @@ contains function s_vect_get_entry(x,index) result(res) implicit none - class(psb_s_vect_type), intent(in) :: x + class(psb_s_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in) :: index real(psb_spk_) :: res - res = 0 + res = szero if (allocated(x%v)) res = x%v%get_entry(index) end function s_vect_get_entry + subroutine s_vect_set_entry(x,index,val) + implicit none + class(psb_s_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: index + real(psb_spk_) :: val + if (allocated(x%v)) call x%v%set_entry(index,val) + end subroutine s_vect_set_entry + function s_vect_dot_v(n,x,y) result(res) implicit none class(psb_s_vect_type), intent(inout) :: x, y @@ -1255,7 +1439,7 @@ contains if (allocated(x%v)) then res = x%v%minreal(n) else - res = szero + res = HUGE(sone) end if end function s_vect_min @@ -1564,19 +1748,20 @@ contains end subroutine s_mvect_bld_x - subroutine s_mvect_bld_n(x,m,n,mold) + subroutine s_mvect_bld_n(x,m,n,mold,scratch) integer(psb_ipk_), intent(in) :: m,n class(psb_s_multivect_type), intent(out) :: x class(psb_s_base_multivect_type), intent(in), optional :: mold integer(psb_ipk_) :: info - + logical, intent(in), optional :: scratch + info = psb_success_ if (present(mold)) then allocate(x%v,stat=info,mold=mold) else allocate(x%v,stat=info, mold=psb_s_get_base_multivect_default()) endif - if (info == psb_success_) call x%v%bld(m,n) + if (info == psb_success_) call x%v%bld(m,n,scratch=scratch) end subroutine s_mvect_bld_n @@ -1806,11 +1991,11 @@ contains end subroutine s_mvect_free - subroutine s_mvect_ins(n,irl,val,x,info) + subroutine s_mvect_ins(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_s_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n,maxr integer(psb_ipk_), intent(in) :: irl(:) real(psb_spk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(out) :: info @@ -1823,7 +2008,7 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl,val,dupl,info) + call x%v%ins(n,irl,val,dupl,maxr,info) end subroutine s_mvect_ins @@ -2057,3 +2242,4 @@ contains !!$ end function s_mvect_asum end module psb_s_multivect_mod + diff --git a/base/modules/serial/psb_serial_mod.f90 b/base/modules/serial/psb_serial_mod.f90 index a25c1c37b..00d0db370 100644 --- a/base/modules/serial/psb_serial_mod.f90 +++ b/base/modules/serial/psb_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/serial/psb_vect_mod.f90 b/base/modules/serial/psb_vect_mod.f90 index 80e7da773..d82eeffb5 100644 --- a/base/modules/serial/psb_vect_mod.f90 +++ b/base/modules/serial/psb_vect_mod.f90 @@ -1,4 +1,5 @@ module psb_vect_mod + use psb_i2_vect_mod use psb_i_vect_mod use psb_l_vect_mod use psb_s_vect_mod diff --git a/base/modules/serial/psb_z_base_mat_mod.F90 b/base/modules/serial/psb_z_base_mat_mod.F90 index 0d2c9e768..4aa6c3465 100644 --- a/base/modules/serial/psb_z_base_mat_mod.F90 +++ b/base/modules/serial/psb_z_base_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/serial/psb_z_base_vect_mod.F90 b/base/modules/serial/psb_z_base_vect_mod.F90 index bf1a276cd..c4dfe1511 100644 --- a/base/modules/serial/psb_z_base_vect_mod.F90 +++ b/base/modules/serial/psb_z_base_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -33,7 +33,7 @@ ! package: psb_z_base_vect_mod ! ! This module contains the definition of the psb_z_base_vect type which -! is a container for dense vectors. +! is a container for dense vectors.\ ! This is encapsulated instead of being just a simple array to allow for ! more complicated situations, such as GPU programming, where the memory ! area we are interested in is not easily accessible from the host/Fortran @@ -47,6 +47,8 @@ module psb_z_base_vect_mod use psb_const_mod use psb_error_mod use psb_realloc_mod + use psb_comm_schemes_mod, only: psb_comm_handle_type, psb_comm_isend_irecv_, psb_comm_unknown_ + use psb_comm_factory_mod, only: psb_comm_set, psb_comm_free use psb_i_base_vect_mod use psb_l_base_vect_mod @@ -62,9 +64,22 @@ module psb_z_base_vect_mod !! type psb_z_base_vect_type !> Values. - complex(psb_dpk_), allocatable :: v(:) - complex(psb_dpk_), allocatable :: combuf(:) - integer(psb_mpk_), allocatable :: comid(:,:) + complex(psb_dpk_), allocatable :: v(:) + complex(psb_dpk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) contains ! ! Constructors/allocators @@ -88,6 +103,22 @@ module psb_z_base_vect_mod procedure, pass(x) :: asb_e => z_base_asb_e generic, public :: asb => asb_m, asb_e procedure, pass(x) :: free => z_base_free + procedure, pass(x) :: reinit => z_base_reinit + procedure, pass(x) :: set_ncfs => z_base_set_ncfs + procedure, pass(x) :: get_ncfs => z_base_get_ncfs + procedure, pass(x) :: set_dupl => z_base_set_dupl + procedure, pass(x) :: get_dupl => z_base_get_dupl + procedure, pass(x) :: set_state => z_base_set_state + procedure, pass(x) :: set_null => z_base_set_null + procedure, pass(x) :: set_bld => z_base_set_bld + procedure, pass(x) :: set_upd => z_base_set_upd + procedure, pass(x) :: set_asb => z_base_set_asb + procedure, pass(x) :: get_state => z_base_get_state + procedure, pass(x) :: is_null => z_base_is_null + procedure, pass(x) :: is_bld => z_base_is_bld + procedure, pass(x) :: is_upd => z_base_is_upd + procedure, pass(x) :: is_asb => z_base_is_asb + procedure, pass(x) :: base_cpy => z_base_cpy ! ! Sync: centerpiece of handling of external storage. ! Any derived class having extra storage upon sync @@ -112,9 +143,7 @@ module psb_z_base_vect_mod procedure, nopass :: device_wait => z_base_device_wait procedure, pass(x) :: maybe_free_buffer => z_base_maybe_free_buffer procedure, pass(x) :: free_buffer => z_base_free_buffer - procedure, pass(x) :: new_comid => z_base_new_comid - procedure, pass(x) :: free_comid => z_base_free_comid - + ! ! Basic info procedure, pass(x) :: get_nrows => z_base_get_nrows @@ -129,6 +158,7 @@ module psb_z_base_vect_mod procedure, pass(x) :: set_vect => z_base_set_vect generic, public :: set => set_vect, set_scal procedure, pass(x) :: get_entry=> z_base_get_entry + procedure, pass(x) :: set_entry=> z_base_set_entry ! ! Gather/scatter. These are needed for MPI interfacing. ! May have to be reworked. @@ -143,6 +173,9 @@ module psb_z_base_vect_mod procedure, pass(y) :: sctb_buf => z_base_sctb_buf generic, public :: sct => sctb, sctb_x, sctb_buf + procedure, pass(x) :: check_addr => z_base_check_addr + + ! ! Dot product and AXPBY @@ -211,8 +244,6 @@ module psb_z_base_vect_mod generic, public :: addconst => addconst_a2,addconst_v2 - - end type psb_z_base_vect_type public :: psb_z_base_vect @@ -263,14 +294,22 @@ contains !! \brief Build method from an array !! \param x(:) input array to be copied !! - subroutine z_base_bld_x(x,this) + subroutine z_base_bld_x(x,this,scratch) use psb_realloc_mod implicit none complex(psb_dpk_), intent(in) :: this(:) class(psb_z_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info integer(psb_ipk_) :: i + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(size(this),x%v,info) if (info /= 0) then call psb_errpush(psb_err_alloc_dealloc_,'base_vect_bld') @@ -295,15 +334,23 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine z_base_bld_mn(x,n) + subroutine z_base_bld_mn(x,n,scratch) use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_z_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(n,x%v,info) - call x%asb(n,info) + call x%asb(n,info,scratch=scratch_) end subroutine z_base_bld_mn @@ -312,15 +359,23 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine z_base_bld_en(x,n) + subroutine z_base_bld_en(x,n,scratch) use psb_realloc_mod implicit none integer(psb_epk_), intent(in) :: n class(psb_z_base_vect_type), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(n,x%v,info) - call x%asb(n,info) + call x%asb(n,info,scratch=scratch_) end subroutine z_base_bld_en @@ -340,6 +395,10 @@ contains integer(psb_ipk_), intent(out) :: info call psb_realloc(n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if end subroutine z_base_all @@ -361,6 +420,31 @@ contains end subroutine z_base_mold + subroutine z_base_reinit(x, info,clear) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_z_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + logical :: clear_ + + info = 0 + if (present(clear)) then + clear_ = clear + else + clear_ = .true. + end if + + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + if (clear_) x%v(:) = zzero + call x%set_host() + call x%set_upd() + end if + + end subroutine z_base_reinit + ! ! Insert a bunch of values at specified positions. ! @@ -388,55 +472,118 @@ contains !! \param info return code !! ! - subroutine z_base_ins_a(n,irl,val,dupl,x,info) + subroutine z_base_ins_a(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_z_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr integer(psb_ipk_), intent(in) :: irl(:) complex(psb_dpk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_) :: i, isz + integer(psb_ipk_) :: i, isz, dupl_, ncfs_, k info = 0 if (psb_errstatus_fatal()) return - if (.not.allocated(x%v)) then - info = psb_err_invalid_vect_state_ - else if (n > min(size(irl),size(val))) then - info = psb_err_invalid_input_ - - else - isz = size(x%v) - select case(dupl) - case(psb_dupl_ovwrt_) + if (try_newins) then + if (x%is_bld()) then + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_ensure_size(isz,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ do i = 1, n !loop over all val's rows ! row actual block row - if ((1 <= irl(i)).and.(irl(i) <= isz)) then + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 ! this row belongs to me ! copy i-th row of block val in x - x%v(irl(i)) = val(i) + x%v(k) = val(i) + x%iv(k) = irl(i) end if enddo + call x%set_ncfs(k) - case(psb_dupl_add_) + else if (x%is_upd()) then - do i = 1, n - !loop over all val's rows - if ((1 <= irl(i)).and.(irl(i) <= isz)) then - ! this row belongs to me - ! copy i-th row of block val in x - x%v(irl(i)) = x%v(irl(i)) + val(i) - end if - enddo + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ - case default - info = 321 - ! !$ call psb_errpush(info,name) - ! !$ goto 9999 - end select + else + isz = size(x%v) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = val(i) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i)) = x%v(irl(i)) + val(i) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if end if call x%set_host() if (info /= 0) then @@ -446,11 +593,11 @@ contains end subroutine z_base_ins_a - subroutine z_base_ins_v(n,irl,val,dupl,x,info) + subroutine z_base_ins_v(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_z_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr class(psb_i_base_vect_type), intent(inout) :: irl class(psb_z_base_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -463,7 +610,7 @@ contains if (irl%is_dev()) call irl%sync() if (val%is_dev()) call val%sync() if (x%is_dev()) call x%sync() - call x%ins(n,irl%v,val%v,dupl,info) + call x%ins(n,irl%v,val%v,dupl,maxr,info) if (info /= 0) then call psb_errpush(info,'base_vect_ins') @@ -507,19 +654,72 @@ contains !! ! - subroutine z_base_asb_m(n, x, info) + subroutine z_base_asb_m(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_z_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + complex(psb_dpk_), allocatable :: vv(:) info = 0 - if (x%get_nrows() < n) & - & call psb_realloc(n,x%v,info) - if (info /= 0) & - & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (x%is_bld()) then + ncfs = x%get_ncfs() + xvsz = psb_size(x%v) + call psb_realloc(n,vv,info) + vv(:) = zzero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,ncfs + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,ncfs + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,ncfs + if (vv(x%iv(i)).ne. zzero) then + call psb_errpush(psb_err_duplicate_coo,'vect-asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() call x%sync() end subroutine z_base_asb_m @@ -537,19 +737,72 @@ contains !! ! - subroutine z_base_asb_e(n, x, info) + subroutine z_base_asb_e(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_epk_), intent(in) :: n class(psb_z_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ + integer(psb_ipk_) :: i, ncfs, xvsz + complex(psb_dpk_), allocatable :: vv(:) info = 0 - if (x%get_nrows() < n) & - & call psb_realloc(n,x%v,info) - if (info /= 0) & - & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + if (try_newins) then + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb unhandled') + if (x%is_bld()) then + call psb_realloc(n,vv,info) + vv(:) = zzero + select case(x%get_dupl()) + case(psb_dupl_add_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = vv(x%iv(i)) + x%v(i) + end do + case(psb_dupl_ovwrt_) + do i=1,x%get_ncfs() + vv(x%iv(i)) = x%v(i) + end do + case(psb_dupl_err_) + do i=1,x%get_ncfs() + if (vv(x%iv(i)).ne. zzero) then + call psb_errpush(psb_err_duplicate_coo,'vect_asb') + return + else + vv(x%iv(i)) = x%v(i) + end if + end do + case default + write(psb_err_unit,*) 'Error in vect_asb: unsafe dupl',x%get_dupl() + info =-7 + end select + call psb_move_alloc(vv,x%v,info) + if (allocated(x%iv)) deallocate(x%iv,stat=info) + else if (x%is_upd().or.x%is_asb().or.scratch_) then + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + else + info = psb_err_invalid_vect_state_ + call psb_errpush(info,'vect_asb') + end if + else + if (x%get_nrows() < n) & + & call psb_realloc(n,x%v,info) + if (info /= 0) & + & call psb_errpush(psb_err_alloc_dealloc_,'vect_asb') + end if + call x%set_host() + call x%set_asb() call x%sync() end subroutine z_base_asb_e @@ -566,19 +819,22 @@ contains use psb_realloc_mod implicit none class(psb_z_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: info_comm + integer(psb_ipk_), intent(out) :: info info = 0 if (allocated(x%v)) deallocate(x%v, stat=info) if ((info == 0).and.allocated(x%combuf)) call x%free_buffer(info) - if ((info == 0).and.allocated(x%comid)) call x%free_comid(info) + if ((info == 0).and.allocated(x%iv)) deallocate(x%iv, stat=info) + if ((info == 0).and.allocated(x%comm_handle)) then + call psb_comm_free(x%comm_handle, info_comm) + if (info_comm /= psb_success_) info = info_comm + end if if (info /= 0) call & & psb_errpush(psb_err_alloc_dealloc_,'vect_free') - + call x%set_null() end subroutine z_base_free - - ! !> Function base_free_buffer: !! \memberof psb_z_base_vect_type @@ -619,25 +875,104 @@ contains & call x%free_buffer(info) end subroutine z_base_maybe_free_buffer + + function z_base_get_ncfs(x) result(res) + implicit none + class(psb_z_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%ncfs + end function z_base_get_ncfs - ! - !> Function base_free_comid: - !! \memberof psb_z_base_vect_type - !! \brief Free aux MPI communication id buffer - !! - !! \param info return code - !! - ! - subroutine z_base_free_comid(x,info) - use psb_realloc_mod + function z_base_get_dupl(x) result(res) + implicit none + class(psb_z_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%dupl + end function z_base_get_dupl + + function z_base_get_state(x) result(res) + implicit none + class(psb_z_base_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + res = x%bldstate + end function z_base_get_state + + function z_base_is_null(x) result(res) + implicit none + class(psb_z_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_null_) + end function z_base_is_null + + function z_base_is_bld(x) result(res) + implicit none + class(psb_z_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_bld_) + end function z_base_is_bld + + function z_base_is_upd(x) result(res) + implicit none + class(psb_z_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_upd_) + end function z_base_is_upd + + function z_base_is_asb(x) result(res) + implicit none + class(psb_z_base_vect_type), intent(in) :: x + logical :: res + res = (x%bldstate == psb_vect_asb_) + end function z_base_is_asb + + subroutine z_base_set_ncfs(n,x) implicit none class(psb_z_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(in) :: n + x%ncfs = n + end subroutine z_base_set_ncfs + + subroutine z_base_set_dupl(n,x) + implicit none + class(psb_z_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%dupl = n + end subroutine z_base_set_dupl + + subroutine z_base_set_state(n,x) + implicit none + class(psb_z_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + x%bldstate = n + end subroutine z_base_set_state + + subroutine z_base_set_null(x) + implicit none + class(psb_z_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_null_ + end subroutine z_base_set_null + + subroutine z_base_set_bld(x) + implicit none + class(psb_z_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_bld_ + end subroutine z_base_set_bld - if (allocated(x%comid)) & - & deallocate(x%comid,stat=info) - end subroutine z_base_free_comid + subroutine z_base_set_upd(x) + implicit none + class(psb_z_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_upd_ + end subroutine z_base_set_upd + subroutine z_base_set_asb(x) + implicit none + class(psb_z_base_vect_type), intent(inout) :: x + + x%bldstate = psb_vect_asb_ + end subroutine z_base_set_asb ! ! The base version of SYNC & friends does nothing, it's just @@ -733,6 +1068,24 @@ contains res = .true. end function z_base_is_sync + !> Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine z_base_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_z_base_vect_type), intent(in) :: x + class(psb_z_base_vect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine z_base_cpy ! ! Size info. @@ -891,6 +1244,13 @@ contains end subroutine z_base_set_vect + subroutine z_base_check_addr(x) + class(psb_z_base_vect_type), intent(inout) :: x + + write(0,*) 'Check addr: base version, do nothing' + + end subroutine z_base_check_addr + ! ! Get entry. @@ -903,15 +1263,33 @@ contains ! function z_base_get_entry(x, index) result(res) implicit none - class(psb_z_base_vect_type), intent(in) :: x + class(psb_z_base_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in) :: index complex(psb_dpk_) :: res res = 0 - if (allocated(x%v)) res = x%v(index) + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + res = x%v(index) + end if end function z_base_get_entry + subroutine z_base_set_entry(x, index, val) + implicit none + class(psb_z_base_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: index + complex(psb_dpk_) :: val + + + if (allocated(x%v)) then + if (x%is_dev()) call x%sync() + x%v(index) =val + call x%set_host() + end if + + end subroutine z_base_set_entry + ! ! Overwrite with absolute value ! @@ -1910,17 +2288,6 @@ contains call psb_realloc(n,x%combuf,info) end subroutine z_base_new_buffer - subroutine z_base_new_comid(n,x,info) - use psb_realloc_mod - implicit none - class(psb_z_base_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n - integer(psb_ipk_), intent(out) :: info - - call psb_realloc(n,2_psb_ipk_,x%comid,info) - end subroutine z_base_new_comid - - ! ! shortcut alpha=1 beta=0 ! @@ -2084,9 +2451,22 @@ module psb_z_base_multivect_mod type psb_z_base_multivect_type !> Values. - complex(psb_dpk_), allocatable :: v(:,:) - complex(psb_dpk_), allocatable :: combuf(:) - integer(psb_mpk_), allocatable :: comid(:,:) + complex(psb_dpk_), allocatable :: v(:,:) + complex(psb_dpk_), allocatable :: combuf(:) + class(psb_comm_handle_type), allocatable :: comm_handle + + !> vector bldstate: + !! null: pristine; + !! build: it's being filled with entries; + !! assembled: ready to use in computations; + !! update: accepts coefficients but only + !! in already existing entries. + !! The transitions among the states are detailed in + !! psb_T_vect_mod. + integer(psb_ipk_), private :: bldstate = psb_vect_null_ + integer(psb_ipk_), private :: dupl = psb_dupl_null_ + integer(psb_ipk_), private :: ncfs = 0 + integer(psb_ipk_), allocatable :: iv(:) contains ! ! Constructors/allocators @@ -2105,6 +2485,22 @@ module psb_z_base_multivect_mod procedure, pass(x) :: zero => z_base_mlv_zero procedure, pass(x) :: asb => z_base_mlv_asb procedure, pass(x) :: free => z_base_mlv_free + procedure, pass(x) :: reinit => z_base_mlv_reinit + procedure, pass(x) :: set_ncfs => z_base_mlv_set_ncfs + procedure, pass(x) :: get_ncfs => z_base_mlv_get_ncfs + procedure, pass(x) :: set_dupl => z_base_mlv_set_dupl + procedure, pass(x) :: get_dupl => z_base_mlv_get_dupl + procedure, pass(x) :: set_state => z_base_mlv_set_state + procedure, pass(x) :: set_null => z_base_mlv_set_null + procedure, pass(x) :: set_bld => z_base_mlv_set_bld + procedure, pass(x) :: set_upd => z_base_mlv_set_upd + procedure, pass(x) :: set_asb => z_base_mlv_set_asb + procedure, pass(x) :: get_state => z_base_mlv_get_state + procedure, pass(x) :: is_null => z_base_mlv_is_null + procedure, pass(x) :: is_bld => z_base_mlv_is_bld + procedure, pass(x) :: is_upd => z_base_mlv_is_upd + procedure, pass(x) :: is_asb => z_base_mlv_is_asb + procedure, pass(x) :: base_cpy => z_base_mlv_cpy ! ! Sync: centerpiece of handling of external storage. ! Any derived class having extra storage upon sync @@ -2178,8 +2574,6 @@ module psb_z_base_multivect_mod procedure, nopass :: device_wait => z_base_mlv_device_wait procedure, pass(x) :: maybe_free_buffer => z_base_mlv_maybe_free_buffer procedure, pass(x) :: free_buffer => z_base_mlv_free_buffer - procedure, pass(x) :: new_comid => z_base_mlv_new_comid - procedure, pass(x) :: free_comid => z_base_mlv_free_comid ! ! Gather/scatter. These are needed for MPI interfacing. @@ -2218,7 +2612,8 @@ contains integer(psb_ipk_) :: info this%v = x - call this%asb(size(x,dim=1,kind=psb_ipk_),size(x,dim=2,kind=psb_ipk_),info) + call this%asb(size(x,dim=1,kind=psb_ipk_),& + & size(x,dim=2,kind=psb_ipk_),info) end function constructor @@ -2268,14 +2663,15 @@ contains !! \brief Build method with size (uninitialized data) !! \param n size to be allocated. !! - subroutine z_base_mlv_bld_n(x,m,n) + subroutine z_base_mlv_bld_n(x,m,n,scratch) use psb_realloc_mod integer(psb_ipk_), intent(in) :: m,n class(psb_z_base_multivect_type), intent(inout) :: x integer(psb_ipk_) :: info + logical, intent(in), optional :: scratch call psb_realloc(m,n,x%v,info) - call x%asb(m,n,info) + call x%asb(m,n,info,scratch=scratch) end subroutine z_base_mlv_bld_n @@ -2295,6 +2691,10 @@ contains integer(psb_ipk_), intent(out) :: info call psb_realloc(m,n,x%v,info) + if (try_newins) then + call psb_realloc(n,x%iv,info) + call x%set_ncfs(0) + end if end subroutine z_base_mlv_all @@ -2316,6 +2716,23 @@ contains end subroutine z_base_mlv_mold + subroutine z_base_mlv_reinit(x, info) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_z_base_multivect_type), intent(out) :: x + integer(psb_ipk_), intent(out) :: info + + info = 0 + if (allocated(x%v)) then + call x%sync() + x%v(:,:) = zzero + call x%set_host() + call x%set_upd() + end if + + end subroutine z_base_mlv_reinit + ! ! Insert a bunch of values at specified positions. ! @@ -2343,57 +2760,123 @@ contains !! \param info return code !! ! - subroutine z_base_mlv_ins(n,irl,val,dupl,x,info) + subroutine z_base_mlv_ins(n,irl,val,dupl,x,maxr,info) use psi_serial_mod implicit none class(psb_z_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl,maxr integer(psb_ipk_), intent(in) :: irl(:) complex(psb_dpk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(out) :: info - integer(psb_ipk_) :: i, isz + integer(psb_ipk_) :: i, isz, nc, dupl_, ncfs_, k info = 0 if (psb_errstatus_fatal()) return - if (.not.allocated(x%v)) then - info = psb_err_invalid_vect_state_ - else if (n > min(size(irl),size(val))) then - info = psb_err_invalid_input_ - - else - isz = size(x%v,1) - select case(dupl) - case(psb_dupl_ovwrt_) + if (try_newins) then + if (x%is_bld()) then + nc = size(x%v,2) + ncfs_ = x%get_ncfs() + isz = ncfs_ + n + call psb_realloc(isz,nc,x%v,info) + call psb_ensure_size(isz,x%iv,info) + k = ncfs_ do i = 1, n !loop over all val's rows - ! row actual block row - if ((1 <= irl(i)).and.(irl(i) <= isz)) then + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + k = k + 1 ! this row belongs to me ! copy i-th row of block val in x - x%v(irl(i),:) = val(i,:) + x%v(k,:) = val(i,:) + x%iv(k) = irl(i) end if enddo + call x%set_ncfs(k) - case(psb_dupl_add_) + else if (x%is_upd()) then - do i = 1, n - !loop over all val's rows - if ((1 <= irl(i)).and.(irl(i) <= isz)) then - ! this row belongs to me - ! copy i-th row of block val in x - x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) - end if - enddo + dupl_ = x%get_dupl() + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl_) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= maxr)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if + else + info = psb_err_invalid_vect_state_ + end if + else + if (.not.allocated(x%v)) then + info = psb_err_invalid_vect_state_ + else if (n > min(size(irl),size(val))) then + info = psb_err_invalid_input_ - case default - info = 321 - ! !$ call psb_errpush(info,name) - ! !$ goto 9999 - end select + else + isz = size(x%v,1) + nc = size(x%v,2) + select case(dupl) + case(psb_dupl_ovwrt_) + do i = 1, n + !loop over all val's rows + ! row actual block row + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = val(i,:) + end if + enddo + + case(psb_dupl_add_) + + do i = 1, n + !loop over all val's rows + if ((1 <= irl(i)).and.(irl(i) <= isz)) then + ! this row belongs to me + ! copy i-th row of block val in x + x%v(irl(i),:) = x%v(irl(i),:) + val(i,:) + end if + enddo + + case default + info = 321 + ! !$ call psb_errpush(info,name) + ! !$ goto 9999 + end select + end if end if + call x%set_host() if (info /= 0) then call psb_errpush(info,'base_mlv_vect_ins') return @@ -2413,6 +2896,7 @@ contains class(psb_z_base_multivect_type), intent(inout) :: x if (allocated(x%v)) x%v=zzero + call x%set_host() end subroutine z_base_mlv_zero @@ -2431,19 +2915,78 @@ contains !! ! - subroutine z_base_mlv_asb(m,n, x, info) + subroutine z_base_mlv_asb(m,n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: m,n class(psb_z_base_multivect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch - if ((x%get_nrows() < m).or.(x%get_ncols() Function base_cpy: + !! \memberof psb_d_base_vect_type + !! \brief base_cpy: copy base contents + !! \param y returned variable + !! + subroutine z_base_mlv_cpy(x, y) + use psi_serial_mod + use psb_realloc_mod + implicit none + class(psb_z_base_multivect_type), intent(in) :: x + class(psb_z_base_multivect_type), intent(out) :: y + + if (allocated(x%v)) call y%bld(x%v) + call y%set_state(x%get_state()) + call y%set_dupl(x%get_dupl()) + call y%set_ncfs(x%get_ncfs()) + if (allocated(x%iv)) y%iv = x%iv + end subroutine z_base_mlv_cpy + ! ! Size info. @@ -2607,7 +3266,7 @@ contains integer(psb_epk_) :: res ! Force 8-byte integers. - res = (1_psb_epk_ * psb_sizeof_ip) * x%get_nrows() * x%get_ncols() + res = (1_psb_epk_ * (2*psb_sizeof_dp)) * x%get_nrows() * x%get_ncols() end function z_base_mlv_sizeof @@ -3194,16 +3853,6 @@ contains call psb_realloc(n*nc,x%combuf,info) end subroutine z_base_mlv_new_buffer - subroutine z_base_mlv_new_comid(n,x,info) - use psb_realloc_mod - implicit none - class(psb_z_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n - integer(psb_ipk_), intent(out) :: info - - call psb_realloc(n,2_psb_ipk_,x%comid,info) - end subroutine z_base_mlv_new_comid - subroutine z_base_mlv_maybe_free_buffer(x,info) use psb_realloc_mod @@ -3228,17 +3877,6 @@ contains & deallocate(x%combuf,stat=info) end subroutine z_base_mlv_free_buffer - subroutine z_base_mlv_free_comid(x,info) - use psb_realloc_mod - implicit none - class(psb_z_base_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - - if (allocated(x%comid)) & - & deallocate(x%comid,stat=info) - end subroutine z_base_mlv_free_comid - - ! ! Gather: Y = beta * Y + alpha * X(IDX(:)) ! diff --git a/base/modules/serial/psb_z_csc_mat_mod.f90 b/base/modules/serial/psb_z_csc_mat_mod.f90 index b9828f597..00ecd4cec 100644 --- a/base/modules/serial/psb_z_csc_mat_mod.f90 +++ b/base/modules/serial/psb_z_csc_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -912,6 +912,23 @@ module psb_z_csc_mat_mod end subroutine psb_lz_csc_scals end interface + interface + subroutine psb_zcscspspmm(a,b,c,info) + import + implicit none + class(psb_z_csc_sparse_mat), intent(in) :: a,b + type(psb_z_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_zcscspspmm + subroutine psb_lzcscspspmm(a,b,c,info) + import + implicit none + class(psb_lz_csc_sparse_mat), intent(in) :: a,b + type(psb_lz_csc_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lzcscspspmm + end interface + contains ! == =================================== diff --git a/base/modules/serial/psb_z_csr_mat_mod.f90 b/base/modules/serial/psb_z_csr_mat_mod.f90 index 0bc66bcca..e67d86fe3 100644 --- a/base/modules/serial/psb_z_csr_mat_mod.f90 +++ b/base/modules/serial/psb_z_csr_mat_mod.f90 @@ -15,7 +15,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -1162,6 +1162,23 @@ module psb_z_csr_mat_mod end subroutine psb_lz_csr_aclsum end interface + ! Interfaces for SPSPMM + interface + subroutine psb_zcsrspspmm(a,b,c,info) + import + implicit none + class(psb_z_csr_sparse_mat), intent(in) :: a,b + type(psb_z_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_zcsrspspmm + subroutine psb_lzcsrspspmm(a,b,c,info) + import + implicit none + class(psb_lz_csr_sparse_mat), intent(in) :: a,b + type(psb_lz_csr_sparse_mat), intent(out) :: c + integer(psb_ipk_), intent(out) :: info + end subroutine psb_lzcsrspspmm + end interface contains diff --git a/base/modules/serial/psb_z_mat_mod.F90 b/base/modules/serial/psb_z_mat_mod.F90 index 47342aeec..762d978f6 100644 --- a/base/modules/serial/psb_z_mat_mod.F90 +++ b/base/modules/serial/psb_z_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -78,6 +78,8 @@ ! module psb_z_mat_mod + use psb_z_vect_mod + use psb_i_vect_mod use psb_z_base_mat_mod use psb_z_csr_mat_mod, only : psb_z_csr_sparse_mat, psb_lz_csr_sparse_mat,& & psb_z_ecsr_sparse_mat @@ -661,9 +663,8 @@ module psb_z_mat_mod interface subroutine psb_z_csput_v(nz,ia,ja,val,a,imin,imax,jmin,jmax,info) - use psb_z_vect_mod, only : psb_z_vect_type - use psb_i_vect_mod, only : psb_i_vect_type - import :: psb_ipk_, psb_lpk_, psb_zspmat_type + import :: psb_ipk_, psb_lpk_, psb_zspmat_type, & + & psb_z_vect_type, psb_i_vect_type class(psb_zspmat_type), intent(inout) :: a type(psb_z_vect_type), intent(inout) :: val type(psb_i_vect_type), intent(inout) :: ia, ja diff --git a/base/modules/serial/psb_z_serial_mod.f90 b/base/modules/serial/psb_z_serial_mod.f90 index dbfce00bd..7f9dff40f 100644 --- a/base/modules/serial/psb_z_serial_mod.f90 +++ b/base/modules/serial/psb_z_serial_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -60,24 +60,8 @@ module psb_z_serial_mod type(psb_zspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_zspspmm - subroutine psb_zcsrspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_z_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_z_csr_sparse_mat), intent(in) :: a,b - type(psb_z_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_zcsrspspmm - subroutine psb_zcscspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_z_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_z_csc_sparse_mat), intent(in) :: a,b - type(psb_z_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_zcscspspmm - end interface - + end interface psb_spspmm + interface psb_symbmm subroutine psb_zsymbmm(a,b,c,info) use psb_z_mat_mod, only : psb_zspmat_type @@ -114,6 +98,16 @@ module psb_z_serial_mod end subroutine psb_zbase_numbmm end interface psb_numbmm + interface psb_aplusat + subroutine psb_zaplusat(ain,aout,info) + use psb_z_mat_mod, only : psb_zspmat_type + import :: psb_ipk_ + implicit none + type(psb_zspmat_type) :: ain, aout + integer(psb_ipk_) :: info + end subroutine psb_zaplusat + end interface + interface psb_rwextd subroutine psb_zrwextd(nr,a,info,b,rowscale) use psb_z_mat_mod, only : psb_zspmat_type @@ -232,22 +226,6 @@ module psb_z_serial_mod type(psb_lzspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info end subroutine psb_lzspspmm - subroutine psb_lzcsrspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_lz_csr_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lz_csr_sparse_mat), intent(in) :: a,b - type(psb_lz_csr_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lzcsrspspmm - subroutine psb_lzcscspspmm(a,b,c,info) - use psb_z_mat_mod, only : psb_lz_csc_sparse_mat - import :: psb_ipk_ - implicit none - class(psb_lz_csc_sparse_mat), intent(in) :: a,b - type(psb_lz_csc_sparse_mat), intent(out) :: c - integer(psb_ipk_), intent(out) :: info - end subroutine psb_lzcscspspmm end interface psb_spspmm interface psb_symbmm diff --git a/base/modules/serial/psb_z_vect_mod.F90 b/base/modules/serial/psb_z_vect_mod.F90 index 79606f3b2..f7cf3584a 100644 --- a/base/modules/serial/psb_z_vect_mod.F90 +++ b/base/modules/serial/psb_z_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -56,14 +56,28 @@ module psb_z_vect_mod procedure, pass(x) :: get_fmt => z_vect_get_fmt procedure, pass(x) :: is_remote_build => z_vect_is_remote_build procedure, pass(x) :: set_remote_build => z_vect_set_remote_build - procedure, pass(x) :: get_dupl => z_vect_get_dupl - procedure, pass(x) :: set_dupl => z_vect_set_dupl procedure, pass(x) :: get_nrmv => z_vect_get_nrmv procedure, pass(x) :: set_nrmv => z_vect_set_nrmv procedure, pass(x) :: all => z_vect_all procedure, pass(x) :: reall => z_vect_reall procedure, pass(x) :: zero => z_vect_zero procedure, pass(x) :: asb => z_vect_asb + procedure, pass(x) :: set_dupl => z_vect_set_dupl + procedure, pass(x) :: get_dupl => z_vect_get_dupl + procedure, pass(x) :: set_ncfs => z_vect_set_ncfs + procedure, pass(x) :: get_ncfs => z_vect_get_ncfs + procedure, pass(x) :: set_state => z_vect_set_state + procedure, pass(x) :: set_null => z_vect_set_null + procedure, pass(x) :: set_bld => z_vect_set_bld + procedure, pass(x) :: set_upd => z_vect_set_upd + procedure, pass(x) :: set_asb => z_vect_set_asb + procedure, pass(x) :: get_state => z_vect_get_state + procedure, pass(x) :: is_null => z_vect_is_null + procedure, pass(x) :: is_bld => z_vect_is_bld + procedure, pass(x) :: is_upd => z_vect_is_upd + procedure, pass(x) :: is_asb => z_vect_is_asb + procedure, pass(x) :: reinit => z_vect_reinit + procedure, pass(x) :: gthab => z_vect_gthab procedure, pass(x) :: gthzv => z_vect_gthzv generic, public :: gth => gthab, gthzv @@ -91,8 +105,10 @@ module psb_z_vect_mod procedure, pass(x) :: set_host => z_vect_set_host procedure, pass(x) :: set_dev => z_vect_set_dev procedure, pass(x) :: set_sync => z_vect_set_sync + procedure, pass(x) :: check_addr => z_vect_check_addr procedure, pass(x) :: get_entry => z_vect_get_entry + procedure, pass(x) :: set_entry => z_vect_set_entry procedure, pass(x) :: dot_v => z_vect_dot_v procedure, pass(x) :: dot_a => z_vect_dot_a @@ -187,7 +203,11 @@ contains implicit none class(psb_z_vect_type), intent(in) :: x integer(psb_ipk_) :: res - res = x%dupl + if (allocated(x%v)) then + res = x%v%get_dupl() + else + res = psb_dupl_null_ + end if end function z_vect_get_dupl subroutine z_vect_set_dupl(x,val) @@ -195,13 +215,117 @@ contains class(psb_z_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in), optional :: val - if (present(val)) then - x%dupl = val - else - x%dupl = psb_dupl_def_ + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_dupl(val) + else + call x%v%set_dupl(psb_dupl_def_) + end if end if end subroutine z_vect_set_dupl + function z_vect_get_ncfs(x) result(res) + implicit none + class(psb_z_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_ncfs() + else + res = 0 + end if + end function z_vect_get_ncfs + + subroutine z_vect_set_ncfs(x,val) + implicit none + class(psb_z_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in), optional :: val + + if (allocated(x%v)) then + if (present(val)) then + call x%v%set_ncfs(val) + else + call x%v%set_ncfs(0) + end if + end if + end subroutine z_vect_set_ncfs + + function z_vect_get_state(x) result(res) + implicit none + class(psb_z_vect_type), intent(in) :: x + integer(psb_ipk_) :: res + if (allocated(x%v)) then + res = x%v%get_state() + else + res = psb_vect_null_ + end if + end function z_vect_get_state + + function z_vect_is_null(x) result(res) + implicit none + class(psb_z_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_null_) + end function z_vect_is_null + + function z_vect_is_bld(x) result(res) + implicit none + class(psb_z_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_bld_) + end function z_vect_is_bld + + function z_vect_is_upd(x) result(res) + implicit none + class(psb_z_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_upd_) + end function z_vect_is_upd + + function z_vect_is_asb(x) result(res) + implicit none + class(psb_z_vect_type), intent(in) :: x + logical :: res + res = (x%get_state() == psb_vect_asb_) + end function z_vect_is_asb + + subroutine z_vect_set_state(n,x) + implicit none + class(psb_z_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: n + if (allocated(x%v)) then + call x%v%set_state(n) + end if + end subroutine z_vect_set_state + + + subroutine z_vect_set_null(x) + implicit none + class(psb_z_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_null_) + end subroutine z_vect_set_null + + subroutine z_vect_set_bld(x) + implicit none + class(psb_z_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_bld_) + end subroutine z_vect_set_bld + + subroutine z_vect_set_upd(x) + implicit none + class(psb_z_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_upd_) + end subroutine z_vect_set_upd + + subroutine z_vect_set_asb(x) + implicit none + class(psb_z_vect_type), intent(inout) :: x + + call x%set_state(psb_vect_asb_) + end subroutine z_vect_set_asb + function z_vect_get_nrmv(x) result(res) implicit none class(psb_z_vect_type), intent(in) :: x @@ -216,7 +340,6 @@ contains x%nrmv = val end subroutine z_vect_set_nrmv - function z_vect_is_remote_build(x) result(res) implicit none @@ -287,16 +410,31 @@ contains info = psb_success_ call y%free(info) if ((info==0).and.allocated(x%v)) then + ! + ! Using sourced allocation here creates + ! problems with handling of memory allocated + ! elsewhere (e.g. accelerators), hence delegation + ! to %bld method + ! call y%bld(x%get_vect(),mold=x%v) end if end subroutine z_vect_clone - subroutine z_vect_bld_x(x,invect,mold) + subroutine z_vect_bld_x(x,invect,mold,scratch) complex(psb_dpk_), intent(in) :: invect(:) class(psb_z_vect_type), intent(inout) :: x class(psb_z_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if + info = psb_success_ if (allocated(x%v)) & & call x%free(info) @@ -307,17 +445,25 @@ contains allocate(x%v,stat=info, mold=psb_z_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(invect) + if (info == psb_success_) call x%v%bld(invect,scratch=scratch_) end subroutine z_vect_bld_x - subroutine z_vect_bld_mn(x,n,mold) + subroutine z_vect_bld_mn(x,n,mold,scratch) integer(psb_mpk_), intent(in) :: n class(psb_z_vect_type), intent(inout) :: x class(psb_z_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info class(psb_z_base_vect_type), pointer :: mld + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if info = psb_success_ if (allocated(x%v)) & @@ -328,17 +474,25 @@ contains else allocate(x%v,stat=info, mold=psb_z_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(n) + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) end subroutine z_vect_bld_mn - subroutine z_vect_bld_en(x,n,mold) + subroutine z_vect_bld_en(x,n,mold,scratch) integer(psb_epk_), intent(in) :: n class(psb_z_vect_type), intent(inout) :: x class(psb_z_base_vect_type), intent(in), optional :: mold + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (allocated(x%v)) & & call x%free(info) @@ -348,7 +502,7 @@ contains else allocate(x%v,stat=info, mold=psb_z_get_base_vect_default()) endif - if (info == psb_success_) call x%v%bld(n) + if (info == psb_success_) call x%v%bld(n,scratch=scratch_) end subroutine z_vect_bld_en @@ -383,6 +537,13 @@ contains end subroutine z_vect_set_vect + subroutine z_vect_check_addr(x) + class(psb_z_vect_type), intent(inout) :: x + + integer(psb_ipk_) :: info + if (allocated(x%v)) call x%v%check_addr() + + end subroutine z_vect_check_addr function constructor(x) result(this) complex(psb_dpk_) :: x(:) @@ -450,8 +611,20 @@ contains else info = psb_err_alloc_dealloc_ end if + call x%set_bld() end subroutine z_vect_all + subroutine z_vect_reinit(x, info, clear) + implicit none + class(psb_z_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: clear + + if (allocated(x%v)) call x%v%reinit(info,clear) + call x%set_upd() + + end subroutine z_vect_reinit + subroutine z_vect_reall(n, x, info) implicit none @@ -476,16 +649,18 @@ contains end subroutine z_vect_zero - subroutine z_vect_asb(n, x, info) + subroutine z_vect_asb(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_ipk_), intent(in) :: n class(psb_z_vect_type), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch if (allocated(x%v)) then - call x%v%asb(n,info) + call x%v%asb(n,info,scratch=scratch) + call x%set_asb() end if end subroutine z_vect_asb @@ -540,11 +715,11 @@ contains end subroutine z_vect_free - subroutine z_vect_ins_a(n,irl,val,x,info) + subroutine z_vect_ins_a(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_z_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n, maxr integer(psb_ipk_), intent(in) :: irl(:) complex(psb_dpk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info @@ -557,15 +732,15 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl,val,dupl,info) + call x%v%ins(n,irl,val,dupl,maxr,info) end subroutine z_vect_ins_a - subroutine z_vect_ins_v(n,irl,val,x,info) + subroutine z_vect_ins_v(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_z_vect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n, maxr class(psb_i_vect_type), intent(inout) :: irl class(psb_z_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -578,7 +753,7 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl%v,val%v,dupl,info) + call x%v%ins(n,irl%v,val%v,dupl,maxr,info) end subroutine z_vect_ins_v @@ -600,6 +775,7 @@ contains if (allocated(x%v%v)) then call x%v%sync() if (info == psb_success_) call tmp%bld(x%v%v) + call x%v%base_cpy(tmp) call x%v%free(info) endif end if @@ -680,13 +856,21 @@ contains function z_vect_get_entry(x,index) result(res) implicit none - class(psb_z_vect_type), intent(in) :: x + class(psb_z_vect_type), intent(inout) :: x integer(psb_ipk_), intent(in) :: index complex(psb_dpk_) :: res - res = 0 + res = zzero if (allocated(x%v)) res = x%v%get_entry(index) end function z_vect_get_entry + subroutine z_vect_set_entry(x,index,val) + implicit none + class(psb_z_vect_type), intent(inout) :: x + integer(psb_ipk_), intent(in) :: index + complex(psb_dpk_) :: val + if (allocated(x%v)) call x%v%set_entry(index,val) + end subroutine z_vect_set_entry + function z_vect_dot_v(n,x,y) result(res) implicit none class(psb_z_vect_type), intent(inout) :: x, y @@ -1485,19 +1669,20 @@ contains end subroutine z_mvect_bld_x - subroutine z_mvect_bld_n(x,m,n,mold) + subroutine z_mvect_bld_n(x,m,n,mold,scratch) integer(psb_ipk_), intent(in) :: m,n class(psb_z_multivect_type), intent(out) :: x class(psb_z_base_multivect_type), intent(in), optional :: mold integer(psb_ipk_) :: info - + logical, intent(in), optional :: scratch + info = psb_success_ if (present(mold)) then allocate(x%v,stat=info,mold=mold) else allocate(x%v,stat=info, mold=psb_z_get_base_multivect_default()) endif - if (info == psb_success_) call x%v%bld(m,n) + if (info == psb_success_) call x%v%bld(m,n,scratch=scratch) end subroutine z_mvect_bld_n @@ -1727,11 +1912,11 @@ contains end subroutine z_mvect_free - subroutine z_mvect_ins(n,irl,val,x,info) + subroutine z_mvect_ins(n,irl,val,x,maxr,info) use psi_serial_mod implicit none class(psb_z_multivect_type), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_), intent(in) :: n,maxr integer(psb_ipk_), intent(in) :: irl(:) complex(psb_dpk_), intent(in) :: val(:,:) integer(psb_ipk_), intent(out) :: info @@ -1744,7 +1929,7 @@ contains return end if dupl = x%get_dupl() - call x%v%ins(n,irl,val,dupl,info) + call x%v%ins(n,irl,val,dupl,maxr,info) end subroutine z_mvect_ins @@ -1978,3 +2163,4 @@ contains !!$ end function z_mvect_asum end module psb_z_multivect_mod + diff --git a/base/modules/tools/psb_c_tools_a_mod.f90 b/base/modules/tools/psb_c_tools_a_mod.f90 index 8dd592b37..60e934748 100644 --- a/base/modules/tools/psb_c_tools_a_mod.f90 +++ b/base/modules/tools/psb_c_tools_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/tools/psb_c_tools_mod.F90 b/base/modules/tools/psb_c_tools_mod.F90 index 97ee169fd..148ddf59f 100644 --- a/base/modules/tools/psb_c_tools_mod.F90 +++ b/base/modules/tools/psb_c_tools_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -70,7 +70,7 @@ Module psb_c_tools_mod interface psb_geasb - subroutine psb_casb_vect(x, desc_a, info,mold, scratch) + subroutine psb_casb_vect(x, desc_a, info,mold, scratch,dupl) import implicit none type(psb_desc_type), intent(in) :: desc_a @@ -78,8 +78,9 @@ Module psb_c_tools_mod integer(psb_ipk_), intent(out) :: info class(psb_c_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl end subroutine psb_casb_vect - subroutine psb_casb_vect_r2(x, desc_a, info,mold, scratch) + subroutine psb_casb_vect_r2(x, desc_a, info,mold, scratch,dupl) import implicit none type(psb_desc_type), intent(in) :: desc_a @@ -87,6 +88,7 @@ Module psb_c_tools_mod integer(psb_ipk_), intent(out) :: info class(psb_c_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl end subroutine psb_casb_vect_r2 subroutine psb_casb_multivect(x, desc_a, info,mold, scratch, n) import @@ -250,13 +252,14 @@ Module psb_c_tools_mod end interface interface psb_spasb - subroutine psb_cspasb(a,desc_a, info, afmt, upd, mold, bld_and) + subroutine psb_cspasb(a,desc_a, info, afmt, upd, mold, dupl, bld_and) import implicit none type(psb_cspmat_type), intent (inout) :: a type(psb_desc_type), intent(inout) :: desc_a integer(psb_ipk_), intent(out) :: info integer(psb_ipk_),optional, intent(in) :: upd + integer(psb_ipk_),optional, intent(in) :: dupl character(len=*), optional, intent(in) :: afmt class(psb_c_base_sparse_mat), intent(in), optional :: mold logical, intent(in), optional :: bld_and @@ -441,6 +444,14 @@ Module psb_c_tools_mod integer(psb_ipk_), intent(out) :: info complex(psb_spk_) :: res end function + function psb_c_getmatelem(a,rowindex,colindex,desc_a,info) result(res) + import + type(psb_cspmat_type), intent(inout) :: a + integer(psb_lpk_), intent(in) :: rowindex, colindex + type(psb_desc_type), intent(inout) :: desc_a + integer(psb_ipk_), intent(out) :: info + complex(psb_spk_) :: res + end function end interface interface psb_remap diff --git a/base/modules/tools/psb_cd_tools_mod.F90 b/base/modules/tools/psb_cd_tools_mod.F90 index 579b6d5fa..69f803747 100644 --- a/base/modules/tools/psb_cd_tools_mod.F90 +++ b/base/modules/tools/psb_cd_tools_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/tools/psb_d_tools_a_mod.f90 b/base/modules/tools/psb_d_tools_a_mod.f90 index 638953b4f..fd7b9ca57 100644 --- a/base/modules/tools/psb_d_tools_a_mod.f90 +++ b/base/modules/tools/psb_d_tools_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/tools/psb_d_tools_mod.F90 b/base/modules/tools/psb_d_tools_mod.F90 index b2ac3a66e..97f70fc13 100644 --- a/base/modules/tools/psb_d_tools_mod.F90 +++ b/base/modules/tools/psb_d_tools_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -70,7 +70,7 @@ Module psb_d_tools_mod interface psb_geasb - subroutine psb_dasb_vect(x, desc_a, info,mold, scratch) + subroutine psb_dasb_vect(x, desc_a, info,mold, scratch,dupl) import implicit none type(psb_desc_type), intent(in) :: desc_a @@ -78,8 +78,9 @@ Module psb_d_tools_mod integer(psb_ipk_), intent(out) :: info class(psb_d_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl end subroutine psb_dasb_vect - subroutine psb_dasb_vect_r2(x, desc_a, info,mold, scratch) + subroutine psb_dasb_vect_r2(x, desc_a, info,mold, scratch,dupl) import implicit none type(psb_desc_type), intent(in) :: desc_a @@ -87,6 +88,7 @@ Module psb_d_tools_mod integer(psb_ipk_), intent(out) :: info class(psb_d_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl end subroutine psb_dasb_vect_r2 subroutine psb_dasb_multivect(x, desc_a, info,mold, scratch, n) import @@ -250,13 +252,14 @@ Module psb_d_tools_mod end interface interface psb_spasb - subroutine psb_dspasb(a,desc_a, info, afmt, upd, mold, bld_and) + subroutine psb_dspasb(a,desc_a, info, afmt, upd, mold, dupl, bld_and) import implicit none type(psb_dspmat_type), intent (inout) :: a type(psb_desc_type), intent(inout) :: desc_a integer(psb_ipk_), intent(out) :: info integer(psb_ipk_),optional, intent(in) :: upd + integer(psb_ipk_),optional, intent(in) :: dupl character(len=*), optional, intent(in) :: afmt class(psb_d_base_sparse_mat), intent(in), optional :: mold logical, intent(in), optional :: bld_and @@ -441,6 +444,14 @@ Module psb_d_tools_mod integer(psb_ipk_), intent(out) :: info real(psb_dpk_) :: res end function + function psb_d_getmatelem(a,rowindex,colindex,desc_a,info) result(res) + import + type(psb_dspmat_type), intent(inout) :: a + integer(psb_lpk_), intent(in) :: rowindex, colindex + type(psb_desc_type), intent(inout) :: desc_a + integer(psb_ipk_), intent(out) :: info + real(psb_dpk_) :: res + end function end interface interface psb_remap diff --git a/base/modules/tools/psb_e_tools_a_mod.f90 b/base/modules/tools/psb_e_tools_a_mod.f90 index f8a27cb54..b54a593c8 100644 --- a/base/modules/tools/psb_e_tools_a_mod.f90 +++ b/base/modules/tools/psb_e_tools_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/tools/psb_i2_tools_a_mod.f90 b/base/modules/tools/psb_i2_tools_a_mod.f90 index b8d52bb42..7471adcc9 100644 --- a/base/modules/tools/psb_i2_tools_a_mod.f90 +++ b/base/modules/tools/psb_i2_tools_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/tools/psb_i_tools_mod.F90 b/base/modules/tools/psb_i_tools_mod.F90 index 1c207fac3..28899c9fe 100644 --- a/base/modules/tools/psb_i_tools_mod.F90 +++ b/base/modules/tools/psb_i_tools_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -69,7 +69,7 @@ Module psb_i_tools_mod interface psb_geasb - subroutine psb_iasb_vect(x, desc_a, info,mold, scratch) + subroutine psb_iasb_vect(x, desc_a, info,mold, scratch,dupl) import implicit none type(psb_desc_type), intent(in) :: desc_a @@ -77,8 +77,9 @@ Module psb_i_tools_mod integer(psb_ipk_), intent(out) :: info class(psb_i_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl end subroutine psb_iasb_vect - subroutine psb_iasb_vect_r2(x, desc_a, info,mold, scratch) + subroutine psb_iasb_vect_r2(x, desc_a, info,mold, scratch,dupl) import implicit none type(psb_desc_type), intent(in) :: desc_a @@ -86,6 +87,7 @@ Module psb_i_tools_mod integer(psb_ipk_), intent(out) :: info class(psb_i_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl end subroutine psb_iasb_vect_r2 subroutine psb_iasb_multivect(x, desc_a, info,mold, scratch, n) import diff --git a/base/modules/tools/psb_l_tools_mod.F90 b/base/modules/tools/psb_l_tools_mod.F90 index 058403d6f..078f06dc7 100644 --- a/base/modules/tools/psb_l_tools_mod.F90 +++ b/base/modules/tools/psb_l_tools_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -69,7 +69,7 @@ Module psb_l_tools_mod interface psb_geasb - subroutine psb_lasb_vect(x, desc_a, info,mold, scratch) + subroutine psb_lasb_vect(x, desc_a, info,mold, scratch,dupl) import implicit none type(psb_desc_type), intent(in) :: desc_a @@ -77,8 +77,9 @@ Module psb_l_tools_mod integer(psb_ipk_), intent(out) :: info class(psb_l_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl end subroutine psb_lasb_vect - subroutine psb_lasb_vect_r2(x, desc_a, info,mold, scratch) + subroutine psb_lasb_vect_r2(x, desc_a, info,mold, scratch,dupl) import implicit none type(psb_desc_type), intent(in) :: desc_a @@ -86,6 +87,7 @@ Module psb_l_tools_mod integer(psb_ipk_), intent(out) :: info class(psb_l_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl end subroutine psb_lasb_vect_r2 subroutine psb_lasb_multivect(x, desc_a, info,mold, scratch, n) import diff --git a/base/modules/tools/psb_m_tools_a_mod.f90 b/base/modules/tools/psb_m_tools_a_mod.f90 index a1de6caa5..65211e353 100644 --- a/base/modules/tools/psb_m_tools_a_mod.f90 +++ b/base/modules/tools/psb_m_tools_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/tools/psb_s_tools_a_mod.f90 b/base/modules/tools/psb_s_tools_a_mod.f90 index 85a2b0296..1881202b1 100644 --- a/base/modules/tools/psb_s_tools_a_mod.f90 +++ b/base/modules/tools/psb_s_tools_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/tools/psb_s_tools_mod.F90 b/base/modules/tools/psb_s_tools_mod.F90 index 18addeda9..c87607bc9 100644 --- a/base/modules/tools/psb_s_tools_mod.F90 +++ b/base/modules/tools/psb_s_tools_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -70,7 +70,7 @@ Module psb_s_tools_mod interface psb_geasb - subroutine psb_sasb_vect(x, desc_a, info,mold, scratch) + subroutine psb_sasb_vect(x, desc_a, info,mold, scratch,dupl) import implicit none type(psb_desc_type), intent(in) :: desc_a @@ -78,8 +78,9 @@ Module psb_s_tools_mod integer(psb_ipk_), intent(out) :: info class(psb_s_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl end subroutine psb_sasb_vect - subroutine psb_sasb_vect_r2(x, desc_a, info,mold, scratch) + subroutine psb_sasb_vect_r2(x, desc_a, info,mold, scratch,dupl) import implicit none type(psb_desc_type), intent(in) :: desc_a @@ -87,6 +88,7 @@ Module psb_s_tools_mod integer(psb_ipk_), intent(out) :: info class(psb_s_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl end subroutine psb_sasb_vect_r2 subroutine psb_sasb_multivect(x, desc_a, info,mold, scratch, n) import @@ -250,13 +252,14 @@ Module psb_s_tools_mod end interface interface psb_spasb - subroutine psb_sspasb(a,desc_a, info, afmt, upd, mold, bld_and) + subroutine psb_sspasb(a,desc_a, info, afmt, upd, mold, dupl, bld_and) import implicit none type(psb_sspmat_type), intent (inout) :: a type(psb_desc_type), intent(inout) :: desc_a integer(psb_ipk_), intent(out) :: info integer(psb_ipk_),optional, intent(in) :: upd + integer(psb_ipk_),optional, intent(in) :: dupl character(len=*), optional, intent(in) :: afmt class(psb_s_base_sparse_mat), intent(in), optional :: mold logical, intent(in), optional :: bld_and @@ -441,6 +444,14 @@ Module psb_s_tools_mod integer(psb_ipk_), intent(out) :: info real(psb_spk_) :: res end function + function psb_s_getmatelem(a,rowindex,colindex,desc_a,info) result(res) + import + type(psb_sspmat_type), intent(inout) :: a + integer(psb_lpk_), intent(in) :: rowindex, colindex + type(psb_desc_type), intent(inout) :: desc_a + integer(psb_ipk_), intent(out) :: info + real(psb_spk_) :: res + end function end interface interface psb_remap diff --git a/base/modules/tools/psb_tools_mod.f90 b/base/modules/tools/psb_tools_mod.f90 index 7f87ee794..ca2020ee7 100644 --- a/base/modules/tools/psb_tools_mod.f90 +++ b/base/modules/tools/psb_tools_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -31,6 +31,7 @@ ! module psb_tools_mod use psb_cd_tools_mod + use psb_i2_tools_a_mod use psb_e_tools_a_mod use psb_m_tools_a_mod use psb_s_tools_a_mod diff --git a/base/modules/tools/psb_z_tools_a_mod.f90 b/base/modules/tools/psb_z_tools_a_mod.f90 index 4c421f266..1052e57db 100644 --- a/base/modules/tools/psb_z_tools_a_mod.f90 +++ b/base/modules/tools/psb_z_tools_a_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/modules/tools/psb_z_tools_mod.F90 b/base/modules/tools/psb_z_tools_mod.F90 index fd9d5e225..8a6c2d34c 100644 --- a/base/modules/tools/psb_z_tools_mod.F90 +++ b/base/modules/tools/psb_z_tools_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -70,7 +70,7 @@ Module psb_z_tools_mod interface psb_geasb - subroutine psb_zasb_vect(x, desc_a, info,mold, scratch) + subroutine psb_zasb_vect(x, desc_a, info,mold, scratch,dupl) import implicit none type(psb_desc_type), intent(in) :: desc_a @@ -78,8 +78,9 @@ Module psb_z_tools_mod integer(psb_ipk_), intent(out) :: info class(psb_z_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl end subroutine psb_zasb_vect - subroutine psb_zasb_vect_r2(x, desc_a, info,mold, scratch) + subroutine psb_zasb_vect_r2(x, desc_a, info,mold, scratch,dupl) import implicit none type(psb_desc_type), intent(in) :: desc_a @@ -87,6 +88,7 @@ Module psb_z_tools_mod integer(psb_ipk_), intent(out) :: info class(psb_z_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl end subroutine psb_zasb_vect_r2 subroutine psb_zasb_multivect(x, desc_a, info,mold, scratch, n) import @@ -250,13 +252,14 @@ Module psb_z_tools_mod end interface interface psb_spasb - subroutine psb_zspasb(a,desc_a, info, afmt, upd, mold, bld_and) + subroutine psb_zspasb(a,desc_a, info, afmt, upd, mold, dupl, bld_and) import implicit none type(psb_zspmat_type), intent (inout) :: a type(psb_desc_type), intent(inout) :: desc_a integer(psb_ipk_), intent(out) :: info integer(psb_ipk_),optional, intent(in) :: upd + integer(psb_ipk_),optional, intent(in) :: dupl character(len=*), optional, intent(in) :: afmt class(psb_z_base_sparse_mat), intent(in), optional :: mold logical, intent(in), optional :: bld_and @@ -441,6 +444,14 @@ Module psb_z_tools_mod integer(psb_ipk_), intent(out) :: info complex(psb_dpk_) :: res end function + function psb_z_getmatelem(a,rowindex,colindex,desc_a,info) result(res) + import + type(psb_zspmat_type), intent(inout) :: a + integer(psb_lpk_), intent(in) :: rowindex, colindex + type(psb_desc_type), intent(inout) :: desc_a + integer(psb_ipk_), intent(out) :: info + complex(psb_dpk_) :: res + end function end interface interface psb_remap diff --git a/base/psblas/psb_cabs_vect.f90 b/base/psblas/psb_cabs_vect.f90 index cb1921953..29780abe5 100644 --- a/base/psblas/psb_cabs_vect.f90 +++ b/base/psblas/psb_cabs_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_camax.f90 b/base/psblas/psb_camax.f90 index e30ba8fe2..90ef18ead 100644 --- a/base/psblas/psb_camax.f90 +++ b/base/psblas/psb_camax.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -148,7 +148,7 @@ end function psb_camax !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -371,7 +371,7 @@ end function psb_camax_vect !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -496,7 +496,7 @@ end subroutine psb_camaxvs !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_casum.f90 b/base/psblas/psb_casum.f90 index 7b9b32759..7b336ebd9 100644 --- a/base/psblas/psb_casum.f90 +++ b/base/psblas/psb_casum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -261,7 +261,7 @@ end function psb_casum_vect !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -391,7 +391,7 @@ end function psb_casumv !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_caxpby.f90 b/base/psblas/psb_caxpby.f90 index da9458490..bb93f7eb8 100644 --- a/base/psblas/psb_caxpby.f90 +++ b/base/psblas/psb_caxpby.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -146,7 +146,7 @@ end subroutine psb_caxpby_vect ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -418,7 +418,7 @@ end subroutine psb_caxpby !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -538,7 +538,7 @@ end subroutine psb_caxpbyv !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_ccmp_vect.f90 b/base/psblas/psb_ccmp_vect.f90 index 5de955138..a77631556 100644 --- a/base/psblas/psb_ccmp_vect.f90 +++ b/base/psblas/psb_ccmp_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_cdiv_vect.f90 b/base/psblas/psb_cdiv_vect.f90 index 0fe4594a1..9a2525a13 100644 --- a/base/psblas/psb_cdiv_vect.f90 +++ b/base/psblas/psb_cdiv_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_cdot.f90 b/base/psblas/psb_cdot.f90 index ed300b7ce..7be3f6663 100644 --- a/base/psblas/psb_cdot.f90 +++ b/base/psblas/psb_cdot.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -301,7 +301,7 @@ end function psb_cdot !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -437,7 +437,7 @@ end function psb_cdotv !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -572,7 +572,7 @@ end subroutine psb_cdotvs !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_cgetmatinfo.F90 b/base/psblas/psb_cgetmatinfo.F90 index 66db76936..eade65178 100644 --- a/base/psblas/psb_cgetmatinfo.F90 +++ b/base/psblas/psb_cgetmatinfo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_cinv_vect.f90 b/base/psblas/psb_cinv_vect.f90 index 25589f32b..d5a4ac1f7 100644 --- a/base/psblas/psb_cinv_vect.f90 +++ b/base/psblas/psb_cinv_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_cmlt_vect.f90 b/base/psblas/psb_cmlt_vect.f90 index 9b4037bf0..c88514992 100644 --- a/base/psblas/psb_cmlt_vect.f90 +++ b/base/psblas/psb_cmlt_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_cnrm2.f90 b/base/psblas/psb_cnrm2.f90 index 0de8ed162..de99ca703 100644 --- a/base/psblas/psb_cnrm2.f90 +++ b/base/psblas/psb_cnrm2.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -155,7 +155,7 @@ end function psb_cnrm2 !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -610,7 +610,7 @@ end function psb_cnrm2_weightmask_vect !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_cnrmi.f90 b/base/psblas/psb_cnrmi.f90 index f28719ea5..38cdc45fb 100644 --- a/base/psblas/psb_cnrmi.f90 +++ b/base/psblas/psb_cnrmi.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_cspmm.f90 b/base/psblas/psb_cspmm.f90 index 777ade06f..f3e96c2f2 100644 --- a/base/psblas/psb_cspmm.f90 +++ b/base/psblas/psb_cspmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,11 +51,10 @@ ! desc_a - type(psb_desc_type). The communication descriptor. ! info - integer. Return code ! trans - character(optional). Whether A or A'. Default: 'N' -! work(:) - complex,(optional). Working area. ! doswap - logical(optional). Whether to performe halo updates. ! -subroutine psb_cspmv_vect(alpha,a,x,beta,y,desc_a,info,& - & trans, work, doswap) +subroutine psb_cspmv_vect(alpha,a,x,beta,y,desc_a,info,& + & trans, doswap) use psb_base_mod, psb_protect_name => psb_cspmv_vect use psi_mod implicit none @@ -66,7 +65,6 @@ subroutine psb_cspmv_vect(alpha,a,x,beta,y,desc_a,info,& type(psb_cspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), optional, target, intent(inout) :: work(:) character, intent(in), optional :: trans logical, intent(in), optional :: doswap @@ -74,10 +72,10 @@ subroutine psb_cspmv_vect(alpha,a,x,beta,y,desc_a,info,& type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me,& & err_act, iix, jjx, iia, jja, nrow, ncol, lldx, lldy, & - & liwork, iiy, jjy, ib, ip, idx + & iiy, jjy, ib, ip, idx integer(psb_lpk_) :: ix, ijx, iy, ijy, m, n, ia, ja integer(psb_ipk_), parameter :: nb=4 - complex(psb_spk_), pointer :: iwork(:), xp(:), yp(:) + complex(psb_spk_), pointer :: xp(:), yp(:) complex(psb_spk_), allocatable :: xvsave(:) character :: trans_ character(len=20) :: name, ch_err @@ -163,34 +161,6 @@ subroutine psb_cspmv_vect(alpha,a,x,beta,y,desc_a,info,& goto 9999 end if - iwork => null() - ! check for presence/size of a work area - liwork= 2*ncol - - if (present(work)) then - if (size(work) >= liwork) then - aliw =.false. - else - aliw=.true. - endif - else - aliw=.true. - end if - - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='Allocate' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - else - iwork => work - endif - - if (debug_level >= psb_debug_comp_) & - & write(debug_unit,*) me,' ',trim(name),' Allocated work ', info if (trans_ == 'N') then ! Matrix is not transposed @@ -203,13 +173,13 @@ subroutine psb_cspmv_vect(alpha,a,x,beta,y,desc_a,info,& if (do_timings) call psb_barrier(ctxt) if (do_timings) call psb_tic(mv_phase1) if (doswap_) call psi_swapdata(psb_swap_send_,& - & czero,x%v,desc_a,iwork,info,data=psb_comm_halo_) + & czero,x%v,desc_a,info,data=psb_comm_halo_) if (do_timings) call psb_toc(mv_phase1) if (do_timings) call psb_tic(mv_phase2) call a%ad%spmm(alpha,x%v,beta,y%v,info) if (do_timings) call psb_tic(mv_phase3) if (doswap_) call psi_swapdata(psb_swap_recv_,& - & czero,x%v,desc_a,iwork,info,data=psb_comm_halo_) + & czero,x%v,desc_a,info,data=psb_comm_halo_) if (do_timings) call psb_toc(mv_phase3) if (do_timings) call psb_tic(mv_phase4) call a%and%spmm(alpha,x%v,cone,y%v,info) @@ -225,7 +195,7 @@ subroutine psb_cspmv_vect(alpha,a,x,beta,y,desc_a,info,& if (do_timings) call psb_tic(mv_phase11) if (doswap_) then call psi_swapdata(ior(psb_swap_send_,psb_swap_recv_),& - & czero,x%v,desc_a,iwork,info,data=psb_comm_halo_) + & czero,x%v,desc_a,info,data=psb_comm_halo_) end if if (do_timings) call psb_toc(mv_phase11) if (do_timings) call psb_tic(mv_phase12) @@ -269,9 +239,9 @@ subroutine psb_cspmv_vect(alpha,a,x,beta,y,desc_a,info,& if (doswap_) then call psi_swaptran(ior(psb_swap_send_,psb_swap_recv_),& - & cone,y%v,desc_a,iwork,info) + & cone,y%v,desc_a,info) if (info == psb_success_) call psi_swapdata(ior(psb_swap_send_,psb_swap_recv_),& - & cone,y%v,desc_a,iwork,info,data=psb_comm_ovr_) + & cone,y%v,desc_a,info,data=psb_comm_ovr_) if (debug_level >= psb_debug_comp_) & & write(debug_unit,*) me,' ',trim(name),' swaptran ', info @@ -285,18 +255,6 @@ subroutine psb_cspmv_vect(alpha,a,x,beta,y,desc_a,info,& end if - if (aliw) deallocate(iwork,stat=info) - if (debug_level >= psb_debug_comp_) & - & write(debug_unit,*) me,' ',trim(name),' deallocat ',aliw, info - if(info /= psb_success_) then - info = psb_err_from_subroutine_ - ch_err='Deallocate iwork' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - - nullify(iwork) - call psb_erractionrestore(err_act) if (debug_level >= psb_debug_comp_) then call psb_barrier(ctxt) @@ -651,7 +609,7 @@ end subroutine psb_cspmm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_cspnrm1.f90 b/base/psblas/psb_cspnrm1.f90 index 92b04ebb4..a912bfd1a 100644 --- a/base/psblas/psb_cspnrm1.f90 +++ b/base/psblas/psb_cspnrm1.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_cspsm.f90 b/base/psblas/psb_cspsm.f90 index 9787b2d88..1f2e8e430 100644 --- a/base/psblas/psb_cspsm.f90 +++ b/base/psblas/psb_cspsm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -64,47 +64,46 @@ ! the diagonal matrix D. ! choice - integer(optional). The kind of update to perform on overlap elements. ! d(:) - complex, optional Matrix for diagonal scaling. -! work(:) - complex, optional Working area. ! -subroutine psb_cspsv_vect(alpha,a,x,beta,y,desc_a,info,& - & trans, scale, choice, diag, work) +subroutine psb_cspsv_vect(alpha,a,x,beta,y,desc_a,info,& + & trans, scale, choice, diag) use psb_base_mod, psb_protect_name => psb_cspsv_vect use psi_mod implicit none - complex(psb_spk_), intent(in) :: alpha, beta - type(psb_c_vect_type), intent(inout) :: x - type(psb_c_vect_type), intent(inout) :: y - type(psb_cspmat_type), intent(inout) :: a - type(psb_desc_type), intent(in) :: desc_a + complex(psb_spk_), intent(in) :: alpha, beta + type(psb_c_vect_type), intent(inout) :: x + type(psb_c_vect_type), intent(inout) :: y + type(psb_cspmat_type), intent(inout) :: a + type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info type(psb_c_vect_type), intent(inout), optional :: diag - complex(psb_spk_), optional, target, intent(inout) :: work(:) - character, intent(in), optional :: trans, scale + character, intent(in), optional :: trans, scale integer(psb_ipk_), intent(in), optional :: choice ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, & + integer(psb_ipk_) :: np, me, & & err_act, iix, jjx, ia, ja, iia, jja, lldx,lldy, choice_,& & ix, iy, ik, jx, jy, i, lld,& & m, nrow, ncol, liwork, llwork, iiy, jjy, idx, ndm - character :: lscale - integer(psb_ipk_), parameter :: nb=4 - complex(psb_spk_),pointer :: iwork(:), xp(:), yp(:) - character :: itrans - character(len=20) :: name, ch_err - logical :: aliw + character :: lscale + integer(psb_ipk_), parameter :: nb=4 + complex(psb_spk_),pointer :: xp(:), yp(:) + character :: itrans + character(len=20) :: name, ch_err + logical :: aliw - name='psb_cspsv_vect' - info=psb_success_ + name = 'psb_cspsv_vect' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() call psb_info(ctxt, me, np) if (np == -1) then @@ -165,34 +164,6 @@ subroutine psb_cspsv_vect(alpha,a,x,beta,y,desc_a,info,& goto 9999 end if - iwork => null() - ! check for presence/size of a work area - liwork= 2*ncol - - if (present(work)) then - if (size(work) >= liwork) then - aliw =.false. - else - aliw=.true. - endif - else - aliw=.true. - end if - - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - else - iwork => work - endif - - iwork(1)=0.d0 - ! Perform local triangular system solve if (present(diag)) then call a%spsm(alpha,x,beta,y,info,scale=scale,d=diag,trans=trans) @@ -208,10 +179,7 @@ subroutine psb_cspsv_vect(alpha,a,x,beta,y,desc_a,info,& ! update overlap elements if (choice_ > 0) then - call psi_swapdata(ior(psb_swap_send_,psb_swap_recv_),& - & cone,y%v,desc_a,iwork,info,data=psb_comm_ovr_) - - + call psi_swapdata(psb_comm_status_sync_,cone,y%v,desc_a,info,data=psb_comm_ovr_) if (info == psb_success_) call psi_ovrl_upd(y%v,desc_a,choice_,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Inner updates') @@ -219,8 +187,6 @@ subroutine psb_cspsv_vect(alpha,a,x,beta,y,desc_a,info,& end if end if - if (aliw) deallocate(iwork) - call psb_erractionrestore(err_act) return @@ -271,7 +237,7 @@ end subroutine psb_cspsv_vect ! jy - integer(optional). The column offset for ( Y ). Default: 1 ! work(:) - complex, optional Working area. ! -subroutine psb_cspsm(alpha,a,x,beta,y,desc_a,info,& +subroutine psb_cspsm(alpha,a,x,beta,y,desc_a,info,& & trans, scale, choice, diag, k, jx, jy, work) use psb_base_mod, psb_protect_name => psb_cspsm use psi_mod @@ -517,7 +483,7 @@ end subroutine psb_cspsm ! d(:) - complex, optional Matrix for diagonal scaling. ! work(:) - complex, optional Working area. ! -subroutine psb_cspsv(alpha,a,x,beta,y,desc_a,info,& +subroutine psb_cspsv(alpha,a,x,beta,y,desc_a,info,& & trans, scale, choice, diag, work) use psb_base_mod, psb_protect_name => psb_cspsv use psi_mod diff --git a/base/psblas/psb_cvmlt.f90 b/base/psblas/psb_cvmlt.f90 index a5ee7bbcd..9cbf35180 100644 --- a/base/psblas/psb_cvmlt.f90 +++ b/base/psblas/psb_cvmlt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_dabs_vect.f90 b/base/psblas/psb_dabs_vect.f90 index 0b655d9cd..29e0ec6ea 100644 --- a/base/psblas/psb_dabs_vect.f90 +++ b/base/psblas/psb_dabs_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_damax.f90 b/base/psblas/psb_damax.f90 index 490d4ffe3..db45d5687 100644 --- a/base/psblas/psb_damax.f90 +++ b/base/psblas/psb_damax.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -148,7 +148,7 @@ end function psb_damax !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -371,7 +371,7 @@ end function psb_damax_vect !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -496,7 +496,7 @@ end subroutine psb_damaxvs !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -689,11 +689,11 @@ function psb_dmin_vect(x, desc_a, info,global) result(res) goto 9999 end if - ! compute local max + ! compute local min if ((desc_a%get_local_rows() > 0).and.(m /= 0)) then res = x%minreal(desc_a%get_local_rows()) else - res = dzero + res = HUGE(done) end if ! compute global min diff --git a/base/psblas/psb_dasum.f90 b/base/psblas/psb_dasum.f90 index ff4399de3..dbb8e5ee1 100644 --- a/base/psblas/psb_dasum.f90 +++ b/base/psblas/psb_dasum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -261,7 +261,7 @@ end function psb_dasum_vect !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -391,7 +391,7 @@ end function psb_dasumv !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_daxpby.f90 b/base/psblas/psb_daxpby.f90 index f86b7fe9f..20b7f71b9 100644 --- a/base/psblas/psb_daxpby.f90 +++ b/base/psblas/psb_daxpby.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -146,7 +146,7 @@ end subroutine psb_daxpby_vect ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -418,7 +418,7 @@ end subroutine psb_daxpby !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -538,7 +538,7 @@ end subroutine psb_daxpbyv !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_dcmp_vect.f90 b/base/psblas/psb_dcmp_vect.f90 index b52b34d12..c9549be6c 100644 --- a/base/psblas/psb_dcmp_vect.f90 +++ b/base/psblas/psb_dcmp_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -121,7 +121,7 @@ end subroutine psb_dcmp_vect ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_ddiv_vect.f90 b/base/psblas/psb_ddiv_vect.f90 index 7f958e19b..37fe59e1b 100644 --- a/base/psblas/psb_ddiv_vect.f90 +++ b/base/psblas/psb_ddiv_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_ddot.f90 b/base/psblas/psb_ddot.f90 index 633c75498..611e43067 100644 --- a/base/psblas/psb_ddot.f90 +++ b/base/psblas/psb_ddot.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -301,7 +301,7 @@ end function psb_ddot !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -437,7 +437,7 @@ end function psb_ddotv !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -572,7 +572,7 @@ end subroutine psb_ddotvs !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_dgetmatinfo.F90 b/base/psblas/psb_dgetmatinfo.F90 index 9b3270118..0b743a86d 100644 --- a/base/psblas/psb_dgetmatinfo.F90 +++ b/base/psblas/psb_dgetmatinfo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_dinv_vect.f90 b/base/psblas/psb_dinv_vect.f90 index 2159398f0..5c238c4b8 100644 --- a/base/psblas/psb_dinv_vect.f90 +++ b/base/psblas/psb_dinv_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_dmlt_vect.f90 b/base/psblas/psb_dmlt_vect.f90 index 80a138c16..b8ff807b4 100644 --- a/base/psblas/psb_dmlt_vect.f90 +++ b/base/psblas/psb_dmlt_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_dnrm2.f90 b/base/psblas/psb_dnrm2.f90 index 7ebe94391..cce877f32 100644 --- a/base/psblas/psb_dnrm2.f90 +++ b/base/psblas/psb_dnrm2.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -155,7 +155,7 @@ end function psb_dnrm2 !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -610,7 +610,7 @@ end function psb_dnrm2_weightmask_vect !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_dnrmi.f90 b/base/psblas/psb_dnrmi.f90 index e06bc71bb..a251ae825 100644 --- a/base/psblas/psb_dnrmi.f90 +++ b/base/psblas/psb_dnrmi.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_dspmm.f90 b/base/psblas/psb_dspmm.f90 index ca7e7c568..e29d23fb1 100644 --- a/base/psblas/psb_dspmm.f90 +++ b/base/psblas/psb_dspmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,11 +51,10 @@ ! desc_a - type(psb_desc_type). The communication descriptor. ! info - integer. Return code ! trans - character(optional). Whether A or A'. Default: 'N' -! work(:) - real,(optional). Working area. ! doswap - logical(optional). Whether to performe halo updates. ! -subroutine psb_dspmv_vect(alpha,a,x,beta,y,desc_a,info,& - & trans, work, doswap) +subroutine psb_dspmv_vect(alpha,a,x,beta,y,desc_a,info,& + & trans, doswap) use psb_base_mod, psb_protect_name => psb_dspmv_vect use psi_mod implicit none @@ -66,7 +65,6 @@ subroutine psb_dspmv_vect(alpha,a,x,beta,y,desc_a,info,& type(psb_dspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), optional, target, intent(inout) :: work(:) character, intent(in), optional :: trans logical, intent(in), optional :: doswap @@ -74,10 +72,10 @@ subroutine psb_dspmv_vect(alpha,a,x,beta,y,desc_a,info,& type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me,& & err_act, iix, jjx, iia, jja, nrow, ncol, lldx, lldy, & - & liwork, iiy, jjy, ib, ip, idx + & iiy, jjy, ib, ip, idx integer(psb_lpk_) :: ix, ijx, iy, ijy, m, n, ia, ja integer(psb_ipk_), parameter :: nb=4 - real(psb_dpk_), pointer :: iwork(:), xp(:), yp(:) + real(psb_dpk_), pointer :: xp(:), yp(:) real(psb_dpk_), allocatable :: xvsave(:) character :: trans_ character(len=20) :: name, ch_err @@ -163,34 +161,6 @@ subroutine psb_dspmv_vect(alpha,a,x,beta,y,desc_a,info,& goto 9999 end if - iwork => null() - ! check for presence/size of a work area - liwork= 2*ncol - - if (present(work)) then - if (size(work) >= liwork) then - aliw =.false. - else - aliw=.true. - endif - else - aliw=.true. - end if - - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='Allocate' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - else - iwork => work - endif - - if (debug_level >= psb_debug_comp_) & - & write(debug_unit,*) me,' ',trim(name),' Allocated work ', info if (trans_ == 'N') then ! Matrix is not transposed @@ -203,13 +173,13 @@ subroutine psb_dspmv_vect(alpha,a,x,beta,y,desc_a,info,& if (do_timings) call psb_barrier(ctxt) if (do_timings) call psb_tic(mv_phase1) if (doswap_) call psi_swapdata(psb_swap_send_,& - & dzero,x%v,desc_a,iwork,info,data=psb_comm_halo_) + & dzero,x%v,desc_a,info,data=psb_comm_halo_) if (do_timings) call psb_toc(mv_phase1) if (do_timings) call psb_tic(mv_phase2) call a%ad%spmm(alpha,x%v,beta,y%v,info) if (do_timings) call psb_tic(mv_phase3) if (doswap_) call psi_swapdata(psb_swap_recv_,& - & dzero,x%v,desc_a,iwork,info,data=psb_comm_halo_) + & dzero,x%v,desc_a,info,data=psb_comm_halo_) if (do_timings) call psb_toc(mv_phase3) if (do_timings) call psb_tic(mv_phase4) call a%and%spmm(alpha,x%v,done,y%v,info) @@ -225,7 +195,7 @@ subroutine psb_dspmv_vect(alpha,a,x,beta,y,desc_a,info,& if (do_timings) call psb_tic(mv_phase11) if (doswap_) then call psi_swapdata(ior(psb_swap_send_,psb_swap_recv_),& - & dzero,x%v,desc_a,iwork,info,data=psb_comm_halo_) + & dzero,x%v,desc_a,info,data=psb_comm_halo_) end if if (do_timings) call psb_toc(mv_phase11) if (do_timings) call psb_tic(mv_phase12) @@ -269,9 +239,9 @@ subroutine psb_dspmv_vect(alpha,a,x,beta,y,desc_a,info,& if (doswap_) then call psi_swaptran(ior(psb_swap_send_,psb_swap_recv_),& - & done,y%v,desc_a,iwork,info) + & done,y%v,desc_a,info) if (info == psb_success_) call psi_swapdata(ior(psb_swap_send_,psb_swap_recv_),& - & done,y%v,desc_a,iwork,info,data=psb_comm_ovr_) + & done,y%v,desc_a,info,data=psb_comm_ovr_) if (debug_level >= psb_debug_comp_) & & write(debug_unit,*) me,' ',trim(name),' swaptran ', info @@ -285,18 +255,6 @@ subroutine psb_dspmv_vect(alpha,a,x,beta,y,desc_a,info,& end if - if (aliw) deallocate(iwork,stat=info) - if (debug_level >= psb_debug_comp_) & - & write(debug_unit,*) me,' ',trim(name),' deallocat ',aliw, info - if(info /= psb_success_) then - info = psb_err_from_subroutine_ - ch_err='Deallocate iwork' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - - nullify(iwork) - call psb_erractionrestore(err_act) if (debug_level >= psb_debug_comp_) then call psb_barrier(ctxt) @@ -651,7 +609,7 @@ end subroutine psb_dspmm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_dspnrm1.f90 b/base/psblas/psb_dspnrm1.f90 index 6bdb4eea3..c415bc526 100644 --- a/base/psblas/psb_dspnrm1.f90 +++ b/base/psblas/psb_dspnrm1.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_dspsm.f90 b/base/psblas/psb_dspsm.f90 index e4010b015..be8db5d74 100644 --- a/base/psblas/psb_dspsm.f90 +++ b/base/psblas/psb_dspsm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -64,47 +64,46 @@ ! the diagonal matrix D. ! choice - integer(optional). The kind of update to perform on overlap elements. ! d(:) - real, optional Matrix for diagonal scaling. -! work(:) - real, optional Working area. ! -subroutine psb_dspsv_vect(alpha,a,x,beta,y,desc_a,info,& - & trans, scale, choice, diag, work) +subroutine psb_dspsv_vect(alpha,a,x,beta,y,desc_a,info,& + & trans, scale, choice, diag) use psb_base_mod, psb_protect_name => psb_dspsv_vect use psi_mod implicit none - real(psb_dpk_), intent(in) :: alpha, beta - type(psb_d_vect_type), intent(inout) :: x - type(psb_d_vect_type), intent(inout) :: y - type(psb_dspmat_type), intent(inout) :: a - type(psb_desc_type), intent(in) :: desc_a + real(psb_dpk_), intent(in) :: alpha, beta + type(psb_d_vect_type), intent(inout) :: x + type(psb_d_vect_type), intent(inout) :: y + type(psb_dspmat_type), intent(inout) :: a + type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info type(psb_d_vect_type), intent(inout), optional :: diag - real(psb_dpk_), optional, target, intent(inout) :: work(:) - character, intent(in), optional :: trans, scale + character, intent(in), optional :: trans, scale integer(psb_ipk_), intent(in), optional :: choice ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, & + integer(psb_ipk_) :: np, me, & & err_act, iix, jjx, ia, ja, iia, jja, lldx,lldy, choice_,& & ix, iy, ik, jx, jy, i, lld,& & m, nrow, ncol, liwork, llwork, iiy, jjy, idx, ndm - character :: lscale - integer(psb_ipk_), parameter :: nb=4 - real(psb_dpk_),pointer :: iwork(:), xp(:), yp(:) - character :: itrans - character(len=20) :: name, ch_err - logical :: aliw + character :: lscale + integer(psb_ipk_), parameter :: nb=4 + real(psb_dpk_),pointer :: xp(:), yp(:) + character :: itrans + character(len=20) :: name, ch_err + logical :: aliw - name='psb_dspsv_vect' - info=psb_success_ + name = 'psb_dspsv_vect' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() call psb_info(ctxt, me, np) if (np == -1) then @@ -165,34 +164,6 @@ subroutine psb_dspsv_vect(alpha,a,x,beta,y,desc_a,info,& goto 9999 end if - iwork => null() - ! check for presence/size of a work area - liwork= 2*ncol - - if (present(work)) then - if (size(work) >= liwork) then - aliw =.false. - else - aliw=.true. - endif - else - aliw=.true. - end if - - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - else - iwork => work - endif - - iwork(1)=0.d0 - ! Perform local triangular system solve if (present(diag)) then call a%spsm(alpha,x,beta,y,info,scale=scale,d=diag,trans=trans) @@ -208,10 +179,7 @@ subroutine psb_dspsv_vect(alpha,a,x,beta,y,desc_a,info,& ! update overlap elements if (choice_ > 0) then - call psi_swapdata(ior(psb_swap_send_,psb_swap_recv_),& - & done,y%v,desc_a,iwork,info,data=psb_comm_ovr_) - - + call psi_swapdata(psb_comm_status_sync_,done,y%v,desc_a,info,data=psb_comm_ovr_) if (info == psb_success_) call psi_ovrl_upd(y%v,desc_a,choice_,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Inner updates') @@ -219,8 +187,6 @@ subroutine psb_dspsv_vect(alpha,a,x,beta,y,desc_a,info,& end if end if - if (aliw) deallocate(iwork) - call psb_erractionrestore(err_act) return @@ -271,7 +237,7 @@ end subroutine psb_dspsv_vect ! jy - integer(optional). The column offset for ( Y ). Default: 1 ! work(:) - real, optional Working area. ! -subroutine psb_dspsm(alpha,a,x,beta,y,desc_a,info,& +subroutine psb_dspsm(alpha,a,x,beta,y,desc_a,info,& & trans, scale, choice, diag, k, jx, jy, work) use psb_base_mod, psb_protect_name => psb_dspsm use psi_mod @@ -517,7 +483,7 @@ end subroutine psb_dspsm ! d(:) - real, optional Matrix for diagonal scaling. ! work(:) - real, optional Working area. ! -subroutine psb_dspsv(alpha,a,x,beta,y,desc_a,info,& +subroutine psb_dspsv(alpha,a,x,beta,y,desc_a,info,& & trans, scale, choice, diag, work) use psb_base_mod, psb_protect_name => psb_dspsv use psi_mod diff --git a/base/psblas/psb_dvmlt.f90 b/base/psblas/psb_dvmlt.f90 index ea76e57a0..d3c6abb59 100644 --- a/base/psblas/psb_dvmlt.f90 +++ b/base/psblas/psb_dvmlt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_sabs_vect.f90 b/base/psblas/psb_sabs_vect.f90 index 2eb22d73c..aad75a030 100644 --- a/base/psblas/psb_sabs_vect.f90 +++ b/base/psblas/psb_sabs_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_samax.f90 b/base/psblas/psb_samax.f90 index b2858d965..ca923b94b 100644 --- a/base/psblas/psb_samax.f90 +++ b/base/psblas/psb_samax.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -148,7 +148,7 @@ end function psb_samax !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -371,7 +371,7 @@ end function psb_samax_vect !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -496,7 +496,7 @@ end subroutine psb_samaxvs !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -689,11 +689,11 @@ function psb_smin_vect(x, desc_a, info,global) result(res) goto 9999 end if - ! compute local max + ! compute local min if ((desc_a%get_local_rows() > 0).and.(m /= 0)) then res = x%minreal(desc_a%get_local_rows()) else - res = szero + res = HUGE(sone) end if ! compute global min diff --git a/base/psblas/psb_sasum.f90 b/base/psblas/psb_sasum.f90 index 6ca62d244..b4e503d0b 100644 --- a/base/psblas/psb_sasum.f90 +++ b/base/psblas/psb_sasum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -261,7 +261,7 @@ end function psb_sasum_vect !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -391,7 +391,7 @@ end function psb_sasumv !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_saxpby.f90 b/base/psblas/psb_saxpby.f90 index 61f71b5a7..f47c866b6 100644 --- a/base/psblas/psb_saxpby.f90 +++ b/base/psblas/psb_saxpby.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -146,7 +146,7 @@ end subroutine psb_saxpby_vect ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -418,7 +418,7 @@ end subroutine psb_saxpby !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -538,7 +538,7 @@ end subroutine psb_saxpbyv !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_scmp_vect.f90 b/base/psblas/psb_scmp_vect.f90 index 7a7ff0028..d4678486b 100644 --- a/base/psblas/psb_scmp_vect.f90 +++ b/base/psblas/psb_scmp_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -121,7 +121,7 @@ end subroutine psb_scmp_vect ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_sdiv_vect.f90 b/base/psblas/psb_sdiv_vect.f90 index 70bb96d03..223ce77ff 100644 --- a/base/psblas/psb_sdiv_vect.f90 +++ b/base/psblas/psb_sdiv_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_sdot.f90 b/base/psblas/psb_sdot.f90 index cf0678a71..00671c7d5 100644 --- a/base/psblas/psb_sdot.f90 +++ b/base/psblas/psb_sdot.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -301,7 +301,7 @@ end function psb_sdot !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -437,7 +437,7 @@ end function psb_sdotv !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -572,7 +572,7 @@ end subroutine psb_sdotvs !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_sgetmatinfo.F90 b/base/psblas/psb_sgetmatinfo.F90 index 5d5ae9c42..25c626ab1 100644 --- a/base/psblas/psb_sgetmatinfo.F90 +++ b/base/psblas/psb_sgetmatinfo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_sinv_vect.f90 b/base/psblas/psb_sinv_vect.f90 index f658b1779..757899097 100644 --- a/base/psblas/psb_sinv_vect.f90 +++ b/base/psblas/psb_sinv_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_smlt_vect.f90 b/base/psblas/psb_smlt_vect.f90 index 04b3150cb..b9dcff878 100644 --- a/base/psblas/psb_smlt_vect.f90 +++ b/base/psblas/psb_smlt_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_snrm2.f90 b/base/psblas/psb_snrm2.f90 index bb9b3effb..fcc36eaa9 100644 --- a/base/psblas/psb_snrm2.f90 +++ b/base/psblas/psb_snrm2.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -155,7 +155,7 @@ end function psb_snrm2 !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -610,7 +610,7 @@ end function psb_snrm2_weightmask_vect !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_snrmi.f90 b/base/psblas/psb_snrmi.f90 index d48bb5f9a..0f9ba9dae 100644 --- a/base/psblas/psb_snrmi.f90 +++ b/base/psblas/psb_snrmi.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_sspmm.f90 b/base/psblas/psb_sspmm.f90 index 7f680934c..acb656ca3 100644 --- a/base/psblas/psb_sspmm.f90 +++ b/base/psblas/psb_sspmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,11 +51,10 @@ ! desc_a - type(psb_desc_type). The communication descriptor. ! info - integer. Return code ! trans - character(optional). Whether A or A'. Default: 'N' -! work(:) - real,(optional). Working area. ! doswap - logical(optional). Whether to performe halo updates. ! -subroutine psb_sspmv_vect(alpha,a,x,beta,y,desc_a,info,& - & trans, work, doswap) +subroutine psb_sspmv_vect(alpha,a,x,beta,y,desc_a,info,& + & trans, doswap) use psb_base_mod, psb_protect_name => psb_sspmv_vect use psi_mod implicit none @@ -66,7 +65,6 @@ subroutine psb_sspmv_vect(alpha,a,x,beta,y,desc_a,info,& type(psb_sspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info - real(psb_spk_), optional, target, intent(inout) :: work(:) character, intent(in), optional :: trans logical, intent(in), optional :: doswap @@ -74,10 +72,10 @@ subroutine psb_sspmv_vect(alpha,a,x,beta,y,desc_a,info,& type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me,& & err_act, iix, jjx, iia, jja, nrow, ncol, lldx, lldy, & - & liwork, iiy, jjy, ib, ip, idx + & iiy, jjy, ib, ip, idx integer(psb_lpk_) :: ix, ijx, iy, ijy, m, n, ia, ja integer(psb_ipk_), parameter :: nb=4 - real(psb_spk_), pointer :: iwork(:), xp(:), yp(:) + real(psb_spk_), pointer :: xp(:), yp(:) real(psb_spk_), allocatable :: xvsave(:) character :: trans_ character(len=20) :: name, ch_err @@ -163,34 +161,6 @@ subroutine psb_sspmv_vect(alpha,a,x,beta,y,desc_a,info,& goto 9999 end if - iwork => null() - ! check for presence/size of a work area - liwork= 2*ncol - - if (present(work)) then - if (size(work) >= liwork) then - aliw =.false. - else - aliw=.true. - endif - else - aliw=.true. - end if - - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='Allocate' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - else - iwork => work - endif - - if (debug_level >= psb_debug_comp_) & - & write(debug_unit,*) me,' ',trim(name),' Allocated work ', info if (trans_ == 'N') then ! Matrix is not transposed @@ -203,13 +173,13 @@ subroutine psb_sspmv_vect(alpha,a,x,beta,y,desc_a,info,& if (do_timings) call psb_barrier(ctxt) if (do_timings) call psb_tic(mv_phase1) if (doswap_) call psi_swapdata(psb_swap_send_,& - & szero,x%v,desc_a,iwork,info,data=psb_comm_halo_) + & szero,x%v,desc_a,info,data=psb_comm_halo_) if (do_timings) call psb_toc(mv_phase1) if (do_timings) call psb_tic(mv_phase2) call a%ad%spmm(alpha,x%v,beta,y%v,info) if (do_timings) call psb_tic(mv_phase3) if (doswap_) call psi_swapdata(psb_swap_recv_,& - & szero,x%v,desc_a,iwork,info,data=psb_comm_halo_) + & szero,x%v,desc_a,info,data=psb_comm_halo_) if (do_timings) call psb_toc(mv_phase3) if (do_timings) call psb_tic(mv_phase4) call a%and%spmm(alpha,x%v,sone,y%v,info) @@ -225,7 +195,7 @@ subroutine psb_sspmv_vect(alpha,a,x,beta,y,desc_a,info,& if (do_timings) call psb_tic(mv_phase11) if (doswap_) then call psi_swapdata(ior(psb_swap_send_,psb_swap_recv_),& - & szero,x%v,desc_a,iwork,info,data=psb_comm_halo_) + & szero,x%v,desc_a,info,data=psb_comm_halo_) end if if (do_timings) call psb_toc(mv_phase11) if (do_timings) call psb_tic(mv_phase12) @@ -269,9 +239,9 @@ subroutine psb_sspmv_vect(alpha,a,x,beta,y,desc_a,info,& if (doswap_) then call psi_swaptran(ior(psb_swap_send_,psb_swap_recv_),& - & sone,y%v,desc_a,iwork,info) + & sone,y%v,desc_a,info) if (info == psb_success_) call psi_swapdata(ior(psb_swap_send_,psb_swap_recv_),& - & sone,y%v,desc_a,iwork,info,data=psb_comm_ovr_) + & sone,y%v,desc_a,info,data=psb_comm_ovr_) if (debug_level >= psb_debug_comp_) & & write(debug_unit,*) me,' ',trim(name),' swaptran ', info @@ -285,18 +255,6 @@ subroutine psb_sspmv_vect(alpha,a,x,beta,y,desc_a,info,& end if - if (aliw) deallocate(iwork,stat=info) - if (debug_level >= psb_debug_comp_) & - & write(debug_unit,*) me,' ',trim(name),' deallocat ',aliw, info - if(info /= psb_success_) then - info = psb_err_from_subroutine_ - ch_err='Deallocate iwork' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - - nullify(iwork) - call psb_erractionrestore(err_act) if (debug_level >= psb_debug_comp_) then call psb_barrier(ctxt) @@ -651,7 +609,7 @@ end subroutine psb_sspmm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_sspnrm1.f90 b/base/psblas/psb_sspnrm1.f90 index 09ea96fbd..3f1bf39cd 100644 --- a/base/psblas/psb_sspnrm1.f90 +++ b/base/psblas/psb_sspnrm1.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_sspsm.f90 b/base/psblas/psb_sspsm.f90 index c354569ba..ab2eb9bd9 100644 --- a/base/psblas/psb_sspsm.f90 +++ b/base/psblas/psb_sspsm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -64,47 +64,46 @@ ! the diagonal matrix D. ! choice - integer(optional). The kind of update to perform on overlap elements. ! d(:) - real, optional Matrix for diagonal scaling. -! work(:) - real, optional Working area. ! -subroutine psb_sspsv_vect(alpha,a,x,beta,y,desc_a,info,& - & trans, scale, choice, diag, work) +subroutine psb_sspsv_vect(alpha,a,x,beta,y,desc_a,info,& + & trans, scale, choice, diag) use psb_base_mod, psb_protect_name => psb_sspsv_vect use psi_mod implicit none - real(psb_spk_), intent(in) :: alpha, beta - type(psb_s_vect_type), intent(inout) :: x - type(psb_s_vect_type), intent(inout) :: y - type(psb_sspmat_type), intent(inout) :: a - type(psb_desc_type), intent(in) :: desc_a + real(psb_spk_), intent(in) :: alpha, beta + type(psb_s_vect_type), intent(inout) :: x + type(psb_s_vect_type), intent(inout) :: y + type(psb_sspmat_type), intent(inout) :: a + type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info type(psb_s_vect_type), intent(inout), optional :: diag - real(psb_spk_), optional, target, intent(inout) :: work(:) - character, intent(in), optional :: trans, scale + character, intent(in), optional :: trans, scale integer(psb_ipk_), intent(in), optional :: choice ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, & + integer(psb_ipk_) :: np, me, & & err_act, iix, jjx, ia, ja, iia, jja, lldx,lldy, choice_,& & ix, iy, ik, jx, jy, i, lld,& & m, nrow, ncol, liwork, llwork, iiy, jjy, idx, ndm - character :: lscale - integer(psb_ipk_), parameter :: nb=4 - real(psb_spk_),pointer :: iwork(:), xp(:), yp(:) - character :: itrans - character(len=20) :: name, ch_err - logical :: aliw + character :: lscale + integer(psb_ipk_), parameter :: nb=4 + real(psb_spk_),pointer :: xp(:), yp(:) + character :: itrans + character(len=20) :: name, ch_err + logical :: aliw - name='psb_sspsv_vect' - info=psb_success_ + name = 'psb_sspsv_vect' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() call psb_info(ctxt, me, np) if (np == -1) then @@ -165,34 +164,6 @@ subroutine psb_sspsv_vect(alpha,a,x,beta,y,desc_a,info,& goto 9999 end if - iwork => null() - ! check for presence/size of a work area - liwork= 2*ncol - - if (present(work)) then - if (size(work) >= liwork) then - aliw =.false. - else - aliw=.true. - endif - else - aliw=.true. - end if - - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - else - iwork => work - endif - - iwork(1)=0.d0 - ! Perform local triangular system solve if (present(diag)) then call a%spsm(alpha,x,beta,y,info,scale=scale,d=diag,trans=trans) @@ -208,10 +179,7 @@ subroutine psb_sspsv_vect(alpha,a,x,beta,y,desc_a,info,& ! update overlap elements if (choice_ > 0) then - call psi_swapdata(ior(psb_swap_send_,psb_swap_recv_),& - & sone,y%v,desc_a,iwork,info,data=psb_comm_ovr_) - - + call psi_swapdata(psb_comm_status_sync_,sone,y%v,desc_a,info,data=psb_comm_ovr_) if (info == psb_success_) call psi_ovrl_upd(y%v,desc_a,choice_,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Inner updates') @@ -219,8 +187,6 @@ subroutine psb_sspsv_vect(alpha,a,x,beta,y,desc_a,info,& end if end if - if (aliw) deallocate(iwork) - call psb_erractionrestore(err_act) return @@ -271,7 +237,7 @@ end subroutine psb_sspsv_vect ! jy - integer(optional). The column offset for ( Y ). Default: 1 ! work(:) - real, optional Working area. ! -subroutine psb_sspsm(alpha,a,x,beta,y,desc_a,info,& +subroutine psb_sspsm(alpha,a,x,beta,y,desc_a,info,& & trans, scale, choice, diag, k, jx, jy, work) use psb_base_mod, psb_protect_name => psb_sspsm use psi_mod @@ -517,7 +483,7 @@ end subroutine psb_sspsm ! d(:) - real, optional Matrix for diagonal scaling. ! work(:) - real, optional Working area. ! -subroutine psb_sspsv(alpha,a,x,beta,y,desc_a,info,& +subroutine psb_sspsv(alpha,a,x,beta,y,desc_a,info,& & trans, scale, choice, diag, work) use psb_base_mod, psb_protect_name => psb_sspsv use psi_mod diff --git a/base/psblas/psb_svmlt.f90 b/base/psblas/psb_svmlt.f90 index a9b506c6c..0117c295c 100644 --- a/base/psblas/psb_svmlt.f90 +++ b/base/psblas/psb_svmlt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zabs_vect.f90 b/base/psblas/psb_zabs_vect.f90 index 8c027727f..17d064f8a 100644 --- a/base/psblas/psb_zabs_vect.f90 +++ b/base/psblas/psb_zabs_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zamax.f90 b/base/psblas/psb_zamax.f90 index 79cc6d96d..ff3331e4c 100644 --- a/base/psblas/psb_zamax.f90 +++ b/base/psblas/psb_zamax.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -148,7 +148,7 @@ end function psb_zamax !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -371,7 +371,7 @@ end function psb_zamax_vect !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -496,7 +496,7 @@ end subroutine psb_zamaxvs !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zasum.f90 b/base/psblas/psb_zasum.f90 index 63061d0b7..4e07c9970 100644 --- a/base/psblas/psb_zasum.f90 +++ b/base/psblas/psb_zasum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -261,7 +261,7 @@ end function psb_zasum_vect !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -391,7 +391,7 @@ end function psb_zasumv !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zaxpby.f90 b/base/psblas/psb_zaxpby.f90 index e47a871d1..df5d7f773 100644 --- a/base/psblas/psb_zaxpby.f90 +++ b/base/psblas/psb_zaxpby.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -146,7 +146,7 @@ end subroutine psb_zaxpby_vect ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -418,7 +418,7 @@ end subroutine psb_zaxpby !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -538,7 +538,7 @@ end subroutine psb_zaxpbyv !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zcmp_vect.f90 b/base/psblas/psb_zcmp_vect.f90 index 01e1cecf8..4729b4465 100644 --- a/base/psblas/psb_zcmp_vect.f90 +++ b/base/psblas/psb_zcmp_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zdiv_vect.f90 b/base/psblas/psb_zdiv_vect.f90 index 22d8b21ce..ad4d069d8 100644 --- a/base/psblas/psb_zdiv_vect.f90 +++ b/base/psblas/psb_zdiv_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zdot.f90 b/base/psblas/psb_zdot.f90 index 97ecbedf3..0b03c30a6 100644 --- a/base/psblas/psb_zdot.f90 +++ b/base/psblas/psb_zdot.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -301,7 +301,7 @@ end function psb_zdot !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -437,7 +437,7 @@ end function psb_zdotv !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -572,7 +572,7 @@ end subroutine psb_zdotvs !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zgetmatinfo.F90 b/base/psblas/psb_zgetmatinfo.F90 index 7cc3bfaea..cdf74d0e3 100644 --- a/base/psblas/psb_zgetmatinfo.F90 +++ b/base/psblas/psb_zgetmatinfo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zinv_vect.f90 b/base/psblas/psb_zinv_vect.f90 index 593d342b9..b631f2365 100644 --- a/base/psblas/psb_zinv_vect.f90 +++ b/base/psblas/psb_zinv_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zmlt_vect.f90 b/base/psblas/psb_zmlt_vect.f90 index 5db9cdb47..2dc83fd84 100644 --- a/base/psblas/psb_zmlt_vect.f90 +++ b/base/psblas/psb_zmlt_vect.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_znrm2.f90 b/base/psblas/psb_znrm2.f90 index 5612a01db..76f51ffc1 100644 --- a/base/psblas/psb_znrm2.f90 +++ b/base/psblas/psb_znrm2.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -155,7 +155,7 @@ end function psb_znrm2 !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -610,7 +610,7 @@ end function psb_znrm2_weightmask_vect !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_znrmi.f90 b/base/psblas/psb_znrmi.f90 index 9afae6e7f..f1ba036bd 100644 --- a/base/psblas/psb_znrmi.f90 +++ b/base/psblas/psb_znrmi.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zspmm.f90 b/base/psblas/psb_zspmm.f90 index b7fc5cc6c..2d687c7b1 100644 --- a/base/psblas/psb_zspmm.f90 +++ b/base/psblas/psb_zspmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,11 +51,10 @@ ! desc_a - type(psb_desc_type). The communication descriptor. ! info - integer. Return code ! trans - character(optional). Whether A or A'. Default: 'N' -! work(:) - complex,(optional). Working area. ! doswap - logical(optional). Whether to performe halo updates. ! -subroutine psb_zspmv_vect(alpha,a,x,beta,y,desc_a,info,& - & trans, work, doswap) +subroutine psb_zspmv_vect(alpha,a,x,beta,y,desc_a,info,& + & trans, doswap) use psb_base_mod, psb_protect_name => psb_zspmv_vect use psi_mod implicit none @@ -66,7 +65,6 @@ subroutine psb_zspmv_vect(alpha,a,x,beta,y,desc_a,info,& type(psb_zspmat_type), intent(in) :: a type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), optional, target, intent(inout) :: work(:) character, intent(in), optional :: trans logical, intent(in), optional :: doswap @@ -74,10 +72,10 @@ subroutine psb_zspmv_vect(alpha,a,x,beta,y,desc_a,info,& type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me,& & err_act, iix, jjx, iia, jja, nrow, ncol, lldx, lldy, & - & liwork, iiy, jjy, ib, ip, idx + & iiy, jjy, ib, ip, idx integer(psb_lpk_) :: ix, ijx, iy, ijy, m, n, ia, ja integer(psb_ipk_), parameter :: nb=4 - complex(psb_dpk_), pointer :: iwork(:), xp(:), yp(:) + complex(psb_dpk_), pointer :: xp(:), yp(:) complex(psb_dpk_), allocatable :: xvsave(:) character :: trans_ character(len=20) :: name, ch_err @@ -163,34 +161,6 @@ subroutine psb_zspmv_vect(alpha,a,x,beta,y,desc_a,info,& goto 9999 end if - iwork => null() - ! check for presence/size of a work area - liwork= 2*ncol - - if (present(work)) then - if (size(work) >= liwork) then - aliw =.false. - else - aliw=.true. - endif - else - aliw=.true. - end if - - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='Allocate' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - else - iwork => work - endif - - if (debug_level >= psb_debug_comp_) & - & write(debug_unit,*) me,' ',trim(name),' Allocated work ', info if (trans_ == 'N') then ! Matrix is not transposed @@ -203,13 +173,13 @@ subroutine psb_zspmv_vect(alpha,a,x,beta,y,desc_a,info,& if (do_timings) call psb_barrier(ctxt) if (do_timings) call psb_tic(mv_phase1) if (doswap_) call psi_swapdata(psb_swap_send_,& - & zzero,x%v,desc_a,iwork,info,data=psb_comm_halo_) + & zzero,x%v,desc_a,info,data=psb_comm_halo_) if (do_timings) call psb_toc(mv_phase1) if (do_timings) call psb_tic(mv_phase2) call a%ad%spmm(alpha,x%v,beta,y%v,info) if (do_timings) call psb_tic(mv_phase3) if (doswap_) call psi_swapdata(psb_swap_recv_,& - & zzero,x%v,desc_a,iwork,info,data=psb_comm_halo_) + & zzero,x%v,desc_a,info,data=psb_comm_halo_) if (do_timings) call psb_toc(mv_phase3) if (do_timings) call psb_tic(mv_phase4) call a%and%spmm(alpha,x%v,zone,y%v,info) @@ -225,7 +195,7 @@ subroutine psb_zspmv_vect(alpha,a,x,beta,y,desc_a,info,& if (do_timings) call psb_tic(mv_phase11) if (doswap_) then call psi_swapdata(ior(psb_swap_send_,psb_swap_recv_),& - & zzero,x%v,desc_a,iwork,info,data=psb_comm_halo_) + & zzero,x%v,desc_a,info,data=psb_comm_halo_) end if if (do_timings) call psb_toc(mv_phase11) if (do_timings) call psb_tic(mv_phase12) @@ -269,9 +239,9 @@ subroutine psb_zspmv_vect(alpha,a,x,beta,y,desc_a,info,& if (doswap_) then call psi_swaptran(ior(psb_swap_send_,psb_swap_recv_),& - & zone,y%v,desc_a,iwork,info) + & zone,y%v,desc_a,info) if (info == psb_success_) call psi_swapdata(ior(psb_swap_send_,psb_swap_recv_),& - & zone,y%v,desc_a,iwork,info,data=psb_comm_ovr_) + & zone,y%v,desc_a,info,data=psb_comm_ovr_) if (debug_level >= psb_debug_comp_) & & write(debug_unit,*) me,' ',trim(name),' swaptran ', info @@ -285,18 +255,6 @@ subroutine psb_zspmv_vect(alpha,a,x,beta,y,desc_a,info,& end if - if (aliw) deallocate(iwork,stat=info) - if (debug_level >= psb_debug_comp_) & - & write(debug_unit,*) me,' ',trim(name),' deallocat ',aliw, info - if(info /= psb_success_) then - info = psb_err_from_subroutine_ - ch_err='Deallocate iwork' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - - nullify(iwork) - call psb_erractionrestore(err_act) if (debug_level >= psb_debug_comp_) then call psb_barrier(ctxt) @@ -651,7 +609,7 @@ end subroutine psb_zspmm !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zspnrm1.f90 b/base/psblas/psb_zspnrm1.f90 index cb568ab87..a6dc8e88f 100644 --- a/base/psblas/psb_zspnrm1.f90 +++ b/base/psblas/psb_zspnrm1.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/psblas/psb_zspsm.f90 b/base/psblas/psb_zspsm.f90 index 3cb06b021..6f0a2797d 100644 --- a/base/psblas/psb_zspsm.f90 +++ b/base/psblas/psb_zspsm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -64,47 +64,46 @@ ! the diagonal matrix D. ! choice - integer(optional). The kind of update to perform on overlap elements. ! d(:) - complex, optional Matrix for diagonal scaling. -! work(:) - complex, optional Working area. ! -subroutine psb_zspsv_vect(alpha,a,x,beta,y,desc_a,info,& - & trans, scale, choice, diag, work) +subroutine psb_zspsv_vect(alpha,a,x,beta,y,desc_a,info,& + & trans, scale, choice, diag) use psb_base_mod, psb_protect_name => psb_zspsv_vect use psi_mod implicit none - complex(psb_dpk_), intent(in) :: alpha, beta - type(psb_z_vect_type), intent(inout) :: x - type(psb_z_vect_type), intent(inout) :: y - type(psb_zspmat_type), intent(inout) :: a - type(psb_desc_type), intent(in) :: desc_a + complex(psb_dpk_), intent(in) :: alpha, beta + type(psb_z_vect_type), intent(inout) :: x + type(psb_z_vect_type), intent(inout) :: y + type(psb_zspmat_type), intent(inout) :: a + type(psb_desc_type), intent(in) :: desc_a integer(psb_ipk_), intent(out) :: info type(psb_z_vect_type), intent(inout), optional :: diag - complex(psb_dpk_), optional, target, intent(inout) :: work(:) - character, intent(in), optional :: trans, scale + character, intent(in), optional :: trans, scale integer(psb_ipk_), intent(in), optional :: choice ! locals type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np, me, & + integer(psb_ipk_) :: np, me, & & err_act, iix, jjx, ia, ja, iia, jja, lldx,lldy, choice_,& & ix, iy, ik, jx, jy, i, lld,& & m, nrow, ncol, liwork, llwork, iiy, jjy, idx, ndm - character :: lscale - integer(psb_ipk_), parameter :: nb=4 - complex(psb_dpk_),pointer :: iwork(:), xp(:), yp(:) - character :: itrans - character(len=20) :: name, ch_err - logical :: aliw + character :: lscale + integer(psb_ipk_), parameter :: nb=4 + complex(psb_dpk_),pointer :: xp(:), yp(:) + character :: itrans + character(len=20) :: name, ch_err + logical :: aliw - name='psb_zspsv_vect' - info=psb_success_ + name = 'psb_zspsv_vect' + info = psb_success_ call psb_erractionsave(err_act) if (psb_errstatus_fatal()) then - info = psb_err_internal_error_ ; goto 9999 + info = psb_err_internal_error_ + goto 9999 end if - ctxt=desc_a%get_context() + ctxt = desc_a%get_context() call psb_info(ctxt, me, np) if (np == -1) then @@ -165,34 +164,6 @@ subroutine psb_zspsv_vect(alpha,a,x,beta,y,desc_a,info,& goto 9999 end if - iwork => null() - ! check for presence/size of a work area - liwork= 2*ncol - - if (present(work)) then - if (size(work) >= liwork) then - aliw =.false. - else - aliw=.true. - endif - else - aliw=.true. - end if - - if (aliw) then - allocate(iwork(liwork),stat=info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='psb_realloc' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - else - iwork => work - endif - - iwork(1)=0.d0 - ! Perform local triangular system solve if (present(diag)) then call a%spsm(alpha,x,beta,y,info,scale=scale,d=diag,trans=trans) @@ -208,10 +179,7 @@ subroutine psb_zspsv_vect(alpha,a,x,beta,y,desc_a,info,& ! update overlap elements if (choice_ > 0) then - call psi_swapdata(ior(psb_swap_send_,psb_swap_recv_),& - & zone,y%v,desc_a,iwork,info,data=psb_comm_ovr_) - - + call psi_swapdata(psb_comm_status_sync_,zone,y%v,desc_a,info,data=psb_comm_ovr_) if (info == psb_success_) call psi_ovrl_upd(y%v,desc_a,choice_,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Inner updates') @@ -219,8 +187,6 @@ subroutine psb_zspsv_vect(alpha,a,x,beta,y,desc_a,info,& end if end if - if (aliw) deallocate(iwork) - call psb_erractionrestore(err_act) return @@ -271,7 +237,7 @@ end subroutine psb_zspsv_vect ! jy - integer(optional). The column offset for ( Y ). Default: 1 ! work(:) - complex, optional Working area. ! -subroutine psb_zspsm(alpha,a,x,beta,y,desc_a,info,& +subroutine psb_zspsm(alpha,a,x,beta,y,desc_a,info,& & trans, scale, choice, diag, k, jx, jy, work) use psb_base_mod, psb_protect_name => psb_zspsm use psi_mod @@ -517,7 +483,7 @@ end subroutine psb_zspsm ! d(:) - complex, optional Matrix for diagonal scaling. ! work(:) - complex, optional Working area. ! -subroutine psb_zspsv(alpha,a,x,beta,y,desc_a,info,& +subroutine psb_zspsv(alpha,a,x,beta,y,desc_a,info,& & trans, scale, choice, diag, work) use psb_base_mod, psb_protect_name => psb_zspsv use psi_mod diff --git a/base/psblas/psb_zvmlt.f90 b/base/psblas/psb_zvmlt.f90 index a4c06fc4e..c6bebedc3 100644 --- a/base/psblas/psb_zvmlt.f90 +++ b/base/psblas/psb_zvmlt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/Makefile b/base/serial/Makefile index ec0e2c829..7e0431aaa 100644 --- a/base/serial/Makefile +++ b/base/serial/Makefile @@ -1,7 +1,7 @@ include ../../Make.inc -FOBJS = psb_lsame.o psi_m_serial_impl.o psi_e_serial_impl.o \ +FOBJS = psb_lsame.o psi_m_serial_impl.o psi_e_serial_impl.o psi_i2_serial_impl.o \ psi_s_serial_impl.o psi_d_serial_impl.o \ psi_c_serial_impl.o psi_z_serial_impl.o \ psb_srwextd.o psb_drwextd.o psb_crwextd.o psb_zrwextd.o \ @@ -11,6 +11,7 @@ FOBJS = psb_lsame.o psi_m_serial_impl.o psi_e_serial_impl.o \ smmp.o lsmmp.o \ psb_sgeprt.o psb_dgeprt.o psb_cgeprt.o psb_zgeprt.o\ psb_spdot_srtd.o psb_aspxpby.o psb_spge_dot.o\ + psb_saplusat.o psb_daplusat.o psb_caplusat.o psb_zaplusat.o \ psb_samax_s.o psb_damax_s.o psb_camax_s.o psb_zamax_s.o \ psb_sasum_s.o psb_dasum_s.o psb_casum_s.o psb_zasum_s.o diff --git a/base/serial/impl/psb_base_mat_impl.f90 b/base/serial/impl/psb_base_mat_impl.f90 index 39e21300c..83a8e6405 100644 --- a/base/serial/impl/psb_base_mat_impl.f90 +++ b/base/serial/impl/psb_base_mat_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_c_base_mat_impl.F90 b/base/serial/impl/psb_c_base_mat_impl.F90 index 25cd290a3..e04a742c4 100644 --- a/base/serial/impl/psb_c_base_mat_impl.F90 +++ b/base/serial/impl/psb_c_base_mat_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_c_coo_impl.F90 b/base/serial/impl/psb_c_coo_impl.F90 index 53ffcea91..3b9ff2758 100644 --- a/base/serial/impl/psb_c_coo_impl.F90 +++ b/base/serial/impl/psb_c_coo_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_c_csc_impl.F90 b/base/serial/impl/psb_c_csc_impl.F90 index 94744dcf4..7553ec01b 100644 --- a/base/serial/impl/psb_c_csc_impl.F90 +++ b/base/serial/impl/psb_c_csc_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -2824,8 +2824,8 @@ subroutine psb_c_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_c_csc_print subroutine psb_ccscspspmm(a,b,c,info) - use psb_c_mat_mod - use psb_serial_mod, psb_protect_name => psb_ccscspspmm + use psb_c_csc_mat_mod, psb_protect_name => psb_ccscspspmm + use psb_serial_mod implicit none @@ -4664,8 +4664,8 @@ subroutine psb_lc_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_lc_csc_print subroutine psb_lccscspspmm(a,b,c,info) - use psb_c_mat_mod - use psb_serial_mod, psb_protect_name => psb_lccscspspmm + use psb_c_csc_mat_mod, psb_protect_name => psb_lccscspspmm + use psb_serial_mod implicit none diff --git a/base/serial/impl/psb_c_csr_impl.F90 b/base/serial/impl/psb_c_csr_impl.F90 index 733240736..d0fe429d8 100644 --- a/base/serial/impl/psb_c_csr_impl.F90 +++ b/base/serial/impl/psb_c_csr_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -3657,8 +3657,8 @@ end subroutine psb_c_cp_csr_from_fmt #if defined(PSB_OPENMP) subroutine psb_ccsrspspmm(a,b,c,info) - use psb_c_mat_mod - use psb_serial_mod, psb_protect_name => psb_ccsrspspmm + use psb_c_csr_mat_mod, psb_protect_name => psb_ccsrspspmm + use psb_serial_mod implicit none @@ -4204,8 +4204,8 @@ end subroutine psb_ccsrspspmm #else subroutine psb_ccsrspspmm(a,b,c,info) - use psb_c_mat_mod - use psb_serial_mod, psb_protect_name => psb_ccsrspspmm + use psb_c_csr_mat_mod, psb_protect_name => psb_ccsrspspmm + use psb_serial_mod implicit none @@ -4238,7 +4238,7 @@ subroutine psb_ccsrspspmm(a,b,c,info) ! Estimate number of nonzeros on output. nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = max(nint(0.5*(nza+nzb)),ma,mb,na,nb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -4276,9 +4276,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 @@ -6580,8 +6580,8 @@ end subroutine psb_lc_cp_csr_from_fmt !!$end subroutine psb_lc_csr_clean_zeros subroutine psb_lccsrspspmm(a,b,c,info) - use psb_c_mat_mod - use psb_serial_mod, psb_protect_name => psb_lccsrspspmm + use psb_c_csr_mat_mod, psb_protect_name => psb_lccsrspspmm + use psb_serial_mod implicit none @@ -6613,7 +6613,7 @@ subroutine psb_lccsrspspmm(a,b,c,info) nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = 2*(nza+nzb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -6651,9 +6651,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 diff --git a/base/serial/impl/psb_c_mat_impl.F90 b/base/serial/impl/psb_c_mat_impl.F90 index 81479084f..e796d5431 100644 --- a/base/serial/impl/psb_c_mat_impl.F90 +++ b/base/serial/impl/psb_c_mat_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_c_rb_idx_tree_impl.F90 b/base/serial/impl/psb_c_rb_idx_tree_impl.F90 index 04730aaa2..0a99b6de7 100644 --- a/base/serial/impl/psb_c_rb_idx_tree_impl.F90 +++ b/base/serial/impl/psb_c_rb_idx_tree_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_d_base_mat_impl.F90 b/base/serial/impl/psb_d_base_mat_impl.F90 index 5f849bea1..0b54601ac 100644 --- a/base/serial/impl/psb_d_base_mat_impl.F90 +++ b/base/serial/impl/psb_d_base_mat_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_d_coo_impl.F90 b/base/serial/impl/psb_d_coo_impl.F90 index 7a79847eb..99d4e2f63 100644 --- a/base/serial/impl/psb_d_coo_impl.F90 +++ b/base/serial/impl/psb_d_coo_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_d_csc_impl.F90 b/base/serial/impl/psb_d_csc_impl.F90 index ba38e7637..d11cd14da 100644 --- a/base/serial/impl/psb_d_csc_impl.F90 +++ b/base/serial/impl/psb_d_csc_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -2824,8 +2824,8 @@ subroutine psb_d_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_d_csc_print subroutine psb_dcscspspmm(a,b,c,info) - use psb_d_mat_mod - use psb_serial_mod, psb_protect_name => psb_dcscspspmm + use psb_d_csc_mat_mod, psb_protect_name => psb_dcscspspmm + use psb_serial_mod implicit none @@ -4664,8 +4664,8 @@ subroutine psb_ld_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_ld_csc_print subroutine psb_ldcscspspmm(a,b,c,info) - use psb_d_mat_mod - use psb_serial_mod, psb_protect_name => psb_ldcscspspmm + use psb_d_csc_mat_mod, psb_protect_name => psb_ldcscspspmm + use psb_serial_mod implicit none diff --git a/base/serial/impl/psb_d_csr_impl.F90 b/base/serial/impl/psb_d_csr_impl.F90 index 7d8f477b7..763bd4f22 100644 --- a/base/serial/impl/psb_d_csr_impl.F90 +++ b/base/serial/impl/psb_d_csr_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -3657,8 +3657,8 @@ end subroutine psb_d_cp_csr_from_fmt #if defined(PSB_OPENMP) subroutine psb_dcsrspspmm(a,b,c,info) - use psb_d_mat_mod - use psb_serial_mod, psb_protect_name => psb_dcsrspspmm + use psb_d_csr_mat_mod, psb_protect_name => psb_dcsrspspmm + use psb_serial_mod implicit none @@ -4204,8 +4204,8 @@ end subroutine psb_dcsrspspmm #else subroutine psb_dcsrspspmm(a,b,c,info) - use psb_d_mat_mod - use psb_serial_mod, psb_protect_name => psb_dcsrspspmm + use psb_d_csr_mat_mod, psb_protect_name => psb_dcsrspspmm + use psb_serial_mod implicit none @@ -4238,7 +4238,7 @@ subroutine psb_dcsrspspmm(a,b,c,info) ! Estimate number of nonzeros on output. nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = max(nint(0.5*(nza+nzb)),ma,mb,na,nb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -4276,9 +4276,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 @@ -6580,8 +6580,8 @@ end subroutine psb_ld_cp_csr_from_fmt !!$end subroutine psb_ld_csr_clean_zeros subroutine psb_ldcsrspspmm(a,b,c,info) - use psb_d_mat_mod - use psb_serial_mod, psb_protect_name => psb_ldcsrspspmm + use psb_d_csr_mat_mod, psb_protect_name => psb_ldcsrspspmm + use psb_serial_mod implicit none @@ -6613,7 +6613,7 @@ subroutine psb_ldcsrspspmm(a,b,c,info) nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = 2*(nza+nzb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -6651,9 +6651,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 diff --git a/base/serial/impl/psb_d_mat_impl.F90 b/base/serial/impl/psb_d_mat_impl.F90 index c744f7f5b..9b6fe8795 100644 --- a/base/serial/impl/psb_d_mat_impl.F90 +++ b/base/serial/impl/psb_d_mat_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_d_rb_idx_tree_impl.F90 b/base/serial/impl/psb_d_rb_idx_tree_impl.F90 index 241338fb3..62af7430c 100644 --- a/base/serial/impl/psb_d_rb_idx_tree_impl.F90 +++ b/base/serial/impl/psb_d_rb_idx_tree_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_s_base_mat_impl.F90 b/base/serial/impl/psb_s_base_mat_impl.F90 index c070e7167..7fe841e3f 100644 --- a/base/serial/impl/psb_s_base_mat_impl.F90 +++ b/base/serial/impl/psb_s_base_mat_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_s_coo_impl.F90 b/base/serial/impl/psb_s_coo_impl.F90 index b4e6a8df9..d03103f81 100644 --- a/base/serial/impl/psb_s_coo_impl.F90 +++ b/base/serial/impl/psb_s_coo_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_s_csc_impl.F90 b/base/serial/impl/psb_s_csc_impl.F90 index 73c11ce60..dec7ccfb2 100644 --- a/base/serial/impl/psb_s_csc_impl.F90 +++ b/base/serial/impl/psb_s_csc_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -2824,8 +2824,8 @@ subroutine psb_s_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_s_csc_print subroutine psb_scscspspmm(a,b,c,info) - use psb_s_mat_mod - use psb_serial_mod, psb_protect_name => psb_scscspspmm + use psb_s_csc_mat_mod, psb_protect_name => psb_scscspspmm + use psb_serial_mod implicit none @@ -4664,8 +4664,8 @@ subroutine psb_ls_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_ls_csc_print subroutine psb_lscscspspmm(a,b,c,info) - use psb_s_mat_mod - use psb_serial_mod, psb_protect_name => psb_lscscspspmm + use psb_s_csc_mat_mod, psb_protect_name => psb_lscscspspmm + use psb_serial_mod implicit none diff --git a/base/serial/impl/psb_s_csr_impl.F90 b/base/serial/impl/psb_s_csr_impl.F90 index a0cce83d2..92bdc0f02 100644 --- a/base/serial/impl/psb_s_csr_impl.F90 +++ b/base/serial/impl/psb_s_csr_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -3657,8 +3657,8 @@ end subroutine psb_s_cp_csr_from_fmt #if defined(PSB_OPENMP) subroutine psb_scsrspspmm(a,b,c,info) - use psb_s_mat_mod - use psb_serial_mod, psb_protect_name => psb_scsrspspmm + use psb_s_csr_mat_mod, psb_protect_name => psb_scsrspspmm + use psb_serial_mod implicit none @@ -4204,8 +4204,8 @@ end subroutine psb_scsrspspmm #else subroutine psb_scsrspspmm(a,b,c,info) - use psb_s_mat_mod - use psb_serial_mod, psb_protect_name => psb_scsrspspmm + use psb_s_csr_mat_mod, psb_protect_name => psb_scsrspspmm + use psb_serial_mod implicit none @@ -4238,7 +4238,7 @@ subroutine psb_scsrspspmm(a,b,c,info) ! Estimate number of nonzeros on output. nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = max(nint(0.5*(nza+nzb)),ma,mb,na,nb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -4276,9 +4276,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 @@ -6580,8 +6580,8 @@ end subroutine psb_ls_cp_csr_from_fmt !!$end subroutine psb_ls_csr_clean_zeros subroutine psb_lscsrspspmm(a,b,c,info) - use psb_s_mat_mod - use psb_serial_mod, psb_protect_name => psb_lscsrspspmm + use psb_s_csr_mat_mod, psb_protect_name => psb_lscsrspspmm + use psb_serial_mod implicit none @@ -6613,7 +6613,7 @@ subroutine psb_lscsrspspmm(a,b,c,info) nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = 2*(nza+nzb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -6651,9 +6651,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 diff --git a/base/serial/impl/psb_s_mat_impl.F90 b/base/serial/impl/psb_s_mat_impl.F90 index a27a24a5d..dda59ee8e 100644 --- a/base/serial/impl/psb_s_mat_impl.F90 +++ b/base/serial/impl/psb_s_mat_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_s_rb_idx_tree_impl.F90 b/base/serial/impl/psb_s_rb_idx_tree_impl.F90 index 5241225ea..88e4fc82c 100644 --- a/base/serial/impl/psb_s_rb_idx_tree_impl.F90 +++ b/base/serial/impl/psb_s_rb_idx_tree_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_z_base_mat_impl.F90 b/base/serial/impl/psb_z_base_mat_impl.F90 index 2d68d1527..b488fd0da 100644 --- a/base/serial/impl/psb_z_base_mat_impl.F90 +++ b/base/serial/impl/psb_z_base_mat_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_z_coo_impl.F90 b/base/serial/impl/psb_z_coo_impl.F90 index 949d0384c..d7439be9d 100644 --- a/base/serial/impl/psb_z_coo_impl.F90 +++ b/base/serial/impl/psb_z_coo_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_z_csc_impl.F90 b/base/serial/impl/psb_z_csc_impl.F90 index 95de776d4..c987996ee 100644 --- a/base/serial/impl/psb_z_csc_impl.F90 +++ b/base/serial/impl/psb_z_csc_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -2824,8 +2824,8 @@ subroutine psb_z_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_z_csc_print subroutine psb_zcscspspmm(a,b,c,info) - use psb_z_mat_mod - use psb_serial_mod, psb_protect_name => psb_zcscspspmm + use psb_z_csc_mat_mod, psb_protect_name => psb_zcscspspmm + use psb_serial_mod implicit none @@ -4664,8 +4664,8 @@ subroutine psb_lz_csc_print(iout,a,iv,head,ivr,ivc) end subroutine psb_lz_csc_print subroutine psb_lzcscspspmm(a,b,c,info) - use psb_z_mat_mod - use psb_serial_mod, psb_protect_name => psb_lzcscspspmm + use psb_z_csc_mat_mod, psb_protect_name => psb_lzcscspspmm + use psb_serial_mod implicit none diff --git a/base/serial/impl/psb_z_csr_impl.F90 b/base/serial/impl/psb_z_csr_impl.F90 index 784b78f69..17dbd4abc 100644 --- a/base/serial/impl/psb_z_csr_impl.F90 +++ b/base/serial/impl/psb_z_csr_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -3657,8 +3657,8 @@ end subroutine psb_z_cp_csr_from_fmt #if defined(PSB_OPENMP) subroutine psb_zcsrspspmm(a,b,c,info) - use psb_z_mat_mod - use psb_serial_mod, psb_protect_name => psb_zcsrspspmm + use psb_z_csr_mat_mod, psb_protect_name => psb_zcsrspspmm + use psb_serial_mod implicit none @@ -4204,8 +4204,8 @@ end subroutine psb_zcsrspspmm #else subroutine psb_zcsrspspmm(a,b,c,info) - use psb_z_mat_mod - use psb_serial_mod, psb_protect_name => psb_zcsrspspmm + use psb_z_csr_mat_mod, psb_protect_name => psb_zcsrspspmm + use psb_serial_mod implicit none @@ -4238,7 +4238,7 @@ subroutine psb_zcsrspspmm(a,b,c,info) ! Estimate number of nonzeros on output. nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = max(nint(0.5*(nza+nzb)),ma,mb,na,nb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -4276,9 +4276,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 @@ -6580,8 +6580,8 @@ end subroutine psb_lz_cp_csr_from_fmt !!$end subroutine psb_lz_csr_clean_zeros subroutine psb_lzcsrspspmm(a,b,c,info) - use psb_z_mat_mod - use psb_serial_mod, psb_protect_name => psb_lzcsrspspmm + use psb_z_csr_mat_mod, psb_protect_name => psb_lzcsrspspmm + use psb_serial_mod implicit none @@ -6613,7 +6613,7 @@ subroutine psb_lzcsrspspmm(a,b,c,info) nza = a%get_nzeros() nzb = b%get_nzeros() - nzc = 2*(nza+nzb) + nzc = max(nint(0.25*(nza+nzb)),ma,nb) call c%allocate(ma,nb,nzc) call csr_spspmm(a,b,c,info) @@ -6651,9 +6651,9 @@ contains nze = min(size(c%val),size(c%ja)) isz = max(ma,na,mb,nb) - call psb_realloc(isz,row,info) - if (info == 0) call psb_realloc(isz,idxs,info) - if (info == 0) call psb_realloc(isz,irow,info) + call psb_realloc(nb,row,info) + if (info == 0) call psb_realloc(max(na,nb),idxs,info) + if (info == 0) call psb_realloc(nb,irow,info) if (info /= 0) return row = dzero irow = 0 diff --git a/base/serial/impl/psb_z_mat_impl.F90 b/base/serial/impl/psb_z_mat_impl.F90 index e1f9310b1..ee1895177 100644 --- a/base/serial/impl/psb_z_mat_impl.F90 +++ b/base/serial/impl/psb_z_mat_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/impl/psb_z_rb_idx_tree_impl.F90 b/base/serial/impl/psb_z_rb_idx_tree_impl.F90 index 42695158e..26b4d88e5 100644 --- a/base/serial/impl/psb_z_rb_idx_tree_impl.F90 +++ b/base/serial/impl/psb_z_rb_idx_tree_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/lsmmp.f90 b/base/serial/lsmmp.f90 index 2bf2efdaa..77aadca41 100644 --- a/base/serial/lsmmp.f90 +++ b/base/serial/lsmmp.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_aspxpby.f90 b/base/serial/psb_aspxpby.f90 index 3ce0c61b1..6c27f231b 100644 --- a/base/serial/psb_aspxpby.f90 +++ b/base/serial/psb_aspxpby.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_camax_s.f90 b/base/serial/psb_camax_s.f90 index d9073d0f9..99f51840d 100644 --- a/base/serial/psb_camax_s.f90 +++ b/base/serial/psb_camax_s.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_caplusat.f90 b/base/serial/psb_caplusat.f90 new file mode 100644 index 000000000..6beb7f173 --- /dev/null +++ b/base/serial/psb_caplusat.f90 @@ -0,0 +1,50 @@ +subroutine psb_caplusat(ain,aout,info) + use psb_c_mat_mod + + implicit none + type(psb_cspmat_type), intent(inout) :: ain + type(psb_cspmat_type), intent(out) :: aout + integer(psb_ipk_) :: info + + type(psb_c_coo_sparse_mat) :: acoo1, acoo2 + integer(psb_ipk_) :: nr, nc, nz1, nz2 + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err + + name='psb_caplusat' + info = psb_success_ + call psb_erractionsave(err_act) + + + + nr = ain%get_nrows() + nc = ain%get_ncols() + + if (nr /= nc) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + + call ain%cp_to(acoo1) + call acoo1%cp_to_coo(acoo2,info) + nz1 = acoo1%get_nzeros() + nz2 = acoo2%get_nzeros() + call acoo1%reallocate(nz1+nz2) + acoo1%ia(nz1+1:nz1+nz2) = acoo2%ja(1:nz2) + acoo1%ja(nz1+1:nz1+nz2) = acoo2%ia(1:nz2) + acoo1%val(nz1+1:nz1+nz2) = acoo2%val(1:nz2) + call acoo1%set_nrows(nr) + call acoo1%set_ncols(nr) + call acoo1%set_nzeros(nz1+nz2) + call aout%cp_from(acoo1) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + + +end subroutine psb_caplusat diff --git a/base/serial/psb_casum_s.f90 b/base/serial/psb_casum_s.f90 index 1c357cc89..32977f2f3 100644 --- a/base/serial/psb_casum_s.f90 +++ b/base/serial/psb_casum_s.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_cgeprt.f90 b/base/serial/psb_cgeprt.f90 index e05d673b6..1ec98f32f 100644 --- a/base/serial/psb_cgeprt.f90 +++ b/base/serial/psb_cgeprt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_cnumbmm.f90 b/base/serial/psb_cnumbmm.f90 index 920187b3d..9559ad44d 100644 --- a/base/serial/psb_cnumbmm.f90 +++ b/base/serial/psb_cnumbmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_crwextd.f90 b/base/serial/psb_crwextd.f90 index 9676ad247..243f91535 100644 --- a/base/serial/psb_crwextd.f90 +++ b/base/serial/psb_crwextd.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_cspspmm.f90 b/base/serial/psb_cspspmm.F90 similarity index 97% rename from base/serial/psb_cspspmm.f90 rename to base/serial/psb_cspspmm.F90 index 83f220129..e7ab8ec20 100644 --- a/base/serial/psb_cspspmm.f90 +++ b/base/serial/psb_cspspmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -37,9 +37,9 @@ ! subroutine psb_cspspmm(a,b,c,info) use psb_mat_mod + use psb_c_csr_mat_mod + use psb_c_csc_mat_mod use psb_c_serial_mod, psb_protect_name => psb_cspspmm - implicit none - type(psb_cspmat_type), intent(in) :: a,b type(psb_cspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -48,6 +48,8 @@ subroutine psb_cspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + + call psb_erractionsave(err_act) info = psb_success_ @@ -118,6 +120,8 @@ end subroutine psb_cspspmm subroutine psb_lcspspmm(a,b,c,info) use psb_mat_mod + use psb_c_csr_mat_mod + use psb_c_csc_mat_mod use psb_c_serial_mod, psb_protect_name => psb_lcspspmm implicit none @@ -129,6 +133,7 @@ subroutine psb_lcspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_csymbmm.f90 b/base/serial/psb_csymbmm.f90 index 7dd657893..519b1689c 100644 --- a/base/serial/psb_csymbmm.f90 +++ b/base/serial/psb_csymbmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,6 +85,7 @@ end subroutine psb_csymbmm subroutine psb_cbase_symbmm(a,b,c,info) use psb_mat_mod use psb_sort_mod + use psb_serial_mod, only : symbmm implicit none class(psb_c_base_sparse_mat), intent(in) :: a,b diff --git a/base/serial/psb_damax_s.f90 b/base/serial/psb_damax_s.f90 index 66aef2882..372dd3082 100644 --- a/base/serial/psb_damax_s.f90 +++ b/base/serial/psb_damax_s.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_daplusat.f90 b/base/serial/psb_daplusat.f90 new file mode 100644 index 000000000..6ae0b4628 --- /dev/null +++ b/base/serial/psb_daplusat.f90 @@ -0,0 +1,50 @@ +subroutine psb_daplusat(ain,aout,info) + use psb_d_mat_mod + + implicit none + type(psb_dspmat_type), intent(inout) :: ain + type(psb_dspmat_type), intent(out) :: aout + integer(psb_ipk_) :: info + + type(psb_d_coo_sparse_mat) :: acoo1, acoo2 + integer(psb_ipk_) :: nr, nc, nz1, nz2 + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err + + name='psb_daplusat' + info = psb_success_ + call psb_erractionsave(err_act) + + + + nr = ain%get_nrows() + nc = ain%get_ncols() + + if (nr /= nc) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + + call ain%cp_to(acoo1) + call acoo1%cp_to_coo(acoo2,info) + nz1 = acoo1%get_nzeros() + nz2 = acoo2%get_nzeros() + call acoo1%reallocate(nz1+nz2) + acoo1%ia(nz1+1:nz1+nz2) = acoo2%ja(1:nz2) + acoo1%ja(nz1+1:nz1+nz2) = acoo2%ia(1:nz2) + acoo1%val(nz1+1:nz1+nz2) = acoo2%val(1:nz2) + call acoo1%set_nrows(nr) + call acoo1%set_ncols(nr) + call acoo1%set_nzeros(nz1+nz2) + call aout%cp_from(acoo1) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + + +end subroutine psb_daplusat diff --git a/base/serial/psb_dasum_s.f90 b/base/serial/psb_dasum_s.f90 index 1ab42614f..88b7925ea 100644 --- a/base/serial/psb_dasum_s.f90 +++ b/base/serial/psb_dasum_s.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_dgeprt.f90 b/base/serial/psb_dgeprt.f90 index ae4c5b11c..6d1a540d6 100644 --- a/base/serial/psb_dgeprt.f90 +++ b/base/serial/psb_dgeprt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_dnumbmm.f90 b/base/serial/psb_dnumbmm.f90 index 4719b2bc7..6763774e6 100644 --- a/base/serial/psb_dnumbmm.f90 +++ b/base/serial/psb_dnumbmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_drwextd.f90 b/base/serial/psb_drwextd.f90 index 70c73f831..5b7dab4db 100644 --- a/base/serial/psb_drwextd.f90 +++ b/base/serial/psb_drwextd.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_dspspmm.f90 b/base/serial/psb_dspspmm.F90 similarity index 97% rename from base/serial/psb_dspspmm.f90 rename to base/serial/psb_dspspmm.F90 index e3e203d64..e2b394ad9 100644 --- a/base/serial/psb_dspspmm.f90 +++ b/base/serial/psb_dspspmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -37,9 +37,9 @@ ! subroutine psb_dspspmm(a,b,c,info) use psb_mat_mod + use psb_d_csr_mat_mod + use psb_d_csc_mat_mod use psb_d_serial_mod, psb_protect_name => psb_dspspmm - implicit none - type(psb_dspmat_type), intent(in) :: a,b type(psb_dspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -48,6 +48,8 @@ subroutine psb_dspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + + call psb_erractionsave(err_act) info = psb_success_ @@ -118,6 +120,8 @@ end subroutine psb_dspspmm subroutine psb_ldspspmm(a,b,c,info) use psb_mat_mod + use psb_d_csr_mat_mod + use psb_d_csc_mat_mod use psb_d_serial_mod, psb_protect_name => psb_ldspspmm implicit none @@ -129,6 +133,7 @@ subroutine psb_ldspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_dsymbmm.f90 b/base/serial/psb_dsymbmm.f90 index a1b594673..b892ecbab 100644 --- a/base/serial/psb_dsymbmm.f90 +++ b/base/serial/psb_dsymbmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,6 +85,7 @@ end subroutine psb_dsymbmm subroutine psb_dbase_symbmm(a,b,c,info) use psb_mat_mod use psb_sort_mod + use psb_serial_mod, only : symbmm implicit none class(psb_d_base_sparse_mat), intent(in) :: a,b diff --git a/base/serial/psb_lsame.f90 b/base/serial/psb_lsame.f90 index 887438571..d4356ed38 100644 --- a/base/serial/psb_lsame.f90 +++ b/base/serial/psb_lsame.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_samax_s.f90 b/base/serial/psb_samax_s.f90 index f2b1fee2c..df39aa244 100644 --- a/base/serial/psb_samax_s.f90 +++ b/base/serial/psb_samax_s.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_saplusat.f90 b/base/serial/psb_saplusat.f90 new file mode 100644 index 000000000..3e9024d3c --- /dev/null +++ b/base/serial/psb_saplusat.f90 @@ -0,0 +1,50 @@ +subroutine psb_saplusat(ain,aout,info) + use psb_s_mat_mod + + implicit none + type(psb_sspmat_type), intent(inout) :: ain + type(psb_sspmat_type), intent(out) :: aout + integer(psb_ipk_) :: info + + type(psb_s_coo_sparse_mat) :: acoo1, acoo2 + integer(psb_ipk_) :: nr, nc, nz1, nz2 + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err + + name='psb_saplusat' + info = psb_success_ + call psb_erractionsave(err_act) + + + + nr = ain%get_nrows() + nc = ain%get_ncols() + + if (nr /= nc) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + + call ain%cp_to(acoo1) + call acoo1%cp_to_coo(acoo2,info) + nz1 = acoo1%get_nzeros() + nz2 = acoo2%get_nzeros() + call acoo1%reallocate(nz1+nz2) + acoo1%ia(nz1+1:nz1+nz2) = acoo2%ja(1:nz2) + acoo1%ja(nz1+1:nz1+nz2) = acoo2%ia(1:nz2) + acoo1%val(nz1+1:nz1+nz2) = acoo2%val(1:nz2) + call acoo1%set_nrows(nr) + call acoo1%set_ncols(nr) + call acoo1%set_nzeros(nz1+nz2) + call aout%cp_from(acoo1) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + + +end subroutine psb_saplusat diff --git a/base/serial/psb_sasum_s.f90 b/base/serial/psb_sasum_s.f90 index c692cbd48..e7307d772 100644 --- a/base/serial/psb_sasum_s.f90 +++ b/base/serial/psb_sasum_s.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_sgeprt.f90 b/base/serial/psb_sgeprt.f90 index 9f3205fdf..b3afeb855 100644 --- a/base/serial/psb_sgeprt.f90 +++ b/base/serial/psb_sgeprt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_snumbmm.f90 b/base/serial/psb_snumbmm.f90 index 99075a8b5..8cc1c38dd 100644 --- a/base/serial/psb_snumbmm.f90 +++ b/base/serial/psb_snumbmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_spdot_srtd.f90 b/base/serial/psb_spdot_srtd.f90 index d0f9120f5..340af0a8c 100644 --- a/base/serial/psb_spdot_srtd.f90 +++ b/base/serial/psb_spdot_srtd.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_spge_dot.f90 b/base/serial/psb_spge_dot.f90 index 714971731..677cb4bb8 100644 --- a/base/serial/psb_spge_dot.f90 +++ b/base/serial/psb_spge_dot.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_srwextd.f90 b/base/serial/psb_srwextd.f90 index 3ecd7a8e9..4cceb8f57 100644 --- a/base/serial/psb_srwextd.f90 +++ b/base/serial/psb_srwextd.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_sspspmm.f90 b/base/serial/psb_sspspmm.F90 similarity index 97% rename from base/serial/psb_sspspmm.f90 rename to base/serial/psb_sspspmm.F90 index e1ae9af35..5ab8b62a9 100644 --- a/base/serial/psb_sspspmm.f90 +++ b/base/serial/psb_sspspmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -37,9 +37,9 @@ ! subroutine psb_sspspmm(a,b,c,info) use psb_mat_mod + use psb_s_csr_mat_mod + use psb_s_csc_mat_mod use psb_s_serial_mod, psb_protect_name => psb_sspspmm - implicit none - type(psb_sspmat_type), intent(in) :: a,b type(psb_sspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -48,6 +48,8 @@ subroutine psb_sspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + + call psb_erractionsave(err_act) info = psb_success_ @@ -118,6 +120,8 @@ end subroutine psb_sspspmm subroutine psb_lsspspmm(a,b,c,info) use psb_mat_mod + use psb_s_csr_mat_mod + use psb_s_csc_mat_mod use psb_s_serial_mod, psb_protect_name => psb_lsspspmm implicit none @@ -129,6 +133,7 @@ subroutine psb_lsspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_ssymbmm.f90 b/base/serial/psb_ssymbmm.f90 index 3b5a41af1..97108ee11 100644 --- a/base/serial/psb_ssymbmm.f90 +++ b/base/serial/psb_ssymbmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,6 +85,7 @@ end subroutine psb_ssymbmm subroutine psb_sbase_symbmm(a,b,c,info) use psb_mat_mod use psb_sort_mod + use psb_serial_mod, only : symbmm implicit none class(psb_s_base_sparse_mat), intent(in) :: a,b diff --git a/base/serial/psb_zamax_s.f90 b/base/serial/psb_zamax_s.f90 index 4a4085664..2adca0c5b 100644 --- a/base/serial/psb_zamax_s.f90 +++ b/base/serial/psb_zamax_s.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_zaplusat.f90 b/base/serial/psb_zaplusat.f90 new file mode 100644 index 000000000..cb418474a --- /dev/null +++ b/base/serial/psb_zaplusat.f90 @@ -0,0 +1,50 @@ +subroutine psb_zaplusat(ain,aout,info) + use psb_z_mat_mod + + implicit none + type(psb_zspmat_type), intent(inout) :: ain + type(psb_zspmat_type), intent(out) :: aout + integer(psb_ipk_) :: info + + type(psb_z_coo_sparse_mat) :: acoo1, acoo2 + integer(psb_ipk_) :: nr, nc, nz1, nz2 + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err + + name='psb_zaplusat' + info = psb_success_ + call psb_erractionsave(err_act) + + + + nr = ain%get_nrows() + nc = ain%get_ncols() + + if (nr /= nc) then + info=psb_err_internal_error_ + call psb_errpush(info,name) + goto 9999 + end if + + call ain%cp_to(acoo1) + call acoo1%cp_to_coo(acoo2,info) + nz1 = acoo1%get_nzeros() + nz2 = acoo2%get_nzeros() + call acoo1%reallocate(nz1+nz2) + acoo1%ia(nz1+1:nz1+nz2) = acoo2%ja(1:nz2) + acoo1%ja(nz1+1:nz1+nz2) = acoo2%ia(1:nz2) + acoo1%val(nz1+1:nz1+nz2) = acoo2%val(1:nz2) + call acoo1%set_nrows(nr) + call acoo1%set_ncols(nr) + call acoo1%set_nzeros(nz1+nz2) + call aout%cp_from(acoo1) + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(err_act) + + return + + +end subroutine psb_zaplusat diff --git a/base/serial/psb_zasum_s.f90 b/base/serial/psb_zasum_s.f90 index 35a043ed9..13fdc6f1b 100644 --- a/base/serial/psb_zasum_s.f90 +++ b/base/serial/psb_zasum_s.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_zgeprt.f90 b/base/serial/psb_zgeprt.f90 index 3fc0eb0c2..3788600d1 100644 --- a/base/serial/psb_zgeprt.f90 +++ b/base/serial/psb_zgeprt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_znumbmm.f90 b/base/serial/psb_znumbmm.f90 index 31b8f6b28..30fee807a 100644 --- a/base/serial/psb_znumbmm.f90 +++ b/base/serial/psb_znumbmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_zrwextd.f90 b/base/serial/psb_zrwextd.f90 index 393a3d9d4..c8cd0e43d 100644 --- a/base/serial/psb_zrwextd.f90 +++ b/base/serial/psb_zrwextd.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psb_zspspmm.f90 b/base/serial/psb_zspspmm.F90 similarity index 97% rename from base/serial/psb_zspspmm.f90 rename to base/serial/psb_zspspmm.F90 index e7b3df44e..b7faf46aa 100644 --- a/base/serial/psb_zspspmm.f90 +++ b/base/serial/psb_zspspmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -37,9 +37,9 @@ ! subroutine psb_zspspmm(a,b,c,info) use psb_mat_mod + use psb_z_csr_mat_mod + use psb_z_csc_mat_mod use psb_z_serial_mod, psb_protect_name => psb_zspspmm - implicit none - type(psb_zspmat_type), intent(in) :: a,b type(psb_zspmat_type), intent(out) :: c integer(psb_ipk_), intent(out) :: info @@ -48,6 +48,8 @@ subroutine psb_zspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + + call psb_erractionsave(err_act) info = psb_success_ @@ -118,6 +120,8 @@ end subroutine psb_zspspmm subroutine psb_lzspspmm(a,b,c,info) use psb_mat_mod + use psb_z_csr_mat_mod + use psb_z_csc_mat_mod use psb_z_serial_mod, psb_protect_name => psb_lzspspmm implicit none @@ -129,6 +133,7 @@ subroutine psb_lzspspmm(a,b,c,info) integer(psb_ipk_) :: err_act character(len=*), parameter :: name='psb_spspmm' logical :: done_spmm + call psb_erractionsave(err_act) info = psb_success_ diff --git a/base/serial/psb_zsymbmm.f90 b/base/serial/psb_zsymbmm.f90 index 5cbffb117..a9703d446 100644 --- a/base/serial/psb_zsymbmm.f90 +++ b/base/serial/psb_zsymbmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,6 +85,7 @@ end subroutine psb_zsymbmm subroutine psb_zbase_symbmm(a,b,c,info) use psb_mat_mod use psb_sort_mod + use psb_serial_mod, only : symbmm implicit none class(psb_z_base_sparse_mat), intent(in) :: a,b diff --git a/base/serial/psi_c_serial_impl.F90 b/base/serial/psi_c_serial_impl.F90 index d6706c887..441211e54 100644 --- a/base/serial/psi_c_serial_impl.F90 +++ b/base/serial/psi_c_serial_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -230,7 +230,7 @@ end subroutine psb_m_cgelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -431,7 +431,7 @@ end subroutine psb_e_cgelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psi_d_serial_impl.F90 b/base/serial/psi_d_serial_impl.F90 index 772f28ea8..aafd9d983 100644 --- a/base/serial/psi_d_serial_impl.F90 +++ b/base/serial/psi_d_serial_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -230,7 +230,7 @@ end subroutine psb_m_dgelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -431,7 +431,7 @@ end subroutine psb_e_dgelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psi_e_serial_impl.F90 b/base/serial/psi_e_serial_impl.F90 index 10ea49cf7..5ede8afbf 100644 --- a/base/serial/psi_e_serial_impl.F90 +++ b/base/serial/psi_e_serial_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -230,7 +230,7 @@ end subroutine psb_m_egelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -431,7 +431,7 @@ end subroutine psb_e_egelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psi_i2_serial_impl.F90 b/base/serial/psi_i2_serial_impl.F90 index ae6ee65a6..8eccd73c9 100644 --- a/base/serial/psi_i2_serial_impl.F90 +++ b/base/serial/psi_i2_serial_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -230,7 +230,7 @@ end subroutine psb_m_i2gelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -431,7 +431,7 @@ end subroutine psb_e_i2gelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psi_m_serial_impl.F90 b/base/serial/psi_m_serial_impl.F90 index 25eaca324..0b6a69831 100644 --- a/base/serial/psi_m_serial_impl.F90 +++ b/base/serial/psi_m_serial_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -230,7 +230,7 @@ end subroutine psb_m_mgelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -431,7 +431,7 @@ end subroutine psb_e_mgelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psi_s_serial_impl.F90 b/base/serial/psi_s_serial_impl.F90 index 6baa8dd75..580975c10 100644 --- a/base/serial/psi_s_serial_impl.F90 +++ b/base/serial/psi_s_serial_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -230,7 +230,7 @@ end subroutine psb_m_sgelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -431,7 +431,7 @@ end subroutine psb_e_sgelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/psi_z_serial_impl.F90 b/base/serial/psi_z_serial_impl.F90 index dcd02540b..7292320e8 100644 --- a/base/serial/psi_z_serial_impl.F90 +++ b/base/serial/psi_z_serial_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -230,7 +230,7 @@ end subroutine psb_m_zgelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -431,7 +431,7 @@ end subroutine psb_e_zgelp !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/smmp.f90 b/base/serial/smmp.f90 index fe3ff2cc2..a8844db2d 100644 --- a/base/serial/smmp.f90 +++ b/base/serial/smmp.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/serial/sort/Makefile b/base/serial/sort/Makefile index ff8fd6201..9a4628398 100644 --- a/base/serial/sort/Makefile +++ b/base/serial/sort/Makefile @@ -3,6 +3,7 @@ include ../../../Make.inc # # The object files # +I2OBJS=psb_i2_hsort_impl.o psb_i2_isort_impl.o psb_i2_msort_impl.o psb_i2_qsort_impl.o IOBJS=psb_m_hsort_impl.o psb_m_isort_impl.o psb_m_msort_impl.o psb_m_qsort_impl.o LOBJS=psb_e_hsort_impl.o psb_e_isort_impl.o psb_e_msort_impl.o psb_e_qsort_impl.o SOBJS=psb_s_hsort_impl.o psb_s_isort_impl.o psb_s_msort_impl.o psb_s_qsort_impl.o @@ -10,7 +11,7 @@ DOBJS=psb_d_hsort_impl.o psb_d_isort_impl.o psb_d_msort_impl.o psb_d_qsort_impl. COBJS=psb_c_hsort_impl.o psb_c_isort_impl.o psb_c_msort_impl.o psb_c_qsort_impl.o ZOBJS=psb_z_hsort_impl.o psb_z_isort_impl.o psb_z_msort_impl.o psb_z_qsort_impl.o -OBJS=$(SOBJS) $(DOBJS) $(COBJS) $(ZOBJS) $(IOBJS) $(LOBJS) +OBJS=$(SOBJS) $(DOBJS) $(COBJS) $(ZOBJS) $(I2OBJS) $(IOBJS) $(LOBJS) # # Where the library should go, and how it is called. diff --git a/base/serial/sort/psb_c_hsort_impl.f90 b/base/serial/sort/psb_c_hsort_impl.f90 index 2400fcf73..674ff8d47 100644 --- a/base/serial/sort/psb_c_hsort_impl.f90 +++ b/base/serial/sort/psb_c_hsort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,18 +41,19 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_chsort(x,ix,dir,flag) +subroutine psb_chsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_chsort use psb_error_mod implicit none complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: flag_, n, i, err_act,info - integer(psb_ipk_) :: dir_, l + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_ipk_) :: n, i, l, dir_ complex(psb_spk_) :: key integer(psb_ipk_) :: index + complex(psb_spk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -60,6 +61,13 @@ subroutine psb_chsort(x,ix,dir,flag) name='psb_hsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -113,24 +121,57 @@ subroutine psb_chsort(x,ix,dir,flag) ix(i) = i end do end if - l = 0 - do i=1, n - key = x(i) - index = ix(i) - call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) - if (l /= i) then - write(psb_err_unit,*) 'Mismatch while heapifying ! ' - end if - end do - do i=n, 2, -1 - call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) - if (l /= i-1) then - write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i - end if - x(i) = key - ix(i) = index - end do - else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + l = 0 do i=1, n key = x(i) diff --git a/base/serial/sort/psb_c_isort_impl.f90 b/base/serial/sort/psb_c_isort_impl.f90 index e61637533..cf3857ad6 100644 --- a/base/serial/sort/psb_c_isort_impl.f90 +++ b/base/serial/sort/psb_c_isort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -40,16 +40,17 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_cisort(x,ix,dir,flag) +subroutine psb_cisort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_cisort use psb_error_mod implicit none complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ integer(psb_ipk_) :: n, i + complex(psb_spk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -57,6 +58,12 @@ subroutine psb_cisort(x,ix,dir,flag) name='psb_cisort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -90,39 +97,73 @@ subroutine psb_cisort(x,ix,dir,flag) ix(i) = i end do end if - - select case(dir_) - case (psb_lsort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_lsort_up_) call psi_clisrx_up(n,x,ix) - case (psb_lsort_down_) + case (psb_lsort_down_) call psi_clisrx_dw(n,x,ix) - case (psb_alsort_up_) + case (psb_alsort_up_) call psi_calisrx_up(n,x,ix) - case (psb_alsort_down_) + case (psb_alsort_down_) call psi_calisrx_dw(n,x,ix) - case (psb_asort_up_) + case (psb_asort_up_) call psi_caisrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_caisrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_lsort_up_) + call psi_clisrx_up(n,tx,ix) + case (psb_lsort_down_) + call psi_clisrx_dw(n,tx,ix) + case (psb_alsort_up_) + call psi_calisrx_up(n,tx,ix) + case (psb_alsort_down_) + call psi_calisrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_caisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_caisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else select case(dir_) case (psb_lsort_up_) - call psi_clisr_up(n,x) + call psi_clisr_up(n,x) case (psb_lsort_down_) - call psi_clisr_dw(n,x) + call psi_clisr_dw(n,x) case (psb_alsort_up_) - call psi_calisr_up(n,x) + call psi_calisr_up(n,x) case (psb_alsort_down_) - call psi_calisr_dw(n,x) + call psi_calisr_dw(n,x) case (psb_asort_up_) - call psi_caisr_up(n,x) + call psi_caisr_up(n,x) case (psb_asort_down_) - call psi_caisr_dw(n,x) + call psi_caisr_dw(n,x) case default ierr(1) = 3; ierr(2) = dir_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) diff --git a/base/serial/sort/psb_c_msort_impl.f90 b/base/serial/sort/psb_c_msort_impl.f90 index 751f60987..e94fcd7ab 100644 --- a/base/serial/sort/psb_c_msort_impl.f90 +++ b/base/serial/sort/psb_c_msort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this - ! software without specific written permission. + ! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -77,16 +77,16 @@ subroutine psb_cmsort_u(x,nout,dir) end subroutine psb_cmsort_u -subroutine psb_cmsort(x,ix,dir,flag) +subroutine psb_cmsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_cmsort use psb_error_mod use psb_ip_reord_mod implicit none complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, n, err_act + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ integer(psb_ipk_), allocatable :: iaux(:) integer(psb_ipk_) :: iret, info, i @@ -96,6 +96,11 @@ subroutine psb_cmsort(x,ix,dir,flag) name='psb_cmsort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(dir)) then dir_ = dir else @@ -163,11 +168,25 @@ subroutine psb_cmsort(x,ix,dir,flag) ! only provide linked pointers. ! if (iret == 0 ) then - if (present(ix)) then - call psb_ip_reord(n,x,ix,iaux) - else - call psb_ip_reord(n,x,iaux) - end if + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select end if return diff --git a/base/serial/sort/psb_c_qsort_impl.f90 b/base/serial/sort/psb_c_qsort_impl.f90 index 7f33c0997..300b3fec4 100644 --- a/base/serial/sort/psb_c_qsort_impl.f90 +++ b/base/serial/sort/psb_c_qsort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,22 +41,29 @@ ! Addison-Wesley ! -subroutine psb_cqsort(x,ix,dir,flag) +subroutine psb_cqsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_cqsort use psb_error_mod implicit none complex(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act, i + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ integer(psb_ipk_) :: n + complex(psb_spk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name name='psb_cqsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(flag)) then flag_ = flag else @@ -91,25 +98,57 @@ subroutine psb_cqsort(x,ix,dir,flag) end do end if - select case(dir_) - case (psb_lsort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_lsort_up_) call psi_clqsrx_up(n,x,ix) - case (psb_lsort_down_) + case (psb_lsort_down_) call psi_clqsrx_dw(n,x,ix) - case (psb_alsort_up_) + case (psb_alsort_up_) call psi_calqsrx_up(n,x,ix) - case (psb_alsort_down_) + case (psb_alsort_down_) call psi_calqsrx_dw(n,x,ix) - case (psb_asort_up_) + case (psb_asort_up_) call psi_caqsrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_caqsrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_lsort_up_) + call psi_clqsrx_up(n,tx,ix) + case (psb_lsort_down_) + call psi_clqsrx_dw(n,tx,ix) + case (psb_alsort_up_) + call psi_calqsrx_up(n,tx,ix) + case (psb_alsort_down_) + call psi_calqsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_caqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_caqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else + select case(dir_) case (psb_lsort_up_) call psi_clqsr_up(n,x) diff --git a/base/serial/sort/psb_d_hsort_impl.f90 b/base/serial/sort/psb_d_hsort_impl.f90 index ffb952d59..7f5a48bda 100644 --- a/base/serial/sort/psb_d_hsort_impl.f90 +++ b/base/serial/sort/psb_d_hsort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,18 +41,19 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_dhsort(x,ix,dir,flag) +subroutine psb_dhsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_dhsort use psb_error_mod implicit none real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: flag_, n, i, err_act,info - integer(psb_ipk_) :: dir_, l + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_ipk_) :: n, i, l, dir_ real(psb_dpk_) :: key integer(psb_ipk_) :: index + real(psb_dpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -60,6 +61,13 @@ subroutine psb_dhsort(x,ix,dir,flag) name='psb_hsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -113,24 +121,57 @@ subroutine psb_dhsort(x,ix,dir,flag) ix(i) = i end do end if - l = 0 - do i=1, n - key = x(i) - index = ix(i) - call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) - if (l /= i) then - write(psb_err_unit,*) 'Mismatch while heapifying ! ' - end if - end do - do i=n, 2, -1 - call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) - if (l /= i-1) then - write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i - end if - x(i) = key - ix(i) = index - end do - else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + l = 0 do i=1, n key = x(i) diff --git a/base/serial/sort/psb_d_isort_impl.f90 b/base/serial/sort/psb_d_isort_impl.f90 index 94e3abd4d..da6338709 100644 --- a/base/serial/sort/psb_d_isort_impl.f90 +++ b/base/serial/sort/psb_d_isort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -40,16 +40,17 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_disort(x,ix,dir,flag) +subroutine psb_disort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_disort use psb_error_mod implicit none real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ integer(psb_ipk_) :: n, i + real(psb_dpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -57,6 +58,12 @@ subroutine psb_disort(x,ix,dir,flag) name='psb_disort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -90,31 +97,61 @@ subroutine psb_disort(x,ix,dir,flag) ix(i) = i end do end if - - select case(dir_) - case (psb_sort_up_) - call psi_disrx_up(n,x,ix) - case (psb_sort_down_) - call psi_disrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_disrx_up(n,x,ix) + case (psb_sort_down_) + call psi_disrx_dw(n,x,ix) + case (psb_asort_up_) call psi_daisrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_daisrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_disrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_disrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_daisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_daisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else select case(dir_) case (psb_sort_up_) call psi_disr_up(n,x) case (psb_sort_down_) call psi_disr_dw(n,x) case (psb_asort_up_) - call psi_daisr_up(n,x) + call psi_daisr_up(n,x) case (psb_asort_down_) - call psi_daisr_dw(n,x) + call psi_daisr_dw(n,x) case default ierr(1) = 3; ierr(2) = dir_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) diff --git a/base/serial/sort/psb_d_msort_impl.f90 b/base/serial/sort/psb_d_msort_impl.f90 index 66ad78972..43ef089ff 100644 --- a/base/serial/sort/psb_d_msort_impl.f90 +++ b/base/serial/sort/psb_d_msort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this - ! software without specific written permission. + ! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -76,16 +76,16 @@ subroutine psb_dmsort_u(x,nout,dir) return end subroutine psb_dmsort_u -subroutine psb_dmsort(x,ix,dir,flag) +subroutine psb_dmsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_dmsort use psb_error_mod use psb_ip_reord_mod implicit none real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, n, err_act + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ integer(psb_ipk_), allocatable :: iaux(:) integer(psb_ipk_) :: iret, info, i @@ -95,6 +95,11 @@ subroutine psb_dmsort(x,ix,dir,flag) name='psb_dmsort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(dir)) then dir_ = dir else @@ -157,15 +162,28 @@ subroutine psb_dmsort(x,ix,dir,flag) ! Do the actual reordering, since the inner routines ! only provide linked pointers. ! - if (iret == 0 ) then - if (present(ix)) then - call psb_ip_reord(n,x,ix,iaux) - else - call psb_ip_reord(n,x,iaux) - end if + if (iret == 0 ) then + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select end if - return 9999 call psb_error_handler(err_act) diff --git a/base/serial/sort/psb_d_qsort_impl.f90 b/base/serial/sort/psb_d_qsort_impl.f90 index 8e4b1d213..6cd35eb01 100644 --- a/base/serial/sort/psb_d_qsort_impl.f90 +++ b/base/serial/sort/psb_d_qsort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -159,22 +159,29 @@ function psb_dssrch(key,n,v) result(ipos) return end function psb_dssrch -subroutine psb_dqsort(x,ix,dir,flag) +subroutine psb_dqsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_dqsort use psb_error_mod implicit none real(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act, i + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ integer(psb_ipk_) :: n + real(psb_dpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name name='psb_dqsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(flag)) then flag_ = flag else @@ -209,21 +216,49 @@ subroutine psb_dqsort(x,ix,dir,flag) end do end if - select case(dir_) - case (psb_sort_up_) - call psi_dqsrx_up(n,x,ix) - case (psb_sort_down_) - call psi_dqsrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_dqsrx_up(n,x,ix) + case (psb_sort_down_) + call psi_dqsrx_dw(n,x,ix) + case (psb_asort_up_) call psi_daqsrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_daqsrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_dqsrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_dqsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_daqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_daqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else + select case(dir_) case (psb_sort_up_) call psi_dqsr_up(n,x) diff --git a/base/serial/sort/psb_e_hsort_impl.f90 b/base/serial/sort/psb_e_hsort_impl.f90 index f1a1a78f6..7d9d6104b 100644 --- a/base/serial/sort/psb_e_hsort_impl.f90 +++ b/base/serial/sort/psb_e_hsort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,18 +41,19 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_ehsort(x,ix,dir,flag) +subroutine psb_ehsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_ehsort use psb_error_mod implicit none integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_epk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: flag_, n, i, err_act,info - integer(psb_epk_) :: dir_, l + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_epk_) :: n, i, l, dir_ integer(psb_epk_) :: key integer(psb_epk_) :: index + integer(psb_epk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -60,6 +61,13 @@ subroutine psb_ehsort(x,ix,dir,flag) name='psb_hsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -113,24 +121,57 @@ subroutine psb_ehsort(x,ix,dir,flag) ix(i) = i end do end if - l = 0 - do i=1, n - key = x(i) - index = ix(i) - call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) - if (l /= i) then - write(psb_err_unit,*) 'Mismatch while heapifying ! ' - end if - end do - do i=n, 2, -1 - call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) - if (l /= i-1) then - write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i - end if - x(i) = key - ix(i) = index - end do - else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + l = 0 do i=1, n key = x(i) diff --git a/base/serial/sort/psb_e_isort_impl.f90 b/base/serial/sort/psb_e_isort_impl.f90 index 0fe323185..68c1d35d6 100644 --- a/base/serial/sort/psb_e_isort_impl.f90 +++ b/base/serial/sort/psb_e_isort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -40,16 +40,17 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_eisort(x,ix,dir,flag) +subroutine psb_eisort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_eisort use psb_error_mod implicit none integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_epk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ integer(psb_epk_) :: n, i + integer(psb_epk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -57,6 +58,12 @@ subroutine psb_eisort(x,ix,dir,flag) name='psb_eisort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -90,31 +97,61 @@ subroutine psb_eisort(x,ix,dir,flag) ix(i) = i end do end if - - select case(dir_) - case (psb_sort_up_) - call psi_eisrx_up(n,x,ix) - case (psb_sort_down_) - call psi_eisrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_eisrx_up(n,x,ix) + case (psb_sort_down_) + call psi_eisrx_dw(n,x,ix) + case (psb_asort_up_) call psi_eaisrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_eaisrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_eisrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_eisrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_eaisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_eaisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else select case(dir_) case (psb_sort_up_) call psi_eisr_up(n,x) case (psb_sort_down_) call psi_eisr_dw(n,x) case (psb_asort_up_) - call psi_eaisr_up(n,x) + call psi_eaisr_up(n,x) case (psb_asort_down_) - call psi_eaisr_dw(n,x) + call psi_eaisr_dw(n,x) case default ierr(1) = 3; ierr(2) = dir_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) diff --git a/base/serial/sort/psb_e_msort_impl.f90 b/base/serial/sort/psb_e_msort_impl.f90 index b97d448a6..beeabf5a0 100644 --- a/base/serial/sort/psb_e_msort_impl.f90 +++ b/base/serial/sort/psb_e_msort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this - ! software without specific written permission. + ! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -131,16 +131,16 @@ subroutine psb_emsort_u(x,nout,dir) return end subroutine psb_emsort_u -subroutine psb_emsort(x,ix,dir,flag) +subroutine psb_emsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_emsort use psb_error_mod use psb_ip_reord_mod implicit none integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_epk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, n, err_act + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ integer(psb_epk_), allocatable :: iaux(:) integer(psb_ipk_) :: iret, info, i @@ -150,6 +150,11 @@ subroutine psb_emsort(x,ix,dir,flag) name='psb_emsort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(dir)) then dir_ = dir else @@ -212,15 +217,28 @@ subroutine psb_emsort(x,ix,dir,flag) ! Do the actual reordering, since the inner routines ! only provide linked pointers. ! - if (iret == 0 ) then - if (present(ix)) then - call psb_ip_reord(n,x,ix,iaux) - else - call psb_ip_reord(n,x,iaux) - end if + if (iret == 0 ) then + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select end if - return 9999 call psb_error_handler(err_act) diff --git a/base/serial/sort/psb_e_qsort_impl.f90 b/base/serial/sort/psb_e_qsort_impl.f90 index c70f80519..9057ff36f 100644 --- a/base/serial/sort/psb_e_qsort_impl.f90 +++ b/base/serial/sort/psb_e_qsort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -159,22 +159,29 @@ function psb_essrch(key,n,v) result(ipos) return end function psb_essrch -subroutine psb_eqsort(x,ix,dir,flag) +subroutine psb_eqsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_eqsort use psb_error_mod implicit none integer(psb_epk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_epk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act, i + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ integer(psb_epk_) :: n + integer(psb_epk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name name='psb_eqsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(flag)) then flag_ = flag else @@ -209,21 +216,49 @@ subroutine psb_eqsort(x,ix,dir,flag) end do end if - select case(dir_) - case (psb_sort_up_) - call psi_eqsrx_up(n,x,ix) - case (psb_sort_down_) - call psi_eqsrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_eqsrx_up(n,x,ix) + case (psb_sort_down_) + call psi_eqsrx_dw(n,x,ix) + case (psb_asort_up_) call psi_eaqsrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_eaqsrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_eqsrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_eqsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_eaqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_eaqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else + select case(dir_) case (psb_sort_up_) call psi_eqsr_up(n,x) diff --git a/base/serial/sort/psb_i2_hsort_impl.f90 b/base/serial/sort/psb_i2_hsort_impl.f90 new file mode 100644 index 000000000..06fff6bae --- /dev/null +++ b/base/serial/sort/psb_i2_hsort_impl.f90 @@ -0,0 +1,721 @@ +! +! Parallel Sparse BLAS version 3.5 +! (C) Copyright 2006-2018 +! Salvatore Filippone +! Alfredo Buttari +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! The merge-sort and quicksort routines are implemented in the +! serial/aux directory +! References: +! D. Knuth +! The Art of Computer Programming, vol. 3 +! Addison-Wesley +! +! Aho, Hopcroft, Ullman +! Data Structures and Algorithms +! Addison-Wesley +! +subroutine psb_i2hsort(x,ix,dir,flag,reord) + use psb_sort_mod, psb_protect_name => psb_i2hsort + use psb_error_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord + integer(psb_ipk_), optional, intent(inout) :: ix(:) + + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_ipk_) :: n, i, l, dir_ + integer(psb_i2pk_) :: key + integer(psb_ipk_) :: index + integer(psb_i2pk_), allocatable :: tx(:) + + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name + + name='psb_hsort' + call psb_erractionsave(err_act) + + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + + if (present(flag)) then + flag_ = flag + else + flag_ = psb_sort_ovw_idx_ + end if + select case(flag_) + case( psb_sort_ovw_idx_, psb_sort_keep_idx_) + ! OK keep going + case default + ierr(1) = 4; ierr(2) = flag_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + + if (present(dir)) then + dir_ = dir + else + dir_= psb_sort_up_ + end if + + select case(dir_) + case(psb_sort_up_,psb_sort_down_) + ! OK + case (psb_asort_up_,psb_asort_down_) + ! OK + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + + n = size(x) + + ! + ! Dirty trick to sort with heaps: if we want + ! to sort in place upwards, first we set up a heap so that + ! we can easily get the LARGEST element, then we take it out + ! and put it in the last entry, and so on. + ! So, we invert dir_ + ! + dir_ = -dir_ + + if (present(ix)) then + if (size(ix) < n) then + ierr(1) = 2; ierr(2) = size(ix); + call psb_errpush(psb_err_input_asize_invalid_i_,name,i_err=ierr) + goto 9999 + end if + if (flag_ == psb_sort_ovw_idx_) then + do i=1, n + ix(i) = i + end do + end if + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + + l = 0 + do i=1, n + key = x(i) + call psi_insert_heap(key,l,x,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ',l,i + end if + end do + do i=n, 2, -1 + call psi_i2_heap_get_first(key,l,x,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + end do + end if + + + return + +9999 call psb_error_handler(err_act) + + return +end subroutine psb_i2hsort + + + +! +! These are packaged so that they can be used to implement +! a heapsort. +! +! +! Programming note: +! In the implementation of the heap_get_first function +! we have code like this +! +! if ( ( heap(2*i) < heap(2*i+1) ) .or.& +! & (2*i == last)) then +! j = 2*i +! else +! j = 2*i + 1 +! end if +! +! It looks like the 2*i+1 could overflow the array, but this +! is not true because there is a guard statement +! if (i>last/2) exit +! and because last has just been reduced by 1 when defining the return value, +! therefore 2*i+1 may be greater than the current value of last, +! but cannot be greater than the value of last when the routine was entered +! hence it is safe. +! +! +! + +subroutine psi_i2_insert_heap(key,last,heap,dir,info) + use psb_sort_mod, psb_protect_name => psi_i2_insert_heap + implicit none + + ! + ! Input: + ! key: the new value + ! last: pointer to the last occupied element in heap + ! heap: the heap + ! dir: sorting direction + + integer(psb_i2pk_), intent(in) :: key + integer(psb_ipk_), intent(in) :: dir + integer(psb_i2pk_), intent(inout) :: heap(:) + integer(psb_ipk_), intent(inout) :: last + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: i, i2 + integer(psb_i2pk_) :: temp + + info = psb_success_ + if (last < 0) then + write(psb_err_unit,*) 'Invalid last in heap ',last + info = last + return + endif + last = last + 1 + if (last > size(heap)) then + write(psb_err_unit,*) 'out of bounds ' + info = -1 + return + end if + i = last + heap(i) = key + + select case(dir) + case (psb_sort_up_) + + do + if (i<=1) exit + i2 = i/2 + if (heap(i) < heap(i2)) then + temp = heap(i) + heap(i) = heap(i2) + heap(i2) = temp + i = i2 + else + exit + end if + end do + + + case (psb_sort_down_) + + do + if (i<=1) exit + i2 = i/2 + if (heap(i) > heap(i2)) then + temp = heap(i) + heap(i) = heap(i2) + heap(i2) = temp + i = i2 + else + exit + end if + end do + + case (psb_asort_up_) + + do + if (i<=1) exit + i2 = i/2 + if (abs(heap(i)) < abs(heap(i2))) then + temp = heap(i) + heap(i) = heap(i2) + heap(i2) = temp + i = i2 + else + exit + end if + end do + + + case (psb_asort_down_) + + do + if (i<=1) exit + i2 = i/2 + if (abs(heap(i)) > abs(heap(i2))) then + temp = heap(i) + heap(i) = heap(i2) + heap(i2) = temp + i = i2 + else + exit + end if + end do + + + case default + write(psb_err_unit,*) 'Invalid direction in heap ',dir + end select + + return +end subroutine psi_i2_insert_heap + + +subroutine psi_i2_heap_get_first(key,last,heap,dir,info) + use psb_sort_mod, psb_protect_name => psi_i2_heap_get_first + implicit none + + integer(psb_i2pk_), intent(inout) :: key + integer(psb_ipk_), intent(inout) :: last + integer(psb_ipk_), intent(in) :: dir + integer(psb_i2pk_), intent(inout) :: heap(:) + integer(psb_ipk_), intent(out) :: info + + integer(psb_ipk_) :: i, j + integer(psb_i2pk_) :: temp + + + info = psb_success_ + if (last <= 0) then + key = 0 + info = -1 + return + endif + + key = heap(1) + heap(1) = heap(last) + last = last - 1 + + select case(dir) + case (psb_sort_up_) + + i = 1 + do + if (i > (last/2)) exit + if ( (heap(2*i) < heap(2*i+1)) .or.& + & (2*i == last)) then + j = 2*i + else + j = 2*i + 1 + end if + + if (heap(i) > heap(j)) then + temp = heap(i) + heap(i) = heap(j) + heap(j) = temp + i = j + else + exit + end if + end do + + + case (psb_sort_down_) + + i = 1 + do + if (i > (last/2)) exit + if ( (heap(2*i) > heap(2*i+1)) .or.& + & (2*i == last)) then + j = 2*i + else + j = 2*i + 1 + end if + + if (heap(i) < heap(j)) then + temp = heap(i) + heap(i) = heap(j) + heap(j) = temp + i = j + else + exit + end if + end do + + case (psb_asort_up_) + + i = 1 + do + if (i > (last/2)) exit + if ( (abs(heap(2*i)) < abs(heap(2*i+1))) .or.& + & (2*i == last)) then + j = 2*i + else + j = 2*i + 1 + end if + + if (abs(heap(i)) > abs(heap(j))) then + temp = heap(i) + heap(i) = heap(j) + heap(j) = temp + i = j + else + exit + end if + end do + + + case (psb_asort_down_) + + i = 1 + do + if (i > (last/2)) exit + if ( (abs(heap(2*i)) > abs(heap(2*i+1))) .or.& + & (2*i == last)) then + j = 2*i + else + j = 2*i + 1 + end if + + if (abs(heap(i)) < abs(heap(j))) then + temp = heap(i) + heap(i) = heap(j) + heap(j) = temp + i = j + else + exit + end if + end do + + case default + write(psb_err_unit,*) 'Invalid direction in heap ',dir + end select + + return +end subroutine psi_i2_heap_get_first + + +subroutine psi_i2_idx_insert_heap(key,index,last,heap,idxs,dir,info) + use psb_sort_mod, psb_protect_name => psi_i2_idx_insert_heap + + implicit none + ! + ! Input: + ! key: the new value + ! index: the new index + ! last: pointer to the last occupied element in heap + ! heap: the heap + ! idxs: the indices + ! dir: sorting direction + + integer(psb_i2pk_), intent(in) :: key + integer(psb_ipk_), intent(in) :: index,dir + integer(psb_i2pk_), intent(inout) :: heap(:) + integer(psb_ipk_), intent(inout) :: idxs(:),last + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: i, i2, itemp + integer(psb_i2pk_) :: temp + + info = psb_success_ + if (last < 0) then + write(psb_err_unit,*) 'Invalid last in heap ',last + info = last + return + endif + + last = last + 1 + if (last > size(heap)) then + write(psb_err_unit,*) 'out of bounds ' + info = -1 + return + end if + + i = last + heap(i) = key + idxs(i) = index + + select case(dir) + case (psb_sort_up_) + + do + if (i<=1) exit + i2 = i/2 + if (heap(i) < heap(i2)) then + itemp = idxs(i) + idxs(i) = idxs(i2) + idxs(i2) = itemp + temp = heap(i) + heap(i) = heap(i2) + heap(i2) = temp + i = i2 + else + exit + end if + end do + + + case (psb_sort_down_) + + do + if (i<=1) exit + i2 = i/2 + if (heap(i) > heap(i2)) then + itemp = idxs(i) + idxs(i) = idxs(i2) + idxs(i2) = itemp + temp = heap(i) + heap(i) = heap(i2) + heap(i2) = temp + i = i2 + else + exit + end if + end do + + case (psb_asort_up_) + + do + if (i<=1) exit + i2 = i/2 + if (abs(heap(i)) < abs(heap(i2))) then + itemp = idxs(i) + idxs(i) = idxs(i2) + idxs(i2) = itemp + temp = heap(i) + heap(i) = heap(i2) + heap(i2) = temp + i = i2 + else + exit + end if + end do + + + case (psb_asort_down_) + + do + if (i<=1) exit + i2 = i/2 + if (abs(heap(i)) > abs(heap(i2))) then + itemp = idxs(i) + idxs(i) = idxs(i2) + idxs(i2) = itemp + temp = heap(i) + heap(i) = heap(i2) + heap(i2) = temp + i = i2 + else + exit + end if + end do + + + case default + write(psb_err_unit,*) 'Invalid direction in heap ',dir + end select + + return +end subroutine psi_i2_idx_insert_heap + +subroutine psi_i2_idx_heap_get_first(key,index,last,heap,idxs,dir,info) + use psb_sort_mod, psb_protect_name => psi_i2_idx_heap_get_first + implicit none + + integer(psb_i2pk_), intent(inout) :: key + integer(psb_i2pk_), intent(inout) :: heap(:) + integer(psb_ipk_), intent(out) :: index + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_), intent(inout) :: last,idxs(:) + integer(psb_ipk_), intent(in) :: dir + + integer(psb_ipk_) :: i, j,itemp + integer(psb_i2pk_) :: temp + + info = psb_success_ + if (last <= 0) then + key = 0 + index = 0 + info = -1 + return + endif + + key = heap(1) + index = idxs(1) + heap(1) = heap(last) + idxs(1) = idxs(last) + last = last - 1 + + select case(dir) + case (psb_sort_up_) + + i = 1 + do + if (i > (last/2)) exit + if ( (heap(2*i) < heap(2*i+1)) .or.& + & (2*i == last)) then + j = 2*i + else + j = 2*i + 1 + end if + + if (heap(i) > heap(j)) then + itemp = idxs(i) + idxs(i) = idxs(j) + idxs(j) = itemp + temp = heap(i) + heap(i) = heap(j) + heap(j) = temp + i = j + else + exit + end if + end do + + + case (psb_sort_down_) + + i = 1 + do + if (i > (last/2)) exit + if ( (heap(2*i) > heap(2*i+1)) .or.& + & (2*i == last)) then + j = 2*i + else + j = 2*i + 1 + end if + + if (heap(i) < heap(j)) then + itemp = idxs(i) + idxs(i) = idxs(j) + idxs(j) = itemp + temp = heap(i) + heap(i) = heap(j) + heap(j) = temp + i = j + else + exit + end if + end do + + case (psb_asort_up_) + + i = 1 + do + if (i > (last/2)) exit + if ( (abs(heap(2*i)) < abs(heap(2*i+1))) .or.& + & (2*i == last)) then + j = 2*i + else + j = 2*i + 1 + end if + + if (abs(heap(i)) > abs(heap(j))) then + itemp = idxs(i) + idxs(i) = idxs(j) + idxs(j) = itemp + temp = heap(i) + heap(i) = heap(j) + heap(j) = temp + i = j + else + exit + end if + end do + + + case (psb_asort_down_) + + i = 1 + do + if (i > (last/2)) exit + if ( (abs(heap(2*i)) > abs(heap(2*i+1))) .or.& + & (2*i == last)) then + j = 2*i + else + j = 2*i + 1 + end if + + if (abs(heap(i)) < abs(heap(j))) then + itemp = idxs(i) + idxs(i) = idxs(j) + idxs(j) = itemp + temp = heap(i) + heap(i) = heap(j) + heap(j) = temp + i = j + else + exit + end if + end do + + case default + write(psb_err_unit,*) 'Invalid direction in heap ',dir + end select + + return +end subroutine psi_i2_idx_heap_get_first + + + + diff --git a/base/serial/sort/psb_i2_isort_impl.f90 b/base/serial/sort/psb_i2_isort_impl.f90 new file mode 100644 index 000000000..f582d2689 --- /dev/null +++ b/base/serial/sort/psb_i2_isort_impl.f90 @@ -0,0 +1,378 @@ +! +! Parallel Sparse BLAS version 3.5 +! (C) Copyright 2006-2018 +! Salvatore Filippone +! Alfredo Buttari +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! The insertion sort routines +! References: +! D. Knuth +! The Art of Computer Programming, vol. 3 +! Addison-Wesley +! +! Aho, Hopcroft, Ullman +! Data Structures and Algorithms +! Addison-Wesley +! +subroutine psb_i2isort(x,ix,dir,flag,reord) + use psb_sort_mod, psb_protect_name => psb_i2isort + use psb_error_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord + integer(psb_ipk_), optional, intent(inout) :: ix(:) + + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ + integer(psb_ipk_) :: n, i + integer(psb_i2pk_), allocatable :: tx(:) + + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name + + name='psb_i2isort' + call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + + if (present(flag)) then + flag_ = flag + else + flag_ = psb_sort_ovw_idx_ + end if + select case(flag_) + case( psb_sort_ovw_idx_, psb_sort_keep_idx_) + ! OK keep going + case default + ierr(1) = 4; ierr(2) = flag_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + + if (present(dir)) then + dir_ = dir + else + dir_= psb_sort_up_ + end if + + n = size(x) + + if (present(ix)) then + if (size(ix) < n) then + ierr(1) = 2; ierr(2) = size(ix); + call psb_errpush(psb_err_input_asize_invalid_i_,name,i_err=ierr) + goto 9999 + end if + if (flag_==psb_sort_ovw_idx_) then + do i=1,n + ix(i) = i + end do + end if + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_i2isrx_up(n,x,ix) + case (psb_sort_down_) + call psi_i2isrx_dw(n,x,ix) + case (psb_asort_up_) + call psi_i2aisrx_up(n,x,ix) + case (psb_asort_down_) + call psi_i2aisrx_dw(n,x,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_i2isrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_i2isrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_i2aisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_i2aisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + select case(dir_) + case (psb_sort_up_) + call psi_i2isr_up(n,x) + case (psb_sort_down_) + call psi_i2isr_dw(n,x) + case (psb_asort_up_) + call psi_i2aisr_up(n,x) + case (psb_asort_down_) + call psi_i2aisr_dw(n,x) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + + end if + + return + +9999 call psb_error_handler(err_act) + + return +end subroutine psb_i2isort + +subroutine psi_i2isrx_up(n,x,idx) + use psb_sort_mod, psb_protect_name => psi_i2isrx_up + use psb_error_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(inout) :: idx(:) + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_) :: i,j,ix + integer(psb_i2pk_) :: xx + + do j=n-1,1,-1 + if (x(j+1) < x(j)) then + xx = x(j) + ix = idx(j) + i=j+1 + do + x(i-1) = x(i) + idx(i-1) = idx(i) + i = i+1 + if (i>n) exit + if (x(i) >= xx) exit + end do + x(i-1) = xx + idx(i-1) = ix + endif + enddo +end subroutine psi_i2isrx_up + +subroutine psi_i2isrx_dw(n,x,idx) + use psb_sort_mod, psb_protect_name => psi_i2isrx_dw + use psb_error_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(inout) :: idx(:) + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_) :: i,j,ix + integer(psb_i2pk_) :: xx + + do j=n-1,1,-1 + if (x(j+1) > x(j)) then + xx = x(j) + ix = idx(j) + i=j+1 + do + x(i-1) = x(i) + idx(i-1) = idx(i) + i = i+1 + if (i>n) exit + if (x(i) <= xx) exit + end do + x(i-1) = xx + idx(i-1) = ix + endif + enddo +end subroutine psi_i2isrx_dw + + +subroutine psi_i2isr_up(n,x) + use psb_sort_mod, psb_protect_name => psi_i2isr_up + use psb_error_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_) :: i,j + integer(psb_i2pk_) :: xx + + do j=n-1,1,-1 + if (x(j+1) < x(j)) then + xx = x(j) + i=j+1 + do + x(i-1) = x(i) + i = i+1 + if (i>n) exit + if (x(i) >= xx) exit + end do + x(i-1) = xx + endif + enddo +end subroutine psi_i2isr_up + +subroutine psi_i2isr_dw(n,x) + use psb_sort_mod, psb_protect_name => psi_i2isr_dw + use psb_error_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_) :: i,j + integer(psb_i2pk_) :: xx + + do j=n-1,1,-1 + if (x(j+1) > x(j)) then + xx = x(j) + i=j+1 + do + x(i-1) = x(i) + i = i+1 + if (i>n) exit + if (x(i) <= xx) exit + end do + x(i-1) = xx + endif + enddo +end subroutine psi_i2isr_dw + +subroutine psi_i2aisrx_up(n,x,idx) + use psb_sort_mod, psb_protect_name => psi_i2aisrx_up + use psb_error_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(inout) :: idx(:) + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_) :: i,j,ix + integer(psb_i2pk_) :: xx + + do j=n-1,1,-1 + if (abs(x(j+1)) < abs(x(j))) then + xx = x(j) + ix = idx(j) + i=j+1 + do + x(i-1) = x(i) + idx(i-1) = idx(i) + i = i+1 + if (i>n) exit + if (abs(x(i)) >= abs(xx)) exit + end do + x(i-1) = xx + idx(i-1) = ix + endif + enddo +end subroutine psi_i2aisrx_up + +subroutine psi_i2aisrx_dw(n,x,idx) + use psb_sort_mod, psb_protect_name => psi_i2aisrx_dw + use psb_error_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(inout) :: idx(:) + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_) :: i,j,ix + integer(psb_i2pk_) :: xx + + do j=n-1,1,-1 + if (abs(x(j+1)) > abs(x(j))) then + xx = x(j) + ix = idx(j) + i=j+1 + do + x(i-1) = x(i) + idx(i-1) = idx(i) + i = i+1 + if (i>n) exit + if (abs(x(i)) <= abs(xx)) exit + end do + x(i-1) = xx + idx(i-1) = ix + endif + enddo +end subroutine psi_i2aisrx_dw + +subroutine psi_i2aisr_up(n,x) + use psb_sort_mod, psb_protect_name => psi_i2aisr_up + use psb_error_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_) :: i,j + integer(psb_i2pk_) :: xx + + do j=n-1,1,-1 + if (abs(x(j+1)) < abs(x(j))) then + xx = x(j) + i=j+1 + do + x(i-1) = x(i) + i = i+1 + if (i>n) exit + if (abs(x(i)) >= abs(xx)) exit + end do + x(i-1) = xx + endif + enddo +end subroutine psi_i2aisr_up + +subroutine psi_i2aisr_dw(n,x) + use psb_sort_mod, psb_protect_name => psi_i2aisr_dw + use psb_error_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(in) :: n + integer(psb_ipk_) :: i,j + integer(psb_i2pk_) :: xx + + do j=n-1,1,-1 + if (abs(x(j+1)) > abs(x(j))) then + xx = x(j) + i=j+1 + do + x(i-1) = x(i) + i = i+1 + if (i>n) exit + if (abs(x(i)) <= abs(xx)) exit + end do + x(i-1) = xx + endif + enddo +end subroutine psi_i2aisr_dw + diff --git a/base/serial/sort/psb_i2_msort_impl.f90 b/base/serial/sort/psb_i2_msort_impl.f90 new file mode 100644 index 000000000..67835351d --- /dev/null +++ b/base/serial/sort/psb_i2_msort_impl.f90 @@ -0,0 +1,667 @@ + ! + ! Parallel Sparse BLAS version 3.5 + ! (C) Copyright 2006-2018 + ! Salvatore Filippone + ! Alfredo Buttari + ! + ! Redistribution and use in source and binary forms, with or without + ! modification, are permitted provided that the following conditions + ! are met: + ! 1. Redistributions of source code must retain the above copyright + ! notice, this list of conditions and the following disclaimer. + ! 2. Redistributions in binary form must reproduce the above copyright + ! notice, this list of conditions, and the following disclaimer in the + ! documentation and/or other materials provided with the distribution. + ! 3. The name of the PSBLAS group or the names of its contributors may + ! not be used to endorse or promote products derived from this + ! software without specific prior written permission. + ! + ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + ! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + ! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS + ! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + ! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + ! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + ! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + ! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + ! POSSIBILITY OF SUCH DAMAGE. + ! + ! + ! + ! The merge-sort routines + ! References: + ! D. Knuth + ! The Art of Computer Programming, vol. 3 + ! Addison-Wesley + ! + ! Aho, Hopcroft, Ullman + ! Data Structures and Algorithms + ! Addison-Wesley + ! +logical function psb_i2isaperm(n,eip) + use psb_sort_mod, psb_protect_name => psb_i2isaperm + implicit none + + integer(psb_i2pk_), intent(in) :: n + integer(psb_i2pk_), intent(in) :: eip(n) + integer(psb_i2pk_), allocatable :: ip(:) + integer(psb_i2pk_) :: i,j,m, info + + + psb_i2isaperm = .true. + if (n <= 0) return + allocate(ip(n), stat=info) + if (info /= psb_success_) return + ! + ! sanity check first + ! + do i=1, n + ip(i) = eip(i) + if ((ip(i) < 1).or.(ip(i) > n)) then + write(psb_err_unit,*) 'Out of bounds in isaperm' ,ip(i), n + psb_i2isaperm = .false. + return + endif + enddo + + ! + ! now work through the cycles, by marking each successive item as negative. + ! no cycle should intersect with any other, hence the >= 1 check. + ! + do m = 1, n + i = ip(m) + if (i < 0) then + ip(m) = -i + else if (i /= m) then + j = ip(i) + ip(i) = -j + i = j + do while ((j >= 1).and.(j /= m)) + j = ip(i) + ip(i) = -j + i = j + enddo + ip(m) = abs(ip(m)) + if (j /= m) then + psb_i2isaperm = .false. + goto 9999 + endif + end if + enddo +9999 continue + + return +end function psb_i2isaperm + + +subroutine psb_i2msort_u(x,nout,dir) + use psb_sort_mod, psb_protect_name => psb_i2msort_u + use psb_error_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(out) :: nout + integer(psb_ipk_), optional, intent(in) :: dir + + integer(psb_ipk_) :: n, k + integer(psb_ipk_) :: err_act + + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name + + name='psb_msort_u' + call psb_erractionsave(err_act) + + n = size(x) + + call psb_msort(x,dir=dir) + nout = min(1,n) + do k=2,n + if (x(k) /= x(nout)) then + nout = nout + 1 + x(nout) = x(k) + endif + enddo + + return + +9999 call psb_error_handler(err_act) + + return +end subroutine psb_i2msort_u + +subroutine psb_i2msort(x,ix,dir,flag,reord) + use psb_sort_mod, psb_protect_name => psb_i2msort + use psb_error_mod + use psb_ip_reord_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord + integer(psb_ipk_), optional, intent(inout) :: ix(:) + + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ + + integer(psb_ipk_), allocatable :: iaux(:) + integer(psb_ipk_) :: iret, info, i + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name + + name='psb_i2msort' + call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(dir)) then + dir_ = dir + else + dir_= psb_sort_up_ + end if + select case(dir_) + case( psb_sort_up_, psb_sort_down_, psb_asort_up_, psb_asort_down_) + ! OK keep going + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + + n = size(x) + + if (present(ix)) then + if (size(ix) < n) then + ierr(1) = 2; ierr(2) = size(ix); + call psb_errpush(psb_err_input_asize_invalid_i_,name,i_err=ierr) + goto 9999 + end if + if (present(flag)) then + flag_ = flag + else + flag_ = psb_sort_ovw_idx_ + end if + select case(flag_) + case(psb_sort_ovw_idx_) + do i=1,n + ix(i) = i + end do + case (psb_sort_keep_idx_) + ! OK keep going + case default + ierr(1) = 4; ierr(2) = flag_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + + end if + + allocate(iaux(0:n+1),stat=info) + if (info /= psb_success_) then + call psb_errpush(psb_err_alloc_dealloc_,r_name='psb_i2_msort') + goto 9999 + endif + + select case(dir_) + case (psb_sort_up_) + call psi_i2_msort_up(n,x,iaux,iret) + case (psb_sort_down_) + call psi_i2_msort_dw(n,x,iaux,iret) + case (psb_asort_up_) + call psi_i2_amsort_up(n,x,iaux,iret) + case (psb_asort_down_) + call psi_i2_amsort_dw(n,x,iaux,iret) + end select + ! + ! Do the actual reordering, since the inner routines + ! only provide linked pointers. + ! + if (iret == 0 ) then + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end if + + return + +9999 call psb_error_handler(err_act) + + return + + +end subroutine psb_i2msort + +subroutine psi_i2_msort_up(n,k,l,iret) + use psb_const_mod + implicit none + integer(psb_ipk_) :: n, iret + integer(psb_i2pk_) :: k(n) + integer(psb_ipk_) :: l(0:n+1) + ! + integer(psb_ipk_) :: p,q,s,t + ! .. + iret = 0 + ! first step: we are preparing ordered sublists, exploiting + ! what order was already in the input data; negative links + ! mark the end of the sublists + l(0) = 1 + t = n + 1 + do p = 1,n - 1 + if (k(p) <= k(p+1)) then + l(p) = p + 1 + else + l(t) = - (p+1) + t = p + end if + end do + l(t) = 0 + l(n) = 0 + ! see if the input was already sorted + if (l(n+1) == 0) then + iret = 1 + return + else + l(n+1) = abs(l(n+1)) + end if + + mergepass: do + ! otherwise, begin a pass through the list. + ! throughout all the subroutine we have: + ! p, q: pointing to the sublists being merged + ! s: pointing to the most recently processed record + ! t: pointing to the end of previously completed sublist + s = 0 + t = n + 1 + p = l(s) + q = l(t) + if (q == 0) exit mergepass + + outer: do + + if (k(p) > k(q)) then + + l(s) = sign(q,l(s)) + s = q + q = l(q) + if (q > 0) then + do + if (k(p) <= k(q)) cycle outer + s = q + q = l(q) + if (q <= 0) exit + end do + end if + l(s) = p + s = t + do + t = p + p = l(p) + if (p <= 0) exit + end do + + else + + l(s) = sign(p,l(s)) + s = p + p = l(p) + if (p>0) then + do + if (k(p) > k(q)) cycle outer + s = p + p = l(p) + if (p <= 0) exit + end do + end if + ! otherwise, one sublist ended, and we append to it the rest + ! of the other one. + l(s) = q + s = t + do + t = q + q = l(q) + if (q <= 0) exit + end do + end if + + p = -p + q = -q + if (q == 0) then + l(s) = sign(p,l(s)) + l(t) = 0 + exit outer + end if + end do outer + end do mergepass + +end subroutine psi_i2_msort_up + +subroutine psi_i2_msort_dw(n,k,l,iret) + use psb_const_mod + implicit none + integer(psb_ipk_) :: n, iret + integer(psb_i2pk_) :: k(n) + integer(psb_ipk_) :: l(0:n+1) + ! + integer(psb_ipk_) :: p,q,s,t + ! .. + iret = 0 + ! first step: we are preparing ordered sublists, exploiting + ! what order was already in the input data; negative links + ! mark the end of the sublists + l(0) = 1 + t = n + 1 + do p = 1,n - 1 + if (k(p) >= k(p+1)) then + l(p) = p + 1 + else + l(t) = - (p+1) + t = p + end if + end do + l(t) = 0 + l(n) = 0 + ! see if the input was already sorted + if (l(n+1) == 0) then + iret = 1 + return + else + l(n+1) = abs(l(n+1)) + end if + + mergepass: do + ! otherwise, begin a pass through the list. + ! throughout all the subroutine we have: + ! p, q: pointing to the sublists being merged + ! s: pointing to the most recently processed record + ! t: pointing to the end of previously completed sublist + s = 0 + t = n + 1 + p = l(s) + q = l(t) + if (q == 0) exit mergepass + + outer: do + + if (k(p) < k(q)) then + + l(s) = sign(q,l(s)) + s = q + q = l(q) + if (q > 0) then + do + if (k(p) >= k(q)) cycle outer + s = q + q = l(q) + if (q <= 0) exit + end do + end if + l(s) = p + s = t + do + t = p + p = l(p) + if (p <= 0) exit + end do + + else + + l(s) = sign(p,l(s)) + s = p + p = l(p) + if (p>0) then + do + if (k(p) < k(q)) cycle outer + s = p + p = l(p) + if (p <= 0) exit + end do + end if + ! otherwise, one sublist ended, and we append to it the rest + ! of the other one. + l(s) = q + s = t + do + t = q + q = l(q) + if (q <= 0) exit + end do + end if + + p = -p + q = -q + if (q == 0) then + l(s) = sign(p,l(s)) + l(t) = 0 + exit outer + end if + end do outer + end do mergepass + +end subroutine psi_i2_msort_dw + +subroutine psi_i2_amsort_up(n,k,l,iret) + use psb_const_mod + implicit none + integer(psb_ipk_) :: n, iret + integer(psb_i2pk_) :: k(n) + integer(psb_ipk_) :: l(0:n+1) + ! + integer(psb_ipk_) :: p,q,s,t + ! .. + iret = 0 + ! first step: we are preparing ordered sublists, exploiting + ! what order was already in the input data; negative links + ! mark the end of the sublists + l(0) = 1 + t = n + 1 + do p = 1,n - 1 + if (abs(k(p)) <= abs(k(p+1))) then + l(p) = p + 1 + else + l(t) = - (p+1) + t = p + end if + end do + l(t) = 0 + l(n) = 0 + ! see if the input was already sorted + if (l(n+1) == 0) then + iret = 1 + return + else + l(n+1) = abs(l(n+1)) + end if + + mergepass: do + ! otherwise, begin a pass through the list. + ! throughout all the subroutine we have: + ! p, q: pointing to the sublists being merged + ! s: pointing to the most recently processed record + ! t: pointing to the end of previously completed sublist + s = 0 + t = n + 1 + p = l(s) + q = l(t) + if (q == 0) exit mergepass + + outer: do + + if (abs(k(p)) > abs(k(q))) then + + l(s) = sign(q,l(s)) + s = q + q = l(q) + if (q > 0) then + do + if (abs(k(p)) <= abs(k(q))) cycle outer + s = q + q = l(q) + if (q <= 0) exit + end do + end if + l(s) = p + s = t + do + t = p + p = l(p) + if (p <= 0) exit + end do + + else + + l(s) = sign(p,l(s)) + s = p + p = l(p) + if (p>0) then + do + if (abs(k(p)) > abs(k(q))) cycle outer + s = p + p = l(p) + if (p <= 0) exit + end do + end if + ! otherwise, one sublist ended, and we append to it the rest + ! of the other one. + l(s) = q + s = t + do + t = q + q = l(q) + if (q <= 0) exit + end do + end if + + p = -p + q = -q + if (q == 0) then + l(s) = sign(p,l(s)) + l(t) = 0 + exit outer + end if + end do outer + end do mergepass + +end subroutine psi_i2_amsort_up + +subroutine psi_i2_amsort_dw(n,k,l,iret) + use psb_const_mod + implicit none + integer(psb_ipk_) :: n, iret + integer(psb_i2pk_) :: k(n) + integer(psb_ipk_) :: l(0:n+1) + ! + integer(psb_ipk_) :: p,q,s,t + ! .. + iret = 0 + ! first step: we are preparing ordered sublists, exploiting + ! what order was already in the input data; negative links + ! mark the end of the sublists + l(0) = 1 + t = n + 1 + do p = 1,n - 1 + if (abs(k(p)) >= abs(k(p+1))) then + l(p) = p + 1 + else + l(t) = - (p+1) + t = p + end if + end do + l(t) = 0 + l(n) = 0 + ! see if the input was already sorted + if (l(n+1) == 0) then + iret = 1 + return + else + l(n+1) = abs(l(n+1)) + end if + + mergepass: do + ! otherwise, begin a pass through the list. + ! throughout all the subroutine we have: + ! p, q: pointing to the sublists being merged + ! s: pointing to the most recently processed record + ! t: pointing to the end of previously completed sublist + s = 0 + t = n + 1 + p = l(s) + q = l(t) + if (q == 0) exit mergepass + + outer: do + + if (abs(k(p)) < abs(k(q))) then + + l(s) = sign(q,l(s)) + s = q + q = l(q) + if (q > 0) then + do + if (abs(k(p)) >= abs(k(q))) cycle outer + s = q + q = l(q) + if (q <= 0) exit + end do + end if + l(s) = p + s = t + do + t = p + p = l(p) + if (p <= 0) exit + end do + + else + + l(s) = sign(p,l(s)) + s = p + p = l(p) + if (p>0) then + do + if (abs(k(p)) < abs(k(q))) cycle outer + s = p + p = l(p) + if (p <= 0) exit + end do + end if + ! otherwise, one sublist ended, and we append to it the rest + ! of the other one. + l(s) = q + s = t + do + t = q + q = l(q) + if (q <= 0) exit + end do + end if + + p = -p + q = -q + if (q == 0) then + l(s) = sign(p,l(s)) + l(t) = 0 + exit outer + end if + end do outer + end do mergepass + +end subroutine psi_i2_amsort_dw + + diff --git a/base/serial/sort/psb_i2_qsort_impl.f90 b/base/serial/sort/psb_i2_qsort_impl.f90 new file mode 100644 index 000000000..cc0ee95bb --- /dev/null +++ b/base/serial/sort/psb_i2_qsort_impl.f90 @@ -0,0 +1,1472 @@ +! +! Parallel Sparse BLAS version 3.5 +! (C) Copyright 2006-2018 +! Salvatore Filippone +! Alfredo Buttari +! +! Redistribution and use in source and binary forms, with or without +! modification, are permitted provided that the following conditions +! are met: +! 1. Redistributions of source code must retain the above copyright +! notice, this list of conditions and the following disclaimer. +! 2. Redistributions in binary form must reproduce the above copyright +! notice, this list of conditions, and the following disclaimer in the +! documentation and/or other materials provided with the distribution. +! 3. The name of the PSBLAS group or the names of its contributors may +! not be used to endorse or promote products derived from this +! software without specific prior written permission. +! +! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED +! TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +! PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS +! BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +! POSSIBILITY OF SUCH DAMAGE. +! +! +! +! The quicksort routines +! References: +! D. Knuth +! The Art of Computer Programming, vol. 3 +! Addison-Wesley +! +! Aho, Hopcroft, Ullman +! Data Structures and Algorithms +! Addison-Wesley +! +function psb_i2bsrch(key,n,v,dir,find) result(ipos) + use psb_sort_mod, psb_protect_name => psb_i2bsrch + implicit none + integer(psb_ipk_) :: ipos, n + integer(psb_i2pk_) :: key + integer(psb_i2pk_) :: v(:) + integer(psb_ipk_), optional :: dir, find + + integer(psb_ipk_) :: lb, ub, m, i, k, dir_, find_ + + if (present(dir)) then + dir_ = dir + else + dir_ = psb_sort_up_ + end if + if (present(find)) then + find_ = find + else + find_ = psb_find_any_ + end if + + ipos = -1 + if (dir_ == psb_sort_up_) then + if (n<=5) then + do m=1,n + if (key == v(m)) then + ipos = m + exit + end if + enddo + + else + + lb = 1 + ub = n + + do while (lb.le.ub) + m = (lb+ub)/2 + if (key.eq.v(m)) then + ipos = m + exit + else if (key < v(m)) then + ub = m-1 + else + lb = m + 1 + end if + enddo + end if + select case(find_) + case (psb_find_any_ ) + ! do nothing + case (psb_find_last_le_ ) + if ((m>n) .or. (m<1)) then + m = n + do while (m>=1) + if (v(m)<=key) exit + m = m - 1 + end do + else + do while (mn) .or. (m<1)) then + m = 1 + do while (m<=n) + if (v(m)>=key) exit + m = m + 1 + end do + else + do while (m>1) + if (v(m-1)>=key) then + m=m-1 + else + exit + end if + end do + end if + ipos = max(m,1) + + case default + write(0,*) 'Wrong FIND' + end select + + + else if (dir_ == psb_sort_down_) then + write(0,*) ' bsrch on sort down not implemented' + else + write(0,*) ' bsrch wrong DIR ',dir_,psb_sort_up_,psb_sort_down_ + end if + return +end function psb_i2bsrch + +function psb_i2ssrch(key,n,v) result(ipos) + use psb_sort_mod, psb_protect_name => psb_i2ssrch + implicit none + integer(psb_ipk_) :: ipos, n + integer(psb_i2pk_) :: key + integer(psb_i2pk_) :: v(:) + + integer(psb_ipk_) :: i + + ipos = -1 + do i=1,n + if (key.eq.v(i)) then + ipos = i + return + end if + enddo + + return +end function psb_i2ssrch + +subroutine psb_i2qsort(x,ix,dir,flag,reord) + use psb_sort_mod, psb_protect_name => psb_i2qsort + use psb_error_mod + implicit none + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord + integer(psb_ipk_), optional, intent(inout) :: ix(:) + + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ + integer(psb_ipk_) :: n + integer(psb_i2pk_), allocatable :: tx(:) + integer(psb_ipk_) :: ierr(5) + character(len=20) :: name + + name='psb_i2qsort' + call psb_erractionsave(err_act) + + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then + flag_ = flag + else + flag_ = psb_sort_ovw_idx_ + end if + select case(flag_) + case( psb_sort_ovw_idx_, psb_sort_keep_idx_) + ! OK keep going + case default + ierr(1) = 4; ierr(2) = flag_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + + if (present(dir)) then + dir_ = dir + else + dir_= psb_sort_up_ + end if + + n = size(x) + + if (present(ix)) then + if (size(ix) < n) then + ierr(1) = 2; ierr(2) = size(ix); + call psb_errpush(psb_err_input_asize_invalid_i_,name,i_err=ierr) + goto 9999 + end if + if (flag_==psb_sort_ovw_idx_) then + do i=1,n + ix(i) = i + end do + end if + + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_i2qsrx_up(n,x,ix) + case (psb_sort_down_) + call psi_i2qsrx_dw(n,x,ix) + case (psb_asort_up_) + call psi_i2aqsrx_up(n,x,ix) + case (psb_asort_down_) + call psi_i2aqsrx_dw(n,x,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_i2qsrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_i2qsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_i2aqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_i2aqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + + select case(dir_) + case (psb_sort_up_) + call psi_i2qsr_up(n,x) + case (psb_sort_down_) + call psi_i2qsr_dw(n,x) + case (psb_asort_up_) + call psi_i2aqsr_up(n,x) + case (psb_asort_down_) + call psi_i2aqsr_dw(n,x) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + + end if + + return + +9999 call psb_error_handler(err_act) + + return +end subroutine psb_i2qsort + +subroutine psi_i2qsrx_up(n,x,idx) + use psb_sort_mod, psb_protect_name => psi_i2qsrx_up + use psb_error_mod + implicit none + + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(inout) :: idx(:) + integer(psb_ipk_), intent(in) :: n + ! .. Local Scalars .. + integer(psb_i2pk_) :: piv, xk, xt + integer(psb_ipk_) :: i, j, ilx, iux, istp, lpiv + integer(psb_ipk_) :: n1, n2 + integer(psb_ipk_) :: ixt + integer(psb_ipk_), parameter :: maxstack=64,nparms=3,ithrs=72 + integer(psb_ipk_) :: istack(nparms,maxstack) + + if (n > ithrs) then + ! + ! Init stack pointer + ! + istp = 1 + istack(1,istp) = 1 + istack(2,istp) = n + + do + if (istp <= 0) exit + ilx = istack(1,istp) + iux = istack(2,istp) + istp = istp - 1 + ! + ! Choose a pivot with median-of-three heuristics, leave it + ! in the LPIV location + ! + i = ilx + j = iux + lpiv = (i+j)/2 + piv = x(lpiv) + if (piv < x(i)) then + xt = x(i) + ixt = idx(i) + x(i) = x(lpiv) + idx(i) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = x(lpiv) + endif + if (piv > x(j)) then + xt = x(j) + ixt = idx(j) + x(j) = x(lpiv) + idx(j) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = x(lpiv) + endif + if (piv < x(i)) then + xt = x(i) + ixt = idx(i) + x(i) = x(lpiv) + idx(i) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = x(lpiv) + endif + ! + ! now piv is correct; place it into first location + xt = x(i) + ixt = idx(i) + x(i) = x(lpiv) + idx(i) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = x(lpiv) + + i = ilx - 1 + j = iux + 1 + + outer_up: do + in_up1: do + i = i + 1 + xk = x(i) + if (xk >= piv) exit in_up1 + end do in_up1 + ! + ! Ensure finite termination for next loop + ! + xt = xk + x(i) = piv + in_up2:do + j = j - 1 + xk = x(j) + if (xk <= piv) exit in_up2 + end do in_up2 + x(i) = xt + + if (j > i) then + xt = x(i) + ixt = idx(i) + x(i) = x(j) + idx(i) = idx(j) + x(j) = xt + idx(j) = ixt + else + exit outer_up + end if + end do outer_up + if (i == ilx) then + if (x(i) /= piv) then + call psb_errpush(psb_err_internal_error_,& + & r_name='psi_i2qsrx',a_err='impossible pivot condition') + call psb_error() + endif + i = i + 1 + endif + + n1 = (i-1)-ilx+1 + n2 = iux-(i)+1 + if (n1 > n2) then + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2isrx_up(n1,x(ilx:i-1),idx(ilx:i-1)) + endif + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2isrx_up(n2,x(i:iux),idx(i:iux)) + endif + else + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2isrx_up(n2,x(i:iux),idx(i:iux)) + endif + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2isrx_up(n1,x(ilx:i-1),idx(ilx:i-1)) + endif + endif + enddo + else + call psi_i2isrx_up(n,x,idx) + endif +end subroutine psi_i2qsrx_up + +subroutine psi_i2qsrx_dw(n,x,idx) + use psb_sort_mod, psb_protect_name => psi_i2qsrx_dw + use psb_error_mod + implicit none + + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(inout) :: idx(:) + integer(psb_ipk_), intent(in) :: n + ! .. Local Scalars .. + integer(psb_i2pk_) :: piv, xk, xt + integer(psb_ipk_) :: i, j, ilx, iux, istp, lpiv + integer(psb_ipk_) :: n1, n2 + integer(psb_ipk_) :: ixt + + integer(psb_ipk_), parameter :: maxstack=64,nparms=3,ithrs=72 + integer(psb_ipk_) :: istack(nparms,maxstack) + + if (n > ithrs) then + ! + ! Init stack pointer + ! + istp = 1 + istack(1,istp) = 1 + istack(2,istp) = n + + do + if (istp <= 0) exit + ilx = istack(1,istp) + iux = istack(2,istp) + istp = istp - 1 + ! + ! Choose a pivot with median-of-three heuristics, leave it + ! in the LPIV location + ! + i = ilx + j = iux + lpiv = (i+j)/2 + piv = x(lpiv) + if (piv > x(i)) then + xt = x(i) + ixt = idx(i) + x(i) = x(lpiv) + idx(i) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = x(lpiv) + endif + if (piv < x(j)) then + xt = x(j) + ixt = idx(j) + x(j) = x(lpiv) + idx(j) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = x(lpiv) + endif + if (piv > x(i)) then + xt = x(i) + ixt = idx(i) + x(i) = x(lpiv) + idx(i) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = x(lpiv) + endif + ! + ! now piv is correct; place it into first location + xt = x(i) + ixt = idx(i) + x(i) = x(lpiv) + idx(i) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = x(lpiv) + + i = ilx - 1 + j = iux + 1 + + outer_dw: do + in_dw1: do + i = i + 1 + xk = x(i) + if (xk <= piv) exit in_dw1 + end do in_dw1 + ! + ! Ensure finite termination for next loop + ! + xt = xk + x(i) = piv + in_dw2:do + j = j - 1 + xk = x(j) + if (xk >= piv) exit in_dw2 + end do in_dw2 + x(i) = xt + + if (j > i) then + xt = x(i) + ixt = idx(i) + x(i) = x(j) + idx(i) = idx(j) + x(j) = xt + idx(j) = ixt + else + exit outer_dw + end if + end do outer_dw + if (i == ilx) then + if (x(i) /= piv) then + call psb_errpush(psb_err_internal_error_,& + & r_name='psi_i2qsrx',a_err='impossible pivot condition') + call psb_error() + endif + i = i + 1 + endif + + n1 = (i-1)-ilx+1 + n2 = iux-(i)+1 + if (n1 > n2) then + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2isrx_dw(n1,x(ilx:i-1),idx(ilx:i-1)) + endif + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2isrx_dw(n2,x(i:iux),idx(i:iux)) + endif + else + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2isrx_dw(n2,x(i:iux),idx(i:iux)) + endif + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2isrx_dw(n1,x(ilx:i-1),idx(ilx:i-1)) + endif + endif + enddo + else + call psi_i2isrx_dw(n,x,idx) + endif + +end subroutine psi_i2qsrx_dw + +subroutine psi_i2qsr_up(n,x) + use psb_sort_mod, psb_protect_name => psi_i2qsr_up + use psb_error_mod + implicit none + + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(in) :: n + ! .. + ! .. Local Scalars .. + integer(psb_i2pk_) :: piv, xt, xk + integer(psb_ipk_) :: i, j, ilx, iux, istp, lpiv + integer(psb_ipk_) :: n1, n2 + + integer(psb_ipk_), parameter :: maxstack=64,nparms=3,ithrs=72 + integer(psb_ipk_) :: istack(nparms,maxstack) + + + if (n > ithrs) then + ! + ! Init stack pointer + ! + istp = 1 + istack(1,istp) = 1 + istack(2,istp) = n + + do + if (istp <= 0) exit + ilx = istack(1,istp) + iux = istack(2,istp) + istp = istp - 1 + ! + ! Choose a pivot with median-of-three heuristics, leave it + ! in the LPIV location + ! + i = ilx + j = iux + lpiv = (i+j)/2 + piv = x(lpiv) + if (piv < x(i)) then + xt = x(i) + x(i) = x(lpiv) + x(lpiv) = xt + piv = x(lpiv) + endif + if (piv > x(j)) then + xt = x(j) + x(j) = x(lpiv) + x(lpiv) = xt + piv = x(lpiv) + endif + if (piv < x(i)) then + xt = x(i) + x(i) = x(lpiv) + x(lpiv) = xt + piv = x(lpiv) + endif + ! + ! now piv is correct; place it into first location + + xt = x(i) + x(i) = x(lpiv) + x(lpiv) = xt + + i = ilx - 1 + j = iux + 1 + + outer_up: do + in_up1: do + i = i + 1 + xk = x(i) + if (xk >= piv) exit in_up1 + end do in_up1 + ! + ! Ensure finite termination for next loop + ! + xt = xk + x(i) = piv + in_up2:do + j = j - 1 + xk = x(j) + if (xk <= piv) exit in_up2 + end do in_up2 + x(i) = xt + + if (j > i) then + xt = x(i) + x(i) = x(j) + x(j) = xt + else + exit outer_up + end if + end do outer_up + if (i == ilx) then + if (x(i) /= piv) then + call psb_errpush(psb_err_internal_error_,& + & r_name='psi_i2qsr',a_err='impossible pivot condition') + call psb_error() + endif + i = i + 1 + endif + + n1 = (i-1)-ilx+1 + n2 = iux-(i)+1 + if (n1 > n2) then + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2isr_up(n1,x(ilx:i-1)) + endif + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2isr_up(n2,x(i:iux)) + endif + else + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2isr_up(n2,x(i:iux)) + endif + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2isr_up(n1,x(ilx:i-1)) + endif + endif + enddo + else + call psi_i2isr_up(n,x) + endif + +end subroutine psi_i2qsr_up + +subroutine psi_i2qsr_dw(n,x) + use psb_sort_mod, psb_protect_name => psi_i2qsr_dw + use psb_error_mod + implicit none + + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(in) :: n + ! .. + ! .. Local Scalars .. + integer(psb_i2pk_) :: piv, xt, xk + integer(psb_ipk_) :: i, j, ilx, iux, istp, lpiv + integer(psb_ipk_) :: n1, n2 + + integer(psb_ipk_), parameter :: maxstack=64,nparms=3,ithrs=72 + integer(psb_ipk_) :: istack(nparms,maxstack) + + + if (n > ithrs) then + ! + ! Init stack pointer + ! + istp = 1 + istack(1,istp) = 1 + istack(2,istp) = n + + do + if (istp <= 0) exit + ilx = istack(1,istp) + iux = istack(2,istp) + istp = istp - 1 + ! + ! Choose a pivot with median-of-three heuristics, leave it + ! in the LPIV location + ! + i = ilx + j = iux + lpiv = (i+j)/2 + piv = x(lpiv) + if (piv > x(i)) then + xt = x(i) + x(i) = x(lpiv) + x(lpiv) = xt + piv = x(lpiv) + endif + if (piv < x(j)) then + xt = x(j) + x(j) = x(lpiv) + x(lpiv) = xt + piv = x(lpiv) + endif + if (piv > x(i)) then + xt = x(i) + x(i) = x(lpiv) + x(lpiv) = xt + piv = x(lpiv) + endif + ! + ! now piv is correct; place it into first location + + xt = x(i) + x(i) = x(lpiv) + x(lpiv) = xt + + i = ilx - 1 + j = iux + 1 + + outer_dw: do + in_dw1: do + i = i + 1 + xk = x(i) + if (xk <= piv) exit in_dw1 + end do in_dw1 + ! + ! Ensure finite termination for next loop + ! + xt = xk + x(i) = piv + in_dw2:do + j = j - 1 + xk = x(j) + if (xk >= piv) exit in_dw2 + end do in_dw2 + x(i) = xt + + if (j > i) then + xt = x(i) + x(i) = x(j) + x(j) = xt + else + exit outer_dw + end if + end do outer_dw + if (i == ilx) then + if (x(i) /= piv) then + call psb_errpush(psb_err_internal_error_, & + & r_name='psi_i2qsr',a_err='impossible pivot condition') + call psb_error() + endif + i = i + 1 + endif + + n1 = (i-1)-ilx+1 + n2 = iux-(i)+1 + if (n1 > n2) then + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2isr_dw(n1,x(ilx:i-1)) + endif + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2isr_dw(n2,x(i:iux)) + endif + else + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2isr_dw(n2,x(i:iux)) + endif + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2isr_dw(n1,x(ilx:i-1)) + endif + endif + enddo + else + call psi_i2isr_dw(n,x) + endif + +end subroutine psi_i2qsr_dw + +subroutine psi_i2aqsrx_up(n,x,idx) + use psb_sort_mod, psb_protect_name => psi_i2aqsrx_up + use psb_error_mod + implicit none + + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(inout) :: idx(:) + integer(psb_ipk_), intent(in) :: n + ! .. Local Scalars .. + integer(psb_i2pk_) :: piv, xk + integer(psb_i2pk_) :: xt + integer(psb_ipk_) :: i, j, ilx, iux, istp, lpiv + integer(psb_ipk_) :: n1, n2 + integer(psb_ipk_) :: ixt + + integer(psb_ipk_), parameter :: maxstack=64,nparms=3,ithrs=72 + integer(psb_ipk_) :: istack(nparms,maxstack) + + if (n > ithrs) then + ! + ! Init stack pointer + ! + istp = 1 + istack(1,istp) = 1 + istack(2,istp) = n + + do + if (istp <= 0) exit + ilx = istack(1,istp) + iux = istack(2,istp) + istp = istp - 1 + ! + ! Choose a pivot with median-of-three heuristics, leave it + ! in the LPIV location + ! + i = ilx + j = iux + lpiv = (i+j)/2 + piv = abs(x(lpiv)) + if (piv < abs(x(i))) then + xt = x(i) + ixt = idx(i) + x(i) = x(lpiv) + idx(i) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = abs(x(lpiv)) + endif + if (piv > abs(x(j))) then + xt = x(j) + ixt = idx(j) + x(j) = x(lpiv) + idx(j) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = abs(x(lpiv)) + endif + if (piv < abs(x(i))) then + xt = x(i) + ixt = idx(i) + x(i) = x(lpiv) + idx(i) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = abs(x(lpiv)) + endif + ! + ! now piv is correct; place it into first location + xt = x(i) + ixt = idx(i) + x(i) = x(lpiv) + idx(i) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + + i = ilx - 1 + j = iux + 1 + + outer_up: do + in_up1: do + i = i + 1 + xk = abs(x(i)) + if (xk >= piv) exit in_up1 + end do in_up1 + ! + ! Ensure finite termination for next loop + ! + xt = x(i) + x(i) = piv + in_up2:do + j = j - 1 + xk = abs(x(j)) + if (xk <= piv) exit in_up2 + end do in_up2 + x(i) = xt + + if (j > i) then + xt = x(i) + ixt = idx(i) + x(i) = x(j) + idx(i) = idx(j) + x(j) = xt + idx(j) = ixt + else + exit outer_up + end if + end do outer_up + if (i == ilx) then + if (x(i) /= piv) then + call psb_errpush(psb_err_internal_error_, & + & r_name='psi_i2aqsrx',a_err='impossible pivot condition') + call psb_error() + endif + i = i + 1 + endif + + n1 = (i-1)-ilx+1 + n2 = iux-(i)+1 + if (n1 > n2) then + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2aisrx_up(n1,x(ilx:i-1),idx(ilx:i-1)) + endif + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2aisrx_up(n2,x(i:iux),idx(i:iux)) + endif + else + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2aisrx_up(n2,x(i:iux),idx(i:iux)) + endif + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2aisrx_up(n1,x(ilx:i-1),idx(ilx:i-1)) + endif + endif + enddo + else + call psi_i2aisrx_up(n,x,idx) + endif + + +end subroutine psi_i2aqsrx_up + +subroutine psi_i2aqsrx_dw(n,x,idx) + use psb_sort_mod, psb_protect_name => psi_i2aqsrx_dw + use psb_error_mod + implicit none + + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(inout) :: idx(:) + integer(psb_ipk_), intent(in) :: n + ! .. Local Scalars .. + integer(psb_i2pk_) :: piv, xk + integer(psb_i2pk_) :: xt + integer(psb_ipk_) :: i, j, ilx, iux, istp, lpiv + integer(psb_ipk_) :: n1, n2 + integer(psb_ipk_) :: ixt + + integer(psb_ipk_), parameter :: maxstack=64,nparms=3,ithrs=72 + integer(psb_ipk_) :: istack(nparms,maxstack) + if (n > ithrs) then + ! + ! Init stack pointer + ! + istp = 1 + istack(1,istp) = 1 + istack(2,istp) = n + + do + if (istp <= 0) exit + ilx = istack(1,istp) + iux = istack(2,istp) + istp = istp - 1 + ! + ! Choose a pivot with median-of-three heuristics, leave it + ! in the LPIV location + ! + i = ilx + j = iux + lpiv = (i+j)/2 + piv = abs(x(lpiv)) + if (piv > abs(x(i))) then + xt = x(i) + ixt = idx(i) + x(i) = x(lpiv) + idx(i) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = abs(x(lpiv)) + endif + if (piv < abs(x(j))) then + xt = x(j) + ixt = idx(j) + x(j) = x(lpiv) + idx(j) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = abs(x(lpiv)) + endif + if (piv > abs(x(i))) then + xt = x(i) + ixt = idx(i) + x(i) = x(lpiv) + idx(i) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + piv = abs(x(lpiv)) + endif + ! + ! now piv is correct; place it into first location + xt = x(i) + ixt = idx(i) + x(i) = x(lpiv) + idx(i) = idx(lpiv) + x(lpiv) = xt + idx(lpiv) = ixt + + i = ilx - 1 + j = iux + 1 + + outer_dw: do + in_dw1: do + i = i + 1 + xk = abs(x(i)) + if (xk <= piv) exit in_dw1 + end do in_dw1 + ! + ! Ensure finite termination for next loop + ! + xt = x(i) + x(i) = piv + in_dw2:do + j = j - 1 + xk = abs(x(j)) + if (xk >= piv) exit in_dw2 + end do in_dw2 + x(i) = xt + + if (j > i) then + xt = x(i) + ixt = idx(i) + x(i) = x(j) + idx(i) = idx(j) + x(j) = xt + idx(j) = ixt + else + exit outer_dw + end if + end do outer_dw + if (i == ilx) then + if (x(i) /= piv) then + call psb_errpush(psb_err_internal_error_,& + & r_name='psi_i2aqsrx',a_err='impossible pivot condition') + call psb_error() + endif + i = i + 1 + endif + + n1 = (i-1)-ilx+1 + n2 = iux-(i)+1 + if (n1 > n2) then + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2aisrx_dw(n1,x(ilx:i-1),idx(ilx:i-1)) + endif + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2aisrx_dw(n2,x(i:iux),idx(i:iux)) + endif + else + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2aisrx_dw(n2,x(i:iux),idx(i:iux)) + endif + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2aisrx_dw(n1,x(ilx:i-1),idx(ilx:i-1)) + endif + endif + enddo + else + call psi_i2aisrx_dw(n,x,idx) + endif + +end subroutine psi_i2aqsrx_dw + +subroutine psi_i2aqsr_up(n,x) + use psb_sort_mod, psb_protect_name => psi_i2aqsr_up + use psb_error_mod + implicit none + + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(in) :: n + ! .. Local Scalars .. + integer(psb_i2pk_) :: piv, xk + integer(psb_i2pk_) :: xt + integer(psb_ipk_) :: i, j, ilx, iux, istp, lpiv + integer(psb_ipk_) :: n1, n2 + integer(psb_ipk_) :: ixt + + integer(psb_ipk_), parameter :: maxstack=64,nparms=3,ithrs=72 + integer(psb_ipk_) :: istack(nparms,maxstack) + + if (n > ithrs) then + ! + ! Init stack pointer + ! + istp = 1 + istack(1,istp) = 1 + istack(2,istp) = n + + do + if (istp <= 0) exit + ilx = istack(1,istp) + iux = istack(2,istp) + istp = istp - 1 + ! + ! Choose a pivot with median-of-three heuristics, leave it + ! in the LPIV location + ! + i = ilx + j = iux + lpiv = (i+j)/2 + piv = abs(x(lpiv)) + if (piv < abs(x(i))) then + xt = x(i) + x(i) = x(lpiv) + x(lpiv) = xt + piv = abs(x(lpiv)) + endif + if (piv > abs(x(j))) then + xt = x(j) + x(j) = x(lpiv) + x(lpiv) = xt + piv = abs(x(lpiv)) + endif + if (piv < abs(x(i))) then + xt = x(i) + x(i) = x(lpiv) + x(lpiv) = xt + piv = abs(x(lpiv)) + endif + ! + ! now piv is correct; place it into first location + + xt = x(i) + x(i) = x(lpiv) + x(lpiv) = xt + + i = ilx - 1 + j = iux + 1 + + outer_up: do + in_up1: do + i = i + 1 + xk = abs(x(i)) + if (xk >= piv) exit in_up1 + end do in_up1 + ! + ! Ensure finite termination for next loop + ! + xt = x(i) + x(i) = piv + in_up2:do + j = j - 1 + xk = abs(x(j)) + if (xk <= piv) exit in_up2 + end do in_up2 + x(i) = xt + + if (j > i) then + xt = x(i) + x(i) = x(j) + x(j) = xt + else + exit outer_up + end if + end do outer_up + if (i == ilx) then + if (x(i) /= piv) then + call psb_errpush(psb_err_internal_error_, & + & r_name='psi_i2qasr',a_err='impossible pivot condition') + call psb_error() + endif + i = i + 1 + endif + + n1 = (i-1)-ilx+1 + n2 = iux-(i)+1 + if (n1 > n2) then + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2aisr_up(n1,x(ilx:i-1)) + endif + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2aisr_up(n2,x(i:iux)) + endif + else + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2aisr_up(n2,x(i:iux)) + endif + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2aisr_up(n1,x(ilx:i-1)) + endif + endif + enddo + else + call psi_i2aisr_up(n,x) + endif + +end subroutine psi_i2aqsr_up + +subroutine psi_i2aqsr_dw(n,x) + use psb_sort_mod, psb_protect_name => psi_i2aqsr_dw + use psb_error_mod + implicit none + + integer(psb_i2pk_), intent(inout) :: x(:) + integer(psb_ipk_), intent(in) :: n + ! .. Local Scalars .. + integer(psb_i2pk_) :: piv, xk + integer(psb_i2pk_) :: xt + integer(psb_ipk_) :: i, j, ilx, iux, istp, lpiv + integer(psb_ipk_) :: n1, n2 + integer(psb_ipk_) :: ixt + + integer(psb_ipk_), parameter :: maxstack=64,nparms=3,ithrs=72 + integer(psb_ipk_) :: istack(nparms,maxstack) + + if (n > ithrs) then + ! + ! Init stack pointer + ! + istp = 1 + istack(1,istp) = 1 + istack(2,istp) = n + + do + if (istp <= 0) exit + ilx = istack(1,istp) + iux = istack(2,istp) + istp = istp - 1 + ! + ! Choose a pivot with median-of-three heuristics, leave it + ! in the LPIV location + ! + i = ilx + j = iux + lpiv = (i+j)/2 + piv = abs(x(lpiv)) + if (piv > abs(x(i))) then + xt = x(i) + x(i) = x(lpiv) + x(lpiv) = xt + piv = abs(x(lpiv)) + endif + if (piv < abs(x(j))) then + xt = x(j) + x(j) = x(lpiv) + x(lpiv) = xt + piv = abs(x(lpiv)) + endif + if (piv > abs(x(i))) then + xt = x(i) + x(i) = x(lpiv) + x(lpiv) = xt + piv = abs(x(lpiv)) + endif + ! + ! now piv is correct; place it into first location + + xt = x(i) + x(i) = x(lpiv) + x(lpiv) = xt + + i = ilx - 1 + j = iux + 1 + + outer_dw: do + in_dw1: do + i = i + 1 + xk = abs(x(i)) + if (xk <= piv) exit in_dw1 + end do in_dw1 + ! + ! Ensure finite termination for next loop + ! + xt = x(i) + x(i) = piv + in_dw2:do + j = j - 1 + xk = abs(x(j)) + if (xk >= piv) exit in_dw2 + end do in_dw2 + x(i) = xt + + if (j > i) then + xt = x(i) + x(i) = x(j) + x(j) = xt + else + exit outer_dw + end if + end do outer_dw + if (i == ilx) then + if (x(i) /= piv) then + call psb_errpush(psb_err_internal_error_,& + & r_name='psi_i2qasr',a_err='impossible pivot condition') + call psb_error() + endif + i = i + 1 + endif + + n1 = (i-1)-ilx+1 + n2 = iux-(i)+1 + if (n1 > n2) then + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2aisr_dw(n1,x(ilx:i-1)) + endif + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2aisr_dw(n2,x(i:iux)) + endif + else + if (n2 > ithrs) then + istp = istp + 1 + istack(1,istp) = i + istack(2,istp) = iux + else + call psi_i2aisr_dw(n2,x(i:iux)) + endif + if (n1 > ithrs) then + istp = istp + 1 + istack(1,istp) = ilx + istack(2,istp) = i-1 + else + call psi_i2aisr_dw(n1,x(ilx:i-1)) + endif + endif + enddo + else + call psi_i2aisr_dw(n,x) + endif + +end subroutine psi_i2aqsr_dw + + diff --git a/base/serial/sort/psb_m_hsort_impl.f90 b/base/serial/sort/psb_m_hsort_impl.f90 index 5dc920823..743fe0381 100644 --- a/base/serial/sort/psb_m_hsort_impl.f90 +++ b/base/serial/sort/psb_m_hsort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,18 +41,19 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_mhsort(x,ix,dir,flag) +subroutine psb_mhsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_mhsort use psb_error_mod implicit none integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: flag_, n, i, err_act,info - integer(psb_ipk_) :: dir_, l + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_ipk_) :: n, i, l, dir_ integer(psb_mpk_) :: key integer(psb_ipk_) :: index + integer(psb_mpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -60,6 +61,13 @@ subroutine psb_mhsort(x,ix,dir,flag) name='psb_hsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -113,24 +121,57 @@ subroutine psb_mhsort(x,ix,dir,flag) ix(i) = i end do end if - l = 0 - do i=1, n - key = x(i) - index = ix(i) - call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) - if (l /= i) then - write(psb_err_unit,*) 'Mismatch while heapifying ! ' - end if - end do - do i=n, 2, -1 - call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) - if (l /= i-1) then - write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i - end if - x(i) = key - ix(i) = index - end do - else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + l = 0 do i=1, n key = x(i) diff --git a/base/serial/sort/psb_m_isort_impl.f90 b/base/serial/sort/psb_m_isort_impl.f90 index 1f373e425..3d2001dc0 100644 --- a/base/serial/sort/psb_m_isort_impl.f90 +++ b/base/serial/sort/psb_m_isort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -40,16 +40,17 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_misort(x,ix,dir,flag) +subroutine psb_misort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_misort use psb_error_mod implicit none integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ integer(psb_ipk_) :: n, i + integer(psb_mpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -57,6 +58,12 @@ subroutine psb_misort(x,ix,dir,flag) name='psb_misort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -90,31 +97,61 @@ subroutine psb_misort(x,ix,dir,flag) ix(i) = i end do end if - - select case(dir_) - case (psb_sort_up_) - call psi_misrx_up(n,x,ix) - case (psb_sort_down_) - call psi_misrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_misrx_up(n,x,ix) + case (psb_sort_down_) + call psi_misrx_dw(n,x,ix) + case (psb_asort_up_) call psi_maisrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_maisrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_misrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_misrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_maisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_maisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else select case(dir_) case (psb_sort_up_) call psi_misr_up(n,x) case (psb_sort_down_) call psi_misr_dw(n,x) case (psb_asort_up_) - call psi_maisr_up(n,x) + call psi_maisr_up(n,x) case (psb_asort_down_) - call psi_maisr_dw(n,x) + call psi_maisr_dw(n,x) case default ierr(1) = 3; ierr(2) = dir_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) diff --git a/base/serial/sort/psb_m_msort_impl.f90 b/base/serial/sort/psb_m_msort_impl.f90 index 437d10692..69de7cc6e 100644 --- a/base/serial/sort/psb_m_msort_impl.f90 +++ b/base/serial/sort/psb_m_msort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this - ! software without specific written permission. + ! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -131,16 +131,16 @@ subroutine psb_mmsort_u(x,nout,dir) return end subroutine psb_mmsort_u -subroutine psb_mmsort(x,ix,dir,flag) +subroutine psb_mmsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_mmsort use psb_error_mod use psb_ip_reord_mod implicit none integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, n, err_act + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ integer(psb_ipk_), allocatable :: iaux(:) integer(psb_ipk_) :: iret, info, i @@ -150,6 +150,11 @@ subroutine psb_mmsort(x,ix,dir,flag) name='psb_mmsort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(dir)) then dir_ = dir else @@ -212,15 +217,28 @@ subroutine psb_mmsort(x,ix,dir,flag) ! Do the actual reordering, since the inner routines ! only provide linked pointers. ! - if (iret == 0 ) then - if (present(ix)) then - call psb_ip_reord(n,x,ix,iaux) - else - call psb_ip_reord(n,x,iaux) - end if + if (iret == 0 ) then + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select end if - return 9999 call psb_error_handler(err_act) diff --git a/base/serial/sort/psb_m_qsort_impl.f90 b/base/serial/sort/psb_m_qsort_impl.f90 index 6b70c3a07..112f5db0d 100644 --- a/base/serial/sort/psb_m_qsort_impl.f90 +++ b/base/serial/sort/psb_m_qsort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -159,22 +159,29 @@ function psb_mssrch(key,n,v) result(ipos) return end function psb_mssrch -subroutine psb_mqsort(x,ix,dir,flag) +subroutine psb_mqsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_mqsort use psb_error_mod implicit none integer(psb_mpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act, i + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ integer(psb_ipk_) :: n + integer(psb_mpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name name='psb_mqsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(flag)) then flag_ = flag else @@ -209,21 +216,49 @@ subroutine psb_mqsort(x,ix,dir,flag) end do end if - select case(dir_) - case (psb_sort_up_) - call psi_mqsrx_up(n,x,ix) - case (psb_sort_down_) - call psi_mqsrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_mqsrx_up(n,x,ix) + case (psb_sort_down_) + call psi_mqsrx_dw(n,x,ix) + case (psb_asort_up_) call psi_maqsrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_maqsrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_mqsrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_mqsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_maqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_maqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else + select case(dir_) case (psb_sort_up_) call psi_mqsr_up(n,x) diff --git a/base/serial/sort/psb_s_hsort_impl.f90 b/base/serial/sort/psb_s_hsort_impl.f90 index 77fefe142..3e0a5a7f7 100644 --- a/base/serial/sort/psb_s_hsort_impl.f90 +++ b/base/serial/sort/psb_s_hsort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,18 +41,19 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_shsort(x,ix,dir,flag) +subroutine psb_shsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_shsort use psb_error_mod implicit none real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: flag_, n, i, err_act,info - integer(psb_ipk_) :: dir_, l + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_ipk_) :: n, i, l, dir_ real(psb_spk_) :: key integer(psb_ipk_) :: index + real(psb_spk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -60,6 +61,13 @@ subroutine psb_shsort(x,ix,dir,flag) name='psb_hsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -113,24 +121,57 @@ subroutine psb_shsort(x,ix,dir,flag) ix(i) = i end do end if - l = 0 - do i=1, n - key = x(i) - index = ix(i) - call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) - if (l /= i) then - write(psb_err_unit,*) 'Mismatch while heapifying ! ' - end if - end do - do i=n, 2, -1 - call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) - if (l /= i-1) then - write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i - end if - x(i) = key - ix(i) = index - end do - else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + l = 0 do i=1, n key = x(i) diff --git a/base/serial/sort/psb_s_isort_impl.f90 b/base/serial/sort/psb_s_isort_impl.f90 index cdcc05eb5..048ed943a 100644 --- a/base/serial/sort/psb_s_isort_impl.f90 +++ b/base/serial/sort/psb_s_isort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -40,16 +40,17 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_sisort(x,ix,dir,flag) +subroutine psb_sisort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_sisort use psb_error_mod implicit none real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ integer(psb_ipk_) :: n, i + real(psb_spk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -57,6 +58,12 @@ subroutine psb_sisort(x,ix,dir,flag) name='psb_sisort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -90,31 +97,61 @@ subroutine psb_sisort(x,ix,dir,flag) ix(i) = i end do end if - - select case(dir_) - case (psb_sort_up_) - call psi_sisrx_up(n,x,ix) - case (psb_sort_down_) - call psi_sisrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_sisrx_up(n,x,ix) + case (psb_sort_down_) + call psi_sisrx_dw(n,x,ix) + case (psb_asort_up_) call psi_saisrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_saisrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_sisrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_sisrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_saisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_saisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else select case(dir_) case (psb_sort_up_) call psi_sisr_up(n,x) case (psb_sort_down_) call psi_sisr_dw(n,x) case (psb_asort_up_) - call psi_saisr_up(n,x) + call psi_saisr_up(n,x) case (psb_asort_down_) - call psi_saisr_dw(n,x) + call psi_saisr_dw(n,x) case default ierr(1) = 3; ierr(2) = dir_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) diff --git a/base/serial/sort/psb_s_msort_impl.f90 b/base/serial/sort/psb_s_msort_impl.f90 index e3382f27b..a602cb34a 100644 --- a/base/serial/sort/psb_s_msort_impl.f90 +++ b/base/serial/sort/psb_s_msort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this - ! software without specific written permission. + ! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -76,16 +76,16 @@ subroutine psb_smsort_u(x,nout,dir) return end subroutine psb_smsort_u -subroutine psb_smsort(x,ix,dir,flag) +subroutine psb_smsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_smsort use psb_error_mod use psb_ip_reord_mod implicit none real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag, reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, n, err_act + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ integer(psb_ipk_), allocatable :: iaux(:) integer(psb_ipk_) :: iret, info, i @@ -95,6 +95,11 @@ subroutine psb_smsort(x,ix,dir,flag) name='psb_smsort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(dir)) then dir_ = dir else @@ -157,15 +162,28 @@ subroutine psb_smsort(x,ix,dir,flag) ! Do the actual reordering, since the inner routines ! only provide linked pointers. ! - if (iret == 0 ) then - if (present(ix)) then - call psb_ip_reord(n,x,ix,iaux) - else - call psb_ip_reord(n,x,iaux) - end if + if (iret == 0 ) then + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select end if - return 9999 call psb_error_handler(err_act) diff --git a/base/serial/sort/psb_s_qsort_impl.f90 b/base/serial/sort/psb_s_qsort_impl.f90 index cae325464..e0868ce4b 100644 --- a/base/serial/sort/psb_s_qsort_impl.f90 +++ b/base/serial/sort/psb_s_qsort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -159,22 +159,29 @@ function psb_sssrch(key,n,v) result(ipos) return end function psb_sssrch -subroutine psb_sqsort(x,ix,dir,flag) +subroutine psb_sqsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_sqsort use psb_error_mod implicit none real(psb_spk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act, i + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ integer(psb_ipk_) :: n + real(psb_spk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name name='psb_sqsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(flag)) then flag_ = flag else @@ -209,21 +216,49 @@ subroutine psb_sqsort(x,ix,dir,flag) end do end if - select case(dir_) - case (psb_sort_up_) - call psi_sqsrx_up(n,x,ix) - case (psb_sort_down_) - call psi_sqsrx_dw(n,x,ix) - case (psb_asort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_sort_up_) + call psi_sqsrx_up(n,x,ix) + case (psb_sort_down_) + call psi_sqsrx_dw(n,x,ix) + case (psb_asort_up_) call psi_saqsrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_saqsrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_sort_up_) + call psi_sqsrx_up(n,tx,ix) + case (psb_sort_down_) + call psi_sqsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_saqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_saqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else + select case(dir_) case (psb_sort_up_) call psi_sqsr_up(n,x) diff --git a/base/serial/sort/psb_z_hsort_impl.f90 b/base/serial/sort/psb_z_hsort_impl.f90 index e796f8310..018ede744 100644 --- a/base/serial/sort/psb_z_hsort_impl.f90 +++ b/base/serial/sort/psb_z_hsort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,18 +41,19 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_zhsort(x,ix,dir,flag) +subroutine psb_zhsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_zhsort use psb_error_mod implicit none complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: flag_, n, i, err_act,info - integer(psb_ipk_) :: dir_, l + integer(psb_ipk_) :: flag_, err_act, info, reord_ + integer(psb_ipk_) :: n, i, l, dir_ complex(psb_dpk_) :: key integer(psb_ipk_) :: index + complex(psb_dpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -60,6 +61,13 @@ subroutine psb_zhsort(x,ix,dir,flag) name='psb_hsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -113,24 +121,57 @@ subroutine psb_zhsort(x,ix,dir,flag) ix(i) = i end do end if - l = 0 - do i=1, n - key = x(i) - index = ix(i) - call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) - if (l /= i) then - write(psb_err_unit,*) 'Mismatch while heapifying ! ' - end if - end do - do i=n, 2, -1 - call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) - if (l /= i-1) then - write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i - end if - x(i) = key - ix(i) = index - end do - else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + + l = 0 + do i=1, n + key = x(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,x,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,x,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + x(i) = key + ix(i) = index + end do + case(psb_sort_noreord_x_) + tx = x + + l = 0 + do i=1, n + key = tx(i) + index = ix(i) + call psi_idx_insert_heap(key,index,l,tx,ix,dir_,info) + if (l /= i) then + write(psb_err_unit,*) 'Mismatch while heapifying ! ' + end if + end do + do i=n, 2, -1 + call psi_idx_heap_get_first(key,index,l,tx,ix,dir_,info) + if (l /= i-1) then + write(psb_err_unit,*) 'Mismatch while pulling out of heap ',l,i + end if + tx(i) = key + ix(i) = index + end do + end select + else if (.not.present(ix)) then + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + l = 0 do i=1, n key = x(i) diff --git a/base/serial/sort/psb_z_isort_impl.f90 b/base/serial/sort/psb_z_isort_impl.f90 index 340ed8e31..a7783925e 100644 --- a/base/serial/sort/psb_z_isort_impl.f90 +++ b/base/serial/sort/psb_z_isort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -40,16 +40,17 @@ ! Data Structures and Algorithms ! Addison-Wesley ! -subroutine psb_zisort(x,ix,dir,flag) +subroutine psb_zisort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_zisort use psb_error_mod implicit none complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act + integer(psb_ipk_) :: dir_, flag_, err_act, reord_ integer(psb_ipk_) :: n, i + complex(psb_dpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name @@ -57,6 +58,12 @@ subroutine psb_zisort(x,ix,dir,flag) name='psb_zisort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if + if (present(flag)) then flag_ = flag else @@ -90,39 +97,73 @@ subroutine psb_zisort(x,ix,dir,flag) ix(i) = i end do end if - - select case(dir_) - case (psb_lsort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_lsort_up_) call psi_zlisrx_up(n,x,ix) - case (psb_lsort_down_) + case (psb_lsort_down_) call psi_zlisrx_dw(n,x,ix) - case (psb_alsort_up_) + case (psb_alsort_up_) call psi_zalisrx_up(n,x,ix) - case (psb_alsort_down_) + case (psb_alsort_down_) call psi_zalisrx_dw(n,x,ix) - case (psb_asort_up_) + case (psb_asort_up_) call psi_zaisrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_zaisrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_lsort_up_) + call psi_zlisrx_up(n,tx,ix) + case (psb_lsort_down_) + call psi_zlisrx_dw(n,tx,ix) + case (psb_alsort_up_) + call psi_zalisrx_up(n,tx,ix) + case (psb_alsort_down_) + call psi_zalisrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_zaisrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_zaisrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else select case(dir_) case (psb_lsort_up_) - call psi_zlisr_up(n,x) + call psi_zlisr_up(n,x) case (psb_lsort_down_) - call psi_zlisr_dw(n,x) + call psi_zlisr_dw(n,x) case (psb_alsort_up_) - call psi_zalisr_up(n,x) + call psi_zalisr_up(n,x) case (psb_alsort_down_) - call psi_zalisr_dw(n,x) + call psi_zalisr_dw(n,x) case (psb_asort_up_) - call psi_zaisr_up(n,x) + call psi_zaisr_up(n,x) case (psb_asort_down_) - call psi_zaisr_dw(n,x) + call psi_zaisr_dw(n,x) case default ierr(1) = 3; ierr(2) = dir_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) diff --git a/base/serial/sort/psb_z_msort_impl.f90 b/base/serial/sort/psb_z_msort_impl.f90 index 525ed5725..6eb8babe8 100644 --- a/base/serial/sort/psb_z_msort_impl.f90 +++ b/base/serial/sort/psb_z_msort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this - ! software without specific written permission. + ! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -77,16 +77,16 @@ subroutine psb_zmsort_u(x,nout,dir) end subroutine psb_zmsort_u -subroutine psb_zmsort(x,ix,dir,flag) +subroutine psb_zmsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_zmsort use psb_error_mod use psb_ip_reord_mod implicit none complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, n, err_act + integer(psb_ipk_) :: dir_, flag_, n, err_act, reord_ integer(psb_ipk_), allocatable :: iaux(:) integer(psb_ipk_) :: iret, info, i @@ -96,6 +96,11 @@ subroutine psb_zmsort(x,ix,dir,flag) name='psb_zmsort' call psb_erractionsave(err_act) + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(dir)) then dir_ = dir else @@ -163,11 +168,25 @@ subroutine psb_zmsort(x,ix,dir,flag) ! only provide linked pointers. ! if (iret == 0 ) then - if (present(ix)) then - call psb_ip_reord(n,x,ix,iaux) - else - call psb_ip_reord(n,x,iaux) - end if + select case(reord_) + case(psb_sort_reord_x_) + if (present(ix)) then + call psb_ip_reord(n,x,ix,iaux) + else + call psb_ip_reord(n,x,iaux) + end if + case(psb_sort_noreord_x_) + if (present(ix)) then + call psb_ip_reord(n,ix,iaux) + else + call psb_errpush(psb_err_no_optional_arg_,name,a_err="ix") + goto 9999 + end if + case default + ierr(1) = 5; ierr(2) = reord_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select end if return diff --git a/base/serial/sort/psb_z_qsort_impl.f90 b/base/serial/sort/psb_z_qsort_impl.f90 index a1cdb1932..6b9a7ca54 100644 --- a/base/serial/sort/psb_z_qsort_impl.f90 +++ b/base/serial/sort/psb_z_qsort_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -41,22 +41,29 @@ ! Addison-Wesley ! -subroutine psb_zqsort(x,ix,dir,flag) +subroutine psb_zqsort(x,ix,dir,flag,reord) use psb_sort_mod, psb_protect_name => psb_zqsort use psb_error_mod implicit none complex(psb_dpk_), intent(inout) :: x(:) - integer(psb_ipk_), optional, intent(in) :: dir, flag + integer(psb_ipk_), optional, intent(in) :: dir, flag,reord integer(psb_ipk_), optional, intent(inout) :: ix(:) - integer(psb_ipk_) :: dir_, flag_, err_act, i + integer(psb_ipk_) :: dir_, flag_, err_act, i, reord_ integer(psb_ipk_) :: n + complex(psb_dpk_), allocatable :: tx(:) integer(psb_ipk_) :: ierr(5) character(len=20) :: name name='psb_zqsort' call psb_erractionsave(err_act) + + if (present(reord)) then + reord_ = reord + else + reord_= psb_sort_reord_x_ + end if if (present(flag)) then flag_ = flag else @@ -91,25 +98,57 @@ subroutine psb_zqsort(x,ix,dir,flag) end do end if - select case(dir_) - case (psb_lsort_up_) + select case(reord_) + case (psb_sort_reord_x_) + select case(dir_) + case (psb_lsort_up_) call psi_zlqsrx_up(n,x,ix) - case (psb_lsort_down_) + case (psb_lsort_down_) call psi_zlqsrx_dw(n,x,ix) - case (psb_alsort_up_) + case (psb_alsort_up_) call psi_zalqsrx_up(n,x,ix) - case (psb_alsort_down_) + case (psb_alsort_down_) call psi_zalqsrx_dw(n,x,ix) - case (psb_asort_up_) + case (psb_asort_up_) call psi_zaqsrx_up(n,x,ix) - case (psb_asort_down_) + case (psb_asort_down_) call psi_zaqsrx_dw(n,x,ix) - case default - ierr(1) = 3; ierr(2) = dir_; + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + case(psb_sort_noreord_x_) + tx = x + select case(dir_) + case (psb_lsort_up_) + call psi_zlqsrx_up(n,tx,ix) + case (psb_lsort_down_) + call psi_zlqsrx_dw(n,tx,ix) + case (psb_alsort_up_) + call psi_zalqsrx_up(n,tx,ix) + case (psb_alsort_down_) + call psi_zalqsrx_dw(n,tx,ix) + case (psb_asort_up_) + call psi_zaqsrx_up(n,tx,ix) + case (psb_asort_down_) + call psi_zaqsrx_dw(n,tx,ix) + case default + ierr(1) = 3; ierr(2) = dir_; + call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) + goto 9999 + end select + end select + else + select case(reord_) + case (psb_sort_reord_x_) + !OK + case default + ierr(1) = 5; ierr(2) = reord_; call psb_errpush(psb_err_input_value_invalid_i_,name,i_err=ierr) goto 9999 end select - else + select case(dir_) case (psb_lsort_up_) call psi_zlqsr_up(n,x) diff --git a/base/tools/Makefile b/base/tools/Makefile index 771e85fc4..1cd67af5b 100644 --- a/base/tools/Makefile +++ b/base/tools/Makefile @@ -14,6 +14,7 @@ FOBJS = psb_cdall.o psb_cdals.o psb_cdalv.o psb_cd_inloc.o psb_cdins.o psb_cdprt psb_dallc.o psb_dasb.o psb_dfree.o psb_dins.o \ psb_callc.o psb_casb.o psb_cfree.o psb_cins.o \ psb_zallc.o psb_zasb.o psb_zfree.o psb_zins.o \ + psb_i2allc_a.o psb_i2asb_a.o psb_i2free_a.o psb_i2ins_a.o \ psb_mallc_a.o psb_masb_a.o psb_mfree_a.o psb_mins_a.o \ psb_eallc_a.o psb_easb_a.o psb_efree_a.o psb_eins_a.o \ psb_sallc_a.o psb_sasb_a.o psb_sfree_a.o psb_sins_a.o \ @@ -33,7 +34,7 @@ MPFOBJS = psb_icdasb.o psb_ssphalo.o psb_dsphalo.o psb_csphalo.o psb_zsphalo.o psb_dcdbldext.o psb_zcdbldext.o psb_scdbldext.o psb_ccdbldext.o \ psb_s_remote_mat.o psb_d_remote_mat.o psb_c_remote_mat.o psb_z_remote_mat.o \ psb_s_remote_vect.o psb_d_remote_vect.o psb_c_remote_vect.o psb_z_remote_vect.o \ - psb_e_remote_vect.o psb_m_remote_vect.o + psb_e_remote_vect.o psb_m_remote_vect.o psb_i2_remote_vect.o LIBDIR=.. INCDIR=.. diff --git a/base/tools/psb_c_glob_transpose.F90 b/base/tools/psb_c_glob_transpose.F90 index 37a4e1001..9285c18a0 100644 --- a/base/tools/psb_c_glob_transpose.F90 +++ b/base/tools/psb_c_glob_transpose.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -139,7 +139,7 @@ subroutine psb_lc_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx) debug_level = psb_get_debug_level() ctxt = desc_r%get_context() - icomm = desc_r%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -437,7 +437,7 @@ subroutine psb_c_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx) debug_level = psb_get_debug_level() ctxt = desc_r%get_context() - icomm = desc_r%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) diff --git a/base/tools/psb_c_map.f90 b/base/tools/psb_c_map.f90 index 1cfb92723..6d11a7c94 100644 --- a/base/tools/psb_c_map.f90 +++ b/base/tools/psb_c_map.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -112,23 +112,22 @@ subroutine psb_c_map_U2V_a(alpha,x,beta,y,map,info,work) end subroutine psb_c_map_U2V_a -subroutine psb_c_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) +subroutine psb_c_map_U2V_v(alpha,x,beta,y,map,info,vtx,vty) use psb_base_mod, psb_protect_name => psb_c_map_U2V_v implicit none - class(psb_clinmap_type), intent(in) :: map - complex(psb_spk_), intent(in) :: alpha,beta - type(psb_c_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), optional :: work(:) + class(psb_clinmap_type), intent(in) :: map + complex(psb_spk_), intent(in) :: alpha,beta + type(psb_c_vect_type), intent(inout) :: x,y + integer(psb_ipk_), intent(out) :: info type(psb_c_vect_type), optional, target, intent(inout) :: vtx,vty ! Local - type(psb_c_vect_type), target :: xt, yt - type(psb_c_vect_type),pointer :: ptx, pty - complex(psb_spk_), allocatable :: xta(:), yta(:) - integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2 ,& + type(psb_c_vect_type), target :: xt, yt + type(psb_c_vect_type),pointer :: ptx, pty + complex(psb_spk_), allocatable :: xta(:), yta(:) + integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2 ,& & map_kind, nr, iam, np - type(psb_ctxt_type) :: ctxt - character(len=20), parameter :: name='psb_map_U2V_v' + type(psb_ctxt_type) :: ctxt + character(len=20), parameter :: name = 'psb_map_U2V_v' info = psb_success_ if (.not.map%is_asb()) then @@ -152,7 +151,7 @@ subroutine psb_c_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) call psb_geasb(yt,map%p_desc_V,info,scratch=.true.,mold=x%v) pty => yt end if - if (info == psb_success_) call psb_halo(x,map%p_desc_U,info,work=work) + if (info == psb_success_) call psb_halo(x,map%p_desc_U,info) if (info == psb_success_) call psb_csmm(cone,map%mat_U2V,x,czero,pty,info) if ((info == psb_success_) .and. map%p_desc_V%is_repl().and.(np>1)) then yta = pty%get_vect() @@ -186,7 +185,7 @@ subroutine psb_c_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) end if call psb_geaxpby(cone,x,czero,ptx,map%desc_U,info) - if (info == psb_success_) call psb_halo(ptx,map%desc_U,info,work=work) + if (info == psb_success_) call psb_halo(ptx,map%desc_U,info) if (info == psb_success_) call psb_csmm(cone,map%mat_U2V,ptx,czero,pty,info) if ((info == psb_success_) .and. map%desc_V%is_repl().and.(np>1)) then yta = pty%get_vect() @@ -294,23 +293,22 @@ subroutine psb_c_map_V2U_a(alpha,x,beta,y,map,info,work) end subroutine psb_c_map_V2U_a -subroutine psb_c_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) +subroutine psb_c_map_V2U_v(alpha,x,beta,y,map,info,vtx,vty) use psb_base_mod, psb_protect_name => psb_c_map_V2U_v implicit none - class(psb_clinmap_type), intent(in) :: map - complex(psb_spk_), intent(in) :: alpha,beta - type(psb_c_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - complex(psb_spk_), optional :: work(:) + class(psb_clinmap_type), intent(in) :: map + complex(psb_spk_), intent(in) :: alpha,beta + type(psb_c_vect_type), intent(inout) :: x,y + integer(psb_ipk_), intent(out) :: info type(psb_c_vect_type), optional, target, intent(inout) :: vtx,vty ! Local - type(psb_c_vect_type), target :: xt, yt - type(psb_c_vect_type),pointer :: ptx, pty - complex(psb_spk_), allocatable :: xta(:), yta(:) - integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2,& + type(psb_c_vect_type), target :: xt, yt + type(psb_c_vect_type),pointer :: ptx, pty + complex(psb_spk_), allocatable :: xta(:), yta(:) + integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2,& & map_kind, nr, iam, np - type(psb_ctxt_type) :: ctxt - character(len=20), parameter :: name='psb_map_V2U_v' + type(psb_ctxt_type) :: ctxt + character(len=20), parameter :: name = 'psb_map_V2U_v' info = psb_success_ if (.not.map%is_asb()) then @@ -334,7 +332,7 @@ subroutine psb_c_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) call psb_geasb(yt,map%p_desc_U,info,scratch=.true.,mold=x%v) pty => yt end if - if (info == psb_success_) call psb_halo(x,map%p_desc_V,info,work=work) + if (info == psb_success_) call psb_halo(x,map%p_desc_V,info) if (info == psb_success_) call psb_csmm(cone,map%mat_V2U,x,czero,pty,info) if ((info == psb_success_) .and. map%p_desc_U%is_repl().and.(np>1)) then yta = pty%get_vect() @@ -369,7 +367,7 @@ subroutine psb_c_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) call psb_geaxpby(cone,x,czero,ptx,map%desc_V,info) - if (info == psb_success_) call psb_halo(ptx,map%desc_V,info,work=work) + if (info == psb_success_) call psb_halo(ptx,map%desc_V,info) if (info == psb_success_) call psb_csmm(cone,map%mat_V2U,ptx,czero,pty,info) if ((info == psb_success_) .and. map%desc_U%is_repl().and.(np>1)) then yta = pty%get_vect() diff --git a/base/tools/psb_c_par_csr_spspmm.f90 b/base/tools/psb_c_par_csr_spspmm.f90 index 2dbd00f0d..de14df0c3 100644 --- a/base/tools/psb_c_par_csr_spspmm.f90 +++ b/base/tools/psb_c_par_csr_spspmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -66,7 +66,8 @@ Subroutine psb_c_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_c_tools_mod, psb_protect_name => psb_c_par_csr_spspmm - use psb_c_serial_mod, only : psb_ccsrspspmm, psb_cbase_rwextd + use psb_c_csr_mat_mod, only : psb_ccsrspspmm + use psb_c_serial_mod, only : psb_cbase_rwextd Implicit None type(psb_c_csr_sparse_mat),intent(in) :: acsr @@ -166,7 +167,8 @@ Subroutine psb_lc_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_c_tools_mod, psb_protect_name => psb_lc_par_csr_spspmm - use psb_c_serial_mod, only : psb_lccsrspspmm, psb_lcbase_rwextd + use psb_c_csr_mat_mod, only : psb_lccsrspspmm + use psb_c_serial_mod, only : psb_lcbase_rwextd Implicit None type(psb_lc_csr_sparse_mat),intent(in) :: acsr diff --git a/base/tools/psb_c_remap.F90 b/base/tools/psb_c_remap.F90 index ccab6c928..9b40dd29c 100644 --- a/base/tools/psb_c_remap.F90 +++ b/base/tools/psb_c_remap.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_c_remote_mat.F90 b/base/tools/psb_c_remote_mat.F90 index bb40edf3e..ecfac5098 100644 --- a/base/tools/psb_c_remote_mat.F90 +++ b/base/tools/psb_c_remote_mat.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -118,7 +118,7 @@ Subroutine psb_lc_remote_mat(a,desc_a,b,info) debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -150,7 +150,7 @@ Subroutine psb_lc_remote_mat(a,desc_a,b,info) call desc_a%indxmap%fnd_owner(a%ia(1:nz),iprc,info) - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() sdsz(:)=0 rvsz(:)=0 sdsi(:)=0 diff --git a/base/tools/psb_c_remote_vect.F90 b/base/tools/psb_c_remote_vect.F90 index 5cacd9a39..00e7415ae 100644 --- a/base/tools/psb_c_remote_vect.F90 +++ b/base/tools/psb_c_remote_vect.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -105,7 +105,7 @@ subroutine psb_c_remote_vect(n,v,iv,desc_a,x,ix, info) debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -123,7 +123,7 @@ subroutine psb_c_remote_vect(n,v,iv,desc_a,x,ix, info) call desc_a%indxmap%fnd_owner(iv(1:n),iprc,info) - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() sdsz(:) = 0 rvsz(:) = 0 sdsi(:) = 0 diff --git a/base/tools/psb_callc.f90 b/base/tools/psb_callc.f90 index 82348a785..f0d8f4203 100644 --- a/base/tools/psb_callc.f90 +++ b/base/tools/psb_callc.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -53,7 +53,7 @@ subroutine psb_calloc_vect(x, desc_a,info, dupl, bldmode) !locals integer(psb_ipk_) :: np,me,nr,i,err_act - integer(psb_ipk_) :: dupl_, bldmode_, nrmt_ + integer(psb_ipk_) :: bldmode_, nrmt_ type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name @@ -95,8 +95,7 @@ subroutine psb_calloc_vect(x, desc_a,info, dupl, bldmode) goto 9999 endif - allocate(psb_c_base_vect_type :: x%v, stat=info) - if (info == 0) call x%all(nr,info) + call x%all(nr,info) if (psb_errstatus_fatal()) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/nr/),a_err='real(psb_spk_)') @@ -109,12 +108,12 @@ subroutine psb_calloc_vect(x, desc_a,info, dupl, bldmode) else bldmode_ = psb_matbld_noremote_ end if + call x%set_bld() if (present(dupl)) then - dupl_ = dupl + call x%set_dupl(dupl) else - dupl_ = psb_dupl_def_ - end if - call x%set_dupl(dupl_) + call x%set_dupl(psb_dupl_def_) + end if call x%set_remote_build(bldmode_) call x%set_nrmv(izero) if (x%is_remote_build()) then @@ -210,48 +209,11 @@ subroutine psb_calloc_vect_r2(x, desc_a,info,n,lb, dupl, bldmode) goto 9999 endif endif - ! As this is a rank-1 array, optional parameter N is actually ignored. - - !....allocate x ..... - if (desc_a%is_asb().or.desc_a%is_upd()) then - nr = max(1,desc_a%get_local_cols()) - else if (desc_a%is_bld()) then - nr = max(1,desc_a%get_local_rows()) - else - info = psb_err_internal_error_ - call psb_errpush(info,name,a_err='Invalid desc_a') - goto 9999 - endif - allocate(x(lb_:lb_+n_-1), stat=info) - if (info == 0) then - do i=lb_, lb_+n_-1 - allocate(psb_c_base_vect_type :: x(i)%v, stat=info) - if (info == 0) call x(i)%all(nr,info) - if (info == 0) call x(i)%zero() - if (info /= 0) exit - end do - end if - - if (present(bldmode)) then - bldmode_ = bldmode - else - bldmode_ = psb_matbld_noremote_ - end if - if (present(dupl)) then - dupl_ = dupl - else - dupl_ = psb_dupl_def_ - end if - do i=lb_, lb_+n_-1 - call x(i)%set_dupl(dupl_) - call x(i)%set_remote_build(bldmode_) - if (x(i)%is_remote_build()) then - nrmt_ = max(100,(desc_a%get_local_cols()-desc_a%get_local_rows())) - allocate(x(i)%rmtv(nrmt_)) - end if + call psb_geall(x(i),desc_a,info,dupl, bldmode) end do + if (psb_errstatus_fatal()) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/nr/),a_err='real(psb_spk_)') @@ -264,7 +226,6 @@ subroutine psb_calloc_vect_r2(x, desc_a,info,n,lb, dupl, bldmode) 9999 call psb_error_handler(ctxt,err_act) return - end subroutine psb_calloc_vect_r2 diff --git a/base/tools/psb_callc_a.f90 b/base/tools/psb_callc_a.f90 index 5ae9dac5d..806f809d1 100644 --- a/base/tools/psb_callc_a.f90 +++ b/base/tools/psb_callc_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -147,7 +147,7 @@ end subroutine psb_calloc !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_casb.f90 b/base/tools/psb_casb.f90 index 83e2715bf..c72a43d3d 100644 --- a/base/tools/psb_casb.f90 +++ b/base/tools/psb_casb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! scratch - logical, optional If true, allocate without checking/zeroing contents. ! default: .false. ! -subroutine psb_casb_vect(x, desc_a, info, mold, scratch) +subroutine psb_casb_vect(x, desc_a, info, mold, scratch, dupl) use psb_base_mod, psb_protect_name => psb_casb_vect implicit none @@ -60,6 +60,7 @@ subroutine psb_casb_vect(x, desc_a, info, mold, scratch) integer(psb_ipk_), intent(out) :: info class(psb_c_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl ! local variables type(psb_ctxt_type) :: ctxt @@ -80,10 +81,9 @@ subroutine psb_casb_vect(x, desc_a, info, mold, scratch) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - scratch_ = .false. + scratch_ = .false. if (present(scratch)) scratch_ = scratch call psb_info(ctxt, me, np) - dupl_ = x%get_dupl() ! ....verify blacs grid correctness.. if (np == -1) then info = psb_err_context_error_ @@ -100,39 +100,83 @@ subroutine psb_casb_vect(x, desc_a, info, mold, scratch) if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),': sizes: ',nrow,ncol - if (scratch_) then - call x%free(info) - call x%bld(ncol,mold=mold) + dupl_ = x%get_dupl() + if (try_newins) then + if (scratch_) then + call x%free(info) + call x%bld(ncol,mold=mold,scratch=scratch_) + else + if (x%is_bld().and.present(dupl)) then + call x%set_dupl(dupl) + dupl_ = dupl + end if + + if (x%is_remote_build()) then + block + integer(psb_lpk_), allocatable :: lvx(:) + complex(psb_spk_), allocatable :: vx(:) + integer(psb_ipk_), allocatable :: ivx(:) + integer(psb_ipk_) :: nrmv, nx, i + + nrmv = x%get_nrmv() + call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) + nx = size(vx) + call psb_realloc(nx,ivx,info) + call desc_a%g2l(lvx,ivx,info,owned=.true.) + call x%ins(nx,ivx,vx,nrow,info) + end block + end if + + call x%asb(ncol,info,scratch=scratch) + ! ..update halo elements.. + call psb_halo(x,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_halo') + goto 9999 + end if + call x%cnv(mold) + end if + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': end' else - if (x%is_remote_build()) then - block - integer(psb_lpk_), allocatable :: lvx(:) - complex(psb_spk_), allocatable :: vx(:) - integer(psb_ipk_), allocatable :: ivx(:) - integer(psb_ipk_) :: nrmv, nx, i - - nrmv = x%get_nrmv() - call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) - nx = size(vx) - call psb_realloc(nx,ivx,info) - call desc_a%g2l(lvx,ivx,info,owned=.true.) - call x%ins(nx,ivx,vx,info) - end block - end if - - call x%asb(ncol,info) - ! ..update halo elements.. - call psb_halo(x,desc_a,info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='psb_halo') - goto 9999 + if (scratch_) then + call x%free(info) + call x%bld(ncol,mold=mold) + else + if (x%is_bld().and.present(dupl)) then + dupl_ = dupl + end if + if (x%is_remote_build()) then + block + integer(psb_lpk_), allocatable :: lvx(:) + complex(psb_spk_), allocatable :: vx(:) + integer(psb_ipk_), allocatable :: ivx(:) + integer(psb_ipk_) :: nrmv, nx, i + + nrmv = x%get_nrmv() + call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) + nx = size(vx) + call psb_realloc(nx,ivx,info) + call desc_a%g2l(lvx,ivx,info,owned=.true.) + call x%ins(nx,ivx,vx,nrow,info) + end block + end if + + call x%asb(ncol,info,scratch=scratch) + ! ..update halo elements.. + call psb_halo(x,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_halo') + goto 9999 + end if + call x%cnv(mold) end if - call x%cnv(mold) + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': end' end if - if (debug_level >= psb_debug_ext_) & - & write(debug_unit,*) me,' ',trim(name),': end' call psb_erractionrestore(err_act) return @@ -144,7 +188,7 @@ subroutine psb_casb_vect(x, desc_a, info, mold, scratch) end subroutine psb_casb_vect -subroutine psb_casb_vect_r2(x, desc_a, info, mold, scratch) +subroutine psb_casb_vect_r2(x, desc_a, info, mold, scratch,dupl) use psb_base_mod, psb_protect_name => psb_casb_vect_r2 implicit none @@ -153,12 +197,12 @@ subroutine psb_casb_vect_r2(x, desc_a, info, mold, scratch) integer(psb_ipk_), intent(out) :: info class(psb_c_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl ! local variables type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me, i, n - integer(psb_ipk_) :: i1sz,nrow,ncol, err_act, dupl_ - logical :: scratch_ + integer(psb_ipk_) :: err_act integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name,ch_err @@ -173,8 +217,6 @@ subroutine psb_casb_vect_r2(x, desc_a, info, mold, scratch) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - scratch_ = .false. - if (present(scratch)) scratch_ = scratch call psb_info(ctxt, me, np) ! ....verify blacs grid correctness.. if (np == -1) then @@ -186,35 +228,11 @@ subroutine psb_casb_vect_r2(x, desc_a, info, mold, scratch) call psb_errpush(info,name) goto 9999 end if - - nrow = desc_a%get_local_rows() - ncol = desc_a%get_local_cols() n = size(x) - if (debug_level >= psb_debug_ext_) & - & write(debug_unit,*) me,' ',trim(name),': sizes: ',nrow,ncol + do i=1, n + call psb_geasb(x(i),desc_a,info, mold, scratch, dupl) + end do - if (scratch_) then - do i=1,n - call x(i)%free(info) - call x(i)%bld(ncol,mold=mold) - end do - - else - do i=1, n - dupl_ = x(i)%get_dupl() - call x(i)%asb(ncol,info) - if (info /= 0) exit - ! ..update halo elements.. - call psb_halo(x(i),desc_a,info) - if (info /= 0) exit - call x(i)%cnv(mold) - end do - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='psb_halo') - goto 9999 - end if - end if if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),': end' @@ -291,7 +309,7 @@ subroutine psb_casb_multivect(x, desc_a, info, mold, scratch,n) dupl_ = x%get_dupl() if (scratch_) then call x%free(info) - call x%bld(ncol,n_,mold=mold) + call x%bld(ncol,n_,mold=mold,scratch=.true.) else call x%asb(ncol,n_,info) ! ..update halo elements.. diff --git a/base/tools/psb_casb_a.f90 b/base/tools/psb_casb_a.f90 index db7b23c8b..9fa846d87 100644 --- a/base/tools/psb_casb_a.f90 +++ b/base/tools/psb_casb_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -153,7 +153,7 @@ end subroutine psb_casb !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_ccdbldext.F90 b/base/tools/psb_ccdbldext.F90 index 1e7d630e5..4f20bad67 100644 --- a/base/tools/psb_ccdbldext.F90 +++ b/base/tools/psb_ccdbldext.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -117,7 +117,7 @@ Subroutine psb_ccdbldext(a,desc_a,novr,desc_ov,info, extype) goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) If (debug_level >= psb_debug_outer_) & diff --git a/base/tools/psb_cd_inloc.f90 b/base/tools/psb_cd_inloc.f90 index 4d0ff7f6d..808a96c6b 100644 --- a/base/tools/psb_cd_inloc.f90 +++ b/base/tools/psb_cd_inloc.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cd_lstext.f90 b/base/tools/psb_cd_lstext.f90 index f96abd9c5..650960911 100644 --- a/base/tools/psb_cd_lstext.f90 +++ b/base/tools/psb_cd_lstext.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cd_reinit.f90 b/base/tools/psb_cd_reinit.f90 index d294cfc0e..ef50de31b 100644 --- a/base/tools/psb_cd_reinit.f90 +++ b/base/tools/psb_cd_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -57,7 +57,7 @@ Subroutine psb_cd_reinit(desc,info) debug_level = psb_get_debug_level() ctxt = desc%get_context() - icomm = desc%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) if (debug_level >= psb_debug_outer_) & & write(debug_unit,*) me,' ',trim(name),': start' diff --git a/base/tools/psb_cd_remap.F90 b/base/tools/psb_cd_remap.F90 index 882af13d7..bfc4dd79d 100644 --- a/base/tools/psb_cd_remap.F90 +++ b/base/tools/psb_cd_remap.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cd_renum_block.F90 b/base/tools/psb_cd_renum_block.F90 index e78e90797..6a2384924 100644 --- a/base/tools/psb_cd_renum_block.F90 +++ b/base/tools/psb_cd_renum_block.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cd_set_bld.f90 b/base/tools/psb_cd_set_bld.f90 index ecce17f94..30e9378da 100644 --- a/base/tools/psb_cd_set_bld.f90 +++ b/base/tools/psb_cd_set_bld.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cd_switch_ovl_indxmap.f90 b/base/tools/psb_cd_switch_ovl_indxmap.f90 index 10ce794ea..1b31ab0d4 100644 --- a/base/tools/psb_cd_switch_ovl_indxmap.f90 +++ b/base/tools/psb_cd_switch_ovl_indxmap.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cdall.f90 b/base/tools/psb_cdall.f90 index e9ffdaf8e..7deaba6c1 100644 --- a/base/tools/psb_cdall.f90 +++ b/base/tools/psb_cdall.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cdals.f90 b/base/tools/psb_cdals.f90 index 92ad3e94c..0124d01fb 100644 --- a/base/tools/psb_cdals.f90 +++ b/base/tools/psb_cdals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -175,7 +175,7 @@ subroutine psb_cdals(m, n, parts, ctxt, desc, info) if (info == psb_success_) then call parts(iglob,m,np,prc_v,nprocs) if (nprocs > np) then - info=psb_err_partfunc_toomuchprocs_ + info=psb_err_partfunc_toomanyprocs_ call psb_errpush(info,name,l_err=(/3_psb_lpk_,np*lone,nprocs*lone,iglob/)) goto 9999 else if (nprocs <= 0) then diff --git a/base/tools/psb_cdalv.f90 b/base/tools/psb_cdalv.f90 index 2f740dc87..d1cb951ed 100644 --- a/base/tools/psb_cdalv.f90 +++ b/base/tools/psb_cdalv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cdcpy.F90 b/base/tools/psb_cdcpy.F90 index d44c0c95d..4ba714629 100644 --- a/base/tools/psb_cdcpy.F90 +++ b/base/tools/psb_cdcpy.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cdins.F90 b/base/tools/psb_cdins.F90 index d29aeef86..42583951b 100644 --- a/base/tools/psb_cdins.F90 +++ b/base/tools/psb_cdins.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cdprt.f90 b/base/tools/psb_cdprt.f90 index 1e14ed640..5f1793484 100644 --- a/base/tools/psb_cdprt.f90 +++ b/base/tools/psb_cdprt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -169,7 +169,7 @@ contains else data_ = psb_comm_halo_ end if - call psb_cd_v_get_list(data_,desc_p,vpnt,totxch,idxr,idxs,info) + call desc_p%get_list_p(data_,vpnt,totxch,idxr,idxs,info) res = totxch end function get_nxchg @@ -201,7 +201,7 @@ contains verb_ = 1 end if - call psb_cd_v_get_list(data_,desc_p,vpnt,totxch,idxr,idxs,info) + call desc_p%get_list_p(data_,vpnt,totxch,idxr,idxs,info) if (glob) & & call psb_realloc(max(idxr,idxs,1),gidx,info) diff --git a/base/tools/psb_cdren.f90 b/base/tools/psb_cdren.f90 index f80c21baa..d0e67fd62 100644 --- a/base/tools/psb_cdren.f90 +++ b/base/tools/psb_cdren.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cdrep.f90 b/base/tools/psb_cdrep.f90 index b6f6bfb73..46cf95d8a 100644 --- a/base/tools/psb_cdrep.f90 +++ b/base/tools/psb_cdrep.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cfree.f90 b/base/tools/psb_cfree.f90 index 54c728f59..524cdbe6b 100644 --- a/base/tools/psb_cfree.f90 +++ b/base/tools/psb_cfree.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cfree_a.f90 b/base/tools/psb_cfree_a.f90 index a8746071a..85fa57c32 100644 --- a/base/tools/psb_cfree_a.f90 +++ b/base/tools/psb_cfree_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cgetelem.f90 b/base/tools/psb_cgetelem.f90 index 3c4151c9f..952ae251a 100644 --- a/base/tools/psb_cgetelem.f90 +++ b/base/tools/psb_cgetelem.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -108,3 +108,92 @@ function psb_c_getelem(x,index,desc_a,info) result(res) end function +! Function: psb_c_getmatelem +! Extract entries from a sparse matrix. Note: the row and column indices in index +! are assumed to be in global numbering and are converted on the fly. +! +! Arguments: +! a - type(psb_cspmat_type) The source matrix +! desc_a - type(psb_desc_type). The communication descriptor. +! rowindex - integer. Row index of x of the value to extract +! colindex - integer. Column index of x of the value to extract +! iam - integer. Index of the process requesting the value +! info - integer. return code + + +function psb_c_getmatelem(a,rowindex,colindex,desc_a,info) result(res) + use psb_base_mod, psb_protect_name => psb_c_getmatelem + use psi_mod + implicit none + + type(psb_cspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a + integer(psb_lpk_), intent(in) :: rowindex, colindex + integer(psb_ipk_), intent(out) :: info + complex(psb_spk_) :: res + + !locals + integer(psb_ipk_) :: localrowindex(1), localcolindex(1), jmin, jmax, imin, imax + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act + integer(psb_lpk_) :: growindex(1), gcolindex(1) + integer(psb_lpk_), allocatable :: myidx(:),mylocal(:) + integer(psb_ipk_), allocatable, dimension(:) :: ia, ja + integer(psb_ipk_) :: nz + complex(psb_spk_), allocatable, dimension(:) :: val + character(len=20) :: name + logical, parameter :: debug = .false. + + growindex(1) = rowindex + gcolindex(1) = colindex + res = czero + if (psb_errstatus_fatal()) return + info=psb_success_ + call psb_erractionsave(err_act) + name = 'psb_c_getmatelem' + + if (.not.desc_a%is_ok()) then + info = psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + end if + + ctxt = desc_a%get_context() + + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + call desc_a%indxmap%g2l(growindex,localrowindex,info,owned=.false.) + call desc_a%indxmap%g2l(gcolindex,localcolindex,info,owned=.false.) + imin = localrowindex(1) + imax = localrowindex(1) + jmin = localcolindex(1) + jmax = localcolindex(1) + if(debug.and.(localrowindex(1) < 1 .or. localcolindex(1) < 1)) then + write(*,*)"Process ",me," owns ",desc_a%get_local_rows()," rows"," Global row index is ", & + growindex,"Local row index is ",localrowindex + write(*,*)"Process ",me," owns ",desc_a%get_local_cols()," cols"," Global col index is ", & + gcolindex,"Local col index is ",localcolindex + myidx = desc_a%get_global_indices(owned=.false.) + mylocal = desc_a%get_global_indices(owned=.true.) + write(*,*)"My (local+halo) indexes are: ",myidx + write(*,*)"My (local) indexes are: ",mylocal + end if + if ( localrowindex(1) < 1 .or. localcolindex(1) < 1) then + res = czero + else + call a%csget(imin, imax, nz, ia, ja, val, info, jmin=jmin, jmax=jmax) + res = val(1) + end if + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + +end function diff --git a/base/tools/psb_cins.f90 b/base/tools/psb_cins.f90 index 180520a38..be0655d49 100644 --- a/base/tools/psb_cins.f90 +++ b/base/tools/psb_cins.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -57,7 +57,7 @@ subroutine psb_cins_vect(m, irw, val, x, desc_a, info, local) logical, intent(in), optional :: local !locals..... - integer(psb_ipk_) :: i, loc_rows,loc_cols + integer(psb_ipk_) :: i, loc_rows, loc_cols integer(psb_lpk_) :: mglob integer(psb_ipk_) :: dupl_ type(psb_ctxt_type) :: ctxt @@ -127,7 +127,7 @@ subroutine psb_cins_vect(m, irw, val, x, desc_a, info, local) else call desc_a%indxmap%g2l(irw(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,val,info) + call x%ins(m,irl,val,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 @@ -198,7 +198,7 @@ subroutine psb_cins_vect_v(m, irw, val, x, desc_a, info, local) logical, intent(in), optional :: local !locals..... - integer(psb_ipk_) :: i, loc_rows,loc_cols,err_act + integer(psb_ipk_) :: i, loc_rows, loc_cols, err_act integer(psb_lpk_) :: mglob type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me @@ -261,7 +261,7 @@ subroutine psb_cins_vect_v(m, irw, val, x, desc_a, info, local) call desc_a%indxmap%g2l(irw%v%v(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,lval,info) + call x%ins(m,irl,lval,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 @@ -368,7 +368,7 @@ subroutine psb_cins_vect_r2(m, irw, val, x, desc_a, info, local) do i=1,n if (.not.allocated(x(i)%v)) info = psb_err_invalid_vect_state_ - if (info == 0) call x(i)%ins(m,irl,val(:,i),info) + if (info == 0) call x(i)%ins(m,irl,val(:,i),loc_rows,info) if (info /= 0) exit end do if (info /= 0) then @@ -475,7 +475,7 @@ subroutine psb_cins_multivect(m, irw, val, x, desc_a, info, local) else call desc_a%indxmap%g2l(irw(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,val,info) + call x%ins(m,irl,val,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 diff --git a/base/tools/psb_cins_a.f90 b/base/tools/psb_cins_a.f90 index 688d06e9f..bcd9e572f 100644 --- a/base/tools/psb_cins_a.f90 +++ b/base/tools/psb_cins_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -195,7 +195,7 @@ end subroutine psb_cinsvi !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cspalloc.f90 b/base/tools/psb_cspalloc.f90 index 7bec040c3..afa2170ad 100644 --- a/base/tools/psb_cspalloc.f90 +++ b/base/tools/psb_cspalloc.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_cspasb.f90 b/base/tools/psb_cspasb.f90 index db8af75a7..ac229b12c 100644 --- a/base/tools/psb_cspasb.f90 +++ b/base/tools/psb_cspasb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,7 +44,7 @@ ! psb_upd_perm_ Permutation(more memory) ! ! -subroutine psb_cspasb(a,desc_a, info, afmt, upd, mold, bld_and) +subroutine psb_cspasb(a,desc_a, info, afmt, upd, mold, dupl, bld_and) use psb_base_mod, psb_protect_name => psb_cspasb use psb_sort_mod use psi_mod @@ -59,6 +59,7 @@ subroutine psb_cspasb(a,desc_a, info, afmt, upd, mold, bld_and) character(len=*), optional, intent(in) :: afmt class(psb_c_base_sparse_mat), intent(in), optional :: mold logical, intent(in), optional :: bld_and + integer(psb_ipk_), optional, intent(in) :: dupl !....Locals.... type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me, err_act @@ -103,7 +104,12 @@ subroutine psb_cspasb(a,desc_a, info, afmt, upd, mold, bld_and) !check on errors encountered in psdspins if (a%is_bld()) then - dupl_ = a%get_dupl() + if (present(dupl)) then + dupl_ = dupl + else + dupl_ = a%get_dupl() + end if + ! ! First case: we come from a fresh build. ! @@ -180,7 +186,7 @@ subroutine psb_cspasb(a,desc_a, info, afmt, upd, mold, bld_and) if (bld_and_) then !!$ allocate(a%ad,mold=a%a) !!$ allocate(a%and,mold=a%a)o - call a%split_nd(n_row,n_col,info) +!!$ call a%split_nd(n_row,n_col,info) !!$ block !!$ character(len=1024) :: fname !!$ type(psb_c_coo_sparse_mat) :: acoo diff --git a/base/tools/psb_cspfree.f90 b/base/tools/psb_cspfree.f90 index 51f40259e..4a6aff419 100644 --- a/base/tools/psb_cspfree.f90 +++ b/base/tools/psb_cspfree.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_csphalo.F90 b/base/tools/psb_csphalo.F90 index 4c56cc5ef..1b6102548 100644 --- a/base/tools/psb_csphalo.F90 +++ b/base/tools/psb_csphalo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -127,7 +127,7 @@ Subroutine psb_csphalo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -198,7 +198,7 @@ Subroutine psb_csphalo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract the row size lnr = 0 @@ -587,7 +587,7 @@ Subroutine psb_lcsphalo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -658,7 +658,7 @@ Subroutine psb_lcsphalo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract and send/receive. lnr = 0 @@ -931,7 +931,7 @@ Subroutine psb_lc_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -1004,7 +1004,7 @@ Subroutine psb_lc_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract the row size lnr = 0 @@ -1293,7 +1293,7 @@ Subroutine psb_c_lc_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -1366,7 +1366,7 @@ Subroutine psb_c_lc_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract the row size lnr = 0 diff --git a/base/tools/psb_cspins.F90 b/base/tools/psb_cspins.F90 index 6ed5c6296..4b40d4ce9 100644 --- a/base/tools/psb_cspins.F90 +++ b/base/tools/psb_cspins.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_csprn.f90 b/base/tools/psb_csprn.f90 index 82fb5be2f..eaeadf66d 100644 --- a/base/tools/psb_csprn.f90 +++ b/base/tools/psb_csprn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_d_glob_transpose.F90 b/base/tools/psb_d_glob_transpose.F90 index 3c323dbd2..f884222f6 100644 --- a/base/tools/psb_d_glob_transpose.F90 +++ b/base/tools/psb_d_glob_transpose.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -139,7 +139,7 @@ subroutine psb_ld_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx) debug_level = psb_get_debug_level() ctxt = desc_r%get_context() - icomm = desc_r%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -437,7 +437,7 @@ subroutine psb_d_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx) debug_level = psb_get_debug_level() ctxt = desc_r%get_context() - icomm = desc_r%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) diff --git a/base/tools/psb_d_map.f90 b/base/tools/psb_d_map.f90 index d1a02fdf5..9c009dbf1 100644 --- a/base/tools/psb_d_map.f90 +++ b/base/tools/psb_d_map.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -112,23 +112,22 @@ subroutine psb_d_map_U2V_a(alpha,x,beta,y,map,info,work) end subroutine psb_d_map_U2V_a -subroutine psb_d_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) +subroutine psb_d_map_U2V_v(alpha,x,beta,y,map,info,vtx,vty) use psb_base_mod, psb_protect_name => psb_d_map_U2V_v implicit none - class(psb_dlinmap_type), intent(in) :: map - real(psb_dpk_), intent(in) :: alpha,beta - type(psb_d_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), optional :: work(:) + class(psb_dlinmap_type), intent(in) :: map + real(psb_dpk_), intent(in) :: alpha,beta + type(psb_d_vect_type), intent(inout) :: x,y + integer(psb_ipk_), intent(out) :: info type(psb_d_vect_type), optional, target, intent(inout) :: vtx,vty ! Local - type(psb_d_vect_type), target :: xt, yt - type(psb_d_vect_type),pointer :: ptx, pty - real(psb_dpk_), allocatable :: xta(:), yta(:) - integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2 ,& + type(psb_d_vect_type), target :: xt, yt + type(psb_d_vect_type),pointer :: ptx, pty + real(psb_dpk_), allocatable :: xta(:), yta(:) + integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2 ,& & map_kind, nr, iam, np - type(psb_ctxt_type) :: ctxt - character(len=20), parameter :: name='psb_map_U2V_v' + type(psb_ctxt_type) :: ctxt + character(len=20), parameter :: name = 'psb_map_U2V_v' info = psb_success_ if (.not.map%is_asb()) then @@ -152,7 +151,7 @@ subroutine psb_d_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) call psb_geasb(yt,map%p_desc_V,info,scratch=.true.,mold=x%v) pty => yt end if - if (info == psb_success_) call psb_halo(x,map%p_desc_U,info,work=work) + if (info == psb_success_) call psb_halo(x,map%p_desc_U,info) if (info == psb_success_) call psb_csmm(done,map%mat_U2V,x,dzero,pty,info) if ((info == psb_success_) .and. map%p_desc_V%is_repl().and.(np>1)) then yta = pty%get_vect() @@ -186,7 +185,7 @@ subroutine psb_d_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) end if call psb_geaxpby(done,x,dzero,ptx,map%desc_U,info) - if (info == psb_success_) call psb_halo(ptx,map%desc_U,info,work=work) + if (info == psb_success_) call psb_halo(ptx,map%desc_U,info) if (info == psb_success_) call psb_csmm(done,map%mat_U2V,ptx,dzero,pty,info) if ((info == psb_success_) .and. map%desc_V%is_repl().and.(np>1)) then yta = pty%get_vect() @@ -294,23 +293,22 @@ subroutine psb_d_map_V2U_a(alpha,x,beta,y,map,info,work) end subroutine psb_d_map_V2U_a -subroutine psb_d_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) +subroutine psb_d_map_V2U_v(alpha,x,beta,y,map,info,vtx,vty) use psb_base_mod, psb_protect_name => psb_d_map_V2U_v implicit none - class(psb_dlinmap_type), intent(in) :: map - real(psb_dpk_), intent(in) :: alpha,beta - type(psb_d_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - real(psb_dpk_), optional :: work(:) + class(psb_dlinmap_type), intent(in) :: map + real(psb_dpk_), intent(in) :: alpha,beta + type(psb_d_vect_type), intent(inout) :: x,y + integer(psb_ipk_), intent(out) :: info type(psb_d_vect_type), optional, target, intent(inout) :: vtx,vty ! Local - type(psb_d_vect_type), target :: xt, yt - type(psb_d_vect_type),pointer :: ptx, pty - real(psb_dpk_), allocatable :: xta(:), yta(:) - integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2,& + type(psb_d_vect_type), target :: xt, yt + type(psb_d_vect_type),pointer :: ptx, pty + real(psb_dpk_), allocatable :: xta(:), yta(:) + integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2,& & map_kind, nr, iam, np - type(psb_ctxt_type) :: ctxt - character(len=20), parameter :: name='psb_map_V2U_v' + type(psb_ctxt_type) :: ctxt + character(len=20), parameter :: name = 'psb_map_V2U_v' info = psb_success_ if (.not.map%is_asb()) then @@ -334,7 +332,7 @@ subroutine psb_d_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) call psb_geasb(yt,map%p_desc_U,info,scratch=.true.,mold=x%v) pty => yt end if - if (info == psb_success_) call psb_halo(x,map%p_desc_V,info,work=work) + if (info == psb_success_) call psb_halo(x,map%p_desc_V,info) if (info == psb_success_) call psb_csmm(done,map%mat_V2U,x,dzero,pty,info) if ((info == psb_success_) .and. map%p_desc_U%is_repl().and.(np>1)) then yta = pty%get_vect() @@ -369,7 +367,7 @@ subroutine psb_d_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) call psb_geaxpby(done,x,dzero,ptx,map%desc_V,info) - if (info == psb_success_) call psb_halo(ptx,map%desc_V,info,work=work) + if (info == psb_success_) call psb_halo(ptx,map%desc_V,info) if (info == psb_success_) call psb_csmm(done,map%mat_V2U,ptx,dzero,pty,info) if ((info == psb_success_) .and. map%desc_U%is_repl().and.(np>1)) then yta = pty%get_vect() diff --git a/base/tools/psb_d_par_csr_spspmm.f90 b/base/tools/psb_d_par_csr_spspmm.f90 index 3ed62f05b..3b0a8671c 100644 --- a/base/tools/psb_d_par_csr_spspmm.f90 +++ b/base/tools/psb_d_par_csr_spspmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -66,7 +66,8 @@ Subroutine psb_d_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_d_tools_mod, psb_protect_name => psb_d_par_csr_spspmm - use psb_d_serial_mod, only : psb_dcsrspspmm, psb_dbase_rwextd + use psb_d_csr_mat_mod, only : psb_dcsrspspmm + use psb_d_serial_mod, only : psb_dbase_rwextd Implicit None type(psb_d_csr_sparse_mat),intent(in) :: acsr @@ -166,7 +167,8 @@ Subroutine psb_ld_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_d_tools_mod, psb_protect_name => psb_ld_par_csr_spspmm - use psb_d_serial_mod, only : psb_ldcsrspspmm, psb_ldbase_rwextd + use psb_d_csr_mat_mod, only : psb_ldcsrspspmm + use psb_d_serial_mod, only : psb_ldbase_rwextd Implicit None type(psb_ld_csr_sparse_mat),intent(in) :: acsr diff --git a/base/tools/psb_d_remap.F90 b/base/tools/psb_d_remap.F90 index dc3219189..a2c9c291f 100644 --- a/base/tools/psb_d_remap.F90 +++ b/base/tools/psb_d_remap.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_d_remote_mat.F90 b/base/tools/psb_d_remote_mat.F90 index bab23d592..56f7b3d3c 100644 --- a/base/tools/psb_d_remote_mat.F90 +++ b/base/tools/psb_d_remote_mat.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -118,7 +118,7 @@ Subroutine psb_ld_remote_mat(a,desc_a,b,info) debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -150,7 +150,7 @@ Subroutine psb_ld_remote_mat(a,desc_a,b,info) call desc_a%indxmap%fnd_owner(a%ia(1:nz),iprc,info) - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() sdsz(:)=0 rvsz(:)=0 sdsi(:)=0 diff --git a/base/tools/psb_d_remote_vect.F90 b/base/tools/psb_d_remote_vect.F90 index 440c8cc56..38ea57b6c 100644 --- a/base/tools/psb_d_remote_vect.F90 +++ b/base/tools/psb_d_remote_vect.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -105,7 +105,7 @@ subroutine psb_d_remote_vect(n,v,iv,desc_a,x,ix, info) debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -123,7 +123,7 @@ subroutine psb_d_remote_vect(n,v,iv,desc_a,x,ix, info) call desc_a%indxmap%fnd_owner(iv(1:n),iprc,info) - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() sdsz(:) = 0 rvsz(:) = 0 sdsi(:) = 0 diff --git a/base/tools/psb_dallc.f90 b/base/tools/psb_dallc.f90 index 7b7b21f72..c726db862 100644 --- a/base/tools/psb_dallc.f90 +++ b/base/tools/psb_dallc.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -53,7 +53,7 @@ subroutine psb_dalloc_vect(x, desc_a,info, dupl, bldmode) !locals integer(psb_ipk_) :: np,me,nr,i,err_act - integer(psb_ipk_) :: dupl_, bldmode_, nrmt_ + integer(psb_ipk_) :: bldmode_, nrmt_ type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name @@ -95,8 +95,7 @@ subroutine psb_dalloc_vect(x, desc_a,info, dupl, bldmode) goto 9999 endif - allocate(psb_d_base_vect_type :: x%v, stat=info) - if (info == 0) call x%all(nr,info) + call x%all(nr,info) if (psb_errstatus_fatal()) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/nr/),a_err='real(psb_spk_)') @@ -109,12 +108,12 @@ subroutine psb_dalloc_vect(x, desc_a,info, dupl, bldmode) else bldmode_ = psb_matbld_noremote_ end if + call x%set_bld() if (present(dupl)) then - dupl_ = dupl + call x%set_dupl(dupl) else - dupl_ = psb_dupl_def_ - end if - call x%set_dupl(dupl_) + call x%set_dupl(psb_dupl_def_) + end if call x%set_remote_build(bldmode_) call x%set_nrmv(izero) if (x%is_remote_build()) then @@ -210,48 +209,11 @@ subroutine psb_dalloc_vect_r2(x, desc_a,info,n,lb, dupl, bldmode) goto 9999 endif endif - ! As this is a rank-1 array, optional parameter N is actually ignored. - - !....allocate x ..... - if (desc_a%is_asb().or.desc_a%is_upd()) then - nr = max(1,desc_a%get_local_cols()) - else if (desc_a%is_bld()) then - nr = max(1,desc_a%get_local_rows()) - else - info = psb_err_internal_error_ - call psb_errpush(info,name,a_err='Invalid desc_a') - goto 9999 - endif - allocate(x(lb_:lb_+n_-1), stat=info) - if (info == 0) then - do i=lb_, lb_+n_-1 - allocate(psb_d_base_vect_type :: x(i)%v, stat=info) - if (info == 0) call x(i)%all(nr,info) - if (info == 0) call x(i)%zero() - if (info /= 0) exit - end do - end if - - if (present(bldmode)) then - bldmode_ = bldmode - else - bldmode_ = psb_matbld_noremote_ - end if - if (present(dupl)) then - dupl_ = dupl - else - dupl_ = psb_dupl_def_ - end if - do i=lb_, lb_+n_-1 - call x(i)%set_dupl(dupl_) - call x(i)%set_remote_build(bldmode_) - if (x(i)%is_remote_build()) then - nrmt_ = max(100,(desc_a%get_local_cols()-desc_a%get_local_rows())) - allocate(x(i)%rmtv(nrmt_)) - end if + call psb_geall(x(i),desc_a,info,dupl, bldmode) end do + if (psb_errstatus_fatal()) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/nr/),a_err='real(psb_spk_)') @@ -264,7 +226,6 @@ subroutine psb_dalloc_vect_r2(x, desc_a,info,n,lb, dupl, bldmode) 9999 call psb_error_handler(ctxt,err_act) return - end subroutine psb_dalloc_vect_r2 diff --git a/base/tools/psb_dallc_a.f90 b/base/tools/psb_dallc_a.f90 index 8cd927fe8..027b64a60 100644 --- a/base/tools/psb_dallc_a.f90 +++ b/base/tools/psb_dallc_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -147,7 +147,7 @@ end subroutine psb_dalloc !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_dasb.f90 b/base/tools/psb_dasb.f90 index 19a19ff14..a4b5a3e38 100644 --- a/base/tools/psb_dasb.f90 +++ b/base/tools/psb_dasb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! scratch - logical, optional If true, allocate without checking/zeroing contents. ! default: .false. ! -subroutine psb_dasb_vect(x, desc_a, info, mold, scratch) +subroutine psb_dasb_vect(x, desc_a, info, mold, scratch, dupl) use psb_base_mod, psb_protect_name => psb_dasb_vect implicit none @@ -60,6 +60,7 @@ subroutine psb_dasb_vect(x, desc_a, info, mold, scratch) integer(psb_ipk_), intent(out) :: info class(psb_d_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl ! local variables type(psb_ctxt_type) :: ctxt @@ -80,10 +81,9 @@ subroutine psb_dasb_vect(x, desc_a, info, mold, scratch) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - scratch_ = .false. + scratch_ = .false. if (present(scratch)) scratch_ = scratch call psb_info(ctxt, me, np) - dupl_ = x%get_dupl() ! ....verify blacs grid correctness.. if (np == -1) then info = psb_err_context_error_ @@ -100,39 +100,83 @@ subroutine psb_dasb_vect(x, desc_a, info, mold, scratch) if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),': sizes: ',nrow,ncol - if (scratch_) then - call x%free(info) - call x%bld(ncol,mold=mold) + dupl_ = x%get_dupl() + if (try_newins) then + if (scratch_) then + call x%free(info) + call x%bld(ncol,mold=mold,scratch=scratch_) + else + if (x%is_bld().and.present(dupl)) then + call x%set_dupl(dupl) + dupl_ = dupl + end if + + if (x%is_remote_build()) then + block + integer(psb_lpk_), allocatable :: lvx(:) + real(psb_dpk_), allocatable :: vx(:) + integer(psb_ipk_), allocatable :: ivx(:) + integer(psb_ipk_) :: nrmv, nx, i + + nrmv = x%get_nrmv() + call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) + nx = size(vx) + call psb_realloc(nx,ivx,info) + call desc_a%g2l(lvx,ivx,info,owned=.true.) + call x%ins(nx,ivx,vx,nrow,info) + end block + end if + + call x%asb(ncol,info,scratch=scratch) + ! ..update halo elements.. + call psb_halo(x,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_halo') + goto 9999 + end if + call x%cnv(mold) + end if + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': end' else - if (x%is_remote_build()) then - block - integer(psb_lpk_), allocatable :: lvx(:) - real(psb_dpk_), allocatable :: vx(:) - integer(psb_ipk_), allocatable :: ivx(:) - integer(psb_ipk_) :: nrmv, nx, i - - nrmv = x%get_nrmv() - call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) - nx = size(vx) - call psb_realloc(nx,ivx,info) - call desc_a%g2l(lvx,ivx,info,owned=.true.) - call x%ins(nx,ivx,vx,info) - end block - end if - - call x%asb(ncol,info) - ! ..update halo elements.. - call psb_halo(x,desc_a,info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='psb_halo') - goto 9999 + if (scratch_) then + call x%free(info) + call x%bld(ncol,mold=mold) + else + if (x%is_bld().and.present(dupl)) then + dupl_ = dupl + end if + if (x%is_remote_build()) then + block + integer(psb_lpk_), allocatable :: lvx(:) + real(psb_dpk_), allocatable :: vx(:) + integer(psb_ipk_), allocatable :: ivx(:) + integer(psb_ipk_) :: nrmv, nx, i + + nrmv = x%get_nrmv() + call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) + nx = size(vx) + call psb_realloc(nx,ivx,info) + call desc_a%g2l(lvx,ivx,info,owned=.true.) + call x%ins(nx,ivx,vx,nrow,info) + end block + end if + + call x%asb(ncol,info,scratch=scratch) + ! ..update halo elements.. + call psb_halo(x,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_halo') + goto 9999 + end if + call x%cnv(mold) end if - call x%cnv(mold) + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': end' end if - if (debug_level >= psb_debug_ext_) & - & write(debug_unit,*) me,' ',trim(name),': end' call psb_erractionrestore(err_act) return @@ -144,7 +188,7 @@ subroutine psb_dasb_vect(x, desc_a, info, mold, scratch) end subroutine psb_dasb_vect -subroutine psb_dasb_vect_r2(x, desc_a, info, mold, scratch) +subroutine psb_dasb_vect_r2(x, desc_a, info, mold, scratch,dupl) use psb_base_mod, psb_protect_name => psb_dasb_vect_r2 implicit none @@ -153,12 +197,12 @@ subroutine psb_dasb_vect_r2(x, desc_a, info, mold, scratch) integer(psb_ipk_), intent(out) :: info class(psb_d_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl ! local variables type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me, i, n - integer(psb_ipk_) :: i1sz,nrow,ncol, err_act, dupl_ - logical :: scratch_ + integer(psb_ipk_) :: err_act integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name,ch_err @@ -173,8 +217,6 @@ subroutine psb_dasb_vect_r2(x, desc_a, info, mold, scratch) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - scratch_ = .false. - if (present(scratch)) scratch_ = scratch call psb_info(ctxt, me, np) ! ....verify blacs grid correctness.. if (np == -1) then @@ -186,35 +228,11 @@ subroutine psb_dasb_vect_r2(x, desc_a, info, mold, scratch) call psb_errpush(info,name) goto 9999 end if - - nrow = desc_a%get_local_rows() - ncol = desc_a%get_local_cols() n = size(x) - if (debug_level >= psb_debug_ext_) & - & write(debug_unit,*) me,' ',trim(name),': sizes: ',nrow,ncol + do i=1, n + call psb_geasb(x(i),desc_a,info, mold, scratch, dupl) + end do - if (scratch_) then - do i=1,n - call x(i)%free(info) - call x(i)%bld(ncol,mold=mold) - end do - - else - do i=1, n - dupl_ = x(i)%get_dupl() - call x(i)%asb(ncol,info) - if (info /= 0) exit - ! ..update halo elements.. - call psb_halo(x(i),desc_a,info) - if (info /= 0) exit - call x(i)%cnv(mold) - end do - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='psb_halo') - goto 9999 - end if - end if if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),': end' @@ -291,7 +309,7 @@ subroutine psb_dasb_multivect(x, desc_a, info, mold, scratch,n) dupl_ = x%get_dupl() if (scratch_) then call x%free(info) - call x%bld(ncol,n_,mold=mold) + call x%bld(ncol,n_,mold=mold,scratch=.true.) else call x%asb(ncol,n_,info) ! ..update halo elements.. diff --git a/base/tools/psb_dasb_a.f90 b/base/tools/psb_dasb_a.f90 index 2a62fedf8..305c2e31d 100644 --- a/base/tools/psb_dasb_a.f90 +++ b/base/tools/psb_dasb_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -153,7 +153,7 @@ end subroutine psb_dasb !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_dcdbldext.F90 b/base/tools/psb_dcdbldext.F90 index a5d059a32..f16402b7c 100644 --- a/base/tools/psb_dcdbldext.F90 +++ b/base/tools/psb_dcdbldext.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -117,7 +117,7 @@ Subroutine psb_dcdbldext(a,desc_a,novr,desc_ov,info, extype) goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) If (debug_level >= psb_debug_outer_) & diff --git a/base/tools/psb_dfree.f90 b/base/tools/psb_dfree.f90 index 8e092dfa3..e3c8482ec 100644 --- a/base/tools/psb_dfree.f90 +++ b/base/tools/psb_dfree.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_dfree_a.f90 b/base/tools/psb_dfree_a.f90 index 0ce49ecca..b71aba123 100644 --- a/base/tools/psb_dfree_a.f90 +++ b/base/tools/psb_dfree_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_dgetelem.f90 b/base/tools/psb_dgetelem.f90 index 38d398aa8..805204b08 100644 --- a/base/tools/psb_dgetelem.f90 +++ b/base/tools/psb_dgetelem.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -108,3 +108,92 @@ function psb_d_getelem(x,index,desc_a,info) result(res) end function +! Function: psb_d_getmatelem +! Extract entries from a sparse matrix. Note: the row and column indices in index +! are assumed to be in global numbering and are converted on the fly. +! +! Arguments: +! a - type(psb_dspmat_type) The source matrix +! desc_a - type(psb_desc_type). The communication descriptor. +! rowindex - integer. Row index of x of the value to extract +! colindex - integer. Column index of x of the value to extract +! iam - integer. Index of the process requesting the value +! info - integer. return code + + +function psb_d_getmatelem(a,rowindex,colindex,desc_a,info) result(res) + use psb_base_mod, psb_protect_name => psb_d_getmatelem + use psi_mod + implicit none + + type(psb_dspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a + integer(psb_lpk_), intent(in) :: rowindex, colindex + integer(psb_ipk_), intent(out) :: info + real(psb_dpk_) :: res + + !locals + integer(psb_ipk_) :: localrowindex(1), localcolindex(1), jmin, jmax, imin, imax + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act + integer(psb_lpk_) :: growindex(1), gcolindex(1) + integer(psb_lpk_), allocatable :: myidx(:),mylocal(:) + integer(psb_ipk_), allocatable, dimension(:) :: ia, ja + integer(psb_ipk_) :: nz + real(psb_dpk_), allocatable, dimension(:) :: val + character(len=20) :: name + logical, parameter :: debug = .false. + + growindex(1) = rowindex + gcolindex(1) = colindex + res = dzero + if (psb_errstatus_fatal()) return + info=psb_success_ + call psb_erractionsave(err_act) + name = 'psb_d_getmatelem' + + if (.not.desc_a%is_ok()) then + info = psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + end if + + ctxt = desc_a%get_context() + + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + call desc_a%indxmap%g2l(growindex,localrowindex,info,owned=.false.) + call desc_a%indxmap%g2l(gcolindex,localcolindex,info,owned=.false.) + imin = localrowindex(1) + imax = localrowindex(1) + jmin = localcolindex(1) + jmax = localcolindex(1) + if(debug.and.(localrowindex(1) < 1 .or. localcolindex(1) < 1)) then + write(*,*)"Process ",me," owns ",desc_a%get_local_rows()," rows"," Global row index is ", & + growindex,"Local row index is ",localrowindex + write(*,*)"Process ",me," owns ",desc_a%get_local_cols()," cols"," Global col index is ", & + gcolindex,"Local col index is ",localcolindex + myidx = desc_a%get_global_indices(owned=.false.) + mylocal = desc_a%get_global_indices(owned=.true.) + write(*,*)"My (local+halo) indexes are: ",myidx + write(*,*)"My (local) indexes are: ",mylocal + end if + if ( localrowindex(1) < 1 .or. localcolindex(1) < 1) then + res = dzero + else + call a%csget(imin, imax, nz, ia, ja, val, info, jmin=jmin, jmax=jmax) + res = val(1) + end if + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + +end function diff --git a/base/tools/psb_dins.f90 b/base/tools/psb_dins.f90 index d35292298..3141ffc84 100644 --- a/base/tools/psb_dins.f90 +++ b/base/tools/psb_dins.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -57,7 +57,7 @@ subroutine psb_dins_vect(m, irw, val, x, desc_a, info, local) logical, intent(in), optional :: local !locals..... - integer(psb_ipk_) :: i, loc_rows,loc_cols + integer(psb_ipk_) :: i, loc_rows, loc_cols integer(psb_lpk_) :: mglob integer(psb_ipk_) :: dupl_ type(psb_ctxt_type) :: ctxt @@ -127,7 +127,7 @@ subroutine psb_dins_vect(m, irw, val, x, desc_a, info, local) else call desc_a%indxmap%g2l(irw(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,val,info) + call x%ins(m,irl,val,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 @@ -198,7 +198,7 @@ subroutine psb_dins_vect_v(m, irw, val, x, desc_a, info, local) logical, intent(in), optional :: local !locals..... - integer(psb_ipk_) :: i, loc_rows,loc_cols,err_act + integer(psb_ipk_) :: i, loc_rows, loc_cols, err_act integer(psb_lpk_) :: mglob type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me @@ -261,7 +261,7 @@ subroutine psb_dins_vect_v(m, irw, val, x, desc_a, info, local) call desc_a%indxmap%g2l(irw%v%v(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,lval,info) + call x%ins(m,irl,lval,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 @@ -368,7 +368,7 @@ subroutine psb_dins_vect_r2(m, irw, val, x, desc_a, info, local) do i=1,n if (.not.allocated(x(i)%v)) info = psb_err_invalid_vect_state_ - if (info == 0) call x(i)%ins(m,irl,val(:,i),info) + if (info == 0) call x(i)%ins(m,irl,val(:,i),loc_rows,info) if (info /= 0) exit end do if (info /= 0) then @@ -475,7 +475,7 @@ subroutine psb_dins_multivect(m, irw, val, x, desc_a, info, local) else call desc_a%indxmap%g2l(irw(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,val,info) + call x%ins(m,irl,val,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 diff --git a/base/tools/psb_dins_a.f90 b/base/tools/psb_dins_a.f90 index eb04ebaff..dd53275df 100644 --- a/base/tools/psb_dins_a.f90 +++ b/base/tools/psb_dins_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -195,7 +195,7 @@ end subroutine psb_dinsvi !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_dspalloc.f90 b/base/tools/psb_dspalloc.f90 index 433d71298..192267c83 100644 --- a/base/tools/psb_dspalloc.f90 +++ b/base/tools/psb_dspalloc.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_dspasb.f90 b/base/tools/psb_dspasb.f90 index 236568a18..a68073051 100644 --- a/base/tools/psb_dspasb.f90 +++ b/base/tools/psb_dspasb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,7 +44,7 @@ ! psb_upd_perm_ Permutation(more memory) ! ! -subroutine psb_dspasb(a,desc_a, info, afmt, upd, mold, bld_and) +subroutine psb_dspasb(a,desc_a, info, afmt, upd, mold, dupl, bld_and) use psb_base_mod, psb_protect_name => psb_dspasb use psb_sort_mod use psi_mod @@ -59,6 +59,7 @@ subroutine psb_dspasb(a,desc_a, info, afmt, upd, mold, bld_and) character(len=*), optional, intent(in) :: afmt class(psb_d_base_sparse_mat), intent(in), optional :: mold logical, intent(in), optional :: bld_and + integer(psb_ipk_), optional, intent(in) :: dupl !....Locals.... type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me, err_act @@ -103,7 +104,12 @@ subroutine psb_dspasb(a,desc_a, info, afmt, upd, mold, bld_and) !check on errors encountered in psdspins if (a%is_bld()) then - dupl_ = a%get_dupl() + if (present(dupl)) then + dupl_ = dupl + else + dupl_ = a%get_dupl() + end if + ! ! First case: we come from a fresh build. ! @@ -180,7 +186,7 @@ subroutine psb_dspasb(a,desc_a, info, afmt, upd, mold, bld_and) if (bld_and_) then !!$ allocate(a%ad,mold=a%a) !!$ allocate(a%and,mold=a%a)o - call a%split_nd(n_row,n_col,info) +!!$ call a%split_nd(n_row,n_col,info) !!$ block !!$ character(len=1024) :: fname !!$ type(psb_d_coo_sparse_mat) :: acoo diff --git a/base/tools/psb_dspfree.f90 b/base/tools/psb_dspfree.f90 index 060043487..9015907f2 100644 --- a/base/tools/psb_dspfree.f90 +++ b/base/tools/psb_dspfree.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_dsphalo.F90 b/base/tools/psb_dsphalo.F90 index c793eb2a1..b40a7c514 100644 --- a/base/tools/psb_dsphalo.F90 +++ b/base/tools/psb_dsphalo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -127,7 +127,7 @@ Subroutine psb_dsphalo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -198,7 +198,7 @@ Subroutine psb_dsphalo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract the row size lnr = 0 @@ -587,7 +587,7 @@ Subroutine psb_ldsphalo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -658,7 +658,7 @@ Subroutine psb_ldsphalo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract and send/receive. lnr = 0 @@ -931,7 +931,7 @@ Subroutine psb_ld_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -1004,7 +1004,7 @@ Subroutine psb_ld_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract the row size lnr = 0 @@ -1293,7 +1293,7 @@ Subroutine psb_d_ld_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -1366,7 +1366,7 @@ Subroutine psb_d_ld_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract the row size lnr = 0 diff --git a/base/tools/psb_dspins.F90 b/base/tools/psb_dspins.F90 index a9cbbe4b6..e88be0840 100644 --- a/base/tools/psb_dspins.F90 +++ b/base/tools/psb_dspins.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_dsprn.f90 b/base/tools/psb_dsprn.f90 index 36e0531f4..a3b613a3f 100644 --- a/base/tools/psb_dsprn.f90 +++ b/base/tools/psb_dsprn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_e_remote_vect.F90 b/base/tools/psb_e_remote_vect.F90 index 9b1906671..91423486f 100644 --- a/base/tools/psb_e_remote_vect.F90 +++ b/base/tools/psb_e_remote_vect.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -105,7 +105,7 @@ subroutine psb_e_remote_vect(n,v,iv,desc_a,x,ix, info) debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -123,7 +123,7 @@ subroutine psb_e_remote_vect(n,v,iv,desc_a,x,ix, info) call desc_a%indxmap%fnd_owner(iv(1:n),iprc,info) - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() sdsz(:) = 0 rvsz(:) = 0 sdsi(:) = 0 diff --git a/base/tools/psb_eallc_a.f90 b/base/tools/psb_eallc_a.f90 index c9c65634d..ba1a60338 100644 --- a/base/tools/psb_eallc_a.f90 +++ b/base/tools/psb_eallc_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -147,7 +147,7 @@ end subroutine psb_ealloc !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_easb_a.f90 b/base/tools/psb_easb_a.f90 index baa8514d3..e0819bc2b 100644 --- a/base/tools/psb_easb_a.f90 +++ b/base/tools/psb_easb_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -153,7 +153,7 @@ end subroutine psb_easb !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_efree_a.f90 b/base/tools/psb_efree_a.f90 index 85baa0c0c..9439f65b2 100644 --- a/base/tools/psb_efree_a.f90 +++ b/base/tools/psb_efree_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_eins_a.f90 b/base/tools/psb_eins_a.f90 index 25744f5ad..3db771844 100644 --- a/base/tools/psb_eins_a.f90 +++ b/base/tools/psb_eins_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -195,7 +195,7 @@ end subroutine psb_einsvi !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_get_overlap.f90 b/base/tools/psb_get_overlap.f90 index 9ef3377e0..6c322772c 100644 --- a/base/tools/psb_get_overlap.f90 +++ b/base/tools/psb_get_overlap.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_glob_to_loc.f90 b/base/tools/psb_glob_to_loc.f90 index 5681d2aeb..0e25648d3 100644 --- a/base/tools/psb_glob_to_loc.f90 +++ b/base/tools/psb_glob_to_loc.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -137,7 +137,7 @@ end subroutine psb_glob_to_loc2v !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_i2_remote_vect.F90 b/base/tools/psb_i2_remote_vect.F90 index 11f0cb7c7..c2a7706f3 100644 --- a/base/tools/psb_i2_remote_vect.F90 +++ b/base/tools/psb_i2_remote_vect.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -105,7 +105,7 @@ subroutine psb_i2_remote_vect(n,v,iv,desc_a,x,ix, info) debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -123,7 +123,7 @@ subroutine psb_i2_remote_vect(n,v,iv,desc_a,x,ix, info) call desc_a%indxmap%fnd_owner(iv(1:n),iprc,info) - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() sdsz(:) = 0 rvsz(:) = 0 sdsi(:) = 0 diff --git a/base/tools/psb_i2allc_a.f90 b/base/tools/psb_i2allc_a.f90 index 525983041..55c152152 100644 --- a/base/tools/psb_i2allc_a.f90 +++ b/base/tools/psb_i2allc_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -147,7 +147,7 @@ end subroutine psb_i2alloc !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_i2asb_a.f90 b/base/tools/psb_i2asb_a.f90 index 97879105f..397703452 100644 --- a/base/tools/psb_i2asb_a.f90 +++ b/base/tools/psb_i2asb_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -153,7 +153,7 @@ end subroutine psb_i2asb !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_i2free_a.f90 b/base/tools/psb_i2free_a.f90 index d5c7509ca..1aa9c9c06 100644 --- a/base/tools/psb_i2free_a.f90 +++ b/base/tools/psb_i2free_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_i2ins_a.f90 b/base/tools/psb_i2ins_a.f90 index 975e619b2..81e321baf 100644 --- a/base/tools/psb_i2ins_a.f90 +++ b/base/tools/psb_i2ins_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -195,7 +195,7 @@ end subroutine psb_i2insvi !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_iallc.f90 b/base/tools/psb_iallc.f90 index 21d4d8a56..6ecb6d270 100644 --- a/base/tools/psb_iallc.f90 +++ b/base/tools/psb_iallc.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -53,7 +53,7 @@ subroutine psb_ialloc_vect(x, desc_a,info, dupl, bldmode) !locals integer(psb_ipk_) :: np,me,nr,i,err_act - integer(psb_ipk_) :: dupl_, bldmode_, nrmt_ + integer(psb_ipk_) :: bldmode_, nrmt_ type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name @@ -95,8 +95,7 @@ subroutine psb_ialloc_vect(x, desc_a,info, dupl, bldmode) goto 9999 endif - allocate(psb_i_base_vect_type :: x%v, stat=info) - if (info == 0) call x%all(nr,info) + call x%all(nr,info) if (psb_errstatus_fatal()) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/nr/),a_err='real(psb_spk_)') @@ -109,12 +108,12 @@ subroutine psb_ialloc_vect(x, desc_a,info, dupl, bldmode) else bldmode_ = psb_matbld_noremote_ end if + call x%set_bld() if (present(dupl)) then - dupl_ = dupl + call x%set_dupl(dupl) else - dupl_ = psb_dupl_def_ - end if - call x%set_dupl(dupl_) + call x%set_dupl(psb_dupl_def_) + end if call x%set_remote_build(bldmode_) call x%set_nrmv(izero) if (x%is_remote_build()) then @@ -210,48 +209,11 @@ subroutine psb_ialloc_vect_r2(x, desc_a,info,n,lb, dupl, bldmode) goto 9999 endif endif - ! As this is a rank-1 array, optional parameter N is actually ignored. - - !....allocate x ..... - if (desc_a%is_asb().or.desc_a%is_upd()) then - nr = max(1,desc_a%get_local_cols()) - else if (desc_a%is_bld()) then - nr = max(1,desc_a%get_local_rows()) - else - info = psb_err_internal_error_ - call psb_errpush(info,name,a_err='Invalid desc_a') - goto 9999 - endif - allocate(x(lb_:lb_+n_-1), stat=info) - if (info == 0) then - do i=lb_, lb_+n_-1 - allocate(psb_i_base_vect_type :: x(i)%v, stat=info) - if (info == 0) call x(i)%all(nr,info) - if (info == 0) call x(i)%zero() - if (info /= 0) exit - end do - end if - - if (present(bldmode)) then - bldmode_ = bldmode - else - bldmode_ = psb_matbld_noremote_ - end if - if (present(dupl)) then - dupl_ = dupl - else - dupl_ = psb_dupl_def_ - end if - do i=lb_, lb_+n_-1 - call x(i)%set_dupl(dupl_) - call x(i)%set_remote_build(bldmode_) - if (x(i)%is_remote_build()) then - nrmt_ = max(100,(desc_a%get_local_cols()-desc_a%get_local_rows())) - allocate(x(i)%rmtv(nrmt_)) - end if + call psb_geall(x(i),desc_a,info,dupl, bldmode) end do + if (psb_errstatus_fatal()) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/nr/),a_err='real(psb_spk_)') @@ -264,7 +226,6 @@ subroutine psb_ialloc_vect_r2(x, desc_a,info,n,lb, dupl, bldmode) 9999 call psb_error_handler(ctxt,err_act) return - end subroutine psb_ialloc_vect_r2 diff --git a/base/tools/psb_iasb.f90 b/base/tools/psb_iasb.f90 index f5e5669f1..b962b28ec 100644 --- a/base/tools/psb_iasb.f90 +++ b/base/tools/psb_iasb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! scratch - logical, optional If true, allocate without checking/zeroing contents. ! default: .false. ! -subroutine psb_iasb_vect(x, desc_a, info, mold, scratch) +subroutine psb_iasb_vect(x, desc_a, info, mold, scratch, dupl) use psb_base_mod, psb_protect_name => psb_iasb_vect implicit none @@ -60,6 +60,7 @@ subroutine psb_iasb_vect(x, desc_a, info, mold, scratch) integer(psb_ipk_), intent(out) :: info class(psb_i_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl ! local variables type(psb_ctxt_type) :: ctxt @@ -80,10 +81,9 @@ subroutine psb_iasb_vect(x, desc_a, info, mold, scratch) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - scratch_ = .false. + scratch_ = .false. if (present(scratch)) scratch_ = scratch call psb_info(ctxt, me, np) - dupl_ = x%get_dupl() ! ....verify blacs grid correctness.. if (np == -1) then info = psb_err_context_error_ @@ -100,39 +100,83 @@ subroutine psb_iasb_vect(x, desc_a, info, mold, scratch) if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),': sizes: ',nrow,ncol - if (scratch_) then - call x%free(info) - call x%bld(ncol,mold=mold) + dupl_ = x%get_dupl() + if (try_newins) then + if (scratch_) then + call x%free(info) + call x%bld(ncol,mold=mold,scratch=scratch_) + else + if (x%is_bld().and.present(dupl)) then + call x%set_dupl(dupl) + dupl_ = dupl + end if + + if (x%is_remote_build()) then + block + integer(psb_lpk_), allocatable :: lvx(:) + integer(psb_ipk_), allocatable :: vx(:) + integer(psb_ipk_), allocatable :: ivx(:) + integer(psb_ipk_) :: nrmv, nx, i + + nrmv = x%get_nrmv() + call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) + nx = size(vx) + call psb_realloc(nx,ivx,info) + call desc_a%g2l(lvx,ivx,info,owned=.true.) + call x%ins(nx,ivx,vx,nrow,info) + end block + end if + + call x%asb(ncol,info,scratch=scratch) + ! ..update halo elements.. + call psb_halo(x,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_halo') + goto 9999 + end if + call x%cnv(mold) + end if + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': end' else - if (x%is_remote_build()) then - block - integer(psb_lpk_), allocatable :: lvx(:) - integer(psb_ipk_), allocatable :: vx(:) - integer(psb_ipk_), allocatable :: ivx(:) - integer(psb_ipk_) :: nrmv, nx, i - - nrmv = x%get_nrmv() - call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) - nx = size(vx) - call psb_realloc(nx,ivx,info) - call desc_a%g2l(lvx,ivx,info,owned=.true.) - call x%ins(nx,ivx,vx,info) - end block - end if - - call x%asb(ncol,info) - ! ..update halo elements.. - call psb_halo(x,desc_a,info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='psb_halo') - goto 9999 + if (scratch_) then + call x%free(info) + call x%bld(ncol,mold=mold) + else + if (x%is_bld().and.present(dupl)) then + dupl_ = dupl + end if + if (x%is_remote_build()) then + block + integer(psb_lpk_), allocatable :: lvx(:) + integer(psb_ipk_), allocatable :: vx(:) + integer(psb_ipk_), allocatable :: ivx(:) + integer(psb_ipk_) :: nrmv, nx, i + + nrmv = x%get_nrmv() + call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) + nx = size(vx) + call psb_realloc(nx,ivx,info) + call desc_a%g2l(lvx,ivx,info,owned=.true.) + call x%ins(nx,ivx,vx,nrow,info) + end block + end if + + call x%asb(ncol,info,scratch=scratch) + ! ..update halo elements.. + call psb_halo(x,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_halo') + goto 9999 + end if + call x%cnv(mold) end if - call x%cnv(mold) + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': end' end if - if (debug_level >= psb_debug_ext_) & - & write(debug_unit,*) me,' ',trim(name),': end' call psb_erractionrestore(err_act) return @@ -144,7 +188,7 @@ subroutine psb_iasb_vect(x, desc_a, info, mold, scratch) end subroutine psb_iasb_vect -subroutine psb_iasb_vect_r2(x, desc_a, info, mold, scratch) +subroutine psb_iasb_vect_r2(x, desc_a, info, mold, scratch,dupl) use psb_base_mod, psb_protect_name => psb_iasb_vect_r2 implicit none @@ -153,12 +197,12 @@ subroutine psb_iasb_vect_r2(x, desc_a, info, mold, scratch) integer(psb_ipk_), intent(out) :: info class(psb_i_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl ! local variables type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me, i, n - integer(psb_ipk_) :: i1sz,nrow,ncol, err_act, dupl_ - logical :: scratch_ + integer(psb_ipk_) :: err_act integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name,ch_err @@ -173,8 +217,6 @@ subroutine psb_iasb_vect_r2(x, desc_a, info, mold, scratch) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - scratch_ = .false. - if (present(scratch)) scratch_ = scratch call psb_info(ctxt, me, np) ! ....verify blacs grid correctness.. if (np == -1) then @@ -186,35 +228,11 @@ subroutine psb_iasb_vect_r2(x, desc_a, info, mold, scratch) call psb_errpush(info,name) goto 9999 end if - - nrow = desc_a%get_local_rows() - ncol = desc_a%get_local_cols() n = size(x) - if (debug_level >= psb_debug_ext_) & - & write(debug_unit,*) me,' ',trim(name),': sizes: ',nrow,ncol + do i=1, n + call psb_geasb(x(i),desc_a,info, mold, scratch, dupl) + end do - if (scratch_) then - do i=1,n - call x(i)%free(info) - call x(i)%bld(ncol,mold=mold) - end do - - else - do i=1, n - dupl_ = x(i)%get_dupl() - call x(i)%asb(ncol,info) - if (info /= 0) exit - ! ..update halo elements.. - call psb_halo(x(i),desc_a,info) - if (info /= 0) exit - call x(i)%cnv(mold) - end do - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='psb_halo') - goto 9999 - end if - end if if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),': end' @@ -291,7 +309,7 @@ subroutine psb_iasb_multivect(x, desc_a, info, mold, scratch,n) dupl_ = x%get_dupl() if (scratch_) then call x%free(info) - call x%bld(ncol,n_,mold=mold) + call x%bld(ncol,n_,mold=mold,scratch=.true.) else call x%asb(ncol,n_,info) ! ..update halo elements.. diff --git a/base/tools/psb_icdasb.F90 b/base/tools/psb_icdasb.F90 index c2d9c27af..c8af1b17e 100644 --- a/base/tools/psb_icdasb.F90 +++ b/base/tools/psb_icdasb.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -83,10 +83,10 @@ subroutine psb_icdasb(desc,info,ext_hv,mold) debug_level = psb_get_debug_level() ctxt = desc%get_context() + icomm = ctxt%get_mpic() dectype = desc%get_dectype() n_row = desc%get_local_rows() n_col = desc%get_local_cols() - icomm = desc%get_mpic() if ((do_timings).and.(idx_total==-1)) & & idx_total = psb_get_timer_idx("ICDASB: total ") if ((do_timings).and.(idx_phase1==-1)) & diff --git a/base/tools/psb_ifree.f90 b/base/tools/psb_ifree.f90 index a804913a3..7e0d67587 100644 --- a/base/tools/psb_ifree.f90 +++ b/base/tools/psb_ifree.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_iins.f90 b/base/tools/psb_iins.f90 index 4fa534297..bbe666ed6 100644 --- a/base/tools/psb_iins.f90 +++ b/base/tools/psb_iins.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -57,7 +57,7 @@ subroutine psb_iins_vect(m, irw, val, x, desc_a, info, local) logical, intent(in), optional :: local !locals..... - integer(psb_ipk_) :: i, loc_rows,loc_cols + integer(psb_ipk_) :: i, loc_rows, loc_cols integer(psb_lpk_) :: mglob integer(psb_ipk_) :: dupl_ type(psb_ctxt_type) :: ctxt @@ -127,7 +127,7 @@ subroutine psb_iins_vect(m, irw, val, x, desc_a, info, local) else call desc_a%indxmap%g2l(irw(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,val,info) + call x%ins(m,irl,val,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 @@ -198,7 +198,7 @@ subroutine psb_iins_vect_v(m, irw, val, x, desc_a, info, local) logical, intent(in), optional :: local !locals..... - integer(psb_ipk_) :: i, loc_rows,loc_cols,err_act + integer(psb_ipk_) :: i, loc_rows, loc_cols, err_act integer(psb_lpk_) :: mglob type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me @@ -261,7 +261,7 @@ subroutine psb_iins_vect_v(m, irw, val, x, desc_a, info, local) call desc_a%indxmap%g2l(irw%v%v(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,lval,info) + call x%ins(m,irl,lval,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 @@ -368,7 +368,7 @@ subroutine psb_iins_vect_r2(m, irw, val, x, desc_a, info, local) do i=1,n if (.not.allocated(x(i)%v)) info = psb_err_invalid_vect_state_ - if (info == 0) call x(i)%ins(m,irl,val(:,i),info) + if (info == 0) call x(i)%ins(m,irl,val(:,i),loc_rows,info) if (info /= 0) exit end do if (info /= 0) then @@ -475,7 +475,7 @@ subroutine psb_iins_multivect(m, irw, val, x, desc_a, info, local) else call desc_a%indxmap%g2l(irw(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,val,info) + call x%ins(m,irl,val,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 diff --git a/base/tools/psb_lallc.f90 b/base/tools/psb_lallc.f90 index a781e55a2..8d3767989 100644 --- a/base/tools/psb_lallc.f90 +++ b/base/tools/psb_lallc.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -53,7 +53,7 @@ subroutine psb_lalloc_vect(x, desc_a,info, dupl, bldmode) !locals integer(psb_ipk_) :: np,me,nr,i,err_act - integer(psb_ipk_) :: dupl_, bldmode_, nrmt_ + integer(psb_ipk_) :: bldmode_, nrmt_ type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name @@ -95,8 +95,7 @@ subroutine psb_lalloc_vect(x, desc_a,info, dupl, bldmode) goto 9999 endif - allocate(psb_l_base_vect_type :: x%v, stat=info) - if (info == 0) call x%all(nr,info) + call x%all(nr,info) if (psb_errstatus_fatal()) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/nr/),a_err='real(psb_spk_)') @@ -109,12 +108,12 @@ subroutine psb_lalloc_vect(x, desc_a,info, dupl, bldmode) else bldmode_ = psb_matbld_noremote_ end if + call x%set_bld() if (present(dupl)) then - dupl_ = dupl + call x%set_dupl(dupl) else - dupl_ = psb_dupl_def_ - end if - call x%set_dupl(dupl_) + call x%set_dupl(psb_dupl_def_) + end if call x%set_remote_build(bldmode_) call x%set_nrmv(izero) if (x%is_remote_build()) then @@ -210,48 +209,11 @@ subroutine psb_lalloc_vect_r2(x, desc_a,info,n,lb, dupl, bldmode) goto 9999 endif endif - ! As this is a rank-1 array, optional parameter N is actually ignored. - - !....allocate x ..... - if (desc_a%is_asb().or.desc_a%is_upd()) then - nr = max(1,desc_a%get_local_cols()) - else if (desc_a%is_bld()) then - nr = max(1,desc_a%get_local_rows()) - else - info = psb_err_internal_error_ - call psb_errpush(info,name,a_err='Invalid desc_a') - goto 9999 - endif - allocate(x(lb_:lb_+n_-1), stat=info) - if (info == 0) then - do i=lb_, lb_+n_-1 - allocate(psb_l_base_vect_type :: x(i)%v, stat=info) - if (info == 0) call x(i)%all(nr,info) - if (info == 0) call x(i)%zero() - if (info /= 0) exit - end do - end if - - if (present(bldmode)) then - bldmode_ = bldmode - else - bldmode_ = psb_matbld_noremote_ - end if - if (present(dupl)) then - dupl_ = dupl - else - dupl_ = psb_dupl_def_ - end if - do i=lb_, lb_+n_-1 - call x(i)%set_dupl(dupl_) - call x(i)%set_remote_build(bldmode_) - if (x(i)%is_remote_build()) then - nrmt_ = max(100,(desc_a%get_local_cols()-desc_a%get_local_rows())) - allocate(x(i)%rmtv(nrmt_)) - end if + call psb_geall(x(i),desc_a,info,dupl, bldmode) end do + if (psb_errstatus_fatal()) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/nr/),a_err='real(psb_spk_)') @@ -264,7 +226,6 @@ subroutine psb_lalloc_vect_r2(x, desc_a,info,n,lb, dupl, bldmode) 9999 call psb_error_handler(ctxt,err_act) return - end subroutine psb_lalloc_vect_r2 diff --git a/base/tools/psb_lasb.f90 b/base/tools/psb_lasb.f90 index baf553209..c9dba3ab6 100644 --- a/base/tools/psb_lasb.f90 +++ b/base/tools/psb_lasb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! scratch - logical, optional If true, allocate without checking/zeroing contents. ! default: .false. ! -subroutine psb_lasb_vect(x, desc_a, info, mold, scratch) +subroutine psb_lasb_vect(x, desc_a, info, mold, scratch, dupl) use psb_base_mod, psb_protect_name => psb_lasb_vect implicit none @@ -60,6 +60,7 @@ subroutine psb_lasb_vect(x, desc_a, info, mold, scratch) integer(psb_ipk_), intent(out) :: info class(psb_l_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl ! local variables type(psb_ctxt_type) :: ctxt @@ -80,10 +81,9 @@ subroutine psb_lasb_vect(x, desc_a, info, mold, scratch) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - scratch_ = .false. + scratch_ = .false. if (present(scratch)) scratch_ = scratch call psb_info(ctxt, me, np) - dupl_ = x%get_dupl() ! ....verify blacs grid correctness.. if (np == -1) then info = psb_err_context_error_ @@ -100,39 +100,83 @@ subroutine psb_lasb_vect(x, desc_a, info, mold, scratch) if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),': sizes: ',nrow,ncol - if (scratch_) then - call x%free(info) - call x%bld(ncol,mold=mold) + dupl_ = x%get_dupl() + if (try_newins) then + if (scratch_) then + call x%free(info) + call x%bld(ncol,mold=mold,scratch=scratch_) + else + if (x%is_bld().and.present(dupl)) then + call x%set_dupl(dupl) + dupl_ = dupl + end if + + if (x%is_remote_build()) then + block + integer(psb_lpk_), allocatable :: lvx(:) + integer(psb_lpk_), allocatable :: vx(:) + integer(psb_ipk_), allocatable :: ivx(:) + integer(psb_ipk_) :: nrmv, nx, i + + nrmv = x%get_nrmv() + call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) + nx = size(vx) + call psb_realloc(nx,ivx,info) + call desc_a%g2l(lvx,ivx,info,owned=.true.) + call x%ins(nx,ivx,vx,nrow,info) + end block + end if + + call x%asb(ncol,info,scratch=scratch) + ! ..update halo elements.. + call psb_halo(x,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_halo') + goto 9999 + end if + call x%cnv(mold) + end if + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': end' else - if (x%is_remote_build()) then - block - integer(psb_lpk_), allocatable :: lvx(:) - integer(psb_lpk_), allocatable :: vx(:) - integer(psb_ipk_), allocatable :: ivx(:) - integer(psb_ipk_) :: nrmv, nx, i - - nrmv = x%get_nrmv() - call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) - nx = size(vx) - call psb_realloc(nx,ivx,info) - call desc_a%g2l(lvx,ivx,info,owned=.true.) - call x%ins(nx,ivx,vx,info) - end block - end if - - call x%asb(ncol,info) - ! ..update halo elements.. - call psb_halo(x,desc_a,info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='psb_halo') - goto 9999 + if (scratch_) then + call x%free(info) + call x%bld(ncol,mold=mold) + else + if (x%is_bld().and.present(dupl)) then + dupl_ = dupl + end if + if (x%is_remote_build()) then + block + integer(psb_lpk_), allocatable :: lvx(:) + integer(psb_lpk_), allocatable :: vx(:) + integer(psb_ipk_), allocatable :: ivx(:) + integer(psb_ipk_) :: nrmv, nx, i + + nrmv = x%get_nrmv() + call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) + nx = size(vx) + call psb_realloc(nx,ivx,info) + call desc_a%g2l(lvx,ivx,info,owned=.true.) + call x%ins(nx,ivx,vx,nrow,info) + end block + end if + + call x%asb(ncol,info,scratch=scratch) + ! ..update halo elements.. + call psb_halo(x,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_halo') + goto 9999 + end if + call x%cnv(mold) end if - call x%cnv(mold) + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': end' end if - if (debug_level >= psb_debug_ext_) & - & write(debug_unit,*) me,' ',trim(name),': end' call psb_erractionrestore(err_act) return @@ -144,7 +188,7 @@ subroutine psb_lasb_vect(x, desc_a, info, mold, scratch) end subroutine psb_lasb_vect -subroutine psb_lasb_vect_r2(x, desc_a, info, mold, scratch) +subroutine psb_lasb_vect_r2(x, desc_a, info, mold, scratch,dupl) use psb_base_mod, psb_protect_name => psb_lasb_vect_r2 implicit none @@ -153,12 +197,12 @@ subroutine psb_lasb_vect_r2(x, desc_a, info, mold, scratch) integer(psb_ipk_), intent(out) :: info class(psb_l_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl ! local variables type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me, i, n - integer(psb_ipk_) :: i1sz,nrow,ncol, err_act, dupl_ - logical :: scratch_ + integer(psb_ipk_) :: err_act integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name,ch_err @@ -173,8 +217,6 @@ subroutine psb_lasb_vect_r2(x, desc_a, info, mold, scratch) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - scratch_ = .false. - if (present(scratch)) scratch_ = scratch call psb_info(ctxt, me, np) ! ....verify blacs grid correctness.. if (np == -1) then @@ -186,35 +228,11 @@ subroutine psb_lasb_vect_r2(x, desc_a, info, mold, scratch) call psb_errpush(info,name) goto 9999 end if - - nrow = desc_a%get_local_rows() - ncol = desc_a%get_local_cols() n = size(x) - if (debug_level >= psb_debug_ext_) & - & write(debug_unit,*) me,' ',trim(name),': sizes: ',nrow,ncol + do i=1, n + call psb_geasb(x(i),desc_a,info, mold, scratch, dupl) + end do - if (scratch_) then - do i=1,n - call x(i)%free(info) - call x(i)%bld(ncol,mold=mold) - end do - - else - do i=1, n - dupl_ = x(i)%get_dupl() - call x(i)%asb(ncol,info) - if (info /= 0) exit - ! ..update halo elements.. - call psb_halo(x(i),desc_a,info) - if (info /= 0) exit - call x(i)%cnv(mold) - end do - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='psb_halo') - goto 9999 - end if - end if if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),': end' @@ -291,7 +309,7 @@ subroutine psb_lasb_multivect(x, desc_a, info, mold, scratch,n) dupl_ = x%get_dupl() if (scratch_) then call x%free(info) - call x%bld(ncol,n_,mold=mold) + call x%bld(ncol,n_,mold=mold,scratch=.true.) else call x%asb(ncol,n_,info) ! ..update halo elements.. diff --git a/base/tools/psb_lfree.f90 b/base/tools/psb_lfree.f90 index 6630601c0..42c28eb25 100644 --- a/base/tools/psb_lfree.f90 +++ b/base/tools/psb_lfree.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_lins.f90 b/base/tools/psb_lins.f90 index 90da8111d..1070173d1 100644 --- a/base/tools/psb_lins.f90 +++ b/base/tools/psb_lins.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -57,7 +57,7 @@ subroutine psb_lins_vect(m, irw, val, x, desc_a, info, local) logical, intent(in), optional :: local !locals..... - integer(psb_ipk_) :: i, loc_rows,loc_cols + integer(psb_ipk_) :: i, loc_rows, loc_cols integer(psb_lpk_) :: mglob integer(psb_ipk_) :: dupl_ type(psb_ctxt_type) :: ctxt @@ -127,7 +127,7 @@ subroutine psb_lins_vect(m, irw, val, x, desc_a, info, local) else call desc_a%indxmap%g2l(irw(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,val,info) + call x%ins(m,irl,val,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 @@ -198,7 +198,7 @@ subroutine psb_lins_vect_v(m, irw, val, x, desc_a, info, local) logical, intent(in), optional :: local !locals..... - integer(psb_ipk_) :: i, loc_rows,loc_cols,err_act + integer(psb_ipk_) :: i, loc_rows, loc_cols, err_act integer(psb_lpk_) :: mglob type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me @@ -261,7 +261,7 @@ subroutine psb_lins_vect_v(m, irw, val, x, desc_a, info, local) call desc_a%indxmap%g2l(irw%v%v(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,lval,info) + call x%ins(m,irl,lval,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 @@ -368,7 +368,7 @@ subroutine psb_lins_vect_r2(m, irw, val, x, desc_a, info, local) do i=1,n if (.not.allocated(x(i)%v)) info = psb_err_invalid_vect_state_ - if (info == 0) call x(i)%ins(m,irl,val(:,i),info) + if (info == 0) call x(i)%ins(m,irl,val(:,i),loc_rows,info) if (info /= 0) exit end do if (info /= 0) then @@ -475,7 +475,7 @@ subroutine psb_lins_multivect(m, irw, val, x, desc_a, info, local) else call desc_a%indxmap%g2l(irw(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,val,info) + call x%ins(m,irl,val,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 diff --git a/base/tools/psb_loc_to_glob.f90 b/base/tools/psb_loc_to_glob.f90 index e4708b9d7..5be450fce 100644 --- a/base/tools/psb_loc_to_glob.f90 +++ b/base/tools/psb_loc_to_glob.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -122,7 +122,7 @@ end subroutine psb_loc_to_glob2v !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_m_remote_vect.F90 b/base/tools/psb_m_remote_vect.F90 index 54f5ef9c9..94cbba4dc 100644 --- a/base/tools/psb_m_remote_vect.F90 +++ b/base/tools/psb_m_remote_vect.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -105,7 +105,7 @@ subroutine psb_m_remote_vect(n,v,iv,desc_a,x,ix, info) debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -123,7 +123,7 @@ subroutine psb_m_remote_vect(n,v,iv,desc_a,x,ix, info) call desc_a%indxmap%fnd_owner(iv(1:n),iprc,info) - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() sdsz(:) = 0 rvsz(:) = 0 sdsi(:) = 0 diff --git a/base/tools/psb_mallc_a.f90 b/base/tools/psb_mallc_a.f90 index c815e8f93..0f67dda4b 100644 --- a/base/tools/psb_mallc_a.f90 +++ b/base/tools/psb_mallc_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -147,7 +147,7 @@ end subroutine psb_malloc !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_masb_a.f90 b/base/tools/psb_masb_a.f90 index 50f2b7685..46c3ccd44 100644 --- a/base/tools/psb_masb_a.f90 +++ b/base/tools/psb_masb_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -153,7 +153,7 @@ end subroutine psb_masb !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_mfree_a.f90 b/base/tools/psb_mfree_a.f90 index c2f57f216..5beae30ca 100644 --- a/base/tools/psb_mfree_a.f90 +++ b/base/tools/psb_mfree_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_mins_a.f90 b/base/tools/psb_mins_a.f90 index d1549c921..7af8a44d2 100644 --- a/base/tools/psb_mins_a.f90 +++ b/base/tools/psb_mins_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -195,7 +195,7 @@ end subroutine psb_minsvi !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_s_glob_transpose.F90 b/base/tools/psb_s_glob_transpose.F90 index 8b7bff590..bee763ac0 100644 --- a/base/tools/psb_s_glob_transpose.F90 +++ b/base/tools/psb_s_glob_transpose.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -139,7 +139,7 @@ subroutine psb_ls_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx) debug_level = psb_get_debug_level() ctxt = desc_r%get_context() - icomm = desc_r%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -437,7 +437,7 @@ subroutine psb_s_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx) debug_level = psb_get_debug_level() ctxt = desc_r%get_context() - icomm = desc_r%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) diff --git a/base/tools/psb_s_map.f90 b/base/tools/psb_s_map.f90 index e6c6d445c..8cd31e10f 100644 --- a/base/tools/psb_s_map.f90 +++ b/base/tools/psb_s_map.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -112,23 +112,22 @@ subroutine psb_s_map_U2V_a(alpha,x,beta,y,map,info,work) end subroutine psb_s_map_U2V_a -subroutine psb_s_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) +subroutine psb_s_map_U2V_v(alpha,x,beta,y,map,info,vtx,vty) use psb_base_mod, psb_protect_name => psb_s_map_U2V_v implicit none - class(psb_slinmap_type), intent(in) :: map - real(psb_spk_), intent(in) :: alpha,beta - type(psb_s_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - real(psb_spk_), optional :: work(:) + class(psb_slinmap_type), intent(in) :: map + real(psb_spk_), intent(in) :: alpha,beta + type(psb_s_vect_type), intent(inout) :: x,y + integer(psb_ipk_), intent(out) :: info type(psb_s_vect_type), optional, target, intent(inout) :: vtx,vty ! Local - type(psb_s_vect_type), target :: xt, yt - type(psb_s_vect_type),pointer :: ptx, pty - real(psb_spk_), allocatable :: xta(:), yta(:) - integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2 ,& + type(psb_s_vect_type), target :: xt, yt + type(psb_s_vect_type),pointer :: ptx, pty + real(psb_spk_), allocatable :: xta(:), yta(:) + integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2 ,& & map_kind, nr, iam, np - type(psb_ctxt_type) :: ctxt - character(len=20), parameter :: name='psb_map_U2V_v' + type(psb_ctxt_type) :: ctxt + character(len=20), parameter :: name = 'psb_map_U2V_v' info = psb_success_ if (.not.map%is_asb()) then @@ -152,7 +151,7 @@ subroutine psb_s_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) call psb_geasb(yt,map%p_desc_V,info,scratch=.true.,mold=x%v) pty => yt end if - if (info == psb_success_) call psb_halo(x,map%p_desc_U,info,work=work) + if (info == psb_success_) call psb_halo(x,map%p_desc_U,info) if (info == psb_success_) call psb_csmm(sone,map%mat_U2V,x,szero,pty,info) if ((info == psb_success_) .and. map%p_desc_V%is_repl().and.(np>1)) then yta = pty%get_vect() @@ -186,7 +185,7 @@ subroutine psb_s_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) end if call psb_geaxpby(sone,x,szero,ptx,map%desc_U,info) - if (info == psb_success_) call psb_halo(ptx,map%desc_U,info,work=work) + if (info == psb_success_) call psb_halo(ptx,map%desc_U,info) if (info == psb_success_) call psb_csmm(sone,map%mat_U2V,ptx,szero,pty,info) if ((info == psb_success_) .and. map%desc_V%is_repl().and.(np>1)) then yta = pty%get_vect() @@ -294,23 +293,22 @@ subroutine psb_s_map_V2U_a(alpha,x,beta,y,map,info,work) end subroutine psb_s_map_V2U_a -subroutine psb_s_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) +subroutine psb_s_map_V2U_v(alpha,x,beta,y,map,info,vtx,vty) use psb_base_mod, psb_protect_name => psb_s_map_V2U_v implicit none - class(psb_slinmap_type), intent(in) :: map - real(psb_spk_), intent(in) :: alpha,beta - type(psb_s_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - real(psb_spk_), optional :: work(:) + class(psb_slinmap_type), intent(in) :: map + real(psb_spk_), intent(in) :: alpha,beta + type(psb_s_vect_type), intent(inout) :: x,y + integer(psb_ipk_), intent(out) :: info type(psb_s_vect_type), optional, target, intent(inout) :: vtx,vty ! Local - type(psb_s_vect_type), target :: xt, yt - type(psb_s_vect_type),pointer :: ptx, pty - real(psb_spk_), allocatable :: xta(:), yta(:) - integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2,& + type(psb_s_vect_type), target :: xt, yt + type(psb_s_vect_type),pointer :: ptx, pty + real(psb_spk_), allocatable :: xta(:), yta(:) + integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2,& & map_kind, nr, iam, np - type(psb_ctxt_type) :: ctxt - character(len=20), parameter :: name='psb_map_V2U_v' + type(psb_ctxt_type) :: ctxt + character(len=20), parameter :: name = 'psb_map_V2U_v' info = psb_success_ if (.not.map%is_asb()) then @@ -334,7 +332,7 @@ subroutine psb_s_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) call psb_geasb(yt,map%p_desc_U,info,scratch=.true.,mold=x%v) pty => yt end if - if (info == psb_success_) call psb_halo(x,map%p_desc_V,info,work=work) + if (info == psb_success_) call psb_halo(x,map%p_desc_V,info) if (info == psb_success_) call psb_csmm(sone,map%mat_V2U,x,szero,pty,info) if ((info == psb_success_) .and. map%p_desc_U%is_repl().and.(np>1)) then yta = pty%get_vect() @@ -369,7 +367,7 @@ subroutine psb_s_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) call psb_geaxpby(sone,x,szero,ptx,map%desc_V,info) - if (info == psb_success_) call psb_halo(ptx,map%desc_V,info,work=work) + if (info == psb_success_) call psb_halo(ptx,map%desc_V,info) if (info == psb_success_) call psb_csmm(sone,map%mat_V2U,ptx,szero,pty,info) if ((info == psb_success_) .and. map%desc_U%is_repl().and.(np>1)) then yta = pty%get_vect() diff --git a/base/tools/psb_s_par_csr_spspmm.f90 b/base/tools/psb_s_par_csr_spspmm.f90 index 4e70478f7..ca21351a0 100644 --- a/base/tools/psb_s_par_csr_spspmm.f90 +++ b/base/tools/psb_s_par_csr_spspmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -66,7 +66,8 @@ Subroutine psb_s_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_s_tools_mod, psb_protect_name => psb_s_par_csr_spspmm - use psb_s_serial_mod, only : psb_scsrspspmm, psb_sbase_rwextd + use psb_s_csr_mat_mod, only : psb_scsrspspmm + use psb_s_serial_mod, only : psb_sbase_rwextd Implicit None type(psb_s_csr_sparse_mat),intent(in) :: acsr @@ -166,7 +167,8 @@ Subroutine psb_ls_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_s_tools_mod, psb_protect_name => psb_ls_par_csr_spspmm - use psb_s_serial_mod, only : psb_lscsrspspmm, psb_lsbase_rwextd + use psb_s_csr_mat_mod, only : psb_lscsrspspmm + use psb_s_serial_mod, only : psb_lsbase_rwextd Implicit None type(psb_ls_csr_sparse_mat),intent(in) :: acsr diff --git a/base/tools/psb_s_remap.F90 b/base/tools/psb_s_remap.F90 index b7cf73696..6f5365b32 100644 --- a/base/tools/psb_s_remap.F90 +++ b/base/tools/psb_s_remap.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_s_remote_mat.F90 b/base/tools/psb_s_remote_mat.F90 index 713f87361..a9bc2a7a5 100644 --- a/base/tools/psb_s_remote_mat.F90 +++ b/base/tools/psb_s_remote_mat.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -118,7 +118,7 @@ Subroutine psb_ls_remote_mat(a,desc_a,b,info) debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -150,7 +150,7 @@ Subroutine psb_ls_remote_mat(a,desc_a,b,info) call desc_a%indxmap%fnd_owner(a%ia(1:nz),iprc,info) - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() sdsz(:)=0 rvsz(:)=0 sdsi(:)=0 diff --git a/base/tools/psb_s_remote_vect.F90 b/base/tools/psb_s_remote_vect.F90 index d103b694a..cd7fe19ea 100644 --- a/base/tools/psb_s_remote_vect.F90 +++ b/base/tools/psb_s_remote_vect.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -105,7 +105,7 @@ subroutine psb_s_remote_vect(n,v,iv,desc_a,x,ix, info) debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -123,7 +123,7 @@ subroutine psb_s_remote_vect(n,v,iv,desc_a,x,ix, info) call desc_a%indxmap%fnd_owner(iv(1:n),iprc,info) - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() sdsz(:) = 0 rvsz(:) = 0 sdsi(:) = 0 diff --git a/base/tools/psb_sallc.f90 b/base/tools/psb_sallc.f90 index d318e45f2..518b269dd 100644 --- a/base/tools/psb_sallc.f90 +++ b/base/tools/psb_sallc.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -53,7 +53,7 @@ subroutine psb_salloc_vect(x, desc_a,info, dupl, bldmode) !locals integer(psb_ipk_) :: np,me,nr,i,err_act - integer(psb_ipk_) :: dupl_, bldmode_, nrmt_ + integer(psb_ipk_) :: bldmode_, nrmt_ type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name @@ -95,8 +95,7 @@ subroutine psb_salloc_vect(x, desc_a,info, dupl, bldmode) goto 9999 endif - allocate(psb_s_base_vect_type :: x%v, stat=info) - if (info == 0) call x%all(nr,info) + call x%all(nr,info) if (psb_errstatus_fatal()) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/nr/),a_err='real(psb_spk_)') @@ -109,12 +108,12 @@ subroutine psb_salloc_vect(x, desc_a,info, dupl, bldmode) else bldmode_ = psb_matbld_noremote_ end if + call x%set_bld() if (present(dupl)) then - dupl_ = dupl + call x%set_dupl(dupl) else - dupl_ = psb_dupl_def_ - end if - call x%set_dupl(dupl_) + call x%set_dupl(psb_dupl_def_) + end if call x%set_remote_build(bldmode_) call x%set_nrmv(izero) if (x%is_remote_build()) then @@ -210,48 +209,11 @@ subroutine psb_salloc_vect_r2(x, desc_a,info,n,lb, dupl, bldmode) goto 9999 endif endif - ! As this is a rank-1 array, optional parameter N is actually ignored. - - !....allocate x ..... - if (desc_a%is_asb().or.desc_a%is_upd()) then - nr = max(1,desc_a%get_local_cols()) - else if (desc_a%is_bld()) then - nr = max(1,desc_a%get_local_rows()) - else - info = psb_err_internal_error_ - call psb_errpush(info,name,a_err='Invalid desc_a') - goto 9999 - endif - allocate(x(lb_:lb_+n_-1), stat=info) - if (info == 0) then - do i=lb_, lb_+n_-1 - allocate(psb_s_base_vect_type :: x(i)%v, stat=info) - if (info == 0) call x(i)%all(nr,info) - if (info == 0) call x(i)%zero() - if (info /= 0) exit - end do - end if - - if (present(bldmode)) then - bldmode_ = bldmode - else - bldmode_ = psb_matbld_noremote_ - end if - if (present(dupl)) then - dupl_ = dupl - else - dupl_ = psb_dupl_def_ - end if - do i=lb_, lb_+n_-1 - call x(i)%set_dupl(dupl_) - call x(i)%set_remote_build(bldmode_) - if (x(i)%is_remote_build()) then - nrmt_ = max(100,(desc_a%get_local_cols()-desc_a%get_local_rows())) - allocate(x(i)%rmtv(nrmt_)) - end if + call psb_geall(x(i),desc_a,info,dupl, bldmode) end do + if (psb_errstatus_fatal()) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/nr/),a_err='real(psb_spk_)') @@ -264,7 +226,6 @@ subroutine psb_salloc_vect_r2(x, desc_a,info,n,lb, dupl, bldmode) 9999 call psb_error_handler(ctxt,err_act) return - end subroutine psb_salloc_vect_r2 diff --git a/base/tools/psb_sallc_a.f90 b/base/tools/psb_sallc_a.f90 index 3b511d61b..9a50199fd 100644 --- a/base/tools/psb_sallc_a.f90 +++ b/base/tools/psb_sallc_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -147,7 +147,7 @@ end subroutine psb_salloc !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_sasb.f90 b/base/tools/psb_sasb.f90 index 315e24ff0..24670a0e9 100644 --- a/base/tools/psb_sasb.f90 +++ b/base/tools/psb_sasb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! scratch - logical, optional If true, allocate without checking/zeroing contents. ! default: .false. ! -subroutine psb_sasb_vect(x, desc_a, info, mold, scratch) +subroutine psb_sasb_vect(x, desc_a, info, mold, scratch, dupl) use psb_base_mod, psb_protect_name => psb_sasb_vect implicit none @@ -60,6 +60,7 @@ subroutine psb_sasb_vect(x, desc_a, info, mold, scratch) integer(psb_ipk_), intent(out) :: info class(psb_s_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl ! local variables type(psb_ctxt_type) :: ctxt @@ -80,10 +81,9 @@ subroutine psb_sasb_vect(x, desc_a, info, mold, scratch) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - scratch_ = .false. + scratch_ = .false. if (present(scratch)) scratch_ = scratch call psb_info(ctxt, me, np) - dupl_ = x%get_dupl() ! ....verify blacs grid correctness.. if (np == -1) then info = psb_err_context_error_ @@ -100,39 +100,83 @@ subroutine psb_sasb_vect(x, desc_a, info, mold, scratch) if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),': sizes: ',nrow,ncol - if (scratch_) then - call x%free(info) - call x%bld(ncol,mold=mold) + dupl_ = x%get_dupl() + if (try_newins) then + if (scratch_) then + call x%free(info) + call x%bld(ncol,mold=mold,scratch=scratch_) + else + if (x%is_bld().and.present(dupl)) then + call x%set_dupl(dupl) + dupl_ = dupl + end if + + if (x%is_remote_build()) then + block + integer(psb_lpk_), allocatable :: lvx(:) + real(psb_spk_), allocatable :: vx(:) + integer(psb_ipk_), allocatable :: ivx(:) + integer(psb_ipk_) :: nrmv, nx, i + + nrmv = x%get_nrmv() + call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) + nx = size(vx) + call psb_realloc(nx,ivx,info) + call desc_a%g2l(lvx,ivx,info,owned=.true.) + call x%ins(nx,ivx,vx,nrow,info) + end block + end if + + call x%asb(ncol,info,scratch=scratch) + ! ..update halo elements.. + call psb_halo(x,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_halo') + goto 9999 + end if + call x%cnv(mold) + end if + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': end' else - if (x%is_remote_build()) then - block - integer(psb_lpk_), allocatable :: lvx(:) - real(psb_spk_), allocatable :: vx(:) - integer(psb_ipk_), allocatable :: ivx(:) - integer(psb_ipk_) :: nrmv, nx, i - - nrmv = x%get_nrmv() - call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) - nx = size(vx) - call psb_realloc(nx,ivx,info) - call desc_a%g2l(lvx,ivx,info,owned=.true.) - call x%ins(nx,ivx,vx,info) - end block - end if - - call x%asb(ncol,info) - ! ..update halo elements.. - call psb_halo(x,desc_a,info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='psb_halo') - goto 9999 + if (scratch_) then + call x%free(info) + call x%bld(ncol,mold=mold) + else + if (x%is_bld().and.present(dupl)) then + dupl_ = dupl + end if + if (x%is_remote_build()) then + block + integer(psb_lpk_), allocatable :: lvx(:) + real(psb_spk_), allocatable :: vx(:) + integer(psb_ipk_), allocatable :: ivx(:) + integer(psb_ipk_) :: nrmv, nx, i + + nrmv = x%get_nrmv() + call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) + nx = size(vx) + call psb_realloc(nx,ivx,info) + call desc_a%g2l(lvx,ivx,info,owned=.true.) + call x%ins(nx,ivx,vx,nrow,info) + end block + end if + + call x%asb(ncol,info,scratch=scratch) + ! ..update halo elements.. + call psb_halo(x,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_halo') + goto 9999 + end if + call x%cnv(mold) end if - call x%cnv(mold) + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': end' end if - if (debug_level >= psb_debug_ext_) & - & write(debug_unit,*) me,' ',trim(name),': end' call psb_erractionrestore(err_act) return @@ -144,7 +188,7 @@ subroutine psb_sasb_vect(x, desc_a, info, mold, scratch) end subroutine psb_sasb_vect -subroutine psb_sasb_vect_r2(x, desc_a, info, mold, scratch) +subroutine psb_sasb_vect_r2(x, desc_a, info, mold, scratch,dupl) use psb_base_mod, psb_protect_name => psb_sasb_vect_r2 implicit none @@ -153,12 +197,12 @@ subroutine psb_sasb_vect_r2(x, desc_a, info, mold, scratch) integer(psb_ipk_), intent(out) :: info class(psb_s_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl ! local variables type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me, i, n - integer(psb_ipk_) :: i1sz,nrow,ncol, err_act, dupl_ - logical :: scratch_ + integer(psb_ipk_) :: err_act integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name,ch_err @@ -173,8 +217,6 @@ subroutine psb_sasb_vect_r2(x, desc_a, info, mold, scratch) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - scratch_ = .false. - if (present(scratch)) scratch_ = scratch call psb_info(ctxt, me, np) ! ....verify blacs grid correctness.. if (np == -1) then @@ -186,35 +228,11 @@ subroutine psb_sasb_vect_r2(x, desc_a, info, mold, scratch) call psb_errpush(info,name) goto 9999 end if - - nrow = desc_a%get_local_rows() - ncol = desc_a%get_local_cols() n = size(x) - if (debug_level >= psb_debug_ext_) & - & write(debug_unit,*) me,' ',trim(name),': sizes: ',nrow,ncol + do i=1, n + call psb_geasb(x(i),desc_a,info, mold, scratch, dupl) + end do - if (scratch_) then - do i=1,n - call x(i)%free(info) - call x(i)%bld(ncol,mold=mold) - end do - - else - do i=1, n - dupl_ = x(i)%get_dupl() - call x(i)%asb(ncol,info) - if (info /= 0) exit - ! ..update halo elements.. - call psb_halo(x(i),desc_a,info) - if (info /= 0) exit - call x(i)%cnv(mold) - end do - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='psb_halo') - goto 9999 - end if - end if if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),': end' @@ -291,7 +309,7 @@ subroutine psb_sasb_multivect(x, desc_a, info, mold, scratch,n) dupl_ = x%get_dupl() if (scratch_) then call x%free(info) - call x%bld(ncol,n_,mold=mold) + call x%bld(ncol,n_,mold=mold,scratch=.true.) else call x%asb(ncol,n_,info) ! ..update halo elements.. diff --git a/base/tools/psb_sasb_a.f90 b/base/tools/psb_sasb_a.f90 index 76dbdafbe..a6a4ef347 100644 --- a/base/tools/psb_sasb_a.f90 +++ b/base/tools/psb_sasb_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -153,7 +153,7 @@ end subroutine psb_sasb !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_scdbldext.F90 b/base/tools/psb_scdbldext.F90 index bdced5418..d7a5f7223 100644 --- a/base/tools/psb_scdbldext.F90 +++ b/base/tools/psb_scdbldext.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -117,7 +117,7 @@ Subroutine psb_scdbldext(a,desc_a,novr,desc_ov,info, extype) goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) If (debug_level >= psb_debug_outer_) & diff --git a/base/tools/psb_sfree.f90 b/base/tools/psb_sfree.f90 index add6162b5..90c397c28 100644 --- a/base/tools/psb_sfree.f90 +++ b/base/tools/psb_sfree.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_sfree_a.f90 b/base/tools/psb_sfree_a.f90 index 036bb903c..b8f1e7c7f 100644 --- a/base/tools/psb_sfree_a.f90 +++ b/base/tools/psb_sfree_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_sgetelem.f90 b/base/tools/psb_sgetelem.f90 index 723a2f7df..73ab33efa 100644 --- a/base/tools/psb_sgetelem.f90 +++ b/base/tools/psb_sgetelem.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -108,3 +108,92 @@ function psb_s_getelem(x,index,desc_a,info) result(res) end function +! Function: psb_s_getmatelem +! Extract entries from a sparse matrix. Note: the row and column indices in index +! are assumed to be in global numbering and are converted on the fly. +! +! Arguments: +! a - type(psb_sspmat_type) The source matrix +! desc_a - type(psb_desc_type). The communication descriptor. +! rowindex - integer. Row index of x of the value to extract +! colindex - integer. Column index of x of the value to extract +! iam - integer. Index of the process requesting the value +! info - integer. return code + + +function psb_s_getmatelem(a,rowindex,colindex,desc_a,info) result(res) + use psb_base_mod, psb_protect_name => psb_s_getmatelem + use psi_mod + implicit none + + type(psb_sspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a + integer(psb_lpk_), intent(in) :: rowindex, colindex + integer(psb_ipk_), intent(out) :: info + real(psb_spk_) :: res + + !locals + integer(psb_ipk_) :: localrowindex(1), localcolindex(1), jmin, jmax, imin, imax + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act + integer(psb_lpk_) :: growindex(1), gcolindex(1) + integer(psb_lpk_), allocatable :: myidx(:),mylocal(:) + integer(psb_ipk_), allocatable, dimension(:) :: ia, ja + integer(psb_ipk_) :: nz + real(psb_spk_), allocatable, dimension(:) :: val + character(len=20) :: name + logical, parameter :: debug = .false. + + growindex(1) = rowindex + gcolindex(1) = colindex + res = szero + if (psb_errstatus_fatal()) return + info=psb_success_ + call psb_erractionsave(err_act) + name = 'psb_s_getmatelem' + + if (.not.desc_a%is_ok()) then + info = psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + end if + + ctxt = desc_a%get_context() + + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + call desc_a%indxmap%g2l(growindex,localrowindex,info,owned=.false.) + call desc_a%indxmap%g2l(gcolindex,localcolindex,info,owned=.false.) + imin = localrowindex(1) + imax = localrowindex(1) + jmin = localcolindex(1) + jmax = localcolindex(1) + if(debug.and.(localrowindex(1) < 1 .or. localcolindex(1) < 1)) then + write(*,*)"Process ",me," owns ",desc_a%get_local_rows()," rows"," Global row index is ", & + growindex,"Local row index is ",localrowindex + write(*,*)"Process ",me," owns ",desc_a%get_local_cols()," cols"," Global col index is ", & + gcolindex,"Local col index is ",localcolindex + myidx = desc_a%get_global_indices(owned=.false.) + mylocal = desc_a%get_global_indices(owned=.true.) + write(*,*)"My (local+halo) indexes are: ",myidx + write(*,*)"My (local) indexes are: ",mylocal + end if + if ( localrowindex(1) < 1 .or. localcolindex(1) < 1) then + res = szero + else + call a%csget(imin, imax, nz, ia, ja, val, info, jmin=jmin, jmax=jmax) + res = val(1) + end if + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + +end function diff --git a/base/tools/psb_sins.f90 b/base/tools/psb_sins.f90 index ddead81ff..bc3a73db0 100644 --- a/base/tools/psb_sins.f90 +++ b/base/tools/psb_sins.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -57,7 +57,7 @@ subroutine psb_sins_vect(m, irw, val, x, desc_a, info, local) logical, intent(in), optional :: local !locals..... - integer(psb_ipk_) :: i, loc_rows,loc_cols + integer(psb_ipk_) :: i, loc_rows, loc_cols integer(psb_lpk_) :: mglob integer(psb_ipk_) :: dupl_ type(psb_ctxt_type) :: ctxt @@ -127,7 +127,7 @@ subroutine psb_sins_vect(m, irw, val, x, desc_a, info, local) else call desc_a%indxmap%g2l(irw(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,val,info) + call x%ins(m,irl,val,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 @@ -198,7 +198,7 @@ subroutine psb_sins_vect_v(m, irw, val, x, desc_a, info, local) logical, intent(in), optional :: local !locals..... - integer(psb_ipk_) :: i, loc_rows,loc_cols,err_act + integer(psb_ipk_) :: i, loc_rows, loc_cols, err_act integer(psb_lpk_) :: mglob type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me @@ -261,7 +261,7 @@ subroutine psb_sins_vect_v(m, irw, val, x, desc_a, info, local) call desc_a%indxmap%g2l(irw%v%v(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,lval,info) + call x%ins(m,irl,lval,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 @@ -368,7 +368,7 @@ subroutine psb_sins_vect_r2(m, irw, val, x, desc_a, info, local) do i=1,n if (.not.allocated(x(i)%v)) info = psb_err_invalid_vect_state_ - if (info == 0) call x(i)%ins(m,irl,val(:,i),info) + if (info == 0) call x(i)%ins(m,irl,val(:,i),loc_rows,info) if (info /= 0) exit end do if (info /= 0) then @@ -475,7 +475,7 @@ subroutine psb_sins_multivect(m, irw, val, x, desc_a, info, local) else call desc_a%indxmap%g2l(irw(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,val,info) + call x%ins(m,irl,val,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 diff --git a/base/tools/psb_sins_a.f90 b/base/tools/psb_sins_a.f90 index 629ad7832..d1e8db110 100644 --- a/base/tools/psb_sins_a.f90 +++ b/base/tools/psb_sins_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -195,7 +195,7 @@ end subroutine psb_sinsvi !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_sspalloc.f90 b/base/tools/psb_sspalloc.f90 index 8004e7421..3e421d5a3 100644 --- a/base/tools/psb_sspalloc.f90 +++ b/base/tools/psb_sspalloc.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_sspasb.f90 b/base/tools/psb_sspasb.f90 index 110097c53..971efe06c 100644 --- a/base/tools/psb_sspasb.f90 +++ b/base/tools/psb_sspasb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,7 +44,7 @@ ! psb_upd_perm_ Permutation(more memory) ! ! -subroutine psb_sspasb(a,desc_a, info, afmt, upd, mold, bld_and) +subroutine psb_sspasb(a,desc_a, info, afmt, upd, mold, dupl, bld_and) use psb_base_mod, psb_protect_name => psb_sspasb use psb_sort_mod use psi_mod @@ -59,6 +59,7 @@ subroutine psb_sspasb(a,desc_a, info, afmt, upd, mold, bld_and) character(len=*), optional, intent(in) :: afmt class(psb_s_base_sparse_mat), intent(in), optional :: mold logical, intent(in), optional :: bld_and + integer(psb_ipk_), optional, intent(in) :: dupl !....Locals.... type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me, err_act @@ -103,7 +104,12 @@ subroutine psb_sspasb(a,desc_a, info, afmt, upd, mold, bld_and) !check on errors encountered in psdspins if (a%is_bld()) then - dupl_ = a%get_dupl() + if (present(dupl)) then + dupl_ = dupl + else + dupl_ = a%get_dupl() + end if + ! ! First case: we come from a fresh build. ! @@ -180,7 +186,7 @@ subroutine psb_sspasb(a,desc_a, info, afmt, upd, mold, bld_and) if (bld_and_) then !!$ allocate(a%ad,mold=a%a) !!$ allocate(a%and,mold=a%a)o - call a%split_nd(n_row,n_col,info) +!!$ call a%split_nd(n_row,n_col,info) !!$ block !!$ character(len=1024) :: fname !!$ type(psb_s_coo_sparse_mat) :: acoo diff --git a/base/tools/psb_sspfree.f90 b/base/tools/psb_sspfree.f90 index 968e9f9a6..073f8cdc6 100644 --- a/base/tools/psb_sspfree.f90 +++ b/base/tools/psb_sspfree.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_ssphalo.F90 b/base/tools/psb_ssphalo.F90 index 81e9616f9..c33a560b7 100644 --- a/base/tools/psb_ssphalo.F90 +++ b/base/tools/psb_ssphalo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -127,7 +127,7 @@ Subroutine psb_ssphalo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -198,7 +198,7 @@ Subroutine psb_ssphalo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract the row size lnr = 0 @@ -587,7 +587,7 @@ Subroutine psb_lssphalo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -658,7 +658,7 @@ Subroutine psb_lssphalo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract and send/receive. lnr = 0 @@ -931,7 +931,7 @@ Subroutine psb_ls_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -1004,7 +1004,7 @@ Subroutine psb_ls_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract the row size lnr = 0 @@ -1293,7 +1293,7 @@ Subroutine psb_s_ls_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -1366,7 +1366,7 @@ Subroutine psb_s_ls_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract the row size lnr = 0 diff --git a/base/tools/psb_sspins.F90 b/base/tools/psb_sspins.F90 index 377c6e23a..74497707f 100644 --- a/base/tools/psb_sspins.F90 +++ b/base/tools/psb_sspins.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_ssprn.f90 b/base/tools/psb_ssprn.f90 index 602867e67..6b687306f 100644 --- a/base/tools/psb_ssprn.f90 +++ b/base/tools/psb_ssprn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_z_glob_transpose.F90 b/base/tools/psb_z_glob_transpose.F90 index df86635b9..339d2804e 100644 --- a/base/tools/psb_z_glob_transpose.F90 +++ b/base/tools/psb_z_glob_transpose.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -139,7 +139,7 @@ subroutine psb_lz_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx) debug_level = psb_get_debug_level() ctxt = desc_r%get_context() - icomm = desc_r%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -437,7 +437,7 @@ subroutine psb_z_coo_glob_transpose(ain,desc_r,info,atrans,desc_c,desc_rx) debug_level = psb_get_debug_level() ctxt = desc_r%get_context() - icomm = desc_r%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) diff --git a/base/tools/psb_z_map.f90 b/base/tools/psb_z_map.f90 index 0aba3e3eb..e7c8a7409 100644 --- a/base/tools/psb_z_map.f90 +++ b/base/tools/psb_z_map.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -112,23 +112,22 @@ subroutine psb_z_map_U2V_a(alpha,x,beta,y,map,info,work) end subroutine psb_z_map_U2V_a -subroutine psb_z_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) +subroutine psb_z_map_U2V_v(alpha,x,beta,y,map,info,vtx,vty) use psb_base_mod, psb_protect_name => psb_z_map_U2V_v implicit none - class(psb_zlinmap_type), intent(in) :: map - complex(psb_dpk_), intent(in) :: alpha,beta - type(psb_z_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), optional :: work(:) + class(psb_zlinmap_type), intent(in) :: map + complex(psb_dpk_), intent(in) :: alpha,beta + type(psb_z_vect_type), intent(inout) :: x,y + integer(psb_ipk_), intent(out) :: info type(psb_z_vect_type), optional, target, intent(inout) :: vtx,vty ! Local - type(psb_z_vect_type), target :: xt, yt - type(psb_z_vect_type),pointer :: ptx, pty - complex(psb_dpk_), allocatable :: xta(:), yta(:) - integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2 ,& + type(psb_z_vect_type), target :: xt, yt + type(psb_z_vect_type),pointer :: ptx, pty + complex(psb_dpk_), allocatable :: xta(:), yta(:) + integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2 ,& & map_kind, nr, iam, np - type(psb_ctxt_type) :: ctxt - character(len=20), parameter :: name='psb_map_U2V_v' + type(psb_ctxt_type) :: ctxt + character(len=20), parameter :: name = 'psb_map_U2V_v' info = psb_success_ if (.not.map%is_asb()) then @@ -152,7 +151,7 @@ subroutine psb_z_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) call psb_geasb(yt,map%p_desc_V,info,scratch=.true.,mold=x%v) pty => yt end if - if (info == psb_success_) call psb_halo(x,map%p_desc_U,info,work=work) + if (info == psb_success_) call psb_halo(x,map%p_desc_U,info) if (info == psb_success_) call psb_csmm(zone,map%mat_U2V,x,zzero,pty,info) if ((info == psb_success_) .and. map%p_desc_V%is_repl().and.(np>1)) then yta = pty%get_vect() @@ -186,7 +185,7 @@ subroutine psb_z_map_U2V_v(alpha,x,beta,y,map,info,work,vtx,vty) end if call psb_geaxpby(zone,x,zzero,ptx,map%desc_U,info) - if (info == psb_success_) call psb_halo(ptx,map%desc_U,info,work=work) + if (info == psb_success_) call psb_halo(ptx,map%desc_U,info) if (info == psb_success_) call psb_csmm(zone,map%mat_U2V,ptx,zzero,pty,info) if ((info == psb_success_) .and. map%desc_V%is_repl().and.(np>1)) then yta = pty%get_vect() @@ -294,23 +293,22 @@ subroutine psb_z_map_V2U_a(alpha,x,beta,y,map,info,work) end subroutine psb_z_map_V2U_a -subroutine psb_z_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) +subroutine psb_z_map_V2U_v(alpha,x,beta,y,map,info,vtx,vty) use psb_base_mod, psb_protect_name => psb_z_map_V2U_v implicit none - class(psb_zlinmap_type), intent(in) :: map - complex(psb_dpk_), intent(in) :: alpha,beta - type(psb_z_vect_type), intent(inout) :: x,y - integer(psb_ipk_), intent(out) :: info - complex(psb_dpk_), optional :: work(:) + class(psb_zlinmap_type), intent(in) :: map + complex(psb_dpk_), intent(in) :: alpha,beta + type(psb_z_vect_type), intent(inout) :: x,y + integer(psb_ipk_), intent(out) :: info type(psb_z_vect_type), optional, target, intent(inout) :: vtx,vty ! Local - type(psb_z_vect_type), target :: xt, yt - type(psb_z_vect_type),pointer :: ptx, pty - complex(psb_dpk_), allocatable :: xta(:), yta(:) - integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2,& + type(psb_z_vect_type), target :: xt, yt + type(psb_z_vect_type),pointer :: ptx, pty + complex(psb_dpk_), allocatable :: xta(:), yta(:) + integer(psb_ipk_) :: i, j, nr1, nc1,nr2, nc2,& & map_kind, nr, iam, np - type(psb_ctxt_type) :: ctxt - character(len=20), parameter :: name='psb_map_V2U_v' + type(psb_ctxt_type) :: ctxt + character(len=20), parameter :: name = 'psb_map_V2U_v' info = psb_success_ if (.not.map%is_asb()) then @@ -334,7 +332,7 @@ subroutine psb_z_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) call psb_geasb(yt,map%p_desc_U,info,scratch=.true.,mold=x%v) pty => yt end if - if (info == psb_success_) call psb_halo(x,map%p_desc_V,info,work=work) + if (info == psb_success_) call psb_halo(x,map%p_desc_V,info) if (info == psb_success_) call psb_csmm(zone,map%mat_V2U,x,zzero,pty,info) if ((info == psb_success_) .and. map%p_desc_U%is_repl().and.(np>1)) then yta = pty%get_vect() @@ -369,7 +367,7 @@ subroutine psb_z_map_V2U_v(alpha,x,beta,y,map,info,work,vtx,vty) call psb_geaxpby(zone,x,zzero,ptx,map%desc_V,info) - if (info == psb_success_) call psb_halo(ptx,map%desc_V,info,work=work) + if (info == psb_success_) call psb_halo(ptx,map%desc_V,info) if (info == psb_success_) call psb_csmm(zone,map%mat_V2U,ptx,zzero,pty,info) if ((info == psb_success_) .and. map%desc_U%is_repl().and.(np>1)) then yta = pty%get_vect() diff --git a/base/tools/psb_z_par_csr_spspmm.f90 b/base/tools/psb_z_par_csr_spspmm.f90 index 5ccf58d36..455d2128f 100644 --- a/base/tools/psb_z_par_csr_spspmm.f90 +++ b/base/tools/psb_z_par_csr_spspmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -66,7 +66,8 @@ Subroutine psb_z_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_z_tools_mod, psb_protect_name => psb_z_par_csr_spspmm - use psb_z_serial_mod, only : psb_zcsrspspmm, psb_zbase_rwextd + use psb_z_csr_mat_mod, only : psb_zcsrspspmm + use psb_z_serial_mod, only : psb_zbase_rwextd Implicit None type(psb_z_csr_sparse_mat),intent(in) :: acsr @@ -166,7 +167,8 @@ Subroutine psb_lz_par_csr_spspmm(acsr,desc_a,bcsr,ccsr,desc_c,info,data) use psb_comm_mod use psb_penv_mod use psb_z_tools_mod, psb_protect_name => psb_lz_par_csr_spspmm - use psb_z_serial_mod, only : psb_lzcsrspspmm, psb_lzbase_rwextd + use psb_z_csr_mat_mod, only : psb_lzcsrspspmm + use psb_z_serial_mod, only : psb_lzbase_rwextd Implicit None type(psb_lz_csr_sparse_mat),intent(in) :: acsr diff --git a/base/tools/psb_z_remap.F90 b/base/tools/psb_z_remap.F90 index 661ae3cc9..c8d23a600 100644 --- a/base/tools/psb_z_remap.F90 +++ b/base/tools/psb_z_remap.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_z_remote_mat.F90 b/base/tools/psb_z_remote_mat.F90 index a9dc1721c..c30f7896f 100644 --- a/base/tools/psb_z_remote_mat.F90 +++ b/base/tools/psb_z_remote_mat.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -118,7 +118,7 @@ Subroutine psb_lz_remote_mat(a,desc_a,b,info) debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -150,7 +150,7 @@ Subroutine psb_lz_remote_mat(a,desc_a,b,info) call desc_a%indxmap%fnd_owner(a%ia(1:nz),iprc,info) - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() sdsz(:)=0 rvsz(:)=0 sdsi(:)=0 diff --git a/base/tools/psb_z_remote_vect.F90 b/base/tools/psb_z_remote_vect.F90 index 9670598a6..083d23d7e 100644 --- a/base/tools/psb_z_remote_vect.F90 +++ b/base/tools/psb_z_remote_vect.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -105,7 +105,7 @@ subroutine psb_z_remote_vect(n,v,iv,desc_a,x,ix, info) debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -123,7 +123,7 @@ subroutine psb_z_remote_vect(n,v,iv,desc_a,x,ix, info) call desc_a%indxmap%fnd_owner(iv(1:n),iprc,info) - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() sdsz(:) = 0 rvsz(:) = 0 sdsi(:) = 0 diff --git a/base/tools/psb_zallc.f90 b/base/tools/psb_zallc.f90 index b43e57cac..a3ffa1ee7 100644 --- a/base/tools/psb_zallc.f90 +++ b/base/tools/psb_zallc.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -53,7 +53,7 @@ subroutine psb_zalloc_vect(x, desc_a,info, dupl, bldmode) !locals integer(psb_ipk_) :: np,me,nr,i,err_act - integer(psb_ipk_) :: dupl_, bldmode_, nrmt_ + integer(psb_ipk_) :: bldmode_, nrmt_ type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name @@ -95,8 +95,7 @@ subroutine psb_zalloc_vect(x, desc_a,info, dupl, bldmode) goto 9999 endif - allocate(psb_z_base_vect_type :: x%v, stat=info) - if (info == 0) call x%all(nr,info) + call x%all(nr,info) if (psb_errstatus_fatal()) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/nr/),a_err='real(psb_spk_)') @@ -109,12 +108,12 @@ subroutine psb_zalloc_vect(x, desc_a,info, dupl, bldmode) else bldmode_ = psb_matbld_noremote_ end if + call x%set_bld() if (present(dupl)) then - dupl_ = dupl + call x%set_dupl(dupl) else - dupl_ = psb_dupl_def_ - end if - call x%set_dupl(dupl_) + call x%set_dupl(psb_dupl_def_) + end if call x%set_remote_build(bldmode_) call x%set_nrmv(izero) if (x%is_remote_build()) then @@ -210,48 +209,11 @@ subroutine psb_zalloc_vect_r2(x, desc_a,info,n,lb, dupl, bldmode) goto 9999 endif endif - ! As this is a rank-1 array, optional parameter N is actually ignored. - - !....allocate x ..... - if (desc_a%is_asb().or.desc_a%is_upd()) then - nr = max(1,desc_a%get_local_cols()) - else if (desc_a%is_bld()) then - nr = max(1,desc_a%get_local_rows()) - else - info = psb_err_internal_error_ - call psb_errpush(info,name,a_err='Invalid desc_a') - goto 9999 - endif - allocate(x(lb_:lb_+n_-1), stat=info) - if (info == 0) then - do i=lb_, lb_+n_-1 - allocate(psb_z_base_vect_type :: x(i)%v, stat=info) - if (info == 0) call x(i)%all(nr,info) - if (info == 0) call x(i)%zero() - if (info /= 0) exit - end do - end if - - if (present(bldmode)) then - bldmode_ = bldmode - else - bldmode_ = psb_matbld_noremote_ - end if - if (present(dupl)) then - dupl_ = dupl - else - dupl_ = psb_dupl_def_ - end if - do i=lb_, lb_+n_-1 - call x(i)%set_dupl(dupl_) - call x(i)%set_remote_build(bldmode_) - if (x(i)%is_remote_build()) then - nrmt_ = max(100,(desc_a%get_local_cols()-desc_a%get_local_rows())) - allocate(x(i)%rmtv(nrmt_)) - end if + call psb_geall(x(i),desc_a,info,dupl, bldmode) end do + if (psb_errstatus_fatal()) then info=psb_err_alloc_request_ call psb_errpush(info,name,i_err=(/nr/),a_err='real(psb_spk_)') @@ -264,7 +226,6 @@ subroutine psb_zalloc_vect_r2(x, desc_a,info,n,lb, dupl, bldmode) 9999 call psb_error_handler(ctxt,err_act) return - end subroutine psb_zalloc_vect_r2 diff --git a/base/tools/psb_zallc_a.f90 b/base/tools/psb_zallc_a.f90 index 1af815e4a..a9fe74fd8 100644 --- a/base/tools/psb_zallc_a.f90 +++ b/base/tools/psb_zallc_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -147,7 +147,7 @@ end subroutine psb_zalloc !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_zasb.f90 b/base/tools/psb_zasb.f90 index decbfdec3..9e516dbce 100644 --- a/base/tools/psb_zasb.f90 +++ b/base/tools/psb_zasb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! scratch - logical, optional If true, allocate without checking/zeroing contents. ! default: .false. ! -subroutine psb_zasb_vect(x, desc_a, info, mold, scratch) +subroutine psb_zasb_vect(x, desc_a, info, mold, scratch, dupl) use psb_base_mod, psb_protect_name => psb_zasb_vect implicit none @@ -60,6 +60,7 @@ subroutine psb_zasb_vect(x, desc_a, info, mold, scratch) integer(psb_ipk_), intent(out) :: info class(psb_z_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl ! local variables type(psb_ctxt_type) :: ctxt @@ -80,10 +81,9 @@ subroutine psb_zasb_vect(x, desc_a, info, mold, scratch) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - scratch_ = .false. + scratch_ = .false. if (present(scratch)) scratch_ = scratch call psb_info(ctxt, me, np) - dupl_ = x%get_dupl() ! ....verify blacs grid correctness.. if (np == -1) then info = psb_err_context_error_ @@ -100,39 +100,83 @@ subroutine psb_zasb_vect(x, desc_a, info, mold, scratch) if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),': sizes: ',nrow,ncol - if (scratch_) then - call x%free(info) - call x%bld(ncol,mold=mold) + dupl_ = x%get_dupl() + if (try_newins) then + if (scratch_) then + call x%free(info) + call x%bld(ncol,mold=mold,scratch=scratch_) + else + if (x%is_bld().and.present(dupl)) then + call x%set_dupl(dupl) + dupl_ = dupl + end if + + if (x%is_remote_build()) then + block + integer(psb_lpk_), allocatable :: lvx(:) + complex(psb_dpk_), allocatable :: vx(:) + integer(psb_ipk_), allocatable :: ivx(:) + integer(psb_ipk_) :: nrmv, nx, i + + nrmv = x%get_nrmv() + call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) + nx = size(vx) + call psb_realloc(nx,ivx,info) + call desc_a%g2l(lvx,ivx,info,owned=.true.) + call x%ins(nx,ivx,vx,nrow,info) + end block + end if + + call x%asb(ncol,info,scratch=scratch) + ! ..update halo elements.. + call psb_halo(x,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_halo') + goto 9999 + end if + call x%cnv(mold) + end if + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': end' else - if (x%is_remote_build()) then - block - integer(psb_lpk_), allocatable :: lvx(:) - complex(psb_dpk_), allocatable :: vx(:) - integer(psb_ipk_), allocatable :: ivx(:) - integer(psb_ipk_) :: nrmv, nx, i - - nrmv = x%get_nrmv() - call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) - nx = size(vx) - call psb_realloc(nx,ivx,info) - call desc_a%g2l(lvx,ivx,info,owned=.true.) - call x%ins(nx,ivx,vx,info) - end block - end if - - call x%asb(ncol,info) - ! ..update halo elements.. - call psb_halo(x,desc_a,info) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='psb_halo') - goto 9999 + if (scratch_) then + call x%free(info) + call x%bld(ncol,mold=mold) + else + if (x%is_bld().and.present(dupl)) then + dupl_ = dupl + end if + if (x%is_remote_build()) then + block + integer(psb_lpk_), allocatable :: lvx(:) + complex(psb_dpk_), allocatable :: vx(:) + integer(psb_ipk_), allocatable :: ivx(:) + integer(psb_ipk_) :: nrmv, nx, i + + nrmv = x%get_nrmv() + call psb_remote_vect(nrmv,x%rmtv,x%rmidx,desc_a,vx,lvx,info) + nx = size(vx) + call psb_realloc(nx,ivx,info) + call desc_a%g2l(lvx,ivx,info,owned=.true.) + call x%ins(nx,ivx,vx,nrow,info) + end block + end if + + call x%asb(ncol,info,scratch=scratch) + ! ..update halo elements.. + call psb_halo(x,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + call psb_errpush(info,name,a_err='psb_halo') + goto 9999 + end if + call x%cnv(mold) end if - call x%cnv(mold) + if (debug_level >= psb_debug_ext_) & + & write(debug_unit,*) me,' ',trim(name),': end' end if - if (debug_level >= psb_debug_ext_) & - & write(debug_unit,*) me,' ',trim(name),': end' call psb_erractionrestore(err_act) return @@ -144,7 +188,7 @@ subroutine psb_zasb_vect(x, desc_a, info, mold, scratch) end subroutine psb_zasb_vect -subroutine psb_zasb_vect_r2(x, desc_a, info, mold, scratch) +subroutine psb_zasb_vect_r2(x, desc_a, info, mold, scratch,dupl) use psb_base_mod, psb_protect_name => psb_zasb_vect_r2 implicit none @@ -153,12 +197,12 @@ subroutine psb_zasb_vect_r2(x, desc_a, info, mold, scratch) integer(psb_ipk_), intent(out) :: info class(psb_z_base_vect_type), intent(in), optional :: mold logical, intent(in), optional :: scratch + integer(psb_ipk_), optional, intent(in) :: dupl ! local variables type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me, i, n - integer(psb_ipk_) :: i1sz,nrow,ncol, err_act, dupl_ - logical :: scratch_ + integer(psb_ipk_) :: err_act integer(psb_ipk_) :: debug_level, debug_unit character(len=20) :: name,ch_err @@ -173,8 +217,6 @@ subroutine psb_zasb_vect_r2(x, desc_a, info, mold, scratch) debug_unit = psb_get_debug_unit() debug_level = psb_get_debug_level() - scratch_ = .false. - if (present(scratch)) scratch_ = scratch call psb_info(ctxt, me, np) ! ....verify blacs grid correctness.. if (np == -1) then @@ -186,35 +228,11 @@ subroutine psb_zasb_vect_r2(x, desc_a, info, mold, scratch) call psb_errpush(info,name) goto 9999 end if - - nrow = desc_a%get_local_rows() - ncol = desc_a%get_local_cols() n = size(x) - if (debug_level >= psb_debug_ext_) & - & write(debug_unit,*) me,' ',trim(name),': sizes: ',nrow,ncol + do i=1, n + call psb_geasb(x(i),desc_a,info, mold, scratch, dupl) + end do - if (scratch_) then - do i=1,n - call x(i)%free(info) - call x(i)%bld(ncol,mold=mold) - end do - - else - do i=1, n - dupl_ = x(i)%get_dupl() - call x(i)%asb(ncol,info) - if (info /= 0) exit - ! ..update halo elements.. - call psb_halo(x(i),desc_a,info) - if (info /= 0) exit - call x(i)%cnv(mold) - end do - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='psb_halo') - goto 9999 - end if - end if if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),': end' @@ -291,7 +309,7 @@ subroutine psb_zasb_multivect(x, desc_a, info, mold, scratch,n) dupl_ = x%get_dupl() if (scratch_) then call x%free(info) - call x%bld(ncol,n_,mold=mold) + call x%bld(ncol,n_,mold=mold,scratch=.true.) else call x%asb(ncol,n_,info) ! ..update halo elements.. diff --git a/base/tools/psb_zasb_a.f90 b/base/tools/psb_zasb_a.f90 index e8c9db992..1d6cae4da 100644 --- a/base/tools/psb_zasb_a.f90 +++ b/base/tools/psb_zasb_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -153,7 +153,7 @@ end subroutine psb_zasb !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_zcdbldext.F90 b/base/tools/psb_zcdbldext.F90 index 29b93c5b3..fe83b784d 100644 --- a/base/tools/psb_zcdbldext.F90 +++ b/base/tools/psb_zcdbldext.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -117,7 +117,7 @@ Subroutine psb_zcdbldext(a,desc_a,novr,desc_ov,info, extype) goto 9999 end if ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) If (debug_level >= psb_debug_outer_) & diff --git a/base/tools/psb_zfree.f90 b/base/tools/psb_zfree.f90 index 6f7f057b1..862432f42 100644 --- a/base/tools/psb_zfree.f90 +++ b/base/tools/psb_zfree.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_zfree_a.f90 b/base/tools/psb_zfree_a.f90 index 95fa38d14..67e94de19 100644 --- a/base/tools/psb_zfree_a.f90 +++ b/base/tools/psb_zfree_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_zgetelem.f90 b/base/tools/psb_zgetelem.f90 index ac130e826..a4cb114be 100644 --- a/base/tools/psb_zgetelem.f90 +++ b/base/tools/psb_zgetelem.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -108,3 +108,92 @@ function psb_z_getelem(x,index,desc_a,info) result(res) end function +! Function: psb_z_getmatelem +! Extract entries from a sparse matrix. Note: the row and column indices in index +! are assumed to be in global numbering and are converted on the fly. +! +! Arguments: +! a - type(psb_zspmat_type) The source matrix +! desc_a - type(psb_desc_type). The communication descriptor. +! rowindex - integer. Row index of x of the value to extract +! colindex - integer. Column index of x of the value to extract +! iam - integer. Index of the process requesting the value +! info - integer. return code + + +function psb_z_getmatelem(a,rowindex,colindex,desc_a,info) result(res) + use psb_base_mod, psb_protect_name => psb_z_getmatelem + use psi_mod + implicit none + + type(psb_zspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a + integer(psb_lpk_), intent(in) :: rowindex, colindex + integer(psb_ipk_), intent(out) :: info + complex(psb_dpk_) :: res + + !locals + integer(psb_ipk_) :: localrowindex(1), localcolindex(1), jmin, jmax, imin, imax + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np, me, err_act + integer(psb_lpk_) :: growindex(1), gcolindex(1) + integer(psb_lpk_), allocatable :: myidx(:),mylocal(:) + integer(psb_ipk_), allocatable, dimension(:) :: ia, ja + integer(psb_ipk_) :: nz + complex(psb_dpk_), allocatable, dimension(:) :: val + character(len=20) :: name + logical, parameter :: debug = .false. + + growindex(1) = rowindex + gcolindex(1) = colindex + res = zzero + if (psb_errstatus_fatal()) return + info=psb_success_ + call psb_erractionsave(err_act) + name = 'psb_z_getmatelem' + + if (.not.desc_a%is_ok()) then + info = psb_err_invalid_cd_state_ + call psb_errpush(info,name) + goto 9999 + end if + + ctxt = desc_a%get_context() + + call psb_info(ctxt, me, np) + if (np == -1) then + info = psb_err_context_error_ + call psb_errpush(info,name) + goto 9999 + endif + + call desc_a%indxmap%g2l(growindex,localrowindex,info,owned=.false.) + call desc_a%indxmap%g2l(gcolindex,localcolindex,info,owned=.false.) + imin = localrowindex(1) + imax = localrowindex(1) + jmin = localcolindex(1) + jmax = localcolindex(1) + if(debug.and.(localrowindex(1) < 1 .or. localcolindex(1) < 1)) then + write(*,*)"Process ",me," owns ",desc_a%get_local_rows()," rows"," Global row index is ", & + growindex,"Local row index is ",localrowindex + write(*,*)"Process ",me," owns ",desc_a%get_local_cols()," cols"," Global col index is ", & + gcolindex,"Local col index is ",localcolindex + myidx = desc_a%get_global_indices(owned=.false.) + mylocal = desc_a%get_global_indices(owned=.true.) + write(*,*)"My (local+halo) indexes are: ",myidx + write(*,*)"My (local) indexes are: ",mylocal + end if + if ( localrowindex(1) < 1 .or. localcolindex(1) < 1) then + res = zzero + else + call a%csget(imin, imax, nz, ia, ja, val, info, jmin=jmin, jmax=jmax) + res = val(1) + end if + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + +end function diff --git a/base/tools/psb_zins.f90 b/base/tools/psb_zins.f90 index 43e5d5cd2..a966c0130 100644 --- a/base/tools/psb_zins.f90 +++ b/base/tools/psb_zins.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -57,7 +57,7 @@ subroutine psb_zins_vect(m, irw, val, x, desc_a, info, local) logical, intent(in), optional :: local !locals..... - integer(psb_ipk_) :: i, loc_rows,loc_cols + integer(psb_ipk_) :: i, loc_rows, loc_cols integer(psb_lpk_) :: mglob integer(psb_ipk_) :: dupl_ type(psb_ctxt_type) :: ctxt @@ -127,7 +127,7 @@ subroutine psb_zins_vect(m, irw, val, x, desc_a, info, local) else call desc_a%indxmap%g2l(irw(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,val,info) + call x%ins(m,irl,val,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 @@ -198,7 +198,7 @@ subroutine psb_zins_vect_v(m, irw, val, x, desc_a, info, local) logical, intent(in), optional :: local !locals..... - integer(psb_ipk_) :: i, loc_rows,loc_cols,err_act + integer(psb_ipk_) :: i, loc_rows, loc_cols, err_act integer(psb_lpk_) :: mglob type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me @@ -261,7 +261,7 @@ subroutine psb_zins_vect_v(m, irw, val, x, desc_a, info, local) call desc_a%indxmap%g2l(irw%v%v(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,lval,info) + call x%ins(m,irl,lval,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 @@ -368,7 +368,7 @@ subroutine psb_zins_vect_r2(m, irw, val, x, desc_a, info, local) do i=1,n if (.not.allocated(x(i)%v)) info = psb_err_invalid_vect_state_ - if (info == 0) call x(i)%ins(m,irl,val(:,i),info) + if (info == 0) call x(i)%ins(m,irl,val(:,i),loc_rows,info) if (info /= 0) exit end do if (info /= 0) then @@ -475,7 +475,7 @@ subroutine psb_zins_multivect(m, irw, val, x, desc_a, info, local) else call desc_a%indxmap%g2l(irw(1:m),irl(1:m),info,owned=.true.) end if - call x%ins(m,irl,val,info) + call x%ins(m,irl,val,loc_rows,info) if (info /= 0) then call psb_errpush(info,name) goto 9999 diff --git a/base/tools/psb_zins_a.f90 b/base/tools/psb_zins_a.f90 index 4b068117f..7bd8b1f9c 100644 --- a/base/tools/psb_zins_a.f90 +++ b/base/tools/psb_zins_a.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -195,7 +195,7 @@ end subroutine psb_zinsvi !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_zspalloc.f90 b/base/tools/psb_zspalloc.f90 index 308774ef8..58a71b85c 100644 --- a/base/tools/psb_zspalloc.f90 +++ b/base/tools/psb_zspalloc.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_zspasb.f90 b/base/tools/psb_zspasb.f90 index 2cb53368a..163f0d5e5 100644 --- a/base/tools/psb_zspasb.f90 +++ b/base/tools/psb_zspasb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -44,7 +44,7 @@ ! psb_upd_perm_ Permutation(more memory) ! ! -subroutine psb_zspasb(a,desc_a, info, afmt, upd, mold, bld_and) +subroutine psb_zspasb(a,desc_a, info, afmt, upd, mold, dupl, bld_and) use psb_base_mod, psb_protect_name => psb_zspasb use psb_sort_mod use psi_mod @@ -59,6 +59,7 @@ subroutine psb_zspasb(a,desc_a, info, afmt, upd, mold, bld_and) character(len=*), optional, intent(in) :: afmt class(psb_z_base_sparse_mat), intent(in), optional :: mold logical, intent(in), optional :: bld_and + integer(psb_ipk_), optional, intent(in) :: dupl !....Locals.... type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me, err_act @@ -103,7 +104,12 @@ subroutine psb_zspasb(a,desc_a, info, afmt, upd, mold, bld_and) !check on errors encountered in psdspins if (a%is_bld()) then - dupl_ = a%get_dupl() + if (present(dupl)) then + dupl_ = dupl + else + dupl_ = a%get_dupl() + end if + ! ! First case: we come from a fresh build. ! @@ -180,7 +186,7 @@ subroutine psb_zspasb(a,desc_a, info, afmt, upd, mold, bld_and) if (bld_and_) then !!$ allocate(a%ad,mold=a%a) !!$ allocate(a%and,mold=a%a)o - call a%split_nd(n_row,n_col,info) +!!$ call a%split_nd(n_row,n_col,info) !!$ block !!$ character(len=1024) :: fname !!$ type(psb_z_coo_sparse_mat) :: acoo diff --git a/base/tools/psb_zspfree.f90 b/base/tools/psb_zspfree.f90 index 73f0bb273..3d89e4cbd 100644 --- a/base/tools/psb_zspfree.f90 +++ b/base/tools/psb_zspfree.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_zsphalo.F90 b/base/tools/psb_zsphalo.F90 index 6d814b39e..90151d451 100644 --- a/base/tools/psb_zsphalo.F90 +++ b/base/tools/psb_zsphalo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -127,7 +127,7 @@ Subroutine psb_zsphalo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -198,7 +198,7 @@ Subroutine psb_zsphalo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract the row size lnr = 0 @@ -587,7 +587,7 @@ Subroutine psb_lzsphalo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -658,7 +658,7 @@ Subroutine psb_lzsphalo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract and send/receive. lnr = 0 @@ -931,7 +931,7 @@ Subroutine psb_lz_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -1004,7 +1004,7 @@ Subroutine psb_lz_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract the row size lnr = 0 @@ -1293,7 +1293,7 @@ Subroutine psb_z_lz_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& debug_level = psb_get_debug_level() ctxt = desc_a%get_context() - icomm = desc_a%get_mpic() + icomm = ctxt%get_mpic() Call psb_info(ctxt, me, np) @@ -1366,7 +1366,7 @@ Subroutine psb_z_lz_csr_halo(a,desc_a,blk,info,rowcnv,colcnv,& idxs = 0 idxr = 0 - call desc_a%get_list(data_,pdxv,totxch,nxr,nxs,info) + call desc_a%get_list_p(data_,pdxv,totxch,nxr,nxs,info) ipdxv = pdxv%get_vect() ! For all rows in the halo descriptor, extract the row size lnr = 0 diff --git a/base/tools/psb_zspins.F90 b/base/tools/psb_zspins.F90 index f5181030b..2e73b7ae4 100644 --- a/base/tools/psb_zspins.F90 +++ b/base/tools/psb_zspins.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/base/tools/psb_zsprn.f90 b/base/tools/psb_zsprn.f90 index c1676bed0..0d797d482 100644 --- a/base/tools/psb_zsprn.f90 +++ b/base/tools/psb_zsprn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cbind/CMakeLists.txt b/cbind/CMakeLists.txt index 284976254..c700b5a88 100644 --- a/cbind/CMakeLists.txt +++ b/cbind/CMakeLists.txt @@ -10,7 +10,6 @@ set(PSB_cbind_source_files base/psb_d_serial_cbind_mod.F90 base/psb_c_tools_cbind_mod.F90 base/psb_c_serial_cbind_mod.F90 - base/psb_base_string_cbind_mod.f90 base/psb_base_tools_cbind_mod.F90 base/psb_z_comm_cbind_mod.f90 base/psb_s_serial_cbind_mod.F90 @@ -20,17 +19,17 @@ set(PSB_cbind_source_files base/psb_c_psblas_cbind_mod.f90 base/psb_d_comm_cbind_mod.f90 base/psb_z_tools_cbind_mod.F90 - base/psb_cpenv_mod.f90 + base/psb_cpenv_mod.F90 util/psb_c_util_cbind_mod.f90 util/psb_s_util_cbind_mod.f90 util/psb_util_cbind_mod.f90 util/psb_d_util_cbind_mod.f90 util/psb_z_util_cbind_mod.f90 - krylov/psb_ckrylov_cbind_mod.f90 - krylov/psb_base_krylov_cbind_mod.f90 - krylov/psb_skrylov_cbind_mod.f90 - krylov/psb_dkrylov_cbind_mod.f90 - krylov/psb_zkrylov_cbind_mod.f90 + linsolve/psb_clinsolve_cbind_mod.f90 + linsolve/psb_base_linsolve_cbind_mod.f90 + linsolve/psb_slinsolve_cbind_mod.f90 + linsolve/psb_dlinsolve_cbind_mod.f90 + linsolve/psb_zlinsolve_cbind_mod.f90 prec/psb_dprec_cbind_mod.f90 prec/psb_cprec_cbind_mod.f90 prec/psb_prec_cbind_mod.f90 @@ -75,7 +74,7 @@ list(APPEND PSB_cbind_header_C_files util/psb_c_sutil.h util/psb_c_cutil.h util/psb_util_cbind.h - krylov/psb_krylov_cbind.h + linsolve/psb_linsolve_cbind.h prec/psb_c_sprec.h prec/psb_c_cprec.h prec/psb_prec_cbind.h diff --git a/cbind/Makefile b/cbind/Makefile index 9724c7115..3be3bd8ff 100644 --- a/cbind/Makefile +++ b/cbind/Makefile @@ -6,13 +6,13 @@ INCDIR=../include MODDIR=../modules/ LIBNAME=$(CBINDLIBNAME) -objs: based precd krylovd utild +objs: based precd linsolved utild /bin/cp -p $(CPUPDFLAG) *.h $(INCDIR) /bin/cp -p $(CPUPDFLAG) *$(.mod) $(MODDIR) lib: objs cd base && $(MAKE) lib LIBNAME=$(LIBNAME) cd prec && $(MAKE) lib LIBNAME=$(LIBNAME) - cd krylov && $(MAKE) lib LIBNAME=$(LIBNAME) + cd linsolve && $(MAKE) lib LIBNAME=$(LIBNAME) cd util && $(MAKE) lib LIBNAME=$(LIBNAME) /bin/cp -p $(CPUPDFLAG) $(HERE)/$(LIBNAME) $(LIBDIR) @@ -21,15 +21,15 @@ based: cd base && $(MAKE) objs LIBNAME=$(LIBNAME) precd: based cd prec && $(MAKE) objs LIBNAME=$(LIBNAME) -krylovd: based precd - cd krylov && $(MAKE) objs LIBNAME=$(LIBNAME) +linsolved: based precd + cd linsolve && $(MAKE) objs LIBNAME=$(LIBNAME) utild: based cd util && $(MAKE) objs LIBNAME=$(LIBNAME) clean: cd base && $(MAKE) clean cd prec && $(MAKE) clean - cd krylov && $(MAKE) clean + cd linsolve && $(MAKE) clean cd util && $(MAKE) clean veryclean: clean diff --git a/cbind/base/Makefile b/cbind/base/Makefile index 2b7448293..9d4d734c6 100644 --- a/cbind/base/Makefile +++ b/cbind/base/Makefile @@ -9,8 +9,7 @@ FINCLUDES=$(FMFLAG). $(FMFLAG)$(HERE) $(FMFLAG)$(MODDIR) CINCLUDES=-I. -I$(HERE) -I$(INCLUDEDIR) FOBJS= psb_objhandle_mod.o psb_base_cbind_mod.o psb_cpenv_mod.o \ - psb_base_tools_cbind_mod.o psb_base_string_cbind_mod.o \ - psb_base_psblas_cbind_mod.o \ + psb_base_tools_cbind_mod.o psb_base_psblas_cbind_mod.o \ psb_s_tools_cbind_mod.o psb_s_serial_cbind_mod.o psb_s_psblas_cbind_mod.o \ psb_d_tools_cbind_mod.o psb_d_serial_cbind_mod.o psb_d_psblas_cbind_mod.o \ psb_c_tools_cbind_mod.o psb_c_serial_cbind_mod.o psb_c_psblas_cbind_mod.o \ @@ -26,6 +25,10 @@ OBJS=$(FOBJS) $(COBJS) LIBNAME=$(CBINDLIBNAME) +# Ensure C-interoperable modules are built with CUDA definitions where available. +.F90.o: + $(FC) $(FCOPT) $(FINCLUDES) $(FDEFINES) $(FCUDEFINES) -c $< -o $@ + objs: $(OBJS) $(CMOD) /bin/cp -p *$(.mod) $(CMOD) $(HERE) @@ -36,7 +39,7 @@ lib: objs $(COBJS): $(CMOD) psb_base_cbind_mod.o: psb_cpenv_mod.o psb_objhandle_mod.o psb_base_tools_cbind_mod.o \ - psb_base_string_cbind_mod.o psb_base_psblas_cbind_mod.o \ + psb_base_psblas_cbind_mod.o \ psb_s_tools_cbind_mod.o psb_s_serial_cbind_mod.o psb_s_psblas_cbind_mod.o \ psb_d_tools_cbind_mod.o psb_d_serial_cbind_mod.o psb_d_psblas_cbind_mod.o \ psb_c_tools_cbind_mod.o psb_c_serial_cbind_mod.o psb_c_psblas_cbind_mod.o \ @@ -44,7 +47,7 @@ psb_base_cbind_mod.o: psb_cpenv_mod.o psb_objhandle_mod.o psb_base_tools_cbind_m psb_s_comm_cbind_mod.o psb_d_comm_cbind_mod.o \ psb_c_comm_cbind_mod.o psb_z_comm_cbind_mod.o -psb_base_tools_cbind_mod.o: psb_cpenv_mod.o psb_objhandle_mod.o psb_base_string_cbind_mod.o +psb_base_tools_cbind_mod.o: psb_cpenv_mod.o psb_objhandle_mod.o psb_s_tools_cbind_mod.o psb_s_serial_cbind_mod.o \ psb_d_tools_cbind_mod.o psb_d_serial_cbind_mod.o \ @@ -53,11 +56,12 @@ psb_z_tools_cbind_mod.o psb_z_serial_cbind_mod.o \ psb_s_psblas_cbind_mod.o psb_d_psblas_cbind_mod.o \ psb_c_psblas_cbind_mod.o psb_z_psblas_cbind_mod.o \ psb_s_comm_cbind_mod.o psb_d_comm_cbind_mod.o \ -psb_c_comm_cbind_mod.o psb_z_comm_cbind_mod.o: psb_base_tools_cbind_mod.o psb_objhandle_mod.o psb_base_string_cbind_mod.o +psb_c_comm_cbind_mod.o psb_z_comm_cbind_mod.o: psb_base_tools_cbind_mod.o psb_objhandle_mod.o psb_base_psblas_cbind_mod.o: psb_s_psblas_cbind_mod.o psb_d_psblas_cbind_mod.o psb_c_psblas_cbind_mod.o psb_z_psblas_cbind_mod.o -psb_cpenv_mod.o: psb_base_string_cbind_mod.o psb_objhandle_mod.o +psb_cpenv_mod.o: psb_objhandle_mod.o + $(FC) $(FCOPT) $(FINCLUDES) $(FCUDEFINES) -c psb_cpenv_mod.F90 -o psb_cpenv_mod.o veryclean: clean /bin/rm -f $(HERE)/$(LIBNAME) diff --git a/cbind/base/psb_base_cbind_mod.f90 b/cbind/base/psb_base_cbind_mod.f90 index f7d74e743..67d97aad9 100644 --- a/cbind/base/psb_base_cbind_mod.f90 +++ b/cbind/base/psb_base_cbind_mod.f90 @@ -1,6 +1,10 @@ module psb_base_cbind_mod use psb_objhandle_mod use psb_cpenv_mod + use psb_s_serial_cbind_mod + use psb_d_serial_cbind_mod + use psb_c_serial_cbind_mod + use psb_z_serial_cbind_mod use psb_base_tools_cbind_mod use psb_s_tools_cbind_mod use psb_d_tools_cbind_mod @@ -11,4 +15,5 @@ module psb_base_cbind_mod use psb_c_comm_cbind_mod use psb_z_comm_cbind_mod use psb_base_psblas_cbind_mod + use psb_ext_mod end module psb_base_cbind_mod diff --git a/cbind/base/psb_base_string_cbind_mod.f90 b/cbind/base/psb_base_string_cbind_mod.f90 deleted file mode 100644 index 05cd9d7d5..000000000 --- a/cbind/base/psb_base_string_cbind_mod.f90 +++ /dev/null @@ -1,38 +0,0 @@ -module psb_base_string_cbind_mod - use iso_c_binding - -contains - - subroutine stringc2f(cstring,fstring) - character(c_char) :: cstring(*) - character(len=*) :: fstring - integer :: i - - i = 1 - do - if (cstring(i) == c_null_char) exit - if (i > len(fstring)) exit - fstring(i:i) = cstring(i) - i = i + 1 - end do - do - if (i > len(fstring)) exit - fstring(i:i) = " " - i = i + 1 - end do - return - end subroutine stringc2f - - subroutine stringf2c(fstring,cstring) - character(c_char) :: cstring(*) - character(len=*) :: fstring - integer :: i - - do i=1, len(fstring) - cstring(i) = fstring(i:i) - end do - cstring(len(fstring)+1) = c_null_char - return - end subroutine stringf2c - -end module psb_base_string_cbind_mod diff --git a/cbind/base/psb_base_tools_cbind_mod.F90 b/cbind/base/psb_base_tools_cbind_mod.F90 index 7126ced8e..d4af3ec19 100644 --- a/cbind/base/psb_base_tools_cbind_mod.F90 +++ b/cbind/base/psb_base_tools_cbind_mod.F90 @@ -3,8 +3,9 @@ module psb_base_tools_cbind_mod use psb_base_mod use psb_objhandle_mod use psb_cpenv_mod - use psb_base_string_cbind_mod - +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif contains ! Aggiungere funzione per estrarre comunicatore @@ -141,6 +142,48 @@ contains end function psb_c_cdall_vl_opt + function psb_c_cdall_vl_lidx(nl,vl,lidx,cctxt,cdh) bind(c,name='psb_c_cdall_vl_lidx') result(res) + implicit none + + integer(psb_c_ipk_) :: res + type(psb_c_object_type), value :: cctxt + integer(psb_c_ipk_), value :: nl + integer(psb_c_lpk_) :: vl(*) + integer(psb_c_ipk_) :: lidx(*) + type(psb_c_object_type) :: cdh + type(psb_desc_type), pointer :: descp + integer(psb_c_ipk_) :: info, ixb + type(psb_ctxt_type) :: ctxt + ctxt = psb_c2f_ctxt(cctxt) + + res = -1 + if (nl <=0) then + write(0,*) 'Invalid size' + return + end if + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + call descp%free(info) + if (info == 0) deallocate(descp,stat=info) + if (info /= 0) return + end if + + allocate(descp,stat=info) + if (info < 0) return + + ixb = psb_c_get_index_base() + + if (ixb == 1) then + call psb_cdall(ctxt,descp,info,vl=vl(1:nl),lidx=lidx(1:nl)) + else + call psb_cdall(ctxt,descp,info,vl=(vl(1:nl)+(1-ixb)),lidx=(lidx(1:nl)+(1-ixb))) + end if + cdh%item = c_loc(descp) + res = info + + end function psb_c_cdall_vl_lidx + function psb_c_cdall_nl(nl,cctxt,cdh) bind(c,name='psb_c_cdall_nl') result(res) implicit none @@ -228,6 +271,48 @@ contains end function psb_c_cdasb + function psb_c_cdasb_format(cdh,format) bind(c,name='psb_c_cdasb_format') result(res) + implicit none + ! Takes as input the desired format bewten CPU or GPU, and assembles accordingly + ! via the mold parameter of psb_cdasb + + integer(psb_c_ipk_) :: res + type(psb_c_object_type) :: cdh + type(psb_desc_type), pointer :: descp + integer(psb_c_ipk_) :: info + character(c_char), dimension(*) :: format + + ! Local variables + character(len=6) :: fformat + ! mold variables +#ifdef PSB_HAVE_CUDA + type(psb_i_vect_cuda), target :: ivgpu +#endif + type(psb_i_base_vect_type), target :: ivect + class(psb_i_base_vect_type), pointer :: imold + + call psb_stringc2f(format,fformat) + + res = -1 + select case (psb_toupper(fformat)) +#ifdef PSB_HAVE_CUDA + case('GPU','DEVICE') + imold => ivgpu +#endif + case('CPU','HOST') + imold => ivect + case default + write(psb_out_unit,*) 'psb_c_cdasb_format: Unknown format ',fformat + imold => ivect + end select + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + call psb_cdasb(descp,info,mold=imold) + res = info + end if + + end function psb_c_cdasb_format function psb_c_cdfree(cdh) bind(c,name='psb_c_cdfree') result(res) @@ -278,6 +363,74 @@ contains end function psb_c_cdins + function psb_c_cdins_lidx(nz,ja,lidx,cdh) bind(c,name='psb_c_cdins_lidx') result(res) + + implicit none + integer(psb_c_ipk_) :: res + integer(psb_c_ipk_), value :: nz + type(psb_c_object_type) :: cdh + integer(psb_c_lpk_) :: ja(*) + integer(psb_c_ipk_) :: lidx(*) + + type(psb_desc_type), pointer :: descp + integer(psb_c_ipk_) :: ixb,info + + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + ixb = psb_c_get_index_base() + + if (ixb == 1) then + call psb_cdins(nz,ja(1:nz),descp,info,lidx=lidx(1:nz)) + else + call psb_cdins(nz,(ja(1:nz)+(1-ixb)),descp,info,lidx=(lidx(1:nz)+(1-ixb))) + end if + + res = info + end if + return + end function psb_c_cdins_lidx + + function psb_c_cd_is_asb(cdh) bind(c,name='psb_c_cd_is_asb') result(res) + implicit none + + logical(c_bool) :: res + type(psb_c_object_type) :: cdh + + type(psb_desc_type), pointer :: descp + + res = .false. + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + if (descp%is_asb()) then + res = .true. + else + res = .false. + end if + end if + + end function psb_c_cd_is_asb + + + function psb_c_cd_check_addr(cdh) & + & bind(c,name='psb_c_cd_check_addr') result(res) + implicit none + + integer(psb_c_ipk_) :: res + type(psb_c_object_type) :: cdh + type(psb_desc_type), pointer :: descp + integer :: info + + res = 0 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + call descp%check_addr(info) + res = info + end if + end function psb_c_cd_check_addr function psb_c_cd_get_local_rows(cdh) bind(c,name='psb_c_cd_get_local_rows') result(res) implicit none @@ -390,5 +543,25 @@ contains end function psb_c_cd_get_global_indices + function psb_c_is_owned(x,cdh) bind(c,name='psb_c_is_owned') result(res) + implicit none + type(psb_c_object_type) :: cdh + integer(psb_c_lpk_), value :: x + logical(c_bool) :: res + ! Internal variables + type(psb_desc_type), pointer :: descp + integer(psb_c_ipk_) :: info + logical :: fowned + res = .false. + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + fowned = psb_is_owned(x+(1-psb_c_get_index_base()),descp) + if (fowned) then + res = .true. + end if + end if + + end function psb_c_is_owned + end module psb_base_tools_cbind_mod diff --git a/cbind/base/psb_c_base.h b/cbind/base/psb_c_base.h index 601ba8c13..1242fd818 100644 --- a/cbind/base/psb_c_base.h +++ b/cbind/base/psb_c_base.h @@ -6,7 +6,11 @@ extern "C" { #endif #include +#ifdef __cplusplus +#include +#else #include +#endif #include #include #include @@ -40,6 +44,7 @@ extern "C" { /* Environment routines */ void psb_c_init(psb_c_ctxt *cctxt); + void psb_c_init_from_fint(psb_c_ctxt *cctxt, psb_i_t f_comm); void psb_c_exit(psb_c_ctxt cctxt); void psb_c_exit_ctxt(psb_c_ctxt cctxt); void psb_c_abort(psb_c_ctxt cctxt); @@ -52,6 +57,13 @@ extern "C" { psb_i_t psb_c_get_index_base(); void psb_c_set_index_base(psb_i_t base); + /* GPU environment routines */ + #ifdef PSB_HAVE_CUDA + void psb_c_cuda_init(psb_c_ctxt *cctxt); + void psb_c_cuda_init_opt(psb_c_ctxt *cctxt, psb_m_t ngpu); + void psb_c_cuda_exit(); + psb_m_t psb_c_cuda_getDeviceCount(); + #endif void psb_c_mbcast(psb_c_ctxt cctxt, psb_i_t n, psb_m_t *v, psb_i_t root); void psb_c_ibcast(psb_c_ctxt cctxt, psb_i_t n, psb_i_t *v, psb_i_t root); @@ -70,30 +82,28 @@ extern "C" { void psb_c_delete_ctxt(psb_c_ctxt *); psb_i_t psb_c_cdall_vg(psb_l_t ng, psb_i_t *vg, psb_c_ctxt cctxt, psb_c_descriptor *cd); psb_i_t psb_c_cdall_vl(psb_i_t nl, psb_l_t *vl, psb_c_ctxt cctxt, psb_c_descriptor *cd); + psb_i_t psb_c_cdall_vl_lidx(psb_i_t nl, psb_l_t *vl, psb_i_t *lidx, psb_c_ctxt cctxt, psb_c_descriptor *cd); psb_i_t psb_c_cdall_nl(psb_i_t nl, psb_c_ctxt cctxt, psb_c_descriptor *cd); psb_i_t psb_c_cdall_repl(psb_l_t n, psb_c_ctxt cctxt, psb_c_descriptor *cd); psb_i_t psb_c_cdasb(psb_c_descriptor *cd); + psb_i_t psb_c_cdasb_format(psb_c_descriptor *cd, const char *afmt); psb_i_t psb_c_cdfree(psb_c_descriptor *cd); psb_i_t psb_c_cdins(psb_i_t nz, const psb_l_t *ia, const psb_l_t *ja, psb_c_descriptor *cd); - + psb_i_t psb_c_cdins_lidx(psb_i_t nz, const psb_l_t *ja, const psb_i_t *lidx, psb_c_descriptor *cd); + bool psb_c_is_owned(psb_l_t gindex, psb_c_descriptor *cd); + bool psb_c_cd_is_asb(psb_c_descriptor *cd); + psb_i_t psb_c_cd_check_addr(psb_c_descriptor *cd); + psb_i_t psb_c_cd_get_local_rows(psb_c_descriptor *cd); psb_i_t psb_c_cd_get_local_cols(psb_c_descriptor *cd); psb_l_t psb_c_cd_get_global_rows(psb_c_descriptor *cd); + psb_l_t psb_c_cd_get_global_cols(psb_c_descriptor *cd); psb_i_t psb_c_cd_get_global_indices(psb_l_t idx[], psb_i_t nidx, bool owned, psb_c_descriptor *cd); psb_i_t psb_c_g2l(psb_c_descriptor *cdh,psb_l_t gindex,bool cowned); - /* legal values for upd argument */ -#define psb_upd_srch_ 98764 -#define psb_upd_perm_ 98765 -#define psb_upd_def_ psb_upd_srch_ - /* legal values for dupl argument */ -#define psb_dupl_ovwrt_ 0 -#define psb_dupl_add_ 1 -#define psb_dupl_err_ 2 -#define psb_dupl_def_ psb_dupl_ovwrt_ - + /* legal values for afmt */ #define PSB_AFMT_CSR "CSR" #define PSB_AFMT_CSC "CSC" @@ -105,6 +115,17 @@ extern "C" { #define psb_Trans_ "T" #define psb_ConjTrans_ "C" +#if 0 + /* legal values for upd argument */ +#define psb_upd_srch_ 98764 +#define psb_upd_perm_ 98765 +#define psb_upd_def_ psb_upd_srch_ + /* legal values for dupl argument */ +#define psb_dupl_ovwrt_ 0 +#define psb_dupl_add_ 1 +#define psb_dupl_err_ 2 +#define psb_dupl_def_ psb_dupl_ovwrt_ + /* legal values for halo swap modes argument */ #define psb_swap_send_ 1 #define psb_swap_recv_ 2 @@ -117,7 +138,7 @@ extern "C" { #define psb_avg_ 2 #define psb_square_root_ 3 #define psb_setzero_ 4 - +#endif #ifdef __cplusplus } diff --git a/cbind/base/psb_c_cbase.h b/cbind/base/psb_c_cbase.h index bff9633a7..67651f572 100644 --- a/cbind/base/psb_c_cbase.h +++ b/cbind/base/psb_c_cbase.h @@ -22,16 +22,24 @@ psb_c_t *psb_c_cvect_get_cpy( psb_c_cvector *xh); psb_i_t psb_c_cvect_f_get_cpy(psb_c_t *v, psb_c_cvector *xh); psb_i_t psb_c_cvect_zero(psb_c_cvector *xh); psb_i_t *psb_c_cvect_f_get_pnt(psb_c_cvector *xh); +psb_i_t psb_c_cvect_clone(psb_c_cvector *xh,psb_c_cvector *yh); psb_i_t psb_c_cgeall(psb_c_cvector *xh, psb_c_descriptor *cdh); psb_i_t psb_c_cgeall_remote(psb_c_cvector *xh, psb_c_descriptor *cdh); +psb_i_t psb_c_cgeall_remote_options(psb_c_cvector *xh, psb_c_descriptor *cdh, + psb_i_t bldmode, psb_i_t duple); psb_i_t psb_c_cgeins(psb_i_t nz, const psb_l_t *irw, const psb_c_t *val, psb_c_cvector *xh, psb_c_descriptor *cdh); psb_i_t psb_c_cgeins_add(psb_i_t nz, const psb_l_t *irw, const psb_c_t *val, psb_c_cvector *xh, psb_c_descriptor *cdh); psb_i_t psb_c_cgeasb(psb_c_cvector *xh, psb_c_descriptor *cdh); +psb_i_t psb_c_cgeasb_options(psb_c_cvector *xh, psb_c_descriptor *cdh, psb_i_t dupl); +psb_i_t psb_c_cgeasb_options_format(psb_c_cvector *xh, psb_c_descriptor *cdh, + const char *fmt, psb_i_t dupl); psb_i_t psb_c_cgefree(psb_c_cvector *xh, psb_c_descriptor *cdh); +psb_i_t psb_c_cgereinit(psb_c_cvector *xh, psb_c_descriptor *cdh, bool clear); psb_c_t psb_c_cgetelem(psb_c_cvector *xh,psb_l_t index,psb_c_descriptor *cd); +psb_c_t psb_c_cmatgetelem(psb_c_cspmat *ah,psb_l_t rowindex,psb_l_t colindex,psb_c_descriptor *cdh); /* sparse matrices*/ psb_c_cspmat* psb_c_new_cspmat(); @@ -52,12 +60,14 @@ psb_i_t psb_c_cset_matasb(psb_c_cspmat *mh,psb_c_descriptor *cdh); psb_i_t psb_c_cset_matbld(psb_c_cspmat *mh,psb_c_descriptor *cdh); psb_i_t psb_c_ccopy_mat(psb_c_cspmat *ah,psb_c_cspmat *bh,psb_c_descriptor *cdh); -/* psb_i_t psb_c_cspasb_opt(psb_c_cspmat *mh, psb_c_descriptor *cdh, */ -/* const char *afmt, psb_i_t upd, psb_i_t dupl); */ +psb_i_t psb_c_cspasb_opt(psb_c_cspmat *mh, psb_c_descriptor *cdh, + const char *afmt, psb_i_t upd, psb_i_t dupl); psb_i_t psb_c_csprn(psb_c_cspmat *mh, psb_c_descriptor *cdh, _Bool clear); psb_i_t psb_c_cmat_name_print(psb_c_cspmat *mh, char *name); -psb_i_t psb_c_cvect_set_scal(psb_c_cvector *xh, psb_c_t val); -psb_i_t psb_c_cvect_set_vect(psb_c_cvector *xh, psb_c_t *val, psb_i_t n); +psb_i_t psb_c_cvect_set_scal(psb_c_cvector *xh, psb_c_t val); +psb_i_t psb_c_cvect_set_vect(psb_c_cvector *xh, psb_c_t *val, psb_i_t n); +psb_c_t psb_c_cvect_get_entry(psb_c_cvector *xh, psb_i_t index); +psb_i_t psb_c_cvect_set_entry(psb_c_cvector *xh, psb_i_t index, psb_c_t val); /* psblas computational routines */ psb_c_t psb_c_cgedot(psb_c_cvector *xh, psb_c_cvector *yh, psb_c_descriptor *cdh); diff --git a/cbind/base/psb_c_comm_cbind_mod.f90 b/cbind/base/psb_c_comm_cbind_mod.f90 index 2e1d305b2..9d5b9ef48 100644 --- a/cbind/base/psb_c_comm_cbind_mod.f90 +++ b/cbind/base/psb_c_comm_cbind_mod.f90 @@ -2,7 +2,6 @@ module psb_c_comm_cbind_mod use iso_c_binding use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod contains diff --git a/cbind/base/psb_c_dbase.h b/cbind/base/psb_c_dbase.h index 591f885b2..6a6de8be7 100644 --- a/cbind/base/psb_c_dbase.h +++ b/cbind/base/psb_c_dbase.h @@ -22,16 +22,25 @@ psb_d_t *psb_c_dvect_get_cpy( psb_c_dvector *xh); psb_i_t psb_c_dvect_f_get_cpy(psb_d_t *v, psb_c_dvector *xh); psb_i_t psb_c_dvect_zero(psb_c_dvector *xh); psb_d_t *psb_c_dvect_f_get_pnt( psb_c_dvector *xh); +psb_i_t psb_c_dvect_clone(psb_c_dvector *xh,psb_c_dvector *yh); psb_i_t psb_c_dgeall(psb_c_dvector *xh, psb_c_descriptor *cdh); psb_i_t psb_c_dgeall_remote(psb_c_dvector *xh, psb_c_descriptor *cdh); +psb_i_t psb_c_dgeall_remote_options(psb_c_dvector *xh, psb_c_descriptor *cdh, + psb_i_t bldmode, psb_i_t duple); psb_i_t psb_c_dgeins(psb_i_t nz, const psb_l_t *irw, const psb_d_t *val, psb_c_dvector *xh, psb_c_descriptor *cdh); psb_i_t psb_c_dgeins_add(psb_i_t nz, const psb_l_t *irw, const psb_d_t *val, psb_c_dvector *xh, psb_c_descriptor *cdh); psb_i_t psb_c_dgeasb(psb_c_dvector *xh, psb_c_descriptor *cdh); +psb_i_t psb_c_dgeasb_options(psb_c_dvector *xh, psb_c_descriptor *cdh, psb_i_t dupl); +psb_i_t psb_c_dgeasb_options_format(psb_c_dvector *xh, psb_c_descriptor *cdh, + psb_i_t dupl, const char *fmt); psb_i_t psb_c_dgefree(psb_c_dvector *xh, psb_c_descriptor *cdh); +psb_i_t psb_c_dgereinit(psb_c_dvector *xh, psb_c_descriptor *cdh, bool clear); psb_d_t psb_c_dgetelem(psb_c_dvector *xh,psb_l_t index,psb_c_descriptor *cd); +psb_d_t psb_c_dmatgetelem(psb_c_dspmat *ah,psb_l_t rowindex,psb_l_t colindex,psb_c_descriptor *cdh); + /* sparse matrices*/ psb_c_dspmat* psb_c_new_dspmat(); @@ -52,12 +61,14 @@ psb_i_t psb_c_dset_matasb(psb_c_dspmat *mh,psb_c_descriptor *cdh); psb_i_t psb_c_dset_matbld(psb_c_dspmat *mh,psb_c_descriptor *cdh); psb_i_t psb_c_dcopy_mat(psb_c_dspmat *ah,psb_c_dspmat *bh,psb_c_descriptor *cdh); -/* psb_i_t psb_c_dspasb_opt(psb_c_dspmat *mh, psb_c_descriptor *cdh, */ -/* const char *afmt, psb_i_t upd, psb_i_t dupl); */ +psb_i_t psb_c_dspasb_opt(psb_c_dspmat *mh, psb_c_descriptor *cdh, + const char *afmt, psb_i_t upd, psb_i_t dupl); psb_i_t psb_c_dsprn(psb_c_dspmat *mh, psb_c_descriptor *cdh, _Bool clear); psb_i_t psb_c_dmat_name_print(psb_c_dspmat *mh, char *name); -psb_i_t psb_c_dvect_set_scal(psb_c_dvector *xh, psb_d_t val); -psb_i_t psb_c_dvect_set_vect(psb_c_dvector *xh, psb_d_t *val, psb_i_t n); +psb_i_t psb_c_dvect_set_scal(psb_c_dvector *xh, psb_d_t val); +psb_i_t psb_c_dvect_set_vect(psb_c_dvector *xh, psb_d_t *val, psb_i_t n); +psb_d_t psb_c_dvect_get_entry(psb_c_dvector *xh, psb_i_t index); +psb_i_t psb_c_dvect_set_entry(psb_c_dvector *xh, psb_i_t index, psb_d_t val); /* psblas computational routines */ psb_d_t psb_c_dgedot(psb_c_dvector *xh, psb_c_dvector *yh, psb_c_descriptor *cdh); diff --git a/cbind/base/psb_c_psblas_cbind_mod.f90 b/cbind/base/psb_c_psblas_cbind_mod.f90 index aea9bad2b..ad3aee04c 100644 --- a/cbind/base/psb_c_psblas_cbind_mod.f90 +++ b/cbind/base/psb_c_psblas_cbind_mod.f90 @@ -2,7 +2,6 @@ module psb_c_psblas_cbind_mod use iso_c_binding use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod contains @@ -430,14 +429,13 @@ contains function psb_c_cgecmp(xh,ch,zh,cdh) bind(c) result(res) implicit none integer(psb_c_ipk_) :: res - + real(c_float_complex), value :: ch type(psb_c_cvector) :: xh,zh type(psb_c_descriptor) :: cdh type(psb_desc_type), pointer :: descp type(psb_c_vect_type), pointer :: xp,zp integer(psb_c_ipk_) :: info - real(c_float_complex), value :: ch res = -1 diff --git a/cbind/base/psb_c_sbase.h b/cbind/base/psb_c_sbase.h index 68abefdd9..ae1ff71e2 100644 --- a/cbind/base/psb_c_sbase.h +++ b/cbind/base/psb_c_sbase.h @@ -22,16 +22,25 @@ psb_s_t *psb_c_svect_get_cpy( psb_c_svector *xh); psb_i_t psb_c_svect_f_get_cpy(psb_s_t *v, psb_c_svector *xh); psb_i_t psb_c_svect_zero(psb_c_svector *xh); psb_s_t *psb_c_svect_f_get_pnt( psb_c_svector *xh); +psb_i_t psb_c_svect_clone(psb_c_svector *xh,psb_c_svector *yh); psb_i_t psb_c_sgeall(psb_c_svector *xh, psb_c_descriptor *cdh); psb_i_t psb_c_sgeall_remote(psb_c_svector *xh, psb_c_descriptor *cdh); +psb_i_t psb_c_sgeall_remote_options(psb_c_svector *xh, psb_c_descriptor *cdh, + psb_i_t bldmode, psb_i_t duple); psb_i_t psb_c_sgeins(psb_i_t nz, const psb_l_t *irw, const psb_s_t *val, psb_c_svector *xh, psb_c_descriptor *cdh); psb_i_t psb_c_sgeins_add(psb_i_t nz, const psb_l_t *irw, const psb_s_t *val, psb_c_svector *xh, psb_c_descriptor *cdh); psb_i_t psb_c_sgeasb(psb_c_svector *xh, psb_c_descriptor *cdh); +psb_i_t psb_c_sgeasb_options(psb_c_svector *xh, psb_c_descriptor *cdh, psb_i_t dupl); +psb_i_t psb_c_sgeasb_options_format(psb_c_svector *xh, psb_c_descriptor *cdh, + const char *fmt, psb_i_t dupl); psb_i_t psb_c_sgefree(psb_c_svector *xh, psb_c_descriptor *cdh); +psb_i_t psb_c_sgereinit(psb_c_svector *xh, psb_c_descriptor *cdh, bool clear); psb_s_t psb_c_sgetelem(psb_c_svector *xh,psb_l_t index,psb_c_descriptor *cd); +psb_s_t psb_c_smatgetelem(psb_c_sspmat *ah,psb_l_t rowindex,psb_l_t colindex,psb_c_descriptor *cdh); + /* sparse matrices*/ psb_c_sspmat* psb_c_new_sspmat(); @@ -51,13 +60,16 @@ psb_i_t psb_c_sset_matupd(psb_c_sspmat *mh,psb_c_descriptor *cdh); psb_i_t psb_c_sset_matasb(psb_c_sspmat *mh,psb_c_descriptor *cdh); psb_i_t psb_c_sset_matbld(psb_c_sspmat *mh,psb_c_descriptor *cdh); psb_i_t psb_c_scopy_mat(psb_c_sspmat *ah,psb_c_sspmat *bh,psb_c_descriptor *cdh); - -/* psb_i_t psb_c_sspasb_opt(psb_c_sspmat *mh, psb_c_descriptor *cdh, */ -/* const char *afmt, psb_i_t upd, psb_i_t dupl); */ + + psb_i_t psb_c_sspasb_opt(psb_c_sspmat *mh, psb_c_descriptor *cdh, + const char *afmt, psb_i_t upd, psb_i_t dupl); psb_i_t psb_c_ssprn(psb_c_sspmat *mh, psb_c_descriptor *cdh, _Bool clear); psb_i_t psb_c_smat_name_print(psb_c_sspmat *mh, char *name); -psb_i_t psb_c_svect_set_scal(psb_c_svector *xh, psb_s_t val); -psb_i_t psb_c_svect_set_vect(psb_c_svector *xh, psb_s_t *val, psb_i_t n); +psb_i_t psb_c_svect_set_scal(psb_c_svector *xh, psb_s_t val); +psb_i_t psb_c_svect_set_vect(psb_c_svector *xh, psb_s_t *val, psb_i_t n); +psb_s_t psb_c_svect_get_entry(psb_c_svector *xh, psb_i_t index); +psb_i_t psb_c_svect_set_entry(psb_c_svector *xh, psb_i_t index, psb_s_t val); + /* psblas computational routines */ psb_s_t psb_c_sgedot(psb_c_svector *xh, psb_c_svector *yh, psb_c_descriptor *cdh); diff --git a/cbind/base/psb_c_serial_cbind_mod.F90 b/cbind/base/psb_c_serial_cbind_mod.F90 index b298d84ae..7de87ccce 100644 --- a/cbind/base/psb_c_serial_cbind_mod.F90 +++ b/cbind/base/psb_c_serial_cbind_mod.F90 @@ -2,7 +2,6 @@ module psb_c_serial_cbind_mod use iso_c_binding use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod use psb_base_tools_cbind_mod contains @@ -89,7 +88,6 @@ contains function psb_c_cmat_get_nrows(mh) bind(c) result(res) use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -112,7 +110,6 @@ contains function psb_c_cmat_get_ncols(mh) bind(c) result(res) use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -135,7 +132,6 @@ contains function psb_c_cmat_name_print(mh,name) bind(c) result(res) use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -151,7 +147,7 @@ contains else return end if - call stringc2f(name,fname) + call psb_stringc2f(name,fname) call ap%print(fname,head='PSBLAS Cbinding Interface') @@ -204,5 +200,74 @@ contains end function psb_c_cvect_set_vect + function psb_c_cvect_set_entry(x,index,val) bind(c) result(info) + use psb_base_mod + implicit none + + type(psb_c_cvector) :: x + type(psb_c_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + integer(psb_c_ipk_), value :: index + complex(c_float_complex), value :: val + integer(psb_c_ipk_) :: ixb + + info = -1; + + if (c_associated(x%item)) then + call c_f_pointer(x%item,xp) + else + return + end if + + ixb = psb_c_get_index_base() + call xp%set_entry((index+(1-ixb)),val) + info = 0 + + end function psb_c_cvect_set_entry + + + function psb_c_cvect_get_entry(x,index) bind(c) result(res) + use psb_base_mod + implicit none + + type(psb_c_cvector) :: x + type(psb_c_vect_type), pointer :: xp + integer(psb_c_ipk_), value :: index + complex(c_float_complex) :: res + integer(psb_c_ipk_) :: ixb + + if (c_associated(x%item)) then + call c_f_pointer(x%item,xp) + else + return + end if + + ixb = psb_c_get_index_base() + res = xp%get_entry((index+(1-ixb))) + end function psb_c_cvect_get_entry + + function psb_c_cvect_clone(xh,yh) bind(c) result(info) + implicit none + + integer(psb_c_ipk_) :: info + type(psb_c_cvector) :: xh,yh + + type(psb_c_vect_type), pointer :: xp,yp + + info = -1 + + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(yh%item)) then + call c_f_pointer(yh%item,yp) + else + return + end if + call xp%clone(yp,info) + + end function psb_c_cvect_clone end module psb_c_serial_cbind_mod diff --git a/cbind/base/psb_c_tools_cbind_mod.F90 b/cbind/base/psb_c_tools_cbind_mod.F90 index b7895de2a..05267b7a8 100644 --- a/cbind/base/psb_c_tools_cbind_mod.F90 +++ b/cbind/base/psb_c_tools_cbind_mod.F90 @@ -3,8 +3,10 @@ module psb_c_tools_cbind_mod use psb_base_mod use psb_cpenv_mod use psb_objhandle_mod - use psb_base_string_cbind_mod use psb_base_tools_cbind_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif contains @@ -67,6 +69,38 @@ contains return end function psb_c_cgeall_remote + function psb_c_cgeall_remote_options(xh,cdh,bldmode,dupl) bind(c) result(res) + + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_cvector) :: xh + type(psb_c_descriptor) :: cdh + integer(psb_c_ipk_), value :: dupl + integer(psb_c_ipk_), value :: bldmode + + + type(psb_desc_type), pointer :: descp + type(psb_c_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + return + end if + allocate(xp) + call psb_geall(xp,descp,info,bldmode=bldmode,dupl=dupl) + xh%item = c_loc(xp) + res = min(0,info) + + return + end function psb_c_cgeall_remote_options + function psb_c_cgeasb(xh,cdh) bind(c) result(res) implicit none @@ -97,6 +131,94 @@ contains return end function psb_c_cgeasb + function psb_c_cgeasb_options(xh,cdh,dupl) bind(c) result(res) + + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_cvector) :: xh + type(psb_c_descriptor) :: cdh + integer(psb_c_ipk_), value :: dupl + + + type(psb_desc_type), pointer :: descp + type(psb_d_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + + call psb_geasb(xp,descp,info,dupl=dupl) + res = min(0,info) + + return + end function psb_c_cgeasb_options + + function psb_c_cgeasb_options_format(xh,cdh,dupl,format) bind(c) result(res) + ! Takes into account format argument as a c string, and uses it to call the appropriate psb_geasb + ! with mold argument + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_cvector) :: xh + type(psb_c_descriptor) :: cdh + character(kind=c_char), dimension(*) :: format + integer(psb_c_ipk_), value :: dupl + + ! Local variables + character(len=6) :: fformat + type(psb_desc_type), pointer :: descp + type(psb_c_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + ! mold variables +#ifdef PSB_HAVE_CUDA + type(psb_c_vect_cuda), target :: vgpu +#endif + type(psb_c_base_vect_type), target :: vect + class(psb_c_base_vect_type), pointer :: vmold + + ! Select mold based on format + call psb_stringc2f(format,fformat) + + select case (psb_toupper(fformat)) +#ifdef PSB_HAVE_CUDA + case('GPU','DEVICE') + vmold => vgpu +#endif + case('CPU','HOST') + vmold => vect + case default + write(psb_out_unit,*) 'psb_c_cgeasb_options_format: Unknown format ',fformat + vmold => vect + end select + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + + call psb_geasb(xp,descp,info,dupl=dupl,mold=vmold) + res = min(0,info) + + return + end function psb_c_cgeasb_options_format + + function psb_c_cgefree(xh,cdh) bind(c) result(res) implicit none @@ -159,13 +281,19 @@ contains end if ixb = psb_c_get_index_base() - if (ixb == 1) then - call psb_geins(nz,irw(1:nz),val(1:nz),& - & xp,descp,info) - else + select case(ixb) + case (0) + !write(0,*) 'C_GEINS: IDX_BASE',ixb,' :',irw(1:nz)+(1-ixb),val(1:nz) call psb_geins(nz,(irw(1:nz)+(1-ixb)),val(1:nz),& & xp,descp,info) - end if + case(1) + !write(0,*) 'C_GEINS: IDX_BASE',ixb,' :',irw(1:nz),val(1:nz) + call psb_geins(nz,irw(1:nz),val(1:nz),& + & xp,descp,info) + case default + write(0,*) 'C_GEINS: Unkonwn inndex base ',ixb + info =-2 + end select res = min(0,info) @@ -288,48 +416,133 @@ contains end function psb_c_cspfree -#if 0 - function psb_c_cspasb_opt(mh,cdh,afmt,upd) bind(c) result(res) -#ifdef PSB_HAVE_LIBRSB + function psb_c_cspasb_opt(mh,cdh,afmt,upd,dupl) bind(c) result(res) + +#if 0 +#ifdef PSB_HAVE_LIBRSB use psb_c_rsb_mat_mod #endif +#endif +#if defined(PSB_HAVE_CUDA) + use psb_cuda_mod +#endif + use psb_ext_mod implicit none integer(psb_c_ipk_) :: res - integer(psb_c_ipk_), value :: cdh, mh,upd,dupl + type(psb_c_cspmat) :: mh + type(psb_c_descriptor) :: cdh + integer(psb_c_ipk_), value :: upd,dupl character(c_char) :: afmt(*) integer(psb_c_ipk_) :: info,n character(len=5) :: fafmt + integer(psb_ipk_), parameter :: hksz = 32 + ! mold variables +#if 0 #ifdef PSB_HAVE_LIBRSB type(psb_c_rsb_sparse_mat) :: arsb #endif +#endif + type(psb_c_ell_sparse_mat), target :: aell + type(psb_c_csr_sparse_mat), target :: acsr + type(psb_c_csc_sparse_mat), target :: acsc + type(psb_c_coo_sparse_mat), target :: acoo + type(psb_c_hll_sparse_mat), target :: ahll + type(psb_c_hdia_sparse_mat), target :: ahdia + type(psb_c_dns_sparse_mat), target :: adns +#if defined(PSB_HAVE_CUDA) + type(psb_c_cuda_hlg_sparse_mat), target :: ahlg + type(psb_c_cuda_csrg_sparse_mat), target :: acsrg + type(psb_c_cuda_elg_sparse_mat), target :: aelg +#endif + class(psb_c_base_sparse_mat), pointer :: amold + !Local variables + type(psb_desc_type), pointer :: descp + type(psb_cspmat_type), pointer :: ap res = -1 - call psb_check_descriptor_handle(cdh,info) - if (info < 0) return - call psb_check_double_spmat_handle(mh,info) - if (info < 0) return + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(mh%item)) then + call c_f_pointer(mh%item,ap) + else + return + end if + call psb_stringc2f(afmt,fafmt) + + ! Set the mold variable based on afmt + select case (psb_toupper(fafmt)) +#if defined(PSB_HAVE_CUDA) + case('ELG') + amold => aelg + case('HLG') + call psi_set_hksz(hksz) + amold => ahlg + case('CSRG') + amold => acsrg + case('ELL') + amold => aell + case('HLL') + call psi_set_hksz(hksz) + amold => ahll + case('CSR') + amold => acsr + case('CSC') + amold => acsc + case('DNS') + amold => adns + case default + write(*,*) 'Unknown format defaulting to HLG' + amold => ahlg +#else + case('ELL') + amold => aell + case('HLL') + call psi_set_hksz(hksz) + amold => ahll + amold => ahdia + case('CSR') + amold => acsr + case('CSC') + amold => acsc + case('DNS') + amold => adns + case default + write(*,*) 'Unknown format defaulting to CSR' + amold => acsr +#endif + end select - call stringc2f(afmt,fafmt) select case(fafmt) +#if 0 #ifdef PSB_HAVE_LIBRSB case('RSB') call psb_spasb(double_spmat_pool(mh)%item,descriptor_pool(cdh)%item,info,& & upd=upd,mold=arsb) #endif +#endif + case('ELL','HLL','CSR','DNS','CSC') + call psb_spasb(ap,descp,info,upd=upd,mold=amold) +#if defined(PSB_HAVE_CUDA) + case('ELG','HLG','CSRG') + call psb_spasb(ap,descp,info,upd=upd,mold=amold) +#endif case default - call psb_spasb(double_spmat_pool(mh)%item,descriptor_pool(cdh)%item,info,& - & afmt=fafmt,upd=upd) + write(psb_out_unit,*) 'psb_c_cspasb_opt: Unknown format ',fafmt + call psb_spasb(ap,descp,info,afmt=fafmt,upd=upd,dupl=dupl) end select res = min(0,info) return end function psb_c_cspasb_opt -#endif - function psb_c_cspins(nz,irw,icl,val,mh,cdh) bind(c) result(res) + + function psb_c_cspins(nz,irw,icl,val,mh,cdh) bind(c) result(res) implicit none integer(psb_c_ipk_) :: res @@ -452,4 +665,39 @@ contains end function psb_c_cgetelem + function psb_c_cmatgetelem(ah,rowindex,colindex,cdh) bind(c) result(res) + implicit none + + type(psb_c_cspmat) :: ah + integer(psb_c_lpk_), value :: rowindex, colindex + type(psb_c_descriptor) :: cdh + complex(c_float_complex) :: res + + type(psb_cspmat_type), pointer :: ap + type(psb_desc_type), pointer :: descp + integer(psb_c_ipk_) :: info, ixb + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + + ixb = psb_c_get_index_base() + if (ixb == 1) then + res = psb_getelem(ap,rowindex,colindex,descp,info) + else + res = psb_getelem(ap,rowindex+(1-ixb),colindex+(1-ixb),descp,info) + end if + + return + + end function psb_c_cmatgetelem + end module psb_c_tools_cbind_mod diff --git a/cbind/base/psb_c_zbase.h b/cbind/base/psb_c_zbase.h index 9a27e9c0b..ac7d2b6c4 100644 --- a/cbind/base/psb_c_zbase.h +++ b/cbind/base/psb_c_zbase.h @@ -22,16 +22,25 @@ psb_z_t *psb_c_zvect_get_cpy( psb_c_zvector *xh); psb_i_t psb_c_zvect_f_get_cpy(psb_z_t *v, psb_c_zvector *xh); psb_i_t psb_c_zvect_zero(psb_c_zvector *xh); psb_z_t *psb_c_zvect_f_get_pnt( psb_c_zvector *xh); +psb_i_t psb_c_zvect_clone(psb_c_zvector *xh,psb_c_zvector *yh); psb_i_t psb_c_zgeall(psb_c_zvector *xh, psb_c_descriptor *cdh); psb_i_t psb_c_zgeall_remote(psb_c_zvector *xh, psb_c_descriptor *cdh); +psb_i_t psb_c_zgeall_remote_options(psb_c_zvector *xh, psb_c_descriptor *cdh, + psb_i_t bldmode, psb_i_t duple); psb_i_t psb_c_zgeins(psb_i_t nz, const psb_l_t *irw, const psb_z_t *val, psb_c_zvector *xh, psb_c_descriptor *cdh); psb_i_t psb_c_zgeins_add(psb_i_t nz, const psb_l_t *irw, const psb_z_t *val, psb_c_zvector *xh, psb_c_descriptor *cdh); psb_i_t psb_c_zgeasb(psb_c_zvector *xh, psb_c_descriptor *cdh); +psb_i_t psb_c_zgeasb_options(psb_c_zvector *xh, psb_c_descriptor *cdh, psb_i_t dupl); +psb_i_t psb_c_zgeasb_options_format(psb_c_zvector *xh, psb_c_descriptor *cdh, + const char *fmt, psb_i_t dupl); psb_i_t psb_c_zgefree(psb_c_zvector *xh, psb_c_descriptor *cdh); +psb_i_t psb_c_zgereinit(psb_c_zvector *xh, psb_c_descriptor *cdh, bool clear); psb_z_t psb_c_zgetelem(psb_c_zvector *xh,psb_l_t index,psb_c_descriptor *cd); +psb_z_t psb_c_zmatgetelem(psb_c_zspmat *ah,psb_l_t rowindex,psb_l_t colindex,psb_c_descriptor *cdh); + /* sparse matrices*/ psb_c_zspmat* psb_c_new_zspmat(); @@ -53,12 +62,14 @@ psb_i_t psb_c_zset_matbld(psb_c_zspmat *mh,psb_c_descriptor *cdh); psb_i_t psb_c_zcopy_mat(psb_c_zspmat *ah,psb_c_zspmat *bh,psb_c_descriptor *cdh); -/* psb_i_t psb_c_zspasb_opt(psb_c_zspmat *mh, psb_c_descriptor *cdh, */ -/* const char *afmt, psb_i_t upd, psb_i_t dupl); */ +psb_i_t psb_c_zspasb_opt(psb_c_zspmat *mh, psb_c_descriptor *cdh, + const char *afmt, psb_i_t upd, psb_i_t dupl); psb_i_t psb_c_zsprn(psb_c_zspmat *mh, psb_c_descriptor *cdh, _Bool clear); psb_i_t psb_c_zmat_name_print(psb_c_zspmat *mh, char *name); -psb_i_t psb_c_zvect_set_scal(psb_c_zvector *xh, psb_z_t val); -psb_i_t psb_c_zvect_set_vect(psb_c_zvector *xh, psb_z_t *val, psb_i_t n); +psb_i_t psb_c_zvect_set_scal(psb_c_zvector *xh, psb_z_t val); +psb_i_t psb_c_zvect_set_vect(psb_c_zvector *xh, psb_z_t *val, psb_i_t n); +psb_z_t psb_c_zvect_get_entry(psb_c_zvector *xh, psb_i_t index); +psb_i_t psb_c_zvect_set_entry(psb_c_zvector *xh, psb_i_t index, psb_z_t val); /* psblas computational routines */ psb_z_t psb_c_zgedot(psb_c_zvector *xh, psb_c_zvector *yh, psb_c_descriptor *cdh); diff --git a/cbind/base/psb_cpenv_mod.f90 b/cbind/base/psb_cpenv_mod.F90 similarity index 81% rename from cbind/base/psb_cpenv_mod.f90 rename to cbind/base/psb_cpenv_mod.F90 index e1003e998..c6b3d9aa7 100644 --- a/cbind/base/psb_cpenv_mod.f90 +++ b/cbind/base/psb_cpenv_mod.F90 @@ -1,5 +1,6 @@ module psb_cpenv_mod use iso_c_binding + use psb_base_mod use psb_objhandle_mod integer, private :: psb_c_index_base=0 @@ -22,7 +23,6 @@ contains end subroutine psb_c_set_index_base function psb_c_get_errstatus() bind(c) result(res) - use psb_base_mod, only : psb_get_errstatus, psb_ctxt_type implicit none integer(psb_c_ipk_) :: res @@ -31,7 +31,6 @@ contains end function psb_c_get_errstatus subroutine psb_c_init(cctxt) bind(c) - use psb_base_mod, only : psb_init, psb_ctxt_type implicit none type(psb_c_object_type) :: cctxt @@ -50,6 +49,86 @@ contains end subroutine psb_c_init +#ifdef PSB_HAVE_CUDA + subroutine psb_c_cuda_init(cctxt) bind(c, name="psb_c_cuda_init") + use psb_cuda_mod, only : psb_cuda_init + implicit none + + type(psb_c_object_type) :: cctxt + type(psb_ctxt_type), pointer :: ctxt + integer :: info + + if (c_associated(cctxt%item)) then + call c_f_pointer(cctxt%item,ctxt) + end if + call psb_cuda_init(ctxt) + cctxt%item = c_loc(ctxt) + end subroutine psb_c_cuda_init + + subroutine psb_c_cuda_init_opt(cctxt,cdevice) bind(c, name="psb_c_cuda_init_opt") + use psb_cuda_mod, only : psb_cuda_init + implicit none + + type(psb_c_object_type) :: cctxt + type(psb_ctxt_type), pointer :: ctxt + integer(psb_c_mpk_), value :: cdevice + integer :: info + ! Local variables + integer(psb_mpk_) :: cdevice_f + + cdevice_f = cdevice + + if (c_associated(cctxt%item)) then + call c_f_pointer(cctxt%item,ctxt) + end if + call psb_cuda_init(ctxt,cdevice_f) + cctxt%item = c_loc(ctxt) + + end subroutine psb_c_cuda_init_opt + + subroutine psb_c_cuda_exit() bind(c, name="psb_c_cuda_exit") + use psb_cuda_mod, only : psb_cuda_exit + implicit none + + call psb_cuda_exit() + return + end subroutine psb_c_cuda_exit + + function psb_c_cuda_getDeviceCount() bind(c, name="psb_c_cuda_getDeviceCount") result(res) + use psb_cuda_mod, only : psb_cuda_getDeviceCount + implicit none + integer(psb_c_ipk_) :: res + ! Local variables + integer(psb_ipk_) :: fres + + fres = psb_cuda_getDeviceCount() + res = fres + + return + end function psb_c_cuda_getDeviceCount +#endif + + ! Get MPI_Fint from C, psb_c_object_type and start a psb_ctxt_type + ! context from it. + subroutine psb_c_init_from_fint(cctxt,fint) bind(c) + implicit none + + type(psb_c_object_type) :: cctxt + integer(psb_c_mpk_), value :: fint + type(psb_ctxt_type), pointer :: ctxt + integer :: info + + ! Local variables + integer(psb_mpk_) :: fmctxt + + allocate(ctxt,stat=info) + if (info /= 0) return + fmctxt = fint + call psb_init(ctxt,extcomm=fmctxt) + cctxt%item = c_loc(ctxt) + + end subroutine psb_c_init_from_fint + function psb_c2f_ctxt(cctxt) result(res) implicit none type(psb_c_object_type), value :: cctxt @@ -97,7 +176,6 @@ contains end function subroutine psb_c_exit_ctxt(cctxt) bind(c) - use psb_base_mod, only : psb_exit, psb_ctxt_type type(psb_c_object_type), value :: cctxt type(psb_ctxt_type), pointer :: ctxt @@ -110,7 +188,6 @@ contains end subroutine psb_c_exit_ctxt subroutine psb_c_exit(cctxt) bind(c) - use psb_base_mod, only : psb_exit, psb_ctxt_type type(psb_c_object_type), value :: cctxt type(psb_ctxt_type), pointer :: ctxt @@ -124,7 +201,6 @@ contains end subroutine psb_c_exit subroutine psb_c_abort(cctxt) bind(c) - use psb_base_mod, only : psb_abort, psb_ctxt_type type(psb_c_object_type), value :: cctxt type(psb_ctxt_type), pointer :: ctxt @@ -134,7 +210,6 @@ contains end subroutine psb_c_abort subroutine psb_c_check_error(cctxt) bind(c) - use psb_base_mod, only : psb_init, psb_ctxt_type, psb_check_error implicit none type(psb_c_object_type), value :: cctxt @@ -147,7 +222,6 @@ contains end subroutine psb_c_check_error subroutine psb_c_info(cctxt,iam,np) bind(c) - use psb_base_mod, only : psb_info, psb_ctxt_type type(psb_c_object_type), value :: cctxt integer(psb_c_ipk_) :: iam,np @@ -158,7 +232,6 @@ contains end subroutine psb_c_info subroutine psb_c_barrier(cctxt) bind(c) - use psb_base_mod, only : psb_barrier, psb_ctxt_type type(psb_c_object_type), value :: cctxt type(psb_ctxt_type), pointer :: ctxt @@ -167,13 +240,11 @@ contains end subroutine psb_c_barrier real(c_double) function psb_c_wtime() bind(c) - use psb_base_mod, only : psb_wtime, psb_ctxt_type psb_c_wtime = psb_wtime() end function psb_c_wtime subroutine psb_c_mbcast(cctxt,n,v,root) bind(c) - use psb_base_mod, only : psb_bcast, psb_ctxt_type implicit none type(psb_c_object_type), value :: cctxt integer(psb_c_ipk_), value :: n, root @@ -194,7 +265,6 @@ contains end subroutine psb_c_mbcast subroutine psb_c_ibcast(cctxt,n,v,root) bind(c) - use psb_base_mod, only : psb_bcast, psb_ctxt_type implicit none type(psb_c_object_type), value :: cctxt integer(psb_c_ipk_), value :: n, root @@ -215,7 +285,6 @@ contains end subroutine psb_c_ibcast subroutine psb_c_lbcast(cctxt,n,v,root) bind(c) - use psb_base_mod, only : psb_bcast, psb_ctxt_type implicit none type(psb_c_object_type), value :: cctxt integer(psb_c_ipk_), value :: n, root @@ -235,7 +304,6 @@ contains end subroutine psb_c_lbcast subroutine psb_c_ebcast(cctxt,n,v,root) bind(c) - use psb_base_mod, only : psb_bcast, psb_ctxt_type implicit none type(psb_c_object_type), value :: cctxt integer(psb_c_ipk_), value :: n, root @@ -255,7 +323,6 @@ contains end subroutine psb_c_ebcast subroutine psb_c_sbcast(cctxt,n,v,root) bind(c) - use psb_base_mod implicit none type(psb_c_object_type), value :: cctxt integer(psb_c_ipk_), value :: n, root @@ -275,7 +342,6 @@ contains end subroutine psb_c_sbcast subroutine psb_c_dbcast(cctxt,n,v,root) bind(c) - use psb_base_mod, only : psb_bcast, psb_ctxt_type implicit none type(psb_c_object_type), value :: cctxt integer(psb_c_ipk_), value :: n, root @@ -296,7 +362,6 @@ contains subroutine psb_c_cbcast(cctxt,n,v,root) bind(c) - use psb_base_mod, only : psb_bcast, psb_ctxt_type implicit none type(psb_c_object_type), value :: cctxt integer(psb_c_ipk_), value :: n, root @@ -316,7 +381,6 @@ contains end subroutine psb_c_cbcast subroutine psb_c_zbcast(cctxt,n,v,root) bind(c) - use psb_base_mod implicit none type(psb_c_object_type), value :: cctxt integer(psb_c_ipk_), value :: n, root @@ -336,7 +400,6 @@ contains end subroutine psb_c_zbcast subroutine psb_c_hbcast(cctxt,v,root) bind(c) - use psb_base_mod, only : psb_bcast, psb_info, psb_ipk_, psb_ctxt_type implicit none type(psb_c_object_type), value :: cctxt integer(psb_c_ipk_), value :: root @@ -361,8 +424,7 @@ contains end subroutine psb_c_hbcast function psb_c_f2c_errmsg(cmesg,len) bind(c) result(res) - use psb_base_mod, only : psb_errpop,psb_max_errmsg_len_, psb_ctxt_type - use psb_base_string_cbind_mod + use psb_string_mod implicit none character(c_char), intent(inout) :: cmesg(*) integer(psb_c_ipk_), intent(in), value :: len @@ -381,7 +443,7 @@ contains il = len_trim(tmp) il = min(il,len-ll) !write(0,*) 'loop f2c_errmsg: ', ll,il - call stringf2c(tmp(1:il),cmesg(ll:ll+il)) + call psb_stringf2c(tmp(1:il),cmesg(ll:ll+il)) cmesg(ll+il)=c_new_line ll = ll+il+1 end do @@ -391,17 +453,14 @@ contains end function psb_c_f2c_errmsg subroutine psb_c_seterraction_ret() bind(c) - use psb_base_mod, only : psb_set_erraction, psb_act_ret_, psb_ctxt_type call psb_set_erraction(psb_act_ret_) end subroutine psb_c_seterraction_ret subroutine psb_c_seterraction_print() bind(c) - use psb_base_mod, only : psb_set_erraction, psb_act_print_, psb_ctxt_type call psb_set_erraction(psb_act_print_) end subroutine psb_c_seterraction_print subroutine psb_c_seterraction_abort() bind(c) - use psb_base_mod, only : psb_set_erraction, psb_act_abort_, psb_ctxt_type call psb_set_erraction(psb_act_abort_) end subroutine psb_c_seterraction_abort diff --git a/cbind/base/psb_d_comm_cbind_mod.f90 b/cbind/base/psb_d_comm_cbind_mod.f90 index 653a24849..49371e3aa 100644 --- a/cbind/base/psb_d_comm_cbind_mod.f90 +++ b/cbind/base/psb_d_comm_cbind_mod.f90 @@ -2,7 +2,6 @@ module psb_d_comm_cbind_mod use iso_c_binding use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod contains diff --git a/cbind/base/psb_d_psblas_cbind_mod.f90 b/cbind/base/psb_d_psblas_cbind_mod.f90 index da5aa2e21..bb77272e0 100644 --- a/cbind/base/psb_d_psblas_cbind_mod.f90 +++ b/cbind/base/psb_d_psblas_cbind_mod.f90 @@ -2,7 +2,6 @@ module psb_d_psblas_cbind_mod use iso_c_binding use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod contains @@ -430,14 +429,13 @@ contains function psb_c_dgecmp(xh,ch,zh,cdh) bind(c) result(res) implicit none integer(psb_c_ipk_) :: res - + real(c_double), value :: ch type(psb_c_dvector) :: xh,zh type(psb_c_descriptor) :: cdh type(psb_desc_type), pointer :: descp type(psb_d_vect_type), pointer :: xp,zp integer(psb_c_ipk_) :: info - real(c_double), value :: ch res = -1 diff --git a/cbind/base/psb_d_serial_cbind_mod.F90 b/cbind/base/psb_d_serial_cbind_mod.F90 index 984f826f6..c365eb55b 100644 --- a/cbind/base/psb_d_serial_cbind_mod.F90 +++ b/cbind/base/psb_d_serial_cbind_mod.F90 @@ -2,7 +2,6 @@ module psb_d_serial_cbind_mod use iso_c_binding use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod use psb_base_tools_cbind_mod contains @@ -89,7 +88,6 @@ contains function psb_c_dmat_get_nrows(mh) bind(c) result(res) use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -112,7 +110,6 @@ contains function psb_c_dmat_get_ncols(mh) bind(c) result(res) use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -135,7 +132,6 @@ contains function psb_c_dmat_name_print(mh,name) bind(c) result(res) use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -151,7 +147,7 @@ contains else return end if - call stringc2f(name,fname) + call psb_stringc2f(name,fname) call ap%print(fname,head='PSBLAS Cbinding Interface') @@ -204,5 +200,74 @@ contains end function psb_c_dvect_set_vect + function psb_c_dvect_set_entry(x,index,val) bind(c) result(info) + use psb_base_mod + implicit none + + type(psb_c_dvector) :: x + type(psb_d_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + integer(psb_c_ipk_), value :: index + real(c_double), value :: val + integer(psb_c_ipk_) :: ixb + + info = -1; + + if (c_associated(x%item)) then + call c_f_pointer(x%item,xp) + else + return + end if + + ixb = psb_c_get_index_base() + call xp%set_entry((index+(1-ixb)),val) + info = 0 + + end function psb_c_dvect_set_entry + + + function psb_c_dvect_get_entry(x,index) bind(c) result(res) + use psb_base_mod + implicit none + + type(psb_c_dvector) :: x + type(psb_d_vect_type), pointer :: xp + integer(psb_c_ipk_), value :: index + real(c_double) :: res + integer(psb_c_ipk_) :: ixb + + if (c_associated(x%item)) then + call c_f_pointer(x%item,xp) + else + return + end if + + ixb = psb_c_get_index_base() + res = xp%get_entry((index+(1-ixb))) + end function psb_c_dvect_get_entry + + function psb_c_dvect_clone(xh,yh) bind(c) result(info) + implicit none + + integer(psb_c_ipk_) :: info + type(psb_c_dvector) :: xh,yh + + type(psb_d_vect_type), pointer :: xp,yp + + info = -1 + + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(yh%item)) then + call c_f_pointer(yh%item,yp) + else + return + end if + call xp%clone(yp,info) + + end function psb_c_dvect_clone end module psb_d_serial_cbind_mod diff --git a/cbind/base/psb_d_tools_cbind_mod.F90 b/cbind/base/psb_d_tools_cbind_mod.F90 index 2de6990c2..11d56d2b9 100644 --- a/cbind/base/psb_d_tools_cbind_mod.F90 +++ b/cbind/base/psb_d_tools_cbind_mod.F90 @@ -3,8 +3,10 @@ module psb_d_tools_cbind_mod use psb_base_mod use psb_cpenv_mod use psb_objhandle_mod - use psb_base_string_cbind_mod use psb_base_tools_cbind_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif contains @@ -67,6 +69,38 @@ contains return end function psb_c_dgeall_remote + function psb_c_dgeall_remote_options(xh,cdh,bldmode,dupl) bind(c) result(res) + + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_dvector) :: xh + type(psb_c_descriptor) :: cdh + integer(psb_c_ipk_), value :: dupl + integer(psb_c_ipk_), value :: bldmode + + + type(psb_desc_type), pointer :: descp + type(psb_d_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + return + end if + allocate(xp) + call psb_geall(xp,descp,info,bldmode=bldmode,dupl=dupl) + xh%item = c_loc(xp) + res = min(0,info) + + return + end function psb_c_dgeall_remote_options + function psb_c_dgeasb(xh,cdh) bind(c) result(res) implicit none @@ -97,6 +131,94 @@ contains return end function psb_c_dgeasb + function psb_c_dgeasb_options(xh,cdh,dupl) bind(c) result(res) + + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_dvector) :: xh + type(psb_c_descriptor) :: cdh + integer(psb_c_ipk_), value :: dupl + + + type(psb_desc_type), pointer :: descp + type(psb_d_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + + call psb_geasb(xp,descp,info,dupl=dupl) + res = min(0,info) + + return + end function psb_c_dgeasb_options + + function psb_c_dgeasb_options_format(xh,cdh,dupl,format) bind(c) result(res) + ! Takes into account format argument as a c string, and uses it to call the appropriate psb_geasb + ! with mold argument + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_dvector) :: xh + type(psb_c_descriptor) :: cdh + character(kind=c_char), dimension(*) :: format + integer(psb_c_ipk_), value :: dupl + + ! Local variables + character(len=6) :: fformat + type(psb_desc_type), pointer :: descp + type(psb_d_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + ! mold variables +#ifdef PSB_HAVE_CUDA + type(psb_d_vect_cuda), target :: vgpu +#endif + type(psb_d_base_vect_type), target :: vect + class(psb_d_base_vect_type), pointer :: vmold + + ! Select mold based on format + call psb_stringc2f(format,fformat) + + select case (psb_toupper(fformat)) +#ifdef PSB_HAVE_CUDA + case('GPU','DEVICE') + vmold => vgpu +#endif + case('CPU','HOST') + vmold => vect + case default + write(psb_out_unit,*) 'psb_c_dgeasb_options_format: Unknown format ',fformat + vmold => vect + end select + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + + call psb_geasb(xp,descp,info,dupl=dupl,mold=vmold) + res = min(0,info) + + return + end function psb_c_dgeasb_options_format + + function psb_c_dgefree(xh,cdh) bind(c) result(res) implicit none @@ -159,13 +281,19 @@ contains end if ixb = psb_c_get_index_base() - if (ixb == 1) then - call psb_geins(nz,irw(1:nz),val(1:nz),& - & xp,descp,info) - else + select case(ixb) + case (0) + !write(0,*) 'C_GEINS: IDX_BASE',ixb,' :',irw(1:nz)+(1-ixb),val(1:nz) call psb_geins(nz,(irw(1:nz)+(1-ixb)),val(1:nz),& & xp,descp,info) - end if + case(1) + !write(0,*) 'C_GEINS: IDX_BASE',ixb,' :',irw(1:nz),val(1:nz) + call psb_geins(nz,irw(1:nz),val(1:nz),& + & xp,descp,info) + case default + write(0,*) 'C_GEINS: Unkonwn inndex base ',ixb + info =-2 + end select res = min(0,info) @@ -288,48 +416,143 @@ contains end function psb_c_dspfree -#if 0 - function psb_c_dspasb_opt(mh,cdh,afmt,upd) bind(c) result(res) -#ifdef PSB_HAVE_LIBRSB + function psb_c_dspasb_opt(mh,cdh,afmt,upd,dupl) bind(c) result(res) + +#if 0 +#ifdef PSB_HAVE_LIBRSB use psb_d_rsb_mat_mod #endif +#endif +#if defined(PSB_HAVE_CUDA) + use psb_cuda_mod +#endif + use psb_ext_mod implicit none integer(psb_c_ipk_) :: res - integer(psb_c_ipk_), value :: cdh, mh,upd,dupl + type(psb_c_dspmat) :: mh + type(psb_c_descriptor) :: cdh + integer(psb_c_ipk_), value :: upd,dupl character(c_char) :: afmt(*) integer(psb_c_ipk_) :: info,n character(len=5) :: fafmt + integer(psb_ipk_), parameter :: hksz = 32 + ! mold variables +#if 0 #ifdef PSB_HAVE_LIBRSB type(psb_d_rsb_sparse_mat) :: arsb #endif +#endif + type(psb_d_ell_sparse_mat), target :: aell + type(psb_d_csr_sparse_mat), target :: acsr + type(psb_d_csc_sparse_mat), target :: acsc + type(psb_d_coo_sparse_mat), target :: acoo + type(psb_d_hll_sparse_mat), target :: ahll + type(psb_d_hdia_sparse_mat), target :: ahdia + type(psb_d_dns_sparse_mat), target :: adns +#if defined(PSB_HAVE_CUDA) + type(psb_d_cuda_hlg_sparse_mat), target :: ahlg + type(psb_d_cuda_hdiag_sparse_mat), target :: ahdiag + type(psb_d_cuda_csrg_sparse_mat), target :: acsrg + type(psb_d_cuda_elg_sparse_mat), target :: aelg +#endif + class(psb_d_base_sparse_mat), pointer :: amold + !Local variables + type(psb_desc_type), pointer :: descp + type(psb_dspmat_type), pointer :: ap res = -1 - call psb_check_descriptor_handle(cdh,info) - if (info < 0) return - call psb_check_double_spmat_handle(mh,info) - if (info < 0) return + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(mh%item)) then + call c_f_pointer(mh%item,ap) + else + return + end if + call psb_stringc2f(afmt,fafmt) + + ! Set the mold variable based on afmt + select case (psb_toupper(fafmt)) +#if defined(PSB_HAVE_CUDA) + case('ELG') + amold => aelg + case('HLG') + call psi_set_hksz(hksz) + amold => ahlg + case('HDIAG') + amold => ahdiag + case('CSRG') + amold => acsrg + case('ELL') + amold => aell + case('HLL') + call psi_set_hksz(hksz) + amold => ahll + case('HDIA') + amold => ahdia + case('CSR') + amold => acsr + case('CSC') + amold => acsc + case('DNS') + amold => adns + case default + write(*,*) 'Unknown format defaulting to HLG' + amold => ahlg +#else + case('ELL') + amold => aell + case('HLL') + call psi_set_hksz(hksz) + amold => ahll + case('HDIA') + amold => ahdia + case('CSR') + amold => acsr + case('CSC') + amold => acsc + case('DNS') + amold => adns + case default + write(*,*) 'Unknown format defaulting to CSR' + amold => acsr +#endif + end select - call stringc2f(afmt,fafmt) select case(fafmt) +#if 0 #ifdef PSB_HAVE_LIBRSB case('RSB') call psb_spasb(double_spmat_pool(mh)%item,descriptor_pool(cdh)%item,info,& & upd=upd,mold=arsb) #endif +#endif + case('ELL','HLL','CSR','DNS','CSC') + call psb_spasb(ap,descp,info,upd=upd,mold=amold) + case('HDIA') + call psb_spasb(ap,descp,info,upd=upd,mold=amold) +#if defined(PSB_HAVE_CUDA) + case('ELG','HLG','CSRG') + call psb_spasb(ap,descp,info,upd=upd,mold=amold) + case('HDIAG') + call psb_spasb(ap,descp,info,upd=upd,mold=amold) +#endif case default - call psb_spasb(double_spmat_pool(mh)%item,descriptor_pool(cdh)%item,info,& - & afmt=fafmt,upd=upd) + write(psb_out_unit,*) 'psb_c_dspasb_opt: Unknown format ',fafmt + call psb_spasb(ap,descp,info,afmt=fafmt,upd=upd,dupl=dupl) end select res = min(0,info) return end function psb_c_dspasb_opt -#endif - function psb_c_dspins(nz,irw,icl,val,mh,cdh) bind(c) result(res) + + function psb_c_dspins(nz,irw,icl,val,mh,cdh) bind(c) result(res) implicit none integer(psb_c_ipk_) :: res @@ -452,4 +675,39 @@ contains end function psb_c_dgetelem + function psb_c_dmatgetelem(ah,rowindex,colindex,cdh) bind(c) result(res) + implicit none + + type(psb_c_dspmat) :: ah + integer(psb_c_lpk_), value :: rowindex, colindex + type(psb_c_descriptor) :: cdh + real(c_double) :: res + + type(psb_dspmat_type), pointer :: ap + type(psb_desc_type), pointer :: descp + integer(psb_c_ipk_) :: info, ixb + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + + ixb = psb_c_get_index_base() + if (ixb == 1) then + res = psb_getelem(ap,rowindex,colindex,descp,info) + else + res = psb_getelem(ap,rowindex+(1-ixb),colindex+(1-ixb),descp,info) + end if + + return + + end function psb_c_dmatgetelem + end module psb_d_tools_cbind_mod diff --git a/cbind/base/psb_s_comm_cbind_mod.f90 b/cbind/base/psb_s_comm_cbind_mod.f90 index 8ad27124e..c63d3ffb9 100644 --- a/cbind/base/psb_s_comm_cbind_mod.f90 +++ b/cbind/base/psb_s_comm_cbind_mod.f90 @@ -2,7 +2,6 @@ module psb_s_comm_cbind_mod use iso_c_binding use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod contains diff --git a/cbind/base/psb_s_psblas_cbind_mod.f90 b/cbind/base/psb_s_psblas_cbind_mod.f90 index 97cc5284e..382cabd00 100644 --- a/cbind/base/psb_s_psblas_cbind_mod.f90 +++ b/cbind/base/psb_s_psblas_cbind_mod.f90 @@ -2,7 +2,6 @@ module psb_s_psblas_cbind_mod use iso_c_binding use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod contains @@ -430,14 +429,13 @@ contains function psb_c_sgecmp(xh,ch,zh,cdh) bind(c) result(res) implicit none integer(psb_c_ipk_) :: res - + real(c_float), value :: ch type(psb_c_svector) :: xh,zh type(psb_c_descriptor) :: cdh type(psb_desc_type), pointer :: descp type(psb_s_vect_type), pointer :: xp,zp integer(psb_c_ipk_) :: info - real(c_float), value :: ch res = -1 diff --git a/cbind/base/psb_s_serial_cbind_mod.F90 b/cbind/base/psb_s_serial_cbind_mod.F90 index 83dac1a5d..d78cc5495 100644 --- a/cbind/base/psb_s_serial_cbind_mod.F90 +++ b/cbind/base/psb_s_serial_cbind_mod.F90 @@ -2,7 +2,6 @@ module psb_s_serial_cbind_mod use iso_c_binding use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod use psb_base_tools_cbind_mod contains @@ -89,7 +88,6 @@ contains function psb_c_smat_get_nrows(mh) bind(c) result(res) use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -112,7 +110,6 @@ contains function psb_c_smat_get_ncols(mh) bind(c) result(res) use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -135,7 +132,6 @@ contains function psb_c_smat_name_print(mh,name) bind(c) result(res) use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -151,7 +147,7 @@ contains else return end if - call stringc2f(name,fname) + call psb_stringc2f(name,fname) call ap%print(fname,head='PSBLAS Cbinding Interface') @@ -204,5 +200,74 @@ contains end function psb_c_svect_set_vect + function psb_c_svect_set_entry(x,index,val) bind(c) result(info) + use psb_base_mod + implicit none + + type(psb_c_svector) :: x + type(psb_s_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + integer(psb_c_ipk_), value :: index + real(c_float), value :: val + integer(psb_c_ipk_) :: ixb + + info = -1; + + if (c_associated(x%item)) then + call c_f_pointer(x%item,xp) + else + return + end if + + ixb = psb_c_get_index_base() + call xp%set_entry((index+(1-ixb)),val) + info = 0 + + end function psb_c_svect_set_entry + + + function psb_c_svect_get_entry(x,index) bind(c) result(res) + use psb_base_mod + implicit none + + type(psb_c_svector) :: x + type(psb_s_vect_type), pointer :: xp + integer(psb_c_ipk_), value :: index + real(c_float) :: res + integer(psb_c_ipk_) :: ixb + + if (c_associated(x%item)) then + call c_f_pointer(x%item,xp) + else + return + end if + + ixb = psb_c_get_index_base() + res = xp%get_entry((index+(1-ixb))) + end function psb_c_svect_get_entry + + function psb_c_svect_clone(xh,yh) bind(c) result(info) + implicit none + + integer(psb_c_ipk_) :: info + type(psb_c_svector) :: xh,yh + + type(psb_s_vect_type), pointer :: xp,yp + + info = -1 + + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(yh%item)) then + call c_f_pointer(yh%item,yp) + else + return + end if + call xp%clone(yp,info) + + end function psb_c_svect_clone end module psb_s_serial_cbind_mod diff --git a/cbind/base/psb_s_tools_cbind_mod.F90 b/cbind/base/psb_s_tools_cbind_mod.F90 index 517ad361b..fe6b0aae7 100644 --- a/cbind/base/psb_s_tools_cbind_mod.F90 +++ b/cbind/base/psb_s_tools_cbind_mod.F90 @@ -3,8 +3,10 @@ module psb_s_tools_cbind_mod use psb_base_mod use psb_cpenv_mod use psb_objhandle_mod - use psb_base_string_cbind_mod use psb_base_tools_cbind_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif contains @@ -67,6 +69,38 @@ contains return end function psb_c_sgeall_remote + function psb_c_sgeall_remote_options(xh,cdh,bldmode,dupl) bind(c) result(res) + + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_svector) :: xh + type(psb_c_descriptor) :: cdh + integer(psb_c_ipk_), value :: dupl + integer(psb_c_ipk_), value :: bldmode + + + type(psb_desc_type), pointer :: descp + type(psb_s_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + return + end if + allocate(xp) + call psb_geall(xp,descp,info,bldmode=bldmode,dupl=dupl) + xh%item = c_loc(xp) + res = min(0,info) + + return + end function psb_c_sgeall_remote_options + function psb_c_sgeasb(xh,cdh) bind(c) result(res) implicit none @@ -97,6 +131,94 @@ contains return end function psb_c_sgeasb + function psb_c_sgeasb_options(xh,cdh,dupl) bind(c) result(res) + + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_svector) :: xh + type(psb_c_descriptor) :: cdh + integer(psb_c_ipk_), value :: dupl + + + type(psb_desc_type), pointer :: descp + type(psb_d_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + + call psb_geasb(xp,descp,info,dupl=dupl) + res = min(0,info) + + return + end function psb_c_sgeasb_options + + function psb_c_sgeasb_options_format(xh,cdh,dupl,format) bind(c) result(res) + ! Takes into account format argument as a c string, and uses it to call the appropriate psb_geasb + ! with mold argument + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_svector) :: xh + type(psb_c_descriptor) :: cdh + character(kind=c_char), dimension(*) :: format + integer(psb_c_ipk_), value :: dupl + + ! Local variables + character(len=6) :: fformat + type(psb_desc_type), pointer :: descp + type(psb_s_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + ! mold variables +#ifdef PSB_HAVE_CUDA + type(psb_s_vect_cuda), target :: vgpu +#endif + type(psb_s_base_vect_type), target :: vect + class(psb_s_base_vect_type), pointer :: vmold + + ! Select mold based on format + call psb_stringc2f(format,fformat) + + select case (psb_toupper(fformat)) +#ifdef PSB_HAVE_CUDA + case('GPU','DEVICE') + vmold => vgpu +#endif + case('CPU','HOST') + vmold => vect + case default + write(psb_out_unit,*) 'psb_c_sgeasb_options_format: Unknown format ',fformat + vmold => vect + end select + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + + call psb_geasb(xp,descp,info,dupl=dupl,mold=vmold) + res = min(0,info) + + return + end function psb_c_sgeasb_options_format + + function psb_c_sgefree(xh,cdh) bind(c) result(res) implicit none @@ -159,13 +281,19 @@ contains end if ixb = psb_c_get_index_base() - if (ixb == 1) then - call psb_geins(nz,irw(1:nz),val(1:nz),& - & xp,descp,info) - else + select case(ixb) + case (0) + !write(0,*) 'C_GEINS: IDX_BASE',ixb,' :',irw(1:nz)+(1-ixb),val(1:nz) call psb_geins(nz,(irw(1:nz)+(1-ixb)),val(1:nz),& & xp,descp,info) - end if + case(1) + !write(0,*) 'C_GEINS: IDX_BASE',ixb,' :',irw(1:nz),val(1:nz) + call psb_geins(nz,irw(1:nz),val(1:nz),& + & xp,descp,info) + case default + write(0,*) 'C_GEINS: Unkonwn inndex base ',ixb + info =-2 + end select res = min(0,info) @@ -288,48 +416,143 @@ contains end function psb_c_sspfree -#if 0 - function psb_c_sspasb_opt(mh,cdh,afmt,upd) bind(c) result(res) -#ifdef PSB_HAVE_LIBRSB + function psb_c_sspasb_opt(mh,cdh,afmt,upd,dupl) bind(c) result(res) + +#if 0 +#ifdef PSB_HAVE_LIBRSB use psb_s_rsb_mat_mod #endif +#endif +#if defined(PSB_HAVE_CUDA) + use psb_cuda_mod +#endif + use psb_ext_mod implicit none integer(psb_c_ipk_) :: res - integer(psb_c_ipk_), value :: cdh, mh,upd,dupl + type(psb_c_sspmat) :: mh + type(psb_c_descriptor) :: cdh + integer(psb_c_ipk_), value :: upd,dupl character(c_char) :: afmt(*) integer(psb_c_ipk_) :: info,n character(len=5) :: fafmt + integer(psb_ipk_), parameter :: hksz = 32 + ! mold variables +#if 0 #ifdef PSB_HAVE_LIBRSB type(psb_s_rsb_sparse_mat) :: arsb #endif +#endif + type(psb_s_ell_sparse_mat), target :: aell + type(psb_s_csr_sparse_mat), target :: acsr + type(psb_s_csc_sparse_mat), target :: acsc + type(psb_s_coo_sparse_mat), target :: acoo + type(psb_s_hll_sparse_mat), target :: ahll + type(psb_s_hdia_sparse_mat), target :: ahdia + type(psb_s_dns_sparse_mat), target :: adns +#if defined(PSB_HAVE_CUDA) + type(psb_s_cuda_hlg_sparse_mat), target :: ahlg + type(psb_s_cuda_hdiag_sparse_mat), target :: ahdiag + type(psb_s_cuda_csrg_sparse_mat), target :: acsrg + type(psb_s_cuda_elg_sparse_mat), target :: aelg +#endif + class(psb_s_base_sparse_mat), pointer :: amold + !Local variables + type(psb_desc_type), pointer :: descp + type(psb_sspmat_type), pointer :: ap res = -1 - call psb_check_descriptor_handle(cdh,info) - if (info < 0) return - call psb_check_double_spmat_handle(mh,info) - if (info < 0) return + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(mh%item)) then + call c_f_pointer(mh%item,ap) + else + return + end if + call psb_stringc2f(afmt,fafmt) + + ! Set the mold variable based on afmt + select case (psb_toupper(fafmt)) +#if defined(PSB_HAVE_CUDA) + case('ELG') + amold => aelg + case('HLG') + call psi_set_hksz(hksz) + amold => ahlg + case('HDIAG') + amold => ahdiag + case('CSRG') + amold => acsrg + case('ELL') + amold => aell + case('HLL') + call psi_set_hksz(hksz) + amold => ahll + case('HDIA') + amold => ahdia + case('CSR') + amold => acsr + case('CSC') + amold => acsc + case('DNS') + amold => adns + case default + write(*,*) 'Unknown format defaulting to HLG' + amold => ahlg +#else + case('ELL') + amold => aell + case('HLL') + call psi_set_hksz(hksz) + amold => ahll + case('HDIA') + amold => ahdia + case('CSR') + amold => acsr + case('CSC') + amold => acsc + case('DNS') + amold => adns + case default + write(*,*) 'Unknown format defaulting to CSR' + amold => acsr +#endif + end select - call stringc2f(afmt,fafmt) select case(fafmt) +#if 0 #ifdef PSB_HAVE_LIBRSB case('RSB') call psb_spasb(double_spmat_pool(mh)%item,descriptor_pool(cdh)%item,info,& & upd=upd,mold=arsb) #endif +#endif + case('ELL','HLL','CSR','DNS','CSC') + call psb_spasb(ap,descp,info,upd=upd,mold=amold) + case('HDIA') + call psb_spasb(ap,descp,info,upd=upd,mold=amold) +#if defined(PSB_HAVE_CUDA) + case('ELG','HLG','CSRG') + call psb_spasb(ap,descp,info,upd=upd,mold=amold) + case('HDIAG') + call psb_spasb(ap,descp,info,upd=upd,mold=amold) +#endif case default - call psb_spasb(double_spmat_pool(mh)%item,descriptor_pool(cdh)%item,info,& - & afmt=fafmt,upd=upd) + write(psb_out_unit,*) 'psb_c_sspasb_opt: Unknown format ',fafmt + call psb_spasb(ap,descp,info,afmt=fafmt,upd=upd,dupl=dupl) end select res = min(0,info) return end function psb_c_sspasb_opt -#endif - function psb_c_sspins(nz,irw,icl,val,mh,cdh) bind(c) result(res) + + function psb_c_sspins(nz,irw,icl,val,mh,cdh) bind(c) result(res) implicit none integer(psb_c_ipk_) :: res @@ -452,4 +675,39 @@ contains end function psb_c_sgetelem + function psb_c_smatgetelem(ah,rowindex,colindex,cdh) bind(c) result(res) + implicit none + + type(psb_c_sspmat) :: ah + integer(psb_c_lpk_), value :: rowindex, colindex + type(psb_c_descriptor) :: cdh + real(c_float) :: res + + type(psb_sspmat_type), pointer :: ap + type(psb_desc_type), pointer :: descp + integer(psb_c_ipk_) :: info, ixb + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + + ixb = psb_c_get_index_base() + if (ixb == 1) then + res = psb_getelem(ap,rowindex,colindex,descp,info) + else + res = psb_getelem(ap,rowindex+(1-ixb),colindex+(1-ixb),descp,info) + end if + + return + + end function psb_c_smatgetelem + end module psb_s_tools_cbind_mod diff --git a/cbind/base/psb_z_comm_cbind_mod.f90 b/cbind/base/psb_z_comm_cbind_mod.f90 index 44ee96c3e..4e4369513 100644 --- a/cbind/base/psb_z_comm_cbind_mod.f90 +++ b/cbind/base/psb_z_comm_cbind_mod.f90 @@ -2,7 +2,6 @@ module psb_z_comm_cbind_mod use iso_c_binding use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod contains diff --git a/cbind/base/psb_z_psblas_cbind_mod.f90 b/cbind/base/psb_z_psblas_cbind_mod.f90 index 0254860ba..5255485f2 100644 --- a/cbind/base/psb_z_psblas_cbind_mod.f90 +++ b/cbind/base/psb_z_psblas_cbind_mod.f90 @@ -2,7 +2,6 @@ module psb_z_psblas_cbind_mod use iso_c_binding use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod contains @@ -430,14 +429,13 @@ contains function psb_c_zgecmp(xh,ch,zh,cdh) bind(c) result(res) implicit none integer(psb_c_ipk_) :: res - + real(c_double_complex), value :: ch type(psb_c_zvector) :: xh,zh type(psb_c_descriptor) :: cdh type(psb_desc_type), pointer :: descp type(psb_z_vect_type), pointer :: xp,zp integer(psb_c_ipk_) :: info - real(c_double_complex), value :: ch res = -1 diff --git a/cbind/base/psb_z_serial_cbind_mod.F90 b/cbind/base/psb_z_serial_cbind_mod.F90 index b61060b98..8c6154af9 100644 --- a/cbind/base/psb_z_serial_cbind_mod.F90 +++ b/cbind/base/psb_z_serial_cbind_mod.F90 @@ -2,7 +2,6 @@ module psb_z_serial_cbind_mod use iso_c_binding use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod use psb_base_tools_cbind_mod contains @@ -89,7 +88,6 @@ contains function psb_c_zmat_get_nrows(mh) bind(c) result(res) use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -112,7 +110,6 @@ contains function psb_c_zmat_get_ncols(mh) bind(c) result(res) use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -135,7 +132,6 @@ contains function psb_c_zmat_name_print(mh,name) bind(c) result(res) use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -151,7 +147,7 @@ contains else return end if - call stringc2f(name,fname) + call psb_stringc2f(name,fname) call ap%print(fname,head='PSBLAS Cbinding Interface') @@ -204,5 +200,74 @@ contains end function psb_c_zvect_set_vect + function psb_c_zvect_set_entry(x,index,val) bind(c) result(info) + use psb_base_mod + implicit none + + type(psb_c_zvector) :: x + type(psb_z_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + integer(psb_c_ipk_), value :: index + complex(c_double_complex), value :: val + integer(psb_c_ipk_) :: ixb + + info = -1; + + if (c_associated(x%item)) then + call c_f_pointer(x%item,xp) + else + return + end if + + ixb = psb_c_get_index_base() + call xp%set_entry((index+(1-ixb)),val) + info = 0 + + end function psb_c_zvect_set_entry + + + function psb_c_zvect_get_entry(x,index) bind(c) result(res) + use psb_base_mod + implicit none + + type(psb_c_zvector) :: x + type(psb_z_vect_type), pointer :: xp + integer(psb_c_ipk_), value :: index + complex(c_double_complex) :: res + integer(psb_c_ipk_) :: ixb + + if (c_associated(x%item)) then + call c_f_pointer(x%item,xp) + else + return + end if + + ixb = psb_c_get_index_base() + res = xp%get_entry((index+(1-ixb))) + end function psb_c_zvect_get_entry + + function psb_c_zvect_clone(xh,yh) bind(c) result(info) + implicit none + + integer(psb_c_ipk_) :: info + type(psb_c_zvector) :: xh,yh + + type(psb_z_vect_type), pointer :: xp,yp + + info = -1 + + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(yh%item)) then + call c_f_pointer(yh%item,yp) + else + return + end if + call xp%clone(yp,info) + + end function psb_c_zvect_clone end module psb_z_serial_cbind_mod diff --git a/cbind/base/psb_z_tools_cbind_mod.F90 b/cbind/base/psb_z_tools_cbind_mod.F90 index 3e94b715a..2721924cd 100644 --- a/cbind/base/psb_z_tools_cbind_mod.F90 +++ b/cbind/base/psb_z_tools_cbind_mod.F90 @@ -3,8 +3,10 @@ module psb_z_tools_cbind_mod use psb_base_mod use psb_cpenv_mod use psb_objhandle_mod - use psb_base_string_cbind_mod use psb_base_tools_cbind_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif contains @@ -67,6 +69,38 @@ contains return end function psb_c_zgeall_remote + function psb_c_zgeall_remote_options(xh,cdh,bldmode,dupl) bind(c) result(res) + + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_zvector) :: xh + type(psb_c_descriptor) :: cdh + integer(psb_c_ipk_), value :: dupl + integer(psb_c_ipk_), value :: bldmode + + + type(psb_desc_type), pointer :: descp + type(psb_z_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + return + end if + allocate(xp) + call psb_geall(xp,descp,info,bldmode=bldmode,dupl=dupl) + xh%item = c_loc(xp) + res = min(0,info) + + return + end function psb_c_zgeall_remote_options + function psb_c_zgeasb(xh,cdh) bind(c) result(res) implicit none @@ -97,6 +131,94 @@ contains return end function psb_c_zgeasb + function psb_c_zgeasb_options(xh,cdh,dupl) bind(c) result(res) + + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_zvector) :: xh + type(psb_c_descriptor) :: cdh + integer(psb_c_ipk_), value :: dupl + + + type(psb_desc_type), pointer :: descp + type(psb_d_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + + call psb_geasb(xp,descp,info,dupl=dupl) + res = min(0,info) + + return + end function psb_c_zgeasb_options + + function psb_c_zgeasb_options_format(xh,cdh,dupl,format) bind(c) result(res) + ! Takes into account format argument as a c string, and uses it to call the appropriate psb_geasb + ! with mold argument + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_zvector) :: xh + type(psb_c_descriptor) :: cdh + character(kind=c_char), dimension(*) :: format + integer(psb_c_ipk_), value :: dupl + + ! Local variables + character(len=6) :: fformat + type(psb_desc_type), pointer :: descp + type(psb_z_vect_type), pointer :: xp + integer(psb_c_ipk_) :: info + ! mold variables +#ifdef PSB_HAVE_CUDA + type(psb_z_vect_cuda), target :: vgpu +#endif + type(psb_z_base_vect_type), target :: vect + class(psb_z_base_vect_type), pointer :: vmold + + ! Select mold based on format + call psb_stringc2f(format,fformat) + + select case (psb_toupper(fformat)) +#ifdef PSB_HAVE_CUDA + case('GPU','DEVICE') + vmold => vgpu +#endif + case('CPU','HOST') + vmold => vect + case default + write(psb_out_unit,*) 'psb_c_zgeasb_options_format: Unknown format ',fformat + vmold => vect + end select + res = -1 + + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + + call psb_geasb(xp,descp,info,dupl=dupl,mold=vmold) + res = min(0,info) + + return + end function psb_c_zgeasb_options_format + + function psb_c_zgefree(xh,cdh) bind(c) result(res) implicit none @@ -159,13 +281,19 @@ contains end if ixb = psb_c_get_index_base() - if (ixb == 1) then - call psb_geins(nz,irw(1:nz),val(1:nz),& - & xp,descp,info) - else + select case(ixb) + case (0) + !write(0,*) 'C_GEINS: IDX_BASE',ixb,' :',irw(1:nz)+(1-ixb),val(1:nz) call psb_geins(nz,(irw(1:nz)+(1-ixb)),val(1:nz),& & xp,descp,info) - end if + case(1) + !write(0,*) 'C_GEINS: IDX_BASE',ixb,' :',irw(1:nz),val(1:nz) + call psb_geins(nz,irw(1:nz),val(1:nz),& + & xp,descp,info) + case default + write(0,*) 'C_GEINS: Unkonwn inndex base ',ixb + info =-2 + end select res = min(0,info) @@ -288,48 +416,133 @@ contains end function psb_c_zspfree -#if 0 - function psb_c_zspasb_opt(mh,cdh,afmt,upd) bind(c) result(res) -#ifdef PSB_HAVE_LIBRSB + function psb_c_zspasb_opt(mh,cdh,afmt,upd,dupl) bind(c) result(res) + +#if 0 +#ifdef PSB_HAVE_LIBRSB use psb_z_rsb_mat_mod #endif +#endif +#if defined(PSB_HAVE_CUDA) + use psb_cuda_mod +#endif + use psb_ext_mod implicit none integer(psb_c_ipk_) :: res - integer(psb_c_ipk_), value :: cdh, mh,upd,dupl + type(psb_c_zspmat) :: mh + type(psb_c_descriptor) :: cdh + integer(psb_c_ipk_), value :: upd,dupl character(c_char) :: afmt(*) integer(psb_c_ipk_) :: info,n character(len=5) :: fafmt + integer(psb_ipk_), parameter :: hksz = 32 + ! mold variables +#if 0 #ifdef PSB_HAVE_LIBRSB type(psb_z_rsb_sparse_mat) :: arsb #endif +#endif + type(psb_z_ell_sparse_mat), target :: aell + type(psb_z_csr_sparse_mat), target :: acsr + type(psb_z_csc_sparse_mat), target :: acsc + type(psb_z_coo_sparse_mat), target :: acoo + type(psb_z_hll_sparse_mat), target :: ahll + type(psb_z_hdia_sparse_mat), target :: ahdia + type(psb_z_dns_sparse_mat), target :: adns +#if defined(PSB_HAVE_CUDA) + type(psb_z_cuda_hlg_sparse_mat), target :: ahlg + type(psb_z_cuda_csrg_sparse_mat), target :: acsrg + type(psb_z_cuda_elg_sparse_mat), target :: aelg +#endif + class(psb_z_base_sparse_mat), pointer :: amold + !Local variables + type(psb_desc_type), pointer :: descp + type(psb_zspmat_type), pointer :: ap res = -1 - call psb_check_descriptor_handle(cdh,info) - if (info < 0) return - call psb_check_double_spmat_handle(mh,info) - if (info < 0) return + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(mh%item)) then + call c_f_pointer(mh%item,ap) + else + return + end if + call psb_stringc2f(afmt,fafmt) + + ! Set the mold variable based on afmt + select case (psb_toupper(fafmt)) +#if defined(PSB_HAVE_CUDA) + case('ELG') + amold => aelg + case('HLG') + call psi_set_hksz(hksz) + amold => ahlg + case('CSRG') + amold => acsrg + case('ELL') + amold => aell + case('HLL') + call psi_set_hksz(hksz) + amold => ahll + case('CSR') + amold => acsr + case('CSC') + amold => acsc + case('DNS') + amold => adns + case default + write(*,*) 'Unknown format defaulting to HLG' + amold => ahlg +#else + case('ELL') + amold => aell + case('HLL') + call psi_set_hksz(hksz) + amold => ahll + amold => ahdia + case('CSR') + amold => acsr + case('CSC') + amold => acsc + case('DNS') + amold => adns + case default + write(*,*) 'Unknown format defaulting to CSR' + amold => acsr +#endif + end select - call stringc2f(afmt,fafmt) select case(fafmt) +#if 0 #ifdef PSB_HAVE_LIBRSB case('RSB') call psb_spasb(double_spmat_pool(mh)%item,descriptor_pool(cdh)%item,info,& & upd=upd,mold=arsb) #endif +#endif + case('ELL','HLL','CSR','DNS','CSC') + call psb_spasb(ap,descp,info,upd=upd,mold=amold) +#if defined(PSB_HAVE_CUDA) + case('ELG','HLG','CSRG') + call psb_spasb(ap,descp,info,upd=upd,mold=amold) +#endif case default - call psb_spasb(double_spmat_pool(mh)%item,descriptor_pool(cdh)%item,info,& - & afmt=fafmt,upd=upd) + write(psb_out_unit,*) 'psb_c_zspasb_opt: Unknown format ',fafmt + call psb_spasb(ap,descp,info,afmt=fafmt,upd=upd,dupl=dupl) end select res = min(0,info) return end function psb_c_zspasb_opt -#endif - function psb_c_zspins(nz,irw,icl,val,mh,cdh) bind(c) result(res) + + function psb_c_zspins(nz,irw,icl,val,mh,cdh) bind(c) result(res) implicit none integer(psb_c_ipk_) :: res @@ -452,4 +665,39 @@ contains end function psb_c_zgetelem + function psb_c_zmatgetelem(ah,rowindex,colindex,cdh) bind(c) result(res) + implicit none + + type(psb_c_zspmat) :: ah + integer(psb_c_lpk_), value :: rowindex, colindex + type(psb_c_descriptor) :: cdh + complex(c_double_complex) :: res + + type(psb_zspmat_type), pointer :: ap + type(psb_desc_type), pointer :: descp + integer(psb_c_ipk_) :: info, ixb + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + + ixb = psb_c_get_index_base() + if (ixb == 1) then + res = psb_getelem(ap,rowindex,colindex,descp,info) + else + res = psb_getelem(ap,rowindex+(1-ixb),colindex+(1-ixb),descp,info) + end if + + return + + end function psb_c_zmatgetelem + end module psb_z_tools_cbind_mod diff --git a/cbind/krylov/psb_base_krylov_cbind_mod.f90 b/cbind/krylov/psb_base_krylov_cbind_mod.f90 deleted file mode 100644 index 88ba819b1..000000000 --- a/cbind/krylov/psb_base_krylov_cbind_mod.f90 +++ /dev/null @@ -1,29 +0,0 @@ -module psb_base_krylov_cbind_mod - - use iso_c_binding - use psb_objhandle_mod - - type, bind(c) :: solveroptions - integer(psb_c_ipk_) :: iter, itmax, itrace, irst, istop - real(c_double) :: eps, err - end type solveroptions - -contains - - function psb_c_DefaultSolverOptions(options)& - & bind(c,name='psb_c_DefaultSolverOptions') result(res) - implicit none - type(solveroptions) :: options - integer(psb_c_ipk_) :: res - - options%itmax = 1000 - options%itrace = 0 - options%istop = 2 - options%irst = 10 - options%eps = 1.d-6 - - res = 0 - end function psb_c_DefaultSolverOptions - - -end module psb_base_krylov_cbind_mod diff --git a/cbind/krylov/psb_ckrylov_cbind_mod.f90 b/cbind/krylov/psb_ckrylov_cbind_mod.f90 deleted file mode 100644 index 758ecd025..000000000 --- a/cbind/krylov/psb_ckrylov_cbind_mod.f90 +++ /dev/null @@ -1,105 +0,0 @@ -module psb_ckrylov_cbind_mod - - use psb_base_krylov_cbind_mod - -contains - - function psb_c_ckrylov(methd,& - & ah,ph,bh,xh,cdh,options) bind(c) result(res) - use psb_base_mod - use psb_prec_mod - use psb_linsolve_mod - use psb_objhandle_mod - use psb_prec_cbind_mod - use psb_base_string_cbind_mod - implicit none - integer(psb_c_ipk_) :: res - type(psb_c_cspmat) :: ah - type(psb_c_descriptor) :: cdh - type(psb_c_cprec) :: ph - type(psb_c_cvector) :: bh,xh - character(c_char) :: methd(*) - type(solveroptions) :: options - - res= psb_c_ckrylov_opt(methd, ah, ph, bh, xh, options%eps,cdh, & - & itmax=options%itmax, iter=options%iter,& - & itrace=options%itrace, istop=options%istop,& - & irst=options%irst, err=options%err) - - end function psb_c_ckrylov - - - function psb_c_ckrylov_opt(methd,& - & ah,ph,bh,xh,eps,cdh,itmax,iter,err,itrace,irst,istop) bind(c) result(res) - use psb_base_mod - use psb_prec_mod - use psb_linsolve_mod - use psb_objhandle_mod - use psb_prec_cbind_mod - use psb_base_string_cbind_mod - implicit none - integer(psb_c_ipk_) :: res - type(psb_c_cspmat) :: ah - type(psb_c_descriptor) :: cdh - type(psb_c_cprec) :: ph - type(psb_c_cvector) :: bh,xh - integer(psb_c_ipk_), value :: itmax,itrace,irst,istop - real(c_double), value :: eps - integer(psb_c_ipk_) :: iter - real(c_double) :: err - character(c_char) :: methd(*) - type(psb_desc_type), pointer :: descp - type(psb_cspmat_type), pointer :: ap - type(psb_cprec_type), pointer :: precp - type(psb_c_vect_type), pointer :: xp, bp - - integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter - character(len=20) :: fmethd - real(psb_spk_) :: feps,ferr - - res = -1 - if (c_associated(cdh%item)) then - call c_f_pointer(cdh%item,descp) - else - return - end if - if (c_associated(xh%item)) then - call c_f_pointer(xh%item,xp) - else - return - end if - if (c_associated(bh%item)) then - call c_f_pointer(bh%item,bp) - else - return - end if - if (c_associated(ah%item)) then - call c_f_pointer(ah%item,ap) - else - return - end if - if (c_associated(ph%item)) then - call c_f_pointer(ph%item,precp) - else - return - end if - - - call stringc2f(methd,fmethd) - feps = eps - fitmax = itmax - fitrace = itrace - first = irst - fistop = istop - - call psb_krylov(fmethd, ap, precp, bp, xp, feps, & - & descp, info,& - & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& - & irst=first, err=ferr) - iter = fiter - err = ferr - res = info - - end function psb_c_ckrylov_opt - -end module psb_ckrylov_cbind_mod diff --git a/cbind/krylov/psb_dkrylov_cbind_mod.f90 b/cbind/krylov/psb_dkrylov_cbind_mod.f90 deleted file mode 100644 index b11190677..000000000 --- a/cbind/krylov/psb_dkrylov_cbind_mod.f90 +++ /dev/null @@ -1,105 +0,0 @@ -module psb_dkrylov_cbind_mod - - use psb_base_krylov_cbind_mod - -contains - - function psb_c_dkrylov(methd,& - & ah,ph,bh,xh,cdh,options) bind(c) result(res) - use psb_base_mod - use psb_prec_mod - use psb_linsolve_mod - use psb_objhandle_mod - use psb_prec_cbind_mod - use psb_base_string_cbind_mod - implicit none - integer(psb_c_ipk_) :: res - type(psb_c_dspmat) :: ah - type(psb_c_descriptor) :: cdh - type(psb_c_dprec) :: ph - type(psb_c_dvector) :: bh,xh - character(c_char) :: methd(*) - type(solveroptions) :: options - - res= psb_c_dkrylov_opt(methd, ah, ph, bh, xh, options%eps,cdh, & - & itmax=options%itmax, iter=options%iter,& - & itrace=options%itrace, istop=options%istop,& - & irst=options%irst, err=options%err) - - end function psb_c_dkrylov - - - function psb_c_dkrylov_opt(methd,& - & ah,ph,bh,xh,eps,cdh,itmax,iter,err,itrace,irst,istop) bind(c) result(res) - use psb_base_mod - use psb_prec_mod - use psb_linsolve_mod - use psb_objhandle_mod - use psb_prec_cbind_mod - use psb_base_string_cbind_mod - implicit none - integer(psb_c_ipk_) :: res - type(psb_c_dspmat) :: ah - type(psb_c_descriptor) :: cdh - type(psb_c_dprec) :: ph - type(psb_c_dvector) :: bh,xh - integer(psb_c_ipk_), value :: itmax,itrace,irst,istop - real(c_double), value :: eps - integer(psb_c_ipk_) :: iter - real(c_double) :: err - character(c_char) :: methd(*) - type(psb_desc_type), pointer :: descp - type(psb_dspmat_type), pointer :: ap - type(psb_dprec_type), pointer :: precp - type(psb_d_vect_type), pointer :: xp, bp - - integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter - character(len=20) :: fmethd - real(psb_dpk_) :: feps,ferr - - res = -1 - if (c_associated(cdh%item)) then - call c_f_pointer(cdh%item,descp) - else - return - end if - if (c_associated(xh%item)) then - call c_f_pointer(xh%item,xp) - else - return - end if - if (c_associated(bh%item)) then - call c_f_pointer(bh%item,bp) - else - return - end if - if (c_associated(ah%item)) then - call c_f_pointer(ah%item,ap) - else - return - end if - if (c_associated(ph%item)) then - call c_f_pointer(ph%item,precp) - else - return - end if - - - call stringc2f(methd,fmethd) - feps = eps - fitmax = itmax - fitrace = itrace - first = irst - fistop = istop - - call psb_krylov(fmethd, ap, precp, bp, xp, feps, & - & descp, info,& - & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& - & irst=first, err=ferr) - iter = fiter - err = ferr - res = info - - end function psb_c_dkrylov_opt - -end module psb_dkrylov_cbind_mod diff --git a/cbind/krylov/psb_skrylov_cbind_mod.f90 b/cbind/krylov/psb_skrylov_cbind_mod.f90 deleted file mode 100644 index 41bb95064..000000000 --- a/cbind/krylov/psb_skrylov_cbind_mod.f90 +++ /dev/null @@ -1,105 +0,0 @@ -module psb_skrylov_cbind_mod - - use psb_base_krylov_cbind_mod - -contains - - function psb_c_skrylov(methd,& - & ah,ph,bh,xh,cdh,options) bind(c) result(res) - use psb_base_mod - use psb_prec_mod - use psb_linsolve_mod - use psb_objhandle_mod - use psb_prec_cbind_mod - use psb_base_string_cbind_mod - implicit none - integer(psb_c_ipk_) :: res - type(psb_c_sspmat) :: ah - type(psb_c_descriptor) :: cdh - type(psb_c_sprec) :: ph - type(psb_c_svector) :: bh,xh - character(c_char) :: methd(*) - type(solveroptions) :: options - - res= psb_c_skrylov_opt(methd, ah, ph, bh, xh, options%eps,cdh, & - & itmax=options%itmax, iter=options%iter,& - & itrace=options%itrace, istop=options%istop,& - & irst=options%irst, err=options%err) - - end function psb_c_skrylov - - - function psb_c_skrylov_opt(methd,& - & ah,ph,bh,xh,eps,cdh,itmax,iter,err,itrace,irst,istop) bind(c) result(res) - use psb_base_mod - use psb_prec_mod - use psb_linsolve_mod - use psb_objhandle_mod - use psb_prec_cbind_mod - use psb_base_string_cbind_mod - implicit none - integer(psb_c_ipk_) :: res - type(psb_c_sspmat) :: ah - type(psb_c_descriptor) :: cdh - type(psb_c_sprec) :: ph - type(psb_c_svector) :: bh,xh - integer(psb_c_ipk_), value :: itmax,itrace,irst,istop - real(c_double), value :: eps - integer(psb_c_ipk_) :: iter - real(c_double) :: err - character(c_char) :: methd(*) - type(psb_desc_type), pointer :: descp - type(psb_sspmat_type), pointer :: ap - type(psb_sprec_type), pointer :: precp - type(psb_s_vect_type), pointer :: xp, bp - - integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter - character(len=20) :: fmethd - real(psb_spk_) :: feps,ferr - - res = -1 - if (c_associated(cdh%item)) then - call c_f_pointer(cdh%item,descp) - else - return - end if - if (c_associated(xh%item)) then - call c_f_pointer(xh%item,xp) - else - return - end if - if (c_associated(bh%item)) then - call c_f_pointer(bh%item,bp) - else - return - end if - if (c_associated(ah%item)) then - call c_f_pointer(ah%item,ap) - else - return - end if - if (c_associated(ph%item)) then - call c_f_pointer(ph%item,precp) - else - return - end if - - - call stringc2f(methd,fmethd) - feps = eps - fitmax = itmax - fitrace = itrace - first = irst - fistop = istop - - call psb_krylov(fmethd, ap, precp, bp, xp, feps, & - & descp, info,& - & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& - & irst=first, err=ferr) - iter = fiter - err = ferr - res = info - - end function psb_c_skrylov_opt - -end module psb_skrylov_cbind_mod diff --git a/cbind/krylov/psb_zkrylov_cbind_mod.f90 b/cbind/krylov/psb_zkrylov_cbind_mod.f90 deleted file mode 100644 index 37f24be78..000000000 --- a/cbind/krylov/psb_zkrylov_cbind_mod.f90 +++ /dev/null @@ -1,105 +0,0 @@ -module psb_zkrylov_cbind_mod - - use psb_base_krylov_cbind_mod - -contains - - function psb_c_zkrylov(methd,& - & ah,ph,bh,xh,cdh,options) bind(c) result(res) - use psb_base_mod - use psb_prec_mod - use psb_linsolve_mod - use psb_objhandle_mod - use psb_prec_cbind_mod - use psb_base_string_cbind_mod - implicit none - integer(psb_c_ipk_) :: res - type(psb_c_zspmat) :: ah - type(psb_c_descriptor) :: cdh - type(psb_c_zprec) :: ph - type(psb_c_zvector) :: bh,xh - character(c_char) :: methd(*) - type(solveroptions) :: options - - res= psb_c_zkrylov_opt(methd, ah, ph, bh, xh, options%eps,cdh, & - & itmax=options%itmax, iter=options%iter,& - & itrace=options%itrace, istop=options%istop,& - & irst=options%irst, err=options%err) - - end function psb_c_zkrylov - - - function psb_c_zkrylov_opt(methd,& - & ah,ph,bh,xh,eps,cdh,itmax,iter,err,itrace,irst,istop) bind(c) result(res) - use psb_base_mod - use psb_prec_mod - use psb_linsolve_mod - use psb_objhandle_mod - use psb_prec_cbind_mod - use psb_base_string_cbind_mod - implicit none - integer(psb_c_ipk_) :: res - type(psb_c_zspmat) :: ah - type(psb_c_descriptor) :: cdh - type(psb_c_zprec) :: ph - type(psb_c_zvector) :: bh,xh - integer(psb_c_ipk_), value :: itmax,itrace,irst,istop - real(c_double), value :: eps - integer(psb_c_ipk_) :: iter - real(c_double) :: err - character(c_char) :: methd(*) - type(psb_desc_type), pointer :: descp - type(psb_zspmat_type), pointer :: ap - type(psb_zprec_type), pointer :: precp - type(psb_z_vect_type), pointer :: xp, bp - - integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter - character(len=20) :: fmethd - real(psb_dpk_) :: feps,ferr - - res = -1 - if (c_associated(cdh%item)) then - call c_f_pointer(cdh%item,descp) - else - return - end if - if (c_associated(xh%item)) then - call c_f_pointer(xh%item,xp) - else - return - end if - if (c_associated(bh%item)) then - call c_f_pointer(bh%item,bp) - else - return - end if - if (c_associated(ah%item)) then - call c_f_pointer(ah%item,ap) - else - return - end if - if (c_associated(ph%item)) then - call c_f_pointer(ph%item,precp) - else - return - end if - - - call stringc2f(methd,fmethd) - feps = eps - fitmax = itmax - fitrace = itrace - first = irst - fistop = istop - - call psb_krylov(fmethd, ap, precp, bp, xp, feps, & - & descp, info,& - & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& - & irst=first, err=ferr) - iter = fiter - err = ferr - res = info - - end function psb_c_zkrylov_opt - -end module psb_zkrylov_cbind_mod diff --git a/cbind/krylov/Makefile b/cbind/linsolve/Makefile similarity index 59% rename from cbind/krylov/Makefile rename to cbind/linsolve/Makefile index 041e23d4f..c0c64c676 100644 --- a/cbind/krylov/Makefile +++ b/cbind/linsolve/Makefile @@ -8,12 +8,12 @@ HERE=.. FINCLUDES=$(FMFLAG). $(FMFLAG)$(HERE) $(FMFLAG)$(MODDIR) CINCLUDES=-I. -I$(HERE) -I$(INCLUDEDIR) -OBJS=psb_base_krylov_cbind_mod.o \ -psb_skrylov_cbind_mod.o psb_dkrylov_cbind_mod.o psb_ckrylov_cbind_mod.o psb_zkrylov_cbind_mod.o -CMOD=psb_krylov_cbind.h +OBJS=psb_base_linsolve_cbind_mod.o \ +psb_slinsolve_cbind_mod.o psb_dlinsolve_cbind_mod.o psb_clinsolve_cbind_mod.o psb_zlinsolve_cbind_mod.o +CMOD=psb_linsolve_cbind.h -LIBNAME=$(CKRYLOVLIBNAME) +LIBNAME=$(CLINSOLVELIBNAME) objs: $(OBJS) $(CMOD) @@ -23,7 +23,7 @@ lib: objs $(RANLIB) $(HERE)/$(LIBNAME) /bin/cp -p $(HERE)/$(LIBNAME) $(LIBDIR) -psb_skrylov_cbind_mod.o psb_dkrylov_cbind_mod.o psb_ckrylov_cbind_mod.o psb_zkrylov_cbind_mod.o: psb_base_krylov_cbind_mod.o +psb_slinsolve_cbind_mod.o psb_dlinsolve_cbind_mod.o psb_clinsolve_cbind_mod.o psb_zlinsolve_cbind_mod.o: psb_base_linsolve_cbind_mod.o veryclean: clean /bin/rm -f $(HERE)/$(LIBNAME) diff --git a/cbind/linsolve/psb_base_linsolve_cbind_mod.f90 b/cbind/linsolve/psb_base_linsolve_cbind_mod.f90 new file mode 100644 index 000000000..db9f9d358 --- /dev/null +++ b/cbind/linsolve/psb_base_linsolve_cbind_mod.f90 @@ -0,0 +1,43 @@ +module psb_base_linsolve_cbind_mod + + use iso_c_binding + use psb_objhandle_mod + + type, bind(c) :: solveroptions + integer(psb_c_ipk_) :: iter, itmax, itrace, irst, istop + real(c_double) :: eps, err + end type solveroptions + +contains + + function psb_c_DefaultSolverOptions(options)& + & bind(c,name='psb_c_DefaultSolverOptions') result(res) + implicit none + type(solveroptions) :: options + integer(psb_c_ipk_) :: res + options%itmax = 1000 + options%itrace = 0 + options%istop = 2 + options%irst = 10 + options%eps = 1.d-6 + + res = 0 + end function psb_c_DefaultSolverOptions + + function psb_c_PrintSolverOptions(options)& + & bind(c,name='psb_c_PrintSolverOptions') result(res) + implicit none + type(solveroptions) :: options + integer(psb_c_ipk_) :: res + + write(*,*) 'PSBLAS C Interface Solver Options ' + write(*,*) ' Maximum number of iterations :', options%itmax + write(*,*) ' Tracing :', options%itrace + write(*,*) ' Stopping Criterion :', options%istop + write(*,*) ' Restart :', options%irst + write(*,*) ' EPS (tolerance) :', options%eps + res = 0 + end function psb_c_PrintSolverOptions + + +end module psb_base_linsolve_cbind_mod diff --git a/cbind/linsolve/psb_clinsolve_cbind_mod.f90 b/cbind/linsolve/psb_clinsolve_cbind_mod.f90 new file mode 100644 index 000000000..1480f0234 --- /dev/null +++ b/cbind/linsolve/psb_clinsolve_cbind_mod.f90 @@ -0,0 +1,193 @@ +module psb_clinsolve_cbind_mod + + use psb_base_linsolve_cbind_mod + +contains + + function psb_c_ckrylov(methd,& + & ah,ph,bh,xh,cdh,options) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_cspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_cprec) :: ph + type(psb_c_cvector) :: bh,xh + character(c_char) :: methd(*) + type(solveroptions) :: options + + res= psb_c_ckrylov_opt(methd, ah, ph, bh, xh, options%eps,cdh, & + & itmax=options%itmax, iter=options%iter,& + & itrace=options%itrace, istop=options%istop,& + & irst=options%irst, err=options%err) + + end function psb_c_ckrylov + + + function psb_c_ckrylov_opt(methd,& + & ah,ph,bh,xh,eps,cdh,itmax,iter,err,itrace,irst,istop) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_cspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_cprec) :: ph + type(psb_c_cvector) :: bh,xh + integer(psb_c_ipk_), value :: itmax,itrace,irst,istop + real(c_double), value :: eps + integer(psb_c_ipk_) :: iter + real(c_double) :: err + character(c_char) :: methd(*) + type(psb_desc_type), pointer :: descp + type(psb_cspmat_type), pointer :: ap + type(psb_cprec_type), pointer :: precp + type(psb_c_vect_type), pointer :: xp, bp + + integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter + character(len=20) :: fmethd + real(psb_spk_) :: feps,ferr + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(bh%item)) then + call c_f_pointer(bh%item,bp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + if (c_associated(ph%item)) then + call c_f_pointer(ph%item,precp) + else + return + end if + + + call psb_stringc2f(methd,fmethd) + feps = eps + fitmax = itmax + fitrace = itrace + first = irst + fistop = istop + + call psb_krylov(fmethd, ap, precp, bp, xp, feps, & + & descp, info,& + & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& + & irst=first, err=ferr) + iter = fiter + err = ferr + res = info + + end function psb_c_ckrylov_opt + + function psb_c_crichardson(ah,ph,bh,xh,cdh,options) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_cspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_cprec) :: ph + type(psb_c_cvector) :: bh,xh + type(solveroptions) :: options + + res= psb_c_crichardson_opt(ah, ph, bh, xh, options%eps,cdh, & + & itmax=options%itmax, iter=options%iter,& + & itrace=options%itrace, istop=options%istop,& + & irst=options%irst, err=options%err) + + end function psb_c_crichardson + + function psb_c_crichardson_opt(ah,ph,bh,xh,eps,cdh,& + & itmax,iter,err,itrace,irst,istop) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_cspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_cprec) :: ph + type(psb_c_cvector) :: bh,xh + integer(psb_c_ipk_), value :: itmax,itrace,irst,istop + real(c_double), value :: eps + integer(psb_c_ipk_) :: iter + real(c_double) :: err + type(psb_desc_type), pointer :: descp + type(psb_cspmat_type), pointer :: ap + type(psb_cprec_type), pointer :: precp + type(psb_c_vect_type), pointer :: xp, bp + + integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter + character(len=20) :: fmethd + real(psb_spk_) :: feps,ferr + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(bh%item)) then + call c_f_pointer(bh%item,bp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + if (c_associated(ph%item)) then + call c_f_pointer(ph%item,precp) + else + return + end if + + feps = eps + fitmax = itmax + fitrace = itrace + first = irst + fistop = istop + + call psb_crichardson_vect(ap, precp, bp, xp, feps, & + & descp, info,& + & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& + & err=ferr) + iter = fiter + err = ferr + res = info + + end function psb_c_crichardson_opt + +end module psb_clinsolve_cbind_mod diff --git a/cbind/linsolve/psb_dlinsolve_cbind_mod.f90 b/cbind/linsolve/psb_dlinsolve_cbind_mod.f90 new file mode 100644 index 000000000..92cb02fa9 --- /dev/null +++ b/cbind/linsolve/psb_dlinsolve_cbind_mod.f90 @@ -0,0 +1,193 @@ +module psb_dlinsolve_cbind_mod + + use psb_base_linsolve_cbind_mod + +contains + + function psb_c_dkrylov(methd,& + & ah,ph,bh,xh,cdh,options) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_dspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_dprec) :: ph + type(psb_c_dvector) :: bh,xh + character(c_char) :: methd(*) + type(solveroptions) :: options + + res= psb_c_dkrylov_opt(methd, ah, ph, bh, xh, options%eps,cdh, & + & itmax=options%itmax, iter=options%iter,& + & itrace=options%itrace, istop=options%istop,& + & irst=options%irst, err=options%err) + + end function psb_c_dkrylov + + + function psb_c_dkrylov_opt(methd,& + & ah,ph,bh,xh,eps,cdh,itmax,iter,err,itrace,irst,istop) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_dspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_dprec) :: ph + type(psb_c_dvector) :: bh,xh + integer(psb_c_ipk_), value :: itmax,itrace,irst,istop + real(c_double), value :: eps + integer(psb_c_ipk_) :: iter + real(c_double) :: err + character(c_char) :: methd(*) + type(psb_desc_type), pointer :: descp + type(psb_dspmat_type), pointer :: ap + type(psb_dprec_type), pointer :: precp + type(psb_d_vect_type), pointer :: xp, bp + + integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter + character(len=20) :: fmethd + real(psb_dpk_) :: feps,ferr + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(bh%item)) then + call c_f_pointer(bh%item,bp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + if (c_associated(ph%item)) then + call c_f_pointer(ph%item,precp) + else + return + end if + + + call psb_stringc2f(methd,fmethd) + feps = eps + fitmax = itmax + fitrace = itrace + first = irst + fistop = istop + + call psb_krylov(fmethd, ap, precp, bp, xp, feps, & + & descp, info,& + & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& + & irst=first, err=ferr) + iter = fiter + err = ferr + res = info + + end function psb_c_dkrylov_opt + + function psb_c_drichardson(ah,ph,bh,xh,cdh,options) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_dspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_dprec) :: ph + type(psb_c_dvector) :: bh,xh + type(solveroptions) :: options + + res= psb_c_drichardson_opt(ah, ph, bh, xh, options%eps,cdh, & + & itmax=options%itmax, iter=options%iter,& + & itrace=options%itrace, istop=options%istop,& + & irst=options%irst, err=options%err) + + end function psb_c_drichardson + + function psb_c_drichardson_opt(ah,ph,bh,xh,eps,cdh,& + & itmax,iter,err,itrace,irst,istop) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_dspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_dprec) :: ph + type(psb_c_dvector) :: bh,xh + integer(psb_c_ipk_), value :: itmax,itrace,irst,istop + real(c_double), value :: eps + integer(psb_c_ipk_) :: iter + real(c_double) :: err + type(psb_desc_type), pointer :: descp + type(psb_dspmat_type), pointer :: ap + type(psb_dprec_type), pointer :: precp + type(psb_d_vect_type), pointer :: xp, bp + + integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter + character(len=20) :: fmethd + real(psb_dpk_) :: feps,ferr + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(bh%item)) then + call c_f_pointer(bh%item,bp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + if (c_associated(ph%item)) then + call c_f_pointer(ph%item,precp) + else + return + end if + + feps = eps + fitmax = itmax + fitrace = itrace + first = irst + fistop = istop + + call psb_drichardson_vect(ap, precp, bp, xp, feps, & + & descp, info,& + & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& + & err=ferr) + iter = fiter + err = ferr + res = info + + end function psb_c_drichardson_opt + +end module psb_dlinsolve_cbind_mod diff --git a/cbind/krylov/psb_krylov_cbind.h b/cbind/linsolve/psb_linsolve_cbind.h similarity index 71% rename from cbind/krylov/psb_krylov_cbind.h rename to cbind/linsolve/psb_linsolve_cbind.h index 4ed45746b..d1ed4a92b 100644 --- a/cbind/krylov/psb_krylov_cbind.h +++ b/cbind/linsolve/psb_linsolve_cbind.h @@ -1,5 +1,5 @@ -#ifndef PSB_KRYL_CBIND_ -#define PSB_KRYL_CBIND_ +#ifndef PSB_LINSLV_CBIND_ +#define PSB_LINSLV_CBIND_ #include "psb_base_cbind.h" #include "psb_prec_cbind.h" @@ -25,7 +25,8 @@ typedef struct psb_c_solveroptions { } psb_c_SolverOptions; int psb_c_DefaultSolverOptions(psb_c_SolverOptions *opt); - +int psb_c_PrintSolverOptions(psb_c_SolverOptions *opt); + int psb_c_skrylov(const char *method, psb_c_sspmat *ah, psb_c_sprec *ph, psb_c_svector *bh, psb_c_svector *xh, psb_c_descriptor *cdh, psb_c_SolverOptions *opt); @@ -42,6 +43,24 @@ int psb_c_zkrylov(const char *method, psb_c_zspmat *ah, psb_c_zprec *ph, psb_c_zvector *bh, psb_c_zvector *xh, psb_c_descriptor *cdh, psb_c_SolverOptions *opt); + + +int psb_c_srichardson(psb_c_sspmat *ah, psb_c_sprec *ph, + psb_c_svector *bh, psb_c_svector *xh, + psb_c_descriptor *cdh, psb_c_SolverOptions *opt); + +int psb_c_drichardson(psb_c_dspmat *ah, psb_c_dprec *ph, + psb_c_dvector *bh, psb_c_dvector *xh, + psb_c_descriptor *cdh, psb_c_SolverOptions *opt); + +int psb_c_crichardson(psb_c_cspmat *ah, psb_c_cprec *ph, + psb_c_cvector *bh, psb_c_cvector *xh, + psb_c_descriptor *cdh, psb_c_SolverOptions *opt); + +int psb_c_zrichardson(psb_c_zspmat *ah, psb_c_zprec *ph, + psb_c_zvector *bh, psb_c_zvector *xh, + psb_c_descriptor *cdh, psb_c_SolverOptions *opt); + #define PSB_VALID_KRYLOV_METHODS_STRINGS "CG","CGS","BICG","BICGSTAB","RGMRES","BICGSTABL","FCG","GCR" #define PSB_VALID_KRYLOV_METHODS_STRING "CG CGS BICG BICGSTAB RGMRES BICGSTABL FCG GCR" diff --git a/cbind/linsolve/psb_slinsolve_cbind_mod.f90 b/cbind/linsolve/psb_slinsolve_cbind_mod.f90 new file mode 100644 index 000000000..ed7c13e52 --- /dev/null +++ b/cbind/linsolve/psb_slinsolve_cbind_mod.f90 @@ -0,0 +1,193 @@ +module psb_slinsolve_cbind_mod + + use psb_base_linsolve_cbind_mod + +contains + + function psb_c_skrylov(methd,& + & ah,ph,bh,xh,cdh,options) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_sspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_sprec) :: ph + type(psb_c_svector) :: bh,xh + character(c_char) :: methd(*) + type(solveroptions) :: options + + res= psb_c_skrylov_opt(methd, ah, ph, bh, xh, options%eps,cdh, & + & itmax=options%itmax, iter=options%iter,& + & itrace=options%itrace, istop=options%istop,& + & irst=options%irst, err=options%err) + + end function psb_c_skrylov + + + function psb_c_skrylov_opt(methd,& + & ah,ph,bh,xh,eps,cdh,itmax,iter,err,itrace,irst,istop) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_sspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_sprec) :: ph + type(psb_c_svector) :: bh,xh + integer(psb_c_ipk_), value :: itmax,itrace,irst,istop + real(c_double), value :: eps + integer(psb_c_ipk_) :: iter + real(c_double) :: err + character(c_char) :: methd(*) + type(psb_desc_type), pointer :: descp + type(psb_sspmat_type), pointer :: ap + type(psb_sprec_type), pointer :: precp + type(psb_s_vect_type), pointer :: xp, bp + + integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter + character(len=20) :: fmethd + real(psb_spk_) :: feps,ferr + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(bh%item)) then + call c_f_pointer(bh%item,bp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + if (c_associated(ph%item)) then + call c_f_pointer(ph%item,precp) + else + return + end if + + + call psb_stringc2f(methd,fmethd) + feps = eps + fitmax = itmax + fitrace = itrace + first = irst + fistop = istop + + call psb_krylov(fmethd, ap, precp, bp, xp, feps, & + & descp, info,& + & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& + & irst=first, err=ferr) + iter = fiter + err = ferr + res = info + + end function psb_c_skrylov_opt + + function psb_c_srichardson(ah,ph,bh,xh,cdh,options) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_sspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_sprec) :: ph + type(psb_c_svector) :: bh,xh + type(solveroptions) :: options + + res= psb_c_srichardson_opt(ah, ph, bh, xh, options%eps,cdh, & + & itmax=options%itmax, iter=options%iter,& + & itrace=options%itrace, istop=options%istop,& + & irst=options%irst, err=options%err) + + end function psb_c_srichardson + + function psb_c_srichardson_opt(ah,ph,bh,xh,eps,cdh,& + & itmax,iter,err,itrace,irst,istop) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_sspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_sprec) :: ph + type(psb_c_svector) :: bh,xh + integer(psb_c_ipk_), value :: itmax,itrace,irst,istop + real(c_double), value :: eps + integer(psb_c_ipk_) :: iter + real(c_double) :: err + type(psb_desc_type), pointer :: descp + type(psb_sspmat_type), pointer :: ap + type(psb_sprec_type), pointer :: precp + type(psb_s_vect_type), pointer :: xp, bp + + integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter + character(len=20) :: fmethd + real(psb_spk_) :: feps,ferr + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(bh%item)) then + call c_f_pointer(bh%item,bp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + if (c_associated(ph%item)) then + call c_f_pointer(ph%item,precp) + else + return + end if + + feps = eps + fitmax = itmax + fitrace = itrace + first = irst + fistop = istop + + call psb_srichardson_vect(ap, precp, bp, xp, feps, & + & descp, info,& + & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& + & err=ferr) + iter = fiter + err = ferr + res = info + + end function psb_c_srichardson_opt + +end module psb_slinsolve_cbind_mod diff --git a/cbind/linsolve/psb_zlinsolve_cbind_mod.f90 b/cbind/linsolve/psb_zlinsolve_cbind_mod.f90 new file mode 100644 index 000000000..8a3312c18 --- /dev/null +++ b/cbind/linsolve/psb_zlinsolve_cbind_mod.f90 @@ -0,0 +1,193 @@ +module psb_zlinsolve_cbind_mod + + use psb_base_linsolve_cbind_mod + +contains + + function psb_c_zkrylov(methd,& + & ah,ph,bh,xh,cdh,options) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_zspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_zprec) :: ph + type(psb_c_zvector) :: bh,xh + character(c_char) :: methd(*) + type(solveroptions) :: options + + res= psb_c_zkrylov_opt(methd, ah, ph, bh, xh, options%eps,cdh, & + & itmax=options%itmax, iter=options%iter,& + & itrace=options%itrace, istop=options%istop,& + & irst=options%irst, err=options%err) + + end function psb_c_zkrylov + + + function psb_c_zkrylov_opt(methd,& + & ah,ph,bh,xh,eps,cdh,itmax,iter,err,itrace,irst,istop) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_zspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_zprec) :: ph + type(psb_c_zvector) :: bh,xh + integer(psb_c_ipk_), value :: itmax,itrace,irst,istop + real(c_double), value :: eps + integer(psb_c_ipk_) :: iter + real(c_double) :: err + character(c_char) :: methd(*) + type(psb_desc_type), pointer :: descp + type(psb_zspmat_type), pointer :: ap + type(psb_zprec_type), pointer :: precp + type(psb_z_vect_type), pointer :: xp, bp + + integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter + character(len=20) :: fmethd + real(psb_dpk_) :: feps,ferr + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(bh%item)) then + call c_f_pointer(bh%item,bp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + if (c_associated(ph%item)) then + call c_f_pointer(ph%item,precp) + else + return + end if + + + call psb_stringc2f(methd,fmethd) + feps = eps + fitmax = itmax + fitrace = itrace + first = irst + fistop = istop + + call psb_krylov(fmethd, ap, precp, bp, xp, feps, & + & descp, info,& + & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& + & irst=first, err=ferr) + iter = fiter + err = ferr + res = info + + end function psb_c_zkrylov_opt + + function psb_c_zrichardson(ah,ph,bh,xh,cdh,options) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_zspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_zprec) :: ph + type(psb_c_zvector) :: bh,xh + type(solveroptions) :: options + + res= psb_c_zrichardson_opt(ah, ph, bh, xh, options%eps,cdh, & + & itmax=options%itmax, iter=options%iter,& + & itrace=options%itrace, istop=options%istop,& + & irst=options%irst, err=options%err) + + end function psb_c_zrichardson + + function psb_c_zrichardson_opt(ah,ph,bh,xh,eps,cdh,& + & itmax,iter,err,itrace,irst,istop) bind(c) result(res) + use psb_base_mod + use psb_prec_mod + use psb_linsolve_mod + use psb_objhandle_mod + use psb_prec_cbind_mod + implicit none + integer(psb_c_ipk_) :: res + type(psb_c_zspmat) :: ah + type(psb_c_descriptor) :: cdh + type(psb_c_zprec) :: ph + type(psb_c_zvector) :: bh,xh + integer(psb_c_ipk_), value :: itmax,itrace,irst,istop + real(c_double), value :: eps + integer(psb_c_ipk_) :: iter + real(c_double) :: err + type(psb_desc_type), pointer :: descp + type(psb_zspmat_type), pointer :: ap + type(psb_zprec_type), pointer :: precp + type(psb_z_vect_type), pointer :: xp, bp + + integer(psb_c_ipk_) :: info,fitmax,fitrace,first,fistop,fiter + character(len=20) :: fmethd + real(psb_dpk_) :: feps,ferr + + res = -1 + if (c_associated(cdh%item)) then + call c_f_pointer(cdh%item,descp) + else + return + end if + if (c_associated(xh%item)) then + call c_f_pointer(xh%item,xp) + else + return + end if + if (c_associated(bh%item)) then + call c_f_pointer(bh%item,bp) + else + return + end if + if (c_associated(ah%item)) then + call c_f_pointer(ah%item,ap) + else + return + end if + if (c_associated(ph%item)) then + call c_f_pointer(ph%item,precp) + else + return + end if + + feps = eps + fitmax = itmax + fitrace = itrace + first = irst + fistop = istop + + call psb_zrichardson_vect(ap, precp, bp, xp, feps, & + & descp, info,& + & itmax=fitmax,iter=fiter,itrace=fitrace,istop=fistop,& + & err=ferr) + iter = fiter + err = ferr + res = info + + end function psb_c_zrichardson_opt + +end module psb_zlinsolve_cbind_mod diff --git a/cbind/prec/psb_cprec_cbind_mod.f90 b/cbind/prec/psb_cprec_cbind_mod.f90 index 6d4de2205..6c9504338 100644 --- a/cbind/prec/psb_cprec_cbind_mod.f90 +++ b/cbind/prec/psb_cprec_cbind_mod.f90 @@ -3,7 +3,6 @@ module psb_cprec_cbind_mod use iso_c_binding use psb_prec_mod, only : psb_cprec_type use psb_objhandle_mod - use psb_base_string_cbind_mod type, bind(c) :: psb_c_cprec type(c_ptr) :: item = c_null_ptr @@ -16,7 +15,6 @@ contains use psb_base_mod use psb_prec_mod use psb_cpenv_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res type(psb_c_object_type), value :: cctxt @@ -39,7 +37,7 @@ contains if (info /= 0) return ph%item = c_loc(precp) - call stringc2f(ptype,fptype) + call psb_stringc2f(ptype,fptype) call psb_precinit(ctxt,precp,fptype,info) @@ -53,7 +51,6 @@ contains use psb_base_mod use psb_prec_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -95,7 +92,6 @@ contains use psb_base_mod use psb_prec_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res diff --git a/cbind/prec/psb_dprec_cbind_mod.f90 b/cbind/prec/psb_dprec_cbind_mod.f90 index edbc427d8..9aa1c7bc8 100644 --- a/cbind/prec/psb_dprec_cbind_mod.f90 +++ b/cbind/prec/psb_dprec_cbind_mod.f90 @@ -3,7 +3,6 @@ module psb_dprec_cbind_mod use iso_c_binding use psb_prec_mod, only : psb_dprec_type use psb_objhandle_mod - use psb_base_string_cbind_mod type, bind(c) :: psb_c_dprec type(c_ptr) :: item = c_null_ptr @@ -16,7 +15,6 @@ contains use psb_base_mod use psb_prec_mod use psb_cpenv_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res type(psb_c_object_type), value :: cctxt @@ -39,7 +37,7 @@ contains if (info /= 0) return ph%item = c_loc(precp) - call stringc2f(ptype,fptype) + call psb_stringc2f(ptype,fptype) call psb_precinit(ctxt,precp,fptype,info) @@ -53,7 +51,6 @@ contains use psb_base_mod use psb_prec_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -95,7 +92,6 @@ contains use psb_base_mod use psb_prec_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res diff --git a/cbind/prec/psb_sprec_cbind_mod.f90 b/cbind/prec/psb_sprec_cbind_mod.f90 index e450d7d85..dc404cd70 100644 --- a/cbind/prec/psb_sprec_cbind_mod.f90 +++ b/cbind/prec/psb_sprec_cbind_mod.f90 @@ -3,7 +3,6 @@ module psb_sprec_cbind_mod use iso_c_binding use psb_prec_mod, only : psb_sprec_type use psb_objhandle_mod - use psb_base_string_cbind_mod type, bind(c) :: psb_c_sprec type(c_ptr) :: item = c_null_ptr @@ -16,7 +15,6 @@ contains use psb_base_mod use psb_prec_mod use psb_cpenv_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res type(psb_c_object_type), value :: cctxt @@ -39,7 +37,7 @@ contains if (info /= 0) return ph%item = c_loc(precp) - call stringc2f(ptype,fptype) + call psb_stringc2f(ptype,fptype) call psb_precinit(ctxt,precp,fptype,info) @@ -53,7 +51,6 @@ contains use psb_base_mod use psb_prec_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -95,7 +92,6 @@ contains use psb_base_mod use psb_prec_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res diff --git a/cbind/prec/psb_zprec_cbind_mod.f90 b/cbind/prec/psb_zprec_cbind_mod.f90 index 64b7cddb4..42a87a1ab 100644 --- a/cbind/prec/psb_zprec_cbind_mod.f90 +++ b/cbind/prec/psb_zprec_cbind_mod.f90 @@ -3,7 +3,6 @@ module psb_zprec_cbind_mod use iso_c_binding use psb_prec_mod, only : psb_zprec_type use psb_objhandle_mod - use psb_base_string_cbind_mod type, bind(c) :: psb_c_zprec type(c_ptr) :: item = c_null_ptr @@ -16,7 +15,6 @@ contains use psb_base_mod use psb_prec_mod use psb_cpenv_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res type(psb_c_object_type), value :: cctxt @@ -39,7 +37,7 @@ contains if (info /= 0) return ph%item = c_loc(precp) - call stringc2f(ptype,fptype) + call psb_stringc2f(ptype,fptype) call psb_precinit(ctxt,precp,fptype,info) @@ -53,7 +51,6 @@ contains use psb_base_mod use psb_prec_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -95,7 +92,6 @@ contains use psb_base_mod use psb_prec_mod use psb_objhandle_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res diff --git a/cbind/test/gpu/Makefile b/cbind/test/gpu/Makefile new file mode 100644 index 000000000..7c0ae80e8 --- /dev/null +++ b/cbind/test/gpu/Makefile @@ -0,0 +1,50 @@ +TOP=../../.. +include $(TOP)/Make.inc +LIBDIR=$(TOP)/lib +INCLUDEDIR=$(TOP)/include +MODDIR=$(TOP)/modules/ +HERE=../.. + +FINCLUDES=$(FMFLAG). $(FMFLAG)$(HERE) $(FMFLAG)$(MODDIR) $(CUDA_INCLUDES) +CINCLUDES=-I. -I$(HERE) -I$(INCLUDEDIR) $(CUDA_INCLUDES) + +PSBC_LIBS= -L$(LIBDIR) -lpsb_cbind +# PSB_LIBS=-lpsb_util -lpsb_linsolve -lpsb_prec -lpsb_base -L$(LIBDIR) $(PSBGPULDLIBS) +PSB_LIBS=-lpsb_ext -lpsb_util -lpsb_linsolve -lpsb_prec -lpsb_base -L$(LIBDIR) $(PSBGPULDLIBS) + + +# +# Compilers and such +# + +EXEDIR=./runs + +all: gputest pdedgen3dc + +gputest: gputest.o + $(FLINK) gputest.o -o gputest $(PSBC_LIBS) \ + $(PSB_LIBS) \ + -lm + /bin/mv gputest $(EXEDIR) + +pdedgen3dc: pdegen3dc.o + $(FLINK) pdegen3dc.o -o pdedgen3dc $(PSBC_LIBS) $(PSB_LIBS) -lstdc++ -lm + /bin/mv pdedgen3dc $(EXEDIR) + +.f90.o: + $(MPFC) $(FCOPT) $(FINCLUDES) $(FDEFINES) -c $< +.c.o: + $(MPCC) $(CCOPT) $(CINCLUDES) $(CDEFINES) -c $< + + +clean: + /bin/rm -f gputest.o $(EXEDIR)/gputest + /bin/rm -f pdedgen3dc.o $(EXEDIR)/pdedgen3dc +verycleanlib: + (cd ../..; make veryclean) +lib: + (cd ../../; make library) + +tests: all + cd runs ; ./gputest + cd runs ; ./pdedgen3dc < runs/pdegen3d.inp > pdegen3d.out \ No newline at end of file diff --git a/cbind/test/gpu/gputest.c b/cbind/test/gpu/gputest.c new file mode 100644 index 000000000..5c1e5a0ac --- /dev/null +++ b/cbind/test/gpu/gputest.c @@ -0,0 +1,64 @@ +/*----------------------------------------------------------------------------------*/ +/* Parallel Sparse BLAS v 3.9.0 */ +/* (C) Copyright 2017 Salvatore Filippone */ +/* */ +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions, and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ +/* 3. The name of the PSBLAS group or the names of its contributors may */ +/* not be used to endorse or promote products derived from this */ +/* software without specific written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ +/* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS */ +/* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR */ +/* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF */ +/* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS */ +/* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN */ +/* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) */ +/* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */ +/* POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/* File: gputest.c */ + +#include +#include +#include +#include + +#include "psb_base_cbind.h" + +int main(int argc, char **argv) +{ + psb_c_ctxt *cctxt; + psb_i_t iam, np; + + // Initialize PSBLAS context + cctxt = psb_c_new_ctxt(); + psb_c_init(cctxt); + // Initialze GPU support +#ifdef PSB_HAVE_CUDA + psb_c_cuda_init(cctxt); +#endif + + psb_c_info(*cctxt, &iam, &np); + printf("Hello from process %d of %d\n", iam, np); +#ifdef PSB_HAVE_CUDA + printf("Number of available GPU devices: %d seen by process %d\n", psb_c_cuda_getDeviceCount(), iam); +#endif + + // Exit from GPU support +#ifdef PSB_HAVE_CUDA + psb_c_cuda_exit(); +#endif + // Finalize PSBLAS context + psb_c_exit(*cctxt); + free(cctxt); +} \ No newline at end of file diff --git a/cbind/test/gpu/pdegen3dc.c b/cbind/test/gpu/pdegen3dc.c new file mode 100644 index 000000000..2a65898a5 --- /dev/null +++ b/cbind/test/gpu/pdegen3dc.c @@ -0,0 +1,509 @@ +/*----------------------------------------------------------------------------------*/ +/* Parallel Sparse BLAS v 3.5.0 */ +/* (C) Copyright 2017 Salvatore Filippone */ +/* */ +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions, and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ +/* 3. The name of the PSBLAS group or the names of its contributors may */ +/* not be used to endorse or promote products derived from this */ +/* software without specific written permission. */ +/* */ +/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ +/* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ +/* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR */ +/* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS */ +/* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR */ +/* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF */ +/* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS */ +/* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN */ +/* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) */ +/* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */ +/* POSSIBILITY OF SUCH DAMAGE. */ +/* */ +/* */ +/* File: pdegen3dc.c */ +/* */ +/* Program: pdegen3dc */ +/* This sample program shows how to build and solve a sparse linear */ +/* */ +/* The program solves a linear system based on the partial differential */ +/* equation */ +/* */ +/* */ +/* */ +/* The equation generated is */ +/* */ +/* b1 d d (u) b2 d d (u) a1 d (u)) a2 d (u))) */ +/* - ------ - ------ + ----- + ------ + a3 u = 0 */ +/* dx dx dy dy dx dy */ +/* */ +/* */ +/* with Dirichlet boundary conditions on the unit cube */ +/* */ +/* 0<=x,y,z<=1 */ +/* */ +/* The equation is discretized with finite differences and uniform stepsize; */ +/* the resulting discrete equation is */ +/* */ +/* ( u(x,y,z)(2b1+2b2+a1+a2)+u(x-1,y)(-b1-a1)+u(x,y-1)(-b2-a2)+ */ +/* -u(x+1,y)b1-u(x,y+1)b2)*(1/h**2) */ +/* */ +/* Example adapted from: C.T.Kelley */ +/* Iterative Methods for Linear and Nonlinear Equations */ +/* SIAM 1995 */ +/* */ +/* */ +/* In this sample program the index space of the discretized */ +/* computational domain is first numbered sequentially in a standard way, */ +/* then the corresponding vector is distributed according to an HPF BLOCK */ +/* distribution directive. The discretization ensures there are IDIM */ +/* *internal* points in each direction. */ +/* */ +/*----------------------------------------------------------------------------------*/ + +#include +#include +#include +#include + +#include "psb_base_cbind.h" +#include "psb_prec_cbind.h" +#include "psb_linsolve_cbind.h" + +#define LINEBUFSIZE 1024 +#define NBMAX 20 +#define DUMPMATRIX 0 + +double a1(double x, double y, double z) +{ + return (1.0 / 80.0); +} +double a2(double x, double y, double z) +{ + return (1.0 / 80.0); +} +double a3(double x, double y, double z) +{ + return (1.0 / 80.0); +} +double c(double x, double y, double z) +{ + return (0.0); +} +double b1(double x, double y, double z) +{ + return (0.0 / sqrt(3.0)); +} +double b2(double x, double y, double z) +{ + return (0.0 / sqrt(3.0)); +} +double b3(double x, double y, double z) +{ + return (0.0 / sqrt(3.0)); +} + +double g(double x, double y, double z) +{ + if (x == 1.0) + { + return (1.0); + } + else if (x == 0.0) + { + return (exp(-y * y - z * z)); + } + else + { + return (0.0); + } +} + +psb_i_t matgen(psb_c_ctxt cctxt, psb_i_t nl, psb_i_t idim, psb_l_t vl[], + psb_c_dspmat *ah, const char *afmt, + psb_c_descriptor *cdh, const char *cdfmt, + psb_c_dvector *xh, psb_c_dvector *bh, psb_c_dvector *rh) +{ + psb_i_t iam, np; + psb_l_t ix, iy, iz, el, glob_row; + psb_i_t i, k, info, ret; + double x, y, z, deltah, sqdeltah, deltah2; + double val[10 * NBMAX], zt[NBMAX]; + psb_l_t irow[10 * NBMAX], icol[10 * NBMAX]; + + info = 0; + psb_c_info(cctxt, &iam, &np); + deltah = (double)1.0 / (idim + 1); + sqdeltah = deltah * deltah; + deltah2 = 2.0 * deltah; + psb_c_set_index_base(0); + for (i = 0; i < nl; i++) + { + glob_row = vl[i]; + // if ((i%100000 == 0)||(i<10)) fprintf(stderr,"%d: generation loop at %d %ld \n",iam,i,glob_row); + el = 0; + ix = glob_row / (idim * idim); + iy = (glob_row - ix * idim * idim) / idim; + iz = glob_row - ix * idim * idim - iy * idim; + x = (ix + 1) * deltah; + y = (iy + 1) * deltah; + z = (iz + 1) * deltah; + zt[0] = 0.0; + /* internal point: build discretization */ + /* term depending on (x-1,y,z) */ + val[el] = -a1(x, y, z) / sqdeltah - b1(x, y, z) / deltah2; + if (ix == 0) + { + zt[0] += g(0.0, y, z) * (-val[el]); + } + else + { + icol[el] = (ix - 1) * idim * idim + (iy)*idim + (iz); + el = el + 1; + } + /* term depending on (x,y-1,z) */ + val[el] = -a2(x, y, z) / sqdeltah - b2(x, y, z) / deltah2; + if (iy == 0) + { + zt[0] += g(x, 0.0, z) * (-val[el]); + } + else + { + icol[el] = (ix)*idim * idim + (iy - 1) * idim + (iz); + el = el + 1; + } + /* term depending on (x,y,z-1)*/ + val[el] = -a3(x, y, z) / sqdeltah - b3(x, y, z) / deltah2; + if (iz == 0) + { + zt[0] += g(x, y, 0.0) * (-val[el]); + } + else + { + icol[el] = (ix)*idim * idim + (iy)*idim + (iz - 1); + el = el + 1; + } + /* term depending on (x,y,z)*/ + val[el] = 2.0 * (a1(x, y, z) + a2(x, y, z) + a3(x, y, z)) / sqdeltah + c(x, y, z); + icol[el] = (ix)*idim * idim + (iy)*idim + (iz); + el = el + 1; + /* term depending on (x,y,z+1) */ + val[el] = -a3(x, y, z) / sqdeltah + b3(x, y, z) / deltah2; + if (iz == idim - 1) + { + zt[0] += g(x, y, 1.0) * (-val[el]); + } + else + { + icol[el] = (ix)*idim * idim + (iy)*idim + (iz + 1); + el = el + 1; + } + /* term depending on (x,y+1,z) */ + val[el] = -a2(x, y, z) / sqdeltah + b2(x, y, z) / deltah2; + if (iy == idim - 1) + { + zt[0] += g(x, 1.0, z) * (-val[el]); + } + else + { + icol[el] = (ix)*idim * idim + (iy + 1) * idim + (iz); + el = el + 1; + } + /* term depending on (x+1,y,z) */ + val[el] = -a1(x, y, z) / sqdeltah + b1(x, y, z) / deltah2; + if (ix == idim - 1) + { + zt[0] += g(1.0, y, z) * (-val[el]); + } + else + { + icol[el] = (ix + 1) * idim * idim + (iy)*idim + (iz); + el = el + 1; + } + for (k = 0; k < el; k++) + irow[k] = glob_row; + if ((ret = psb_c_dspins(el, irow, icol, val, ah, cdh)) != 0) + fprintf(stderr, "From psb_c_dspins: %d\n", ret); + irow[0] = glob_row; + psb_c_dgeins(1, irow, zt, bh, cdh); + zt[0] = 0.0; + psb_c_dgeins(1, irow, zt, xh, cdh); + } + +#ifdef PSB_HAVE_CUDA + info = psb_c_cdasb_format(cdh, cdfmt); + if (info != 0) + return (info); + info = psb_c_dspasb_opt(ah, cdh, afmt, PSB_UPD_DFLT, PSB_DUPL_DEF); + if (info != 0) + return (info); + info = psb_c_dgeasb_options_format(xh, cdh, PSB_DUPL_ADD, cdfmt); + if (info != 0) + return (info); + info = psb_c_dgeasb_options_format(bh, cdh, PSB_DUPL_ADD, cdfmt); + if (info != 0) + return (info); + info = psb_c_dgeasb_options_format(rh, cdh, PSB_DUPL_ADD, cdfmt); + if (info != 0) + return (info); +#else + if ((info = psb_c_cdasb(cdh)) != 0) + return (info); + + if ((info = psb_c_dspasb(ah, cdh)) != 0) + return (info); + + if ((info = psb_c_dgeasb(xh, cdh)) != 0) + return (info); + if ((info = psb_c_dgeasb(bh, cdh)) != 0) + return (info); + if ((info = psb_c_dgeasb(rh, cdh)) != 0) + return (info); +#endif + return (info); +} + +int main(int argc, char *argv[]) +{ + psb_c_ctxt *cctxt; + psb_i_t iam, np; + char methd[40], ptype[20], afmt[8], cdfmt[8], buffer[LINEBUFSIZE + 1]; + psb_i_t nparms; + psb_i_t idim, info, istop, itmax, itrace, irst, iter, ret; + psb_c_dprec *ph; + psb_c_dspmat *ah; + psb_c_dvector *bh, *xh, *rh; + psb_i_t nb, nlr, nl; + psb_l_t i, ng, *vl, k; + double t1, t2, eps, err; + double *xv, *bv, *rv; + double one = 1.0, zero = 0.0, res2; + psb_c_SolverOptions options; + psb_c_descriptor *cdh; + FILE *vectfile; + + cctxt = psb_c_new_ctxt(); + psb_c_init(cctxt); +#ifdef PSB_HAVE_CUDA + psb_c_cuda_init(cctxt); +#endif + psb_c_info(*cctxt, &iam, &np); +#ifdef PSB_HAVE_CUDA + if (iam == 0) + printf("Example compiled with GPU support.\n"); +#endif + psb_c_barrier(*cctxt); + if (iam == 0) + { + fgets(buffer, LINEBUFSIZE, stdin); + sscanf(buffer, "%d ", &nparms); + fgets(buffer, LINEBUFSIZE, stdin); + sscanf(buffer, "%s", methd); + fgets(buffer, LINEBUFSIZE, stdin); + sscanf(buffer, "%s", ptype); + fgets(buffer, LINEBUFSIZE, stdin); + sscanf(buffer, "%s", afmt); + fgets(buffer, LINEBUFSIZE, stdin); + sscanf(buffer, "%s", cdfmt); + fgets(buffer, LINEBUFSIZE, stdin); + sscanf(buffer, "%d", &idim); + fgets(buffer, LINEBUFSIZE, stdin); + sscanf(buffer, "%d", &istop); + fgets(buffer, LINEBUFSIZE, stdin); + sscanf(buffer, "%d", &itmax); + fgets(buffer, LINEBUFSIZE, stdin); + sscanf(buffer, "%d", &itrace); + fgets(buffer, LINEBUFSIZE, stdin); + sscanf(buffer, "%d", &irst); + + /* Echo input parameters */ + printf("Number of processes: %d\n", np); + printf("Number of parameters read: %d\n", nparms); + printf("Krylov method: %s\n", methd); + printf("Preconditioner type: %s\n", ptype); + printf("Sparse matrix format: %s\n", afmt); + printf("Descriptor format: %s\n", cdfmt); + printf("Problem dimension (internal points per direction): %d\n", idim); + printf("Stopping criterion (1:backward error 2: ||r||_2/||b||_2): %d\n", istop); + printf("Maximum number of iterations: %d\n", itmax); + printf("Info message frequency (every itrace iterations): %d\n", itrace); + printf("Restart depth for RGMRES or BiCGSTAB(L): %d\n", irst); + } + /* Now broadcast the values, and check they're OK */ + psb_c_ibcast(*cctxt, 1, &nparms, 0); + psb_c_hbcast(*cctxt, methd, 0); + psb_c_hbcast(*cctxt, ptype, 0); + psb_c_hbcast(*cctxt, afmt, 0); + psb_c_hbcast(*cctxt, cdfmt, 0); + psb_c_ibcast(*cctxt, 1, &idim, 0); + psb_c_ibcast(*cctxt, 1, &istop, 0); + psb_c_ibcast(*cctxt, 1, &itmax, 0); + psb_c_ibcast(*cctxt, 1, &itrace, 0); + psb_c_ibcast(*cctxt, 1, &irst, 0); + + fflush(stderr); + psb_c_barrier(*cctxt); + + cdh = psb_c_new_descriptor(); + psb_c_set_index_base(0); + + /* Simple minded BLOCK data distribution */ + ng = ((psb_l_t)idim) * idim * idim; + nb = (ng + np - 1) / np; + nl = nb; + if ((ng - iam * nb) < nl) + nl = ng - iam * nb; + if ((vl = malloc(nb * sizeof(psb_l_t))) == NULL) + { + fprintf(stderr, "On %d: malloc failure\n", iam); + psb_c_abort(*cctxt); + } + i = ((psb_l_t)iam) * nb; + for (k = 0; k < nl; k++) + vl[k] = i + k; + + if ((info = psb_c_cdall_vl(nl, vl, *cctxt, cdh)) != 0) + { + fprintf(stderr, "From cdall: %d\nBailing out\n", info); + psb_c_abort(*cctxt); + } + + bh = psb_c_new_dvector(); + xh = psb_c_new_dvector(); + rh = psb_c_new_dvector(); + ah = psb_c_new_dspmat(); + // fprintf(stderr,"From psb_c_new_dspmat: %p\n",ah); + + /* Allocate mem space for sparse matrix and vectors */ + ret = psb_c_dspall(ah, cdh); + // fprintf(stderr,"From psb_c_dspall: %d\n",ret); + psb_c_dgeall(bh, cdh); + psb_c_dgeall(xh, cdh); + psb_c_dgeall(rh, cdh); + + /* Matrix generation */ + if (matgen(*cctxt, nl, idim, vl, ah, afmt, cdh, cdfmt, xh, bh, rh) != 0) + { + fprintf(stderr, "Error during matrix build loop\n"); + psb_c_abort(*cctxt); + } + psb_c_barrier(*cctxt); + /* Set up the preconditioner */ + ph = psb_c_new_dprec(); + psb_c_dprecinit(*cctxt, ph, ptype); + ret = psb_c_dprecbld(ah, cdh, ph); + // fprintf(stderr,"From psb_c_dprecbld: %d\n",ret); + + /* Set up the solver options */ + psb_c_DefaultSolverOptions(&options); + options.eps = 1.e-9; + options.itmax = itmax; + options.irst = irst; + options.itrace = 1; + options.istop = istop; + psb_c_seterraction_ret(); + t1 = psb_c_wtime(); + ret = psb_c_dkrylov(methd, ah, ph, bh, xh, cdh, &options); + t2 = psb_c_wtime(); + iter = options.iter; + err = options.err; + // fprintf(stderr,"From krylov: %d %lf, %d %d\n",iter,err,ret,psb_c_get_errstatus()); + if (psb_c_get_errstatus() != 0) + { + psb_c_print_errmsg(); + } + // fprintf(stderr,"After cleanup %d\n",psb_c_get_errstatus()); + /* Check 2-norm of residual on exit */ + psb_c_dgeaxpby(one, bh, zero, rh, cdh); + psb_c_dspmm(-one, ah, xh, one, rh, cdh); + res2 = psb_c_dgenrm2(rh, cdh); + + if (iam == 0) + { + fprintf(stdout, "Time: %lf\n", (t2 - t1)); + fprintf(stdout, "Iter: %d\n", iter); + fprintf(stdout, "Err: %lg\n", err); + fprintf(stdout, "||r||_2: %lg\n", res2); + } + +#if DUMPATRIX + psb_c_dmat_name_print(ah, "cbindmat.mtx"); + nlr = psb_c_cd_get_local_rows(cdh); + bv = psb_c_dvect_get_cpy(bh); + vectfile = fopen("cbindb.mtx", "w"); + for (i = 0; i < nlr; i++) + fprintf(vectfile, "%lf\n", bv[i]); + fclose(vectfile); + + xv = psb_c_dvect_get_cpy(xh); + nlr = psb_c_cd_get_local_rows(cdh); + for (i = 0; i < nlr; i++) + fprintf(stdout, "SOL: %d %d %lf\n", iam, i, xv[i]); + + rv = psb_c_dvect_get_cpy(rh); + nlr = psb_c_cd_get_local_rows(cdh); + for (i = 0; i < nlr; i++) + fprintf(stdout, "RES: %d %d %lf\n", iam, i, rv[i]); + +#endif + + /* Clean up memory */ + if ((info = psb_c_dprecfree(ph)) != 0) + { + fprintf(stderr, "From dprecfree: %d\nBailing out\n", info); + psb_c_abort(*cctxt); + } + if ((info = psb_c_dgefree(xh, cdh)) != 0) + { + fprintf(stderr, "From dgefree: %d\nBailing out\n", info); + psb_c_abort(*cctxt); + } + if ((info = psb_c_dgefree(bh, cdh)) != 0) + { + fprintf(stderr, "From dgefree: %d\nBailing out\n", info); + psb_c_abort(*cctxt); + } + if ((info = psb_c_dgefree(rh, cdh)) != 0) + { + fprintf(stderr, "From dgefree: %d\nBailing out\n", info); + psb_c_abort(*cctxt); + } + if ((info = psb_c_dspfree(ah, cdh)) != 0) + { + fprintf(stderr, "From dspfree: %d\nBailing out\n", info); + psb_c_abort(*cctxt); + } + + if ((info = psb_c_cdfree(cdh)) != 0) + { + fprintf(stderr, "From cdfree: %d\nBailing out\n", info); + psb_c_abort(*cctxt); + } + // fprintf(stderr,"pointer from cdfree: %p\n",cdh->descriptor); + + /* Clean up object handles */ + free(ph); + free(xh); + free(bh); + free(rh); + free(ah); + free(cdh); + + /* further cleanup */ + free(vl); + // if (iam == 0) fprintf(stderr,"program completed successfully\n"); + + psb_c_barrier(*cctxt); +#ifdef PSB_HAVE_CUDA + psb_c_cuda_exit(); +#endif + /* Finalize PSBLAS context */ + psb_c_exit(*cctxt); + free(cctxt); +} diff --git a/cbind/test/gpu/runs/pdegen3d.inp b/cbind/test/gpu/runs/pdegen3d.inp new file mode 100644 index 000000000..c2bb30719 --- /dev/null +++ b/cbind/test/gpu/runs/pdegen3d.inp @@ -0,0 +1,12 @@ +7 Number of entries below this +BICGSTAB Iterative method BICGSTAB CGS BICG BICGSTABL RGMRES +BJAC ls Preconditioner NONE DIAG BJAC +CSRG A Storage format CSR COO (for CPU) CSRG HLG (for GPU) +DEVICE A Descriptor Storage format HOST/CPU or DEVICE/GPU +080 Domain size (acutal system is this**3) +1 Stopping criterion +80 MAXIT +01 ITRACE +20 IRST restart for RGMRES and BiCGSTABL + + diff --git a/cbind/test/pdegen/Makefile b/cbind/test/pdegen/Makefile index cd7c8d680..a3e0a38f6 100644 --- a/cbind/test/pdegen/Makefile +++ b/cbind/test/pdegen/Makefile @@ -9,7 +9,7 @@ FINCLUDES=$(FMFLAG). $(FMFLAG)$(HERE) $(FMFLAG)$(MODDIR) CINCLUDES=-I. -I$(HERE) -I$(INCLUDEDIR) PSBC_LIBS= -L$(LIBDIR) -lpsb_cbind -PSB_LIBS=-lpsb_util -lpsb_linsolve -lpsb_prec -lpsb_base -L$(LIBDIR) +PSB_LIBS=-lpsb_util -lpsb_linsolve -lpsb_prec -lpsb_ext -lpsb_base -L$(LIBDIR) # # Compilers and such diff --git a/cbind/test/pdegen/pdegen3dc.c b/cbind/test/pdegen/pdegen3dc.c index 2d8061805..52a7a97f6 100644 --- a/cbind/test/pdegen/pdegen3dc.c +++ b/cbind/test/pdegen/pdegen3dc.c @@ -12,7 +12,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ -/* software without specific written permission. */ +/* software without specific prior written permission. */ /* */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -74,7 +74,7 @@ #include "psb_base_cbind.h" #include "psb_prec_cbind.h" -#include "psb_krylov_cbind.h" +#include "psb_linsolve_cbind.h" #define LINEBUFSIZE 1024 #define NBMAX 20 diff --git a/cbind/util/psb_c_util_cbind_mod.f90 b/cbind/util/psb_c_util_cbind_mod.f90 index ae3f6cf8d..712b92824 100644 --- a/cbind/util/psb_c_util_cbind_mod.f90 +++ b/cbind/util/psb_c_util_cbind_mod.f90 @@ -4,14 +4,12 @@ module psb_cutil_cbind_mod use psb_util_mod use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod contains function psb_c_cmm_mat_write(ah,matrixtitle,filename) bind(c) result(res) use psb_base_mod use psb_util_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -32,8 +30,8 @@ contains return end if - call stringc2f(matrixtitle,mtitle) - call stringc2f(filename,fname) + call psb_stringc2f(matrixtitle,mtitle) + call psb_stringc2f(filename,fname) call mm_mat_write(ap,mtitle,info,filename=fname) @@ -44,7 +42,6 @@ contains function psb_c_cglobal_mat_write(ah,cdh) bind(c) result(res) use psb_base_mod use psb_util_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -87,7 +84,6 @@ contains function psb_c_cglobal_vec_write(vh,cdh) bind(c) result(res) use psb_base_mod use psb_util_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res diff --git a/cbind/util/psb_d_util_cbind_mod.f90 b/cbind/util/psb_d_util_cbind_mod.f90 index 29fec75b4..66b50b3c8 100644 --- a/cbind/util/psb_d_util_cbind_mod.f90 +++ b/cbind/util/psb_d_util_cbind_mod.f90 @@ -4,14 +4,12 @@ module psb_dutil_cbind_mod use psb_util_mod use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod contains function psb_c_dmm_mat_write(ah,matrixtitle,filename) bind(c) result(res) use psb_base_mod use psb_util_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -32,8 +30,8 @@ contains return end if - call stringc2f(matrixtitle,mtitle) - call stringc2f(filename,fname) + call psb_stringc2f(matrixtitle,mtitle) + call psb_stringc2f(filename,fname) call mm_mat_write(ap,mtitle,info,filename=fname) @@ -44,7 +42,6 @@ contains function psb_c_dglobal_mat_write(ah,cdh) bind(c) result(res) use psb_base_mod use psb_util_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -87,7 +84,6 @@ contains function psb_c_dglobal_vec_write(vh,cdh) bind(c) result(res) use psb_base_mod use psb_util_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res diff --git a/cbind/util/psb_s_util_cbind_mod.f90 b/cbind/util/psb_s_util_cbind_mod.f90 index 0dfe3ddc4..2fe32cb4a 100644 --- a/cbind/util/psb_s_util_cbind_mod.f90 +++ b/cbind/util/psb_s_util_cbind_mod.f90 @@ -4,14 +4,12 @@ module psb_sutil_cbind_mod use psb_util_mod use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod contains function psb_c_smm_mat_write(ah,matrixtitle,filename) bind(c) result(res) use psb_base_mod use psb_util_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -32,8 +30,8 @@ contains return end if - call stringc2f(matrixtitle,mtitle) - call stringc2f(filename,fname) + call psb_stringc2f(matrixtitle,mtitle) + call psb_stringc2f(filename,fname) call mm_mat_write(ap,mtitle,info,filename=fname) @@ -44,7 +42,6 @@ contains function psb_c_sglobal_mat_write(ah,cdh) bind(c) result(res) use psb_base_mod use psb_util_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -87,7 +84,6 @@ contains function psb_c_sglobal_vec_write(vh,cdh) bind(c) result(res) use psb_base_mod use psb_util_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res diff --git a/cbind/util/psb_z_util_cbind_mod.f90 b/cbind/util/psb_z_util_cbind_mod.f90 index 792f836f6..9d627d1eb 100644 --- a/cbind/util/psb_z_util_cbind_mod.f90 +++ b/cbind/util/psb_z_util_cbind_mod.f90 @@ -4,14 +4,12 @@ module psb_zutil_cbind_mod use psb_util_mod use psb_base_mod use psb_objhandle_mod - use psb_base_string_cbind_mod contains function psb_c_zmm_mat_write(ah,matrixtitle,filename) bind(c) result(res) use psb_base_mod use psb_util_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -32,8 +30,8 @@ contains return end if - call stringc2f(matrixtitle,mtitle) - call stringc2f(filename,fname) + call psb_stringc2f(matrixtitle,mtitle) + call psb_stringc2f(filename,fname) call mm_mat_write(ap,mtitle,info,filename=fname) @@ -44,7 +42,6 @@ contains function psb_c_zglobal_mat_write(ah,cdh) bind(c) result(res) use psb_base_mod use psb_util_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res @@ -87,7 +84,6 @@ contains function psb_c_zglobal_vec_write(vh,cdh) bind(c) result(res) use psb_base_mod use psb_util_mod - use psb_base_string_cbind_mod implicit none integer(psb_c_ipk_) :: res diff --git a/cmake/readPSBConst.cmake b/cmake/readPSBConst.cmake new file mode 100644 index 000000000..47a28f69b --- /dev/null +++ b/cmake/readPSBConst.cmake @@ -0,0 +1,68 @@ + +macro(_psb_read_const) +file(READ "${CMAKE_CURRENT_SOURCE_DIR}/base/modules/psb_const_mod.F90" _psb_const_mod) +string(REGEX MATCH "psb_version_major_[ \t]+=[ \t]+([0-9]+)" _psb_version_major_match "${_psb_const_mod}") +set(PSBLASMAJOR "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_version_minor_[ \t]+=[ \t]+([0-9]+)" _psb_version_minor_match "${_psb_const_mod}") +set(PSBLASMINOR "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_patchlevel_[ \t]+=[ \t]+([0-9]+)" _psb_patchlevel_match "${_psb_const_mod}") +set(PSBLASPATCH "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_version_string_[ \t]+=[ \t]+([^ \t]+)" _psb_version_string_match "${_psb_const_mod}") +set(PSBLASSTRING "${CMAKE_MATCH_1}") + +string(REGEX MATCH "psb_dupl_null_[ \t]+=[ \t]+([0-9]+)" _psb_dupl_null_match "${_psb_const_mod}") +set(PSBLASDUPNUL "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_dupl_add_[ \t]+=[ \t]+([0-9]+)" _psb_dupl_add_match "${_psb_const_mod}") +set(PSBLASDUPADD "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_dupl_err_[ \t]+=[ \t]+([0-9]+)" _psb_dupl_err_match "${_psb_const_mod}") +set(PSBLASDUPERR "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_dupl_ovwrt_[ \t]+=[ \t]+([0-9]+)" _psb_dupl_ovw_match "${_psb_const_mod}") +set(PSBLASDUPOVW "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_dupl_def_[ \t]+=[ \t]+([^ \t]+)_" _psb_dupl_def_match "${_psb_const_mod}") +set(PSBLASDUPDEF "${CMAKE_MATCH_1}") +string(TOUPPER ${PSBLASDUPDEF} PSBLASDUPDEF) + +string(REGEX MATCH "psb_upd_srch_[ \t]+=[ \t]+([0-9]+)" _psb_upd_srch_match "${_psb_const_mod}") +set(PSBLASUPDSRC "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_upd_perm_[ \t]+=[ \t]+([0-9]+)" _psb_upd_perm_match "${_psb_const_mod}") +set(PSBLASUPDPRM "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_upd_dflt_[ \t]+=[ \t]+([^ \t]+)_" _psb_upd_dflt_match "${_psb_const_mod}") +set(PSBLASUPDDEF "${CMAKE_MATCH_1}") +string(TOUPPER ${PSBLASUPDDEF} PSBLASUPDDEF) + +string(REGEX MATCH "psb_matbld_noremote_[ \t]+=[ \t]+([0-9]+)" _psb_matbld_noremote_match "${_psb_const_mod}") +set(PSBLASBLDNOR "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_matbld_remote_[ \t]+=[ \t]+([0-9]+)" _psb_matbld_remote_match "${_psb_const_mod}") +set(PSBLASBLDRMT "${CMAKE_MATCH_1}") +endmacro(_psb_read_const) + +macro(_psb_read_desc_const) +file(READ "${CMAKE_CURRENT_SOURCE_DIR}/base/modules/desc/psb_desc_const_mod.f90" _psb_const_mod) + +string(REGEX MATCH "psb_swap_send_[ \t]+=[ \t]+([0-9]+)" _psb_swap_send_match "${_psb_const_mod}") +set(PSBSWPSND "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_swap_recv_[ \t]+=[ \t]+([0-9]+)" _psb_swap_recv_match "${_psb_const_mod}") +set(PSBSWPRCV "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_swap_sync_[ \t]+=[ \t]+([0-9]+)" _psb_swap_sync_match "${_psb_const_mod}") +set(PSBSWPSYN "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_swap_mpi_[ \t]+=[ \t]+([0-9]+)" _psb_swap_mpi_match "${_psb_const_mod}") +set(PSBSWPMPI "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_collective_start_[ \t]+=[ \t]+([0-9]+)" _psb_collective_start_match "${_psb_const_mod}") +set(PSBCLCSTR "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_collective_end_[ \t]+=[ \t]+([0-9]+)" _psb_collective_end_match "${_psb_const_mod}") +set(PSBCLCEND "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_collective_sync_[ \t]+=[ \t]+([0-9]+)" _psb_collective_sync_match "${_psb_const_mod}") +set(PSBCLCSYN "${CMAKE_MATCH_1}") + +string(REGEX MATCH "psb_none_[ \t]+=[ \t]+([0-9]+)" _psb_none_match "${_psb_const_mod}") +set(PSBNONE "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_sum_[ \t]+=[ \t]+([0-9]+)" _psb_sum_match "${_psb_const_mod}") +set(PSBSUM "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_avg_[ \t]+=[ \t]+([0-9]+)" _psb_avg_match "${_psb_const_mod}") +set(PSBAVG "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_square_root_[ \t]+=[ \t]+([0-9]+)" _psb_square_root_match "${_psb_const_mod}") +set(PSBSQRT "${CMAKE_MATCH_1}") +string(REGEX MATCH "psb_setzero_[ \t]+=[ \t]+([0-9]+)" _psb_setzero_match "${_psb_const_mod}") +set(PSBSETZ "${CMAKE_MATCH_1}") + +endmacro(_psb_read_desc_const) diff --git a/config/pac.m4 b/config/pac.m4 index 9a9a1b0f3..9cb556476 100644 --- a/config/pac.m4 +++ b/config/pac.m4 @@ -956,6 +956,57 @@ end program xtt], AC_LANG_POP([Fortran]) ]) +dnl @synopsis PAC_FORTRAN_TEST_SUBMODULES( [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]) +dnl +dnl Will try to compile a program checking the SUBMODULES Fortran support. +dnl +dnl Will use MPIFC, otherwise '$FC'. +dnl +dnl If the test passes, will execute ACTION-IF-FOUND. Otherwise, ACTION-IF-NOT-FOUND. +dnl Note : This file will be likely to induce the compiler to create a module file +dnl (for a module called conftest). +dnl Depending on the compiler flags, this could cause a conftest.mod file to appear +dnl in the present directory, or in another, or with another name. So be warned! +dnl +dnl @author Salvatore Filippone +AC_DEFUN(PAC_FORTRAN_TEST_SUBMODULES, +dnl Warning : square brackets are EVIL! +[AC_MSG_CHECKING([support for Fortran SUBMODULES]) +AC_LANG_PUSH([Fortran]) + ac_exeext='' + ac_ext='F90' + dnl ac_link='${MPIFC-$FC} -o conftest${ac_exeext} $FFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' + ac_fc=${MPIFC-$FC}; + AC_COMPILE_IFELSE([ +module conftest + + interface + module subroutine foo(v) + integer, intent(inout) :: v(:) + end subroutine foo + end interface +end module conftest +submodule (conftest) conftest_impl + +contains + module subroutine foo(v) + integer, intent(inout) :: v(:) + integer :: i + do i=1,size(v) + v(i)=i + end do + end subroutine foo +end submodule ], + [ AC_MSG_RESULT([yes]) + ifelse([$1], , :, [ $1])], + [ AC_MSG_RESULT([no]) + echo "configure: failed program was:" >&AS_MESSAGE_LOG_FD + cat conftest.$ac_ext >&AS_MESSAGE_LOG_FD + ifelse([$2], , , [ $2])]) +AC_LANG_POP([Fortran]) +]) + + dnl @synopsis PAC_CHECK_BLACS dnl dnl Will try to find the BLACS @@ -2348,3 +2399,23 @@ fi ] ) +dnl @synopsis PAC_FORTRAN_PSBLAS_VERSION( ) +dnl +dnl Will try to compile, link and run a program using the PSBLAS library. \ +dnl Checks for version major, minor and patchlevel +dnl +dnl Will use MPIFC, otherwise '$FC'. +dnl +dnl If the test passes, will execute ACTION-IF-FOUND. Otherwise, ACTION-IF-NOT-FOUND. +dnl +dnl @author Michele Martone +dnl @author Salvatore Filippone +dnl +AC_DEFUN(PAC_EXTRACT_PSBLAS_VERSION, +[AC_MSG_CHECKING([for version data of PSBLAS]) + pac_const_file="base/modules/psb_const_mod.F90"; + pac_cv_psblas_version_major=`cat $pac_const_file| grep version_major`; + pac_cv_psblas_version_minor=`cat $pac_const_file | grep version_minor `; + pac_cv_psblas_patchlevel=`cat $pac_const_file | grep patchlevel `; + pac_cv_psblas_version_string=`cat $pac_const_file | grep version_string `; +]) diff --git a/configure b/configure index 4f83aa19f..e8a214af5 100755 --- a/configure +++ b/configure @@ -651,8 +651,9 @@ LIBRSB_DIR LIBRSB_INCDIR LIBRSB_INCLUDES LIBRSB_LIBS -LCUDA +LPSB_CUDA CUDALD +CUDAMODS CUDAD CUDEFINES CUDA_NVCC @@ -666,12 +667,12 @@ FCUDEFINES CUDA_DEFINES CUDA_DIR EXTRALDLIBS -SPGPU_LIBS SPGPU_FLAGS CXXOPENACC CCOPENACC FCOPENACC OACCLD +OACCMODS OACCD METISINCFILE UTILLIBNAME @@ -690,6 +691,32 @@ CINTMETIS CHAVEMETIS CHAVE_OPENMP CSERIALMPI +PSBCLCSYN +PSBCLCEND +PSBCLCSTR +PSBSETZ +PSBSQRT +PSBAVG +PSBSUM +PSBNONE +PSBSWPMPI +PSBSWPSYN +PSBSWPRCV +PSBSWPSND +PSBLASBLDRMT +PSBLASBLDNOR +PSBLASUPDDEF +PSBLASUPDPRM +PSBLASUPDSRC +PSBLASDUPDEF +PSBLASDUPERR +PSBLASDUPOVW +PSBLASDUPADD +PSBLASDUPNUL +PSBLASSTRING +PSBLASPATCH +PSBLASMINOR +PSBLASMAJOR PSB_LPKDEF PSB_IPKDEF FINCLUDES @@ -705,7 +732,6 @@ INSTALL_LIBDIR INSTALL_DIR INSTALL MPIFCC -AR FLIBS CLINK FLINK @@ -726,6 +752,7 @@ BASEMODNAME CDEFINES FDEFINES LAPACK_LIBS +AR OPENMP_CXXFLAGS OPENMP_CFLAGS OPENMP_FCFLAGS @@ -4255,7 +4282,10 @@ _ACEOF break fi done - rm -f core conftest* + # aligned with autoconf, so not including core; see bug#72225. + rm -f -r a.out a.exe b.out conftest.$ac_ext conftest.$ac_objext \ + conftest.dSYM conftest1.$ac_ext conftest1.$ac_objext conftest1.dSYM \ + conftest2.$ac_ext conftest2.$ac_objext conftest2.dSYM unset am_i ;; esac fi @@ -5905,7 +5935,7 @@ else fi -am__api_version='1.17' +am__api_version='1.18' { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether sleep supports fractional seconds" >&5 printf %s "checking whether sleep supports fractional seconds... " >&6; } @@ -6074,10 +6104,14 @@ am_lf=' ' case `pwd` in *[\\\"\#\$\&\'\`$am_lf]*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; esac case $srcdir in *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; esac @@ -6602,9 +6636,133 @@ AMTAR='$${TAR-tar}' # We'll loop over all known methods to create a tar archive until one works. -_am_tools='gnutar pax cpio none' +_am_tools='gnutar plaintar pax cpio none' + +# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format" >&5 +printf %s "checking whether UID '$am_uid' is supported by ustar format... " >&6; } + if test x$am_uid = xunknown; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ancient id detected; assuming current UID is ok, but dist-ustar might not work" >&5 +printf "%s\n" "$as_me: WARNING: ancient id detected; assuming current UID is ok, but dist-ustar might not work" >&2;} + elif test $am_uid -le $am_max_uid; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + _am_tools=none + fi + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format" >&5 +printf %s "checking whether GID '$am_gid' is supported by ustar format... " >&6; } + if test x$gm_gid = xunknown; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: ancient id detected; assuming current GID is ok, but dist-ustar might not work" >&5 +printf "%s\n" "$as_me: WARNING: ancient id detected; assuming current GID is ok, but dist-ustar might not work" >&2;} + elif test $am_gid -le $am_max_gid; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + _am_tools=none + fi -am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive" >&5 +printf %s "checking how to create a ustar tar archive... " >&6; } + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_ustar-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + { echo "$as_me:$LINENO: $_am_tar --version" >&5 + ($_am_tar --version) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && break + done + am__tar="$_am_tar --format=ustar -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=ustar -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x ustar -w "$$tardir"' + am__tar_='pax -L -x ustar -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H ustar -L' + am__tar_='find "$tardir" -print | cpio -o -H ustar -L' + am__untar='cpio -i -H ustar -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_ustar}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + { echo "$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar" >&5 + (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + rm -rf conftest.dir + if test -s conftest.tar; then + { echo "$as_me:$LINENO: $am__untar &5 + ($am__untar &5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + { echo "$as_me:$LINENO: cat conftest.dir/file" >&5 + (cat conftest.dir/file) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + grep GrepMe conftest.dir/file >/dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + if test ${am_cv_prog_tar_ustar+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) am_cv_prog_tar_ustar=$_am_tool ;; +esac +fi + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar" >&5 +printf "%s\n" "$am_cv_prog_tar_ustar" >&6; } @@ -6989,7 +7147,7 @@ if test x"$psblas_cv_fc" == "x" ; then # TODO : discover the exact conditions when the usage of -WF is needed. psblas_cv_define_prepend="-WF," if eval "$MPIFC -qversion 2>&1 | grep -e\"Version: 10\.\" 2>/dev/null"; then - FDEFINES="$psblas_cv_define_prepend-DXLF_10 $FDEFINES"; sed -e's/(0-9*).*/$1/p' + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_XLF_10 $FDEFINES"; sed -e's/(0-9*).*/$1/p' fi # Note : there could be problems with old xlf compiler versions ( <10.1 ) @@ -7005,7 +7163,7 @@ if test x"$psblas_cv_fc" == "x" ; then psblas_flang_version=`flang-new --version |grep flang| sed -e 's/^ *flang.* version *//gi'`; psblas_flang_shv=`flang-new --version |grep flang| sed -e 's/^ *flang.* version *//gi' | sed -e's/\./ /g' | awk '{print $1}'`; psblas_cv_define_prepend=""; - FDEFINES="$psblas_cv_define_prepend-DFLANG $FDEFINES" + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_FLANG $FDEFINES" psblas_shvs=`echo $psblas_flang_shv|sed -e's/^0-9*//g'`; if test x"$psblas_shvs" != x""; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Running with LLVM $psblas_flang_version ($psblas_flang_shv). " >&5 @@ -7024,7 +7182,7 @@ printf "%s\n" "$as_me: Running with LLVM $psblas_flang_version ($psblas_flang_ psblas_flang_shv=`flang --version |grep flang| sed -e 's/^ *flang.* version *//gi' | sed -e's/\./ /g' | awk '{print $1}'`; psblas_cv_fc="flang"; psblas_cv_define_prepend=""; - FDEFINES="$psblas_cv_define_prepend-DFLANG $FDEFINES" + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_FLANG $FDEFINES" psblas_shvs=`echo $psblas_flang_shv|sed -e's/^0-9*//g'`; if test x"$psblas_shvs" != x""; then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Running with LLVM $psblas_flang_version ($psblas_flang_shv). " >&5 @@ -7037,7 +7195,7 @@ printf "%s\n" "$as_me: Running with LLVM $psblas_flang_version ($psblas_flang_ fi elif eval "$MPIFC -V 2>&1 | grep Intel.*Fortran.*Compiler 2>/dev/null" ; then # Intel compiler identification - + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_INTEL $FDEFINES" psblas_cv_fc="ifc"; elif eval "$MPIFC -v 2>&1 | grep NAG 2>/dev/null" ; then psblas_cv_fc="nag"; @@ -8106,7 +8264,7 @@ printf "%s\n" "no" >&6; } echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 as_fn_error $? "Sorry, cannot build PSBLAS without support for TR15581. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8." "$LINENO" 5 + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0." "$LINENO" 5 ;; esac fi @@ -8155,7 +8313,7 @@ printf "%s\n" "no" >&6; } echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 as_fn_error $? "Sorry, cannot build PSBLAS without support for EXTENDS. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8." "$LINENO" 5 + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0." "$LINENO" 5 ;; esac fi @@ -8220,7 +8378,7 @@ printf "%s\n" "no" >&6; } echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 as_fn_error $? "Sorry, cannot build PSBLAS without support for CLASS and type bound procedures. - Please get a Fortran compiler that supports them, e.g. GNU Fortran 4.8." "$LINENO" 5 + Please get a Fortran compiler that supports them, e.g. GNU Fortran 6.0." "$LINENO" 5 ;; esac fi @@ -8271,7 +8429,7 @@ printf "%s\n" "no" >&6; } echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 as_fn_error $? "Sorry, cannot build PSBLAS without support for SOURCE= allocation. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8." "$LINENO" 5 + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0." "$LINENO" 5 ;; esac fi @@ -8312,7 +8470,7 @@ printf "%s\n" "no" >&6; } echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 as_fn_error $? "Sorry, cannot build PSBLAS without support for MOVE_ALLOC. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8." "$LINENO" 5 + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0." "$LINENO" 5 ;; esac fi @@ -8352,7 +8510,7 @@ printf "%s\n" "no" >&6; } echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 as_fn_error $? "Sorry, cannot build PSBLAS without support for ISO_C_BINDING. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8." "$LINENO" 5 + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0." "$LINENO" 5 ;; esac fi @@ -8403,7 +8561,7 @@ printf "%s\n" "no" >&6; } echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 as_fn_error $? "Sorry, cannot build PSBLAS without support for SAME_TYPE_AS. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8." "$LINENO" 5 + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0." "$LINENO" 5 ;; esac fi @@ -8452,7 +8610,7 @@ printf "%s\n" "no" >&6; } echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 as_fn_error $? "Sorry, cannot build PSBLAS without support for EXTENDS_TYPE_OF. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8." "$LINENO" 5 + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0." "$LINENO" 5 ;; esac fi @@ -8503,7 +8661,7 @@ printf "%s\n" "no" >&6; } echo "configure: failed program was:" >&5 cat conftest.$ac_ext >&5 as_fn_error $? "Sorry, cannot build PSBLAS without support for MOLD= allocation. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8." "$LINENO" 5 + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0." "$LINENO" 5 ;; esac fi @@ -8516,6 +8674,61 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for Fortran SUBMODULES" >&5 +printf %s "checking support for Fortran SUBMODULES... " >&6; } +ac_ext=${ac_fc_srcext-f} +ac_compile='$FC -c $FCFLAGS $ac_fcflags_srcext conftest.$ac_ext >&5' +ac_link='$FC -o conftest$ac_exeext $FCFLAGS $LDFLAGS $ac_fcflags_srcext conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_fc_compiler_gnu + + ac_exeext='' + ac_ext='F90' + ac_fc=${MPIFC-$FC}; + cat > conftest.$ac_ext <<_ACEOF + +module conftest + + interface + module subroutine foo(v) + integer, intent(inout) :: v(:) + end subroutine foo + end interface +end module conftest +submodule (conftest) conftest_impl + +contains + module subroutine foo(v) + integer, intent(inout) :: v(:) + integer :: i + do i=1,size(v) + v(i)=i + end do + end subroutine foo +end submodule +_ACEOF +if ac_fn_fc_try_compile "$LINENO" +then : + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +printf "%s\n" "yes" >&6; } + : +else case e in #( + e) { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + as_fn_error $? "Sorry, cannot build without support for SUBMODULES. + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0." "$LINENO" 5 ;; +esac +fi +rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking support for Fortran VOLATILE" >&5 printf %s "checking support for Fortran VOLATILE... " >&6; } ac_ext=${ac_fc_srcext-f} @@ -8745,6 +8958,42 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu +###################### +# Extract version data +###################### +#PAC_EXTRACT_PSBLAS_VERSION +CFILE="base/modules/psb_const_mod.F90"; +PSBLASMAJOR=`cat $CFILE| grep version_major | $AWK '{print $6;}'`; +PSBLASMINOR=`cat $CFILE| grep version_minor| $AWK '{print $6;}'`; +PSBLASPATCH=`cat $CFILE| grep patchlevel| $AWK '{print $6;}'`; +PSBLASSTRING=`cat $CFILE | grep version_string | $AWK '{print $6;}'`; +PSBLASDUPNUL=`cat $CFILE| grep dupl_null | $AWK '{print $6;}'`; +PSBLASDUPADD=`cat $CFILE| grep "psb_dupl_add_ =" | $AWK '{print $6;}'`; +PSBLASDUPOVW=`cat $CFILE| grep dupl_ovwrt| $AWK '{print $6;}'`; +PSBLASDUPERR=`cat $CFILE| grep dupl_err| $AWK '{print $6;}'`; +PSBLASDUPDEF=`cat $CFILE| grep dupl_def| $AWK '{print $6;}' | tr a-z A-Z | sed s/\_$// `; +PSBLASUPDSRC=`cat $CFILE| grep "psb_upd_srch_ ="| $AWK '{print $6;}' `; +PSBLASUPDPRM=`cat $CFILE| grep "psb_upd_perm_ ="| $AWK '{print $6;}' `; +PSBLASUPDDEF=`cat $CFILE| grep "psb_upd_dflt_ ="| $AWK '{print $6;}' | tr a-z A-Z | sed s/\_$//`; +PSBLASBLDNOR=`cat $CFILE| grep matbld_noremote| $AWK '{print $6;}'`; +PSBLASBLDRMT=`cat $CFILE| grep matbld_remote| $AWK '{print $6;}'`; + +CFILE="base/modules/desc/psb_desc_const_mod.f90"; +PSBSWPSND=`cat $CFILE| grep swap_send| $AWK '{print $6;}'`; +PSBSWPRCV=`cat $CFILE| grep swap_recv| $AWK '{print $6;}'`; +PSBSWPSYN=`cat $CFILE| grep swap_sync| $AWK '{print $6;}'`; +PSBSWPMPI=`cat $CFILE| grep swap_mpi| $AWK '{print $6;}'`; +PSBNONE=`cat $CFILE| grep psb_none| $AWK '{print $6;}'`; +PSBSUM=`cat $CFILE| grep psb_sum| $AWK '{print $6;}'`; +PSBAVG=`cat $CFILE| grep psb_avg| $AWK '{print $6;}'`; +PSBSQRT=`cat $CFILE| grep square_root| $AWK '{print $6;}'`; +PSBSETZ=`cat $CFILE| grep psb_setzero| $AWK '{print $6;}'`; +PSBCLCSTR=`cat $CFILE| grep collective_start| $AWK '{print $6;}'`; +PSBCLCEND=`cat $CFILE| grep collective_end| $AWK '{print $6;}'`; +PSBCLCSYN=`cat $CFILE| grep collective_sync| $AWK '{print $6;}'`; + +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: version $PSBLASSTRING" >&5 +printf "%s\n" " version $PSBLASSTRING" >&6; } ############################################################################### # Additional pathname stuff (yes, it is redundant and confusing...) @@ -8769,18 +9018,215 @@ fi ############################################################################### # Parachute rules for ar and ranlib ... (could cause problems) ############################################################################### +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ar", so it can be a program name with args. +set dummy ${ac_tool_prefix}ar; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_AR+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$AR"; then + ac_cv_prog_AR="$AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_AR="${ac_tool_prefix}ar" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -if test "X$AR" == "X" ; then - AR="ar" +fi ;; +esac fi +AR=$ac_cv_prog_AR +if test -n "$AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $AR" >&5 +printf "%s\n" "$AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + -if test "X$RANLIB" == "X" ; then - RANLIB="ranlib" fi +if test -z "$ac_cv_prog_AR"; then + ac_ct_AR=$AR + # Extract the first word of "ar", so it can be a program name with args. +set dummy ar; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_AR+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_AR"; then + ac_cv_prog_ac_ct_AR="$ac_ct_AR" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_AR="ar" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS -# This should be portable -AR="${AR} -cDr" +fi ;; +esac +fi +ac_ct_AR=$ac_cv_prog_ac_ct_AR +if test -n "$ac_ct_AR"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR" >&5 +printf "%s\n" "$ac_ct_AR" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + if test "x$ac_ct_AR" = x; then + AR=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + AR=$ac_ct_AR + fi +else + AR="$ac_cv_prog_AR" +fi + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_RANLIB+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $RANLIB" >&5 +printf "%s\n" "$RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +printf %s "checking for $ac_word... " >&6; } +if test ${ac_cv_prog_ac_ct_RANLIB+y} +then : + printf %s "(cached) " >&6 +else case e in #( + e) if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + case $as_dir in #((( + '') as_dir=./ ;; + */) ;; + *) as_dir=$as_dir/ ;; + esac + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + printf "%s\n" "$as_me:${as_lineno-$LINENO}: found $as_dir$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi ;; +esac +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB" >&5 +printf "%s\n" "$ac_ct_RANLIB" >&6; } +else + { printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: no" >&5 +printf "%s\n" "no" >&6; } +fi + + if test "x$ac_ct_RANLIB" = x; then + RANLIB=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +printf "%s\n" "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + RANLIB=$ac_ct_RANLIB + fi +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +AR="$AR -cr" ############################################################################### # BLAS library presence checks @@ -10850,7 +11296,6 @@ printf "%s\n" "$as_me: For CUDA I need psb_ipk_ to be 4 bytes but it is $pac_cv_ pac_cv_cuda="no"; PSB_HAVE_CUDA="no"; CUDA_CC=""; - SPGPU_LIBS=""; CUDAD=""; CUDALD=""; CUDEFINES=""; @@ -11093,13 +11538,12 @@ LIBS="$SAVE_LIBS" CPPFLAGS="$SAVE_CPPFLAGS" PSB_CUDA_VERSION="$pac_cv_cuda_version"; - if (( ${PSB_CUDA_VERSION} > 12080 )); then + if (( ${PSB_CUDA_VERSION} > 15010 )); then { printf "%s\n" "$as_me:${as_lineno-$LINENO}: Unsupported CUDA version ${PSB_CUDA_VERSION} disabling CUDA" >&5 printf "%s\n" "$as_me: Unsupported CUDA version ${PSB_CUDA_VERSION} disabling CUDA" >&6;} pac_cv_cuda="no"; PSB_HAVE_CUDA="no"; CUDA_CC=""; - SPGPU_LIBS=""; CUDAD=""; CUDALD=""; CUDEFINES=""; @@ -11118,10 +11562,10 @@ printf "%s\n" "$as_me: CUDA version ${PSB_CUDA_VERSION}" >&6;} CHAVECUDA="#define PSB_HAVE_CUDA" CSHORTVCUDA="#define PSB_CUDA_SHORT_VERSION ${PSB_CUDA_SHORT_VERSION}" CVERSIONCUDA="#define PSB_CUDA_VERSION ${PSB_CUDA_VERSION}" - SPGPU_LIBS="-lspgpu"; - CUDAD=cudad; + CUDAD=cudad; + CUDAMODS=cudamods; CUDALD=cudald; - LCUDA="-lpsb_cuda"; + LPSB_CUDA="-lpsb_cuda -lpsb_ext"; EXTRALDLIBS="-lstdc++"; { printf "%s\n" "$as_me:${as_lineno-$LINENO}: At this point GPUTARGET is $CUDAD $CUDALD" >&5 printf "%s\n" "$as_me: At this point GPUTARGET is $CUDAD $CUDALD" >&6;} @@ -11139,7 +11583,7 @@ fi if test "x$pac_cv_cudacc" == "x"; then - pac_cv_cudacc="50,60,70,75,80,86"; + pac_cv_cudacc="75,80,86"; CUDA_CC="$pac_cv_cudacc"; fi if (( $pac_cv_cuda_version >= 11070 )) @@ -11151,8 +11595,8 @@ fi CUDEFINES="$CUDEFINES -gencode arch=compute_$cc,code=sm_$cc"; done if test "x$pac_cv_cuda_version" != "xunknown"; then - FCUDEFINES=" ${CUDA_DEFINES}" - fi + FCUDEFINES=" ${CUDA_DEFINES}" + fi fi fi fi @@ -11541,6 +11985,7 @@ fi CXXOPENACC="$CXXOPENACC $EXTRAOPENACC"; FCOPENACC="$FCOPENACC $EXTRAOPENACC"; OACCD=oaccd; + OACCMODS=oaccmods; OACCLD=oaccld; #FCOPT="$FCOPT $FCOPENACC"; @@ -11678,6 +12123,37 @@ FDEFINES=$(PSBFDEFINES) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -13045,6 +13521,8 @@ fi FCOPT : ${FCOPT} CCOPT : ${CCOPT} + EXTRA_OPT : ${EXTRA_OPT} + CUDA : ${PSB_HAVE_CUDA} CUDA_CC : ${pac_cv_cudacc} @@ -13064,7 +13542,9 @@ fi LIBRARYPATH : ${LIBRARYPATH} INCLUDEPATH : ${INCLUDEPATH} - MODULE_PATH : ${MODULE_PATH} + MODULE_PATH : ${MODULE_PATH} + + INSTALL_DIR : ${INSTALL_DIR} If you are satisfied, run 'make' to build ${PACKAGE_NAME} and its documentation; otherwise type ./configure --help=short for a complete list of configure options specific to ${PACKAGE_NAME}. @@ -13083,6 +13563,8 @@ printf "%s\n" "$as_me: FCOPT : ${FCOPT} CCOPT : ${CCOPT} + EXTRA_OPT : ${EXTRA_OPT} + CUDA : ${PSB_HAVE_CUDA} CUDA_CC : ${pac_cv_cudacc} @@ -13102,7 +13584,9 @@ printf "%s\n" "$as_me: LIBRARYPATH : ${LIBRARYPATH} INCLUDEPATH : ${INCLUDEPATH} - MODULE_PATH : ${MODULE_PATH} + MODULE_PATH : ${MODULE_PATH} + + INSTALL_DIR : ${INSTALL_DIR} If you are satisfied, run 'make' to build ${PACKAGE_NAME} and its documentation; otherwise type ./configure --help=short for a complete list of configure options specific to ${PACKAGE_NAME}. diff --git a/configure.ac b/configure.ac index 2850d275b..1116417a9 100644 --- a/configure.ac +++ b/configure.ac @@ -242,7 +242,7 @@ if test x"$psblas_cv_fc" == "x" ; then # TODO : discover the exact conditions when the usage of -WF is needed. psblas_cv_define_prepend="-WF," if eval "$MPIFC -qversion 2>&1 | grep -e\"Version: 10\.\" 2>/dev/null"; then - FDEFINES="$psblas_cv_define_prepend-DXLF_10 $FDEFINES"; sed -e's/([0-9]*).*/$1/p' + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_XLF_10 $FDEFINES"; sed -e's/([0-9]*).*/$1/p' fi # Note : there could be problems with old xlf compiler versions ( <10.1 ) @@ -258,7 +258,7 @@ if test x"$psblas_cv_fc" == "x" ; then psblas_flang_version=`flang-new --version |grep flang| sed -e 's/^ *flang.* version *//gi'`; psblas_flang_shv=`flang-new --version |grep flang| sed -e 's/^ *flang.* version *//gi' | sed -e's/\./ /g' | awk '{print $1}'`; psblas_cv_define_prepend=""; - FDEFINES="$psblas_cv_define_prepend-DFLANG $FDEFINES" + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_FLANG $FDEFINES" psblas_shvs=`echo $psblas_flang_shv|sed -e's/[^0-9]*//g'`; if test x"$psblas_shvs" != x""; then AC_MSG_NOTICE([[Running with LLVM $psblas_flang_version ($psblas_flang_shv). ]]) @@ -276,7 +276,7 @@ if test x"$psblas_cv_fc" == "x" ; then psblas_flang_shv=`flang --version |grep flang| sed -e 's/^ *flang.* version *//gi' | sed -e's/\./ /g' | awk '{print $1}'`; psblas_cv_fc="flang"; psblas_cv_define_prepend=""; - FDEFINES="$psblas_cv_define_prepend-DFLANG $FDEFINES" + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_FLANG $FDEFINES" psblas_shvs=`echo $psblas_flang_shv|sed -e's/[^0-9]*//g'`; if test x"$psblas_shvs" != x""; then AC_MSG_NOTICE([[Running with LLVM $psblas_flang_version ($psblas_flang_shv). ]]) @@ -288,7 +288,7 @@ if test x"$psblas_cv_fc" == "x" ; then fi elif eval "$MPIFC -V 2>&1 | grep Intel.*Fortran.*Compiler 2>/dev/null" ; then # Intel compiler identification - + FDEFINES="$psblas_cv_define_prepend-DPSB_CMP_INTEL $FDEFINES" psblas_cv_fc="ifc"; elif eval "$MPIFC -v 2>&1 | grep NAG 2>/dev/null" ; then psblas_cv_fc="nag"; @@ -599,55 +599,61 @@ fi PAC_FORTRAN_TEST_TR15581( [], [AC_MSG_ERROR([Sorry, cannot build PSBLAS without support for TR15581. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8.])] + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0.])] ) PAC_FORTRAN_TEST_EXTENDS( [], [AC_MSG_ERROR([Sorry, cannot build PSBLAS without support for EXTENDS. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8.])] + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0.])] ) PAC_FORTRAN_TEST_CLASS_TBP( [], [AC_MSG_ERROR([Sorry, cannot build PSBLAS without support for CLASS and type bound procedures. - Please get a Fortran compiler that supports them, e.g. GNU Fortran 4.8.])] + Please get a Fortran compiler that supports them, e.g. GNU Fortran 6.0.])] ) PAC_FORTRAN_TEST_SOURCE( [], [AC_MSG_ERROR([Sorry, cannot build PSBLAS without support for SOURCE= allocation. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8.])] + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0.])] ) PAC_FORTRAN_HAVE_MOVE_ALLOC( [], [AC_MSG_ERROR([Sorry, cannot build PSBLAS without support for MOVE_ALLOC. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8.])] + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0.])] ) PAC_FORTRAN_TEST_ISO_C_BIND( [], [AC_MSG_ERROR([Sorry, cannot build PSBLAS without support for ISO_C_BINDING. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8.])] + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0.])] ) PAC_FORTRAN_TEST_SAME_TYPE( [], [AC_MSG_ERROR([Sorry, cannot build PSBLAS without support for SAME_TYPE_AS. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8.])] + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0.])] ) PAC_FORTRAN_TEST_EXTENDS_TYPE( [], [AC_MSG_ERROR([Sorry, cannot build PSBLAS without support for EXTENDS_TYPE_OF. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8.])] + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0.])] ) PAC_FORTRAN_TEST_MOLD( [], [AC_MSG_ERROR([Sorry, cannot build PSBLAS without support for MOLD= allocation. - Please get a Fortran compiler that supports it, e.g. GNU Fortran 4.8.])] + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0.])] +) + +PAC_FORTRAN_TEST_SUBMODULES( + [], + [AC_MSG_ERROR([Sorry, cannot build without support for SUBMODULES. + Please get a Fortran compiler that supports it, e.g. GNU Fortran 6.0.])], ) PAC_FORTRAN_TEST_VOLATILE( @@ -680,6 +686,41 @@ PAC_FORTRAN_TEST_FLUSH( [FDEFINES="$psblas_cv_define_prepend-DPSB_HAVE_FLUSH_STMT $FDEFINES"], ) +###################### +# Extract version data +###################### +#PAC_EXTRACT_PSBLAS_VERSION +CFILE="base/modules/psb_const_mod.F90"; +PSBLASMAJOR=`cat $CFILE| grep version_major | $AWK '{print $6;}'`; +PSBLASMINOR=`cat $CFILE| grep version_minor| $AWK '{print $6;}'`; +PSBLASPATCH=`cat $CFILE| grep patchlevel| $AWK '{print $6;}'`; +PSBLASSTRING=`cat $CFILE | grep version_string | $AWK '{print $6;}'`; +PSBLASDUPNUL=`cat $CFILE| grep dupl_null | $AWK '{print $6;}'`; +PSBLASDUPADD=`cat $CFILE| grep "psb_dupl_add_ =" | $AWK '{print $6;}'`; +PSBLASDUPOVW=`cat $CFILE| grep dupl_ovwrt| $AWK '{print $6;}'`; +PSBLASDUPERR=`cat $CFILE| grep dupl_err| $AWK '{print $6;}'`; +PSBLASDUPDEF=`cat $CFILE| grep dupl_def| $AWK '{print $6;}' | tr a-z A-Z | sed s/\_$// `; +PSBLASUPDSRC=`cat $CFILE| grep "psb_upd_srch_ ="| $AWK '{print $6;}' `; +PSBLASUPDPRM=`cat $CFILE| grep "psb_upd_perm_ ="| $AWK '{print $6;}' `; +PSBLASUPDDEF=`cat $CFILE| grep "psb_upd_dflt_ ="| $AWK '{print $6;}' | tr a-z A-Z | sed s/\_$//`; +PSBLASBLDNOR=`cat $CFILE| grep matbld_noremote| $AWK '{print $6;}'`; +PSBLASBLDRMT=`cat $CFILE| grep matbld_remote| $AWK '{print $6;}'`; + +CFILE="base/modules/desc/psb_desc_const_mod.f90"; +PSBSWPSND=`cat $CFILE| grep swap_send| $AWK '{print $6;}'`; +PSBSWPRCV=`cat $CFILE| grep swap_recv| $AWK '{print $6;}'`; +PSBSWPSYN=`cat $CFILE| grep swap_sync| $AWK '{print $6;}'`; +PSBSWPMPI=`cat $CFILE| grep swap_mpi| $AWK '{print $6;}'`; +PSBNONE=`cat $CFILE| grep psb_none| $AWK '{print $6;}'`; +PSBSUM=`cat $CFILE| grep psb_sum| $AWK '{print $6;}'`; +PSBAVG=`cat $CFILE| grep psb_avg| $AWK '{print $6;}'`; +PSBSQRT=`cat $CFILE| grep square_root| $AWK '{print $6;}'`; +PSBSETZ=`cat $CFILE| grep psb_setzero| $AWK '{print $6;}'`; +PSBCLCSTR=`cat $CFILE| grep collective_start| $AWK '{print $6;}'`; +PSBCLCEND=`cat $CFILE| grep collective_end| $AWK '{print $6;}'`; +PSBCLCSYN=`cat $CFILE| grep collective_sync| $AWK '{print $6;}'`; + +AC_MSG_RESULT([ version $PSBLASSTRING]) ############################################################################### # Additional pathname stuff (yes, it is redundant and confusing...) @@ -704,18 +745,9 @@ fi ############################################################################### # Parachute rules for ar and ranlib ... (could cause problems) ############################################################################### - -if test "X$AR" == "X" ; then - AR="ar" -fi - -if test "X$RANLIB" == "X" ; then - RANLIB="ranlib" -fi - -# This should be portable -AR="${AR} -cDr" - +AC_PROG_AR +AR="${AR} -cr" +AC_PROG_RANLIB ############################################################################### # BLAS library presence checks @@ -834,7 +866,6 @@ if test "x$pac_cv_ipk_size" != "x4"; then pac_cv_cuda="no"; PSB_HAVE_CUDA="no"; CUDA_CC=""; - SPGPU_LIBS=""; CUDAD=""; CUDALD=""; CUDEFINES=""; @@ -853,12 +884,11 @@ else PAC_CHECK_CUDA_VERSION() dnl PAC_CHECK_SPGPU() PSB_CUDA_VERSION="$pac_cv_cuda_version"; - if (( ${PSB_CUDA_VERSION} > 12080 )); then + if (( ${PSB_CUDA_VERSION} > 15010 )); then AC_MSG_NOTICE([Unsupported CUDA version ${PSB_CUDA_VERSION} disabling CUDA]) pac_cv_cuda="no"; PSB_HAVE_CUDA="no"; CUDA_CC=""; - SPGPU_LIBS=""; CUDAD=""; CUDALD=""; CUDEFINES=""; @@ -876,16 +906,17 @@ else CHAVECUDA="#define PSB_HAVE_CUDA" CSHORTVCUDA="#define PSB_CUDA_SHORT_VERSION ${PSB_CUDA_SHORT_VERSION}" CVERSIONCUDA="#define PSB_CUDA_VERSION ${PSB_CUDA_VERSION}" - SPGPU_LIBS="-lspgpu"; + dnl SPGPU_LIBS="-lspgpu"; CUDAD=cudad; + CUDAMODS=cudamods; CUDALD=cudald; - LCUDA="-lpsb_cuda"; + LPSB_CUDA="-lpsb_cuda -lpsb_ext"; EXTRALDLIBS="-lstdc++"; AC_MSG_NOTICE([At this point GPUTARGET is $CUDAD $CUDALD]) PAC_ARG_WITH_CUDACC() if test "x$pac_cv_cudacc" == "x"; then - pac_cv_cudacc="50,60,70,75,80,86"; + pac_cv_cudacc="75,80,86"; CUDA_CC="$pac_cv_cudacc"; fi if (( $pac_cv_cuda_version >= 11070 )) @@ -898,8 +929,8 @@ else done if test "x$pac_cv_cuda_version" != "xunknown"; then dnl CUDEFINES="$CUDEFINES ${CUDA_DEFINES}" - FCUDEFINES=" ${CUDA_DEFINES}" - dnl CCUDEFINES=" ${CUDA_DEFINES}" + FCUDEFINES=" ${CUDA_DEFINES}" + dnl CCUDEFINES=" ${CUDA_DEFINES}" dnl CXXCUDEFINES=" ${CUDA_DEFINES}" fi fi @@ -938,6 +969,7 @@ dnl fi FCOPENACC="$FCOPENACC $EXTRAOPENACC"; dnl AC_MSG_NOTICE([OpenACC 3 flags CC $CCOPENACC CXX $CXXOPENACC FC $FCOPENACC]) OACCD=oaccd; + OACCMODS=oaccmods; OACCLD=oaccld; #FCOPT="$FCOPT $FCOPENACC"; @@ -1051,6 +1083,36 @@ FDEFINES=$(PSBFDEFINES) AC_SUBST(PSB_IPKDEF) AC_SUBST(PSB_LPKDEF) +AC_SUBST(PSBLASMAJOR) +AC_SUBST(PSBLASMINOR) +AC_SUBST(PSBLASPATCH) +AC_SUBST(PSBLASSTRING) +AC_SUBST(PSBLASDUPNUL) +AC_SUBST(PSBLASDUPADD) +AC_SUBST(PSBLASDUPOVW) +AC_SUBST(PSBLASDUPERR) +AC_SUBST(PSBLASDUPDEF) +AC_SUBST(PSBLASDUPDEF) +AC_SUBST(PSBLASUPDSRC) +AC_SUBST(PSBLASUPDPRM) +AC_SUBST(PSBLASUPDDEF) +AC_SUBST(PSBLASBLDNOR) +AC_SUBST(PSBLASBLDRMT) + +AC_SUBST(PSBSWPSND) +AC_SUBST(PSBSWPRCV) +AC_SUBST(PSBSWPSYN) +AC_SUBST(PSBSWPMPI) +AC_SUBST(PSBNONE) +AC_SUBST(PSBSUM) +AC_SUBST(PSBAVG) +AC_SUBST(PSBSQRT) +AC_SUBST(PSBSETZ) +AC_SUBST(PSBCLCSTR) +AC_SUBST(PSBCLCEND) +AC_SUBST(PSBCLCSYN) + + AC_SUBST(CSERIALMPI) AC_SUBST(CHAVE_OPENMP) AC_SUBST(CHAVEMETIS) @@ -1070,13 +1132,13 @@ AC_SUBST(METHDLIBNAME) AC_SUBST(UTILLIBNAME) AC_SUBST(METISINCFILE) AC_SUBST(OACCD) +AC_SUBST(OACCMODS) AC_SUBST(OACCLD) AC_SUBST(FCOPENACC) AC_SUBST(CCOPENACC) AC_SUBST(CXXOPENACC) AC_SUBST(SPGPU_FLAGS) -AC_SUBST(SPGPU_LIBS) dnl AC_SUBST(SPGPU_DIR) dnl AC_SUBST(SPGPU_INCLUDES) dnl AC_SUBST(SPGPU_INCDIR) @@ -1093,8 +1155,9 @@ AC_SUBST(PSB_CUDA_SHORT_VERSION) AC_SUBST(CUDA_NVCC) AC_SUBST(CUDEFINES) AC_SUBST(CUDAD) +AC_SUBST(CUDAMODS) AC_SUBST(CUDALD) -AC_SUBST(LCUDA) +AC_SUBST(LPSB_CUDA) AC_SUBST(LIBRSB_LIBS) AC_SUBST(LIBRSB_INCLUDES) AC_SUBST(LIBRSB_INCDIR) @@ -1128,6 +1191,8 @@ AC_MSG_NOTICE([ FCOPT : ${FCOPT} CCOPT : ${CCOPT} + EXTRA_OPT : ${EXTRA_OPT} + CUDA : ${PSB_HAVE_CUDA} CUDA_CC : ${pac_cv_cudacc} @@ -1148,7 +1213,9 @@ dnl Note : we should use LDLIBS sooner or later! LIBRARYPATH : ${LIBRARYPATH} INCLUDEPATH : ${INCLUDEPATH} - MODULE_PATH : ${MODULE_PATH} + MODULE_PATH : ${MODULE_PATH} + + INSTALL_DIR : ${INSTALL_DIR} If you are satisfied, run 'make' to build ${PACKAGE_NAME} and its documentation; otherwise type ./configure --help=short for a complete list of configure options specific to ${PACKAGE_NAME}. diff --git a/cuda/CUDA/Makefile b/cuda/CUDA/Makefile index 010d591d5..3918e2988 100644 --- a/cuda/CUDA/Makefile +++ b/cuda/CUDA/Makefile @@ -16,7 +16,7 @@ LDLIBS=$(PSBLDLIBS) #CCOPT= -g FINCLUDES=$(FMFLAG). $(FMFLAG)$(INCDIR) $(FMFLAG)$(PSBINCDIR) $(FIFLAG). CINCLUDES=$(SPGPU_INCLUDES) $(CUDA_INCLUDES) -I.. -I$(INCDIR) -LIBNAME=libpsb_gpu.a +LIBNAME=libpsb_cuda.a CUDAOBJS=psi_cuda_c_CopyCooToElg.o psi_cuda_c_CopyCooToHlg.o \ diff --git a/cuda/License-spgpu b/cuda/License-spgpu new file mode 100644 index 000000000..4e5e16f5b --- /dev/null +++ b/cuda/License-spgpu @@ -0,0 +1,26 @@ + (C) Copyright 2011-2026 Davide Barbieri + (C) Copyright 2011-2026 Salvatore Filippone + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions, and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. Neither the of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this + software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PSBLAS GROUP OR ITS CONTRIBUTORS + BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. diff --git a/cuda/License-spgpu.md b/cuda/License-spgpu.md deleted file mode 100644 index 7f4b8ff4c..000000000 --- a/cuda/License-spgpu.md +++ /dev/null @@ -1,21 +0,0 @@ -(c) Copyright 2011-2021 Davide Barbieri, Salvatore Filippone - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation and/or - other materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY - EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES - OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT - SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/cuda/Makefile b/cuda/Makefile old mode 100755 new mode 100644 index b47e58ce7..ee4757ce0 --- a/cuda/Makefile +++ b/cuda/Makefile @@ -47,18 +47,21 @@ COBJS= elldev.o hlldev.o diagdev.o hdiagdev.o vectordev.o ivectordev.o dnsdev.o OBJS=$(COBJS) $(FOBJS) -lib: objs ilib cudalib spgpulib +lib: mods objs ilib cudalib spgpulib $(AR) $(LIBNAME) $(OBJS) /bin/cp -p $(LIBNAME) $(LIBDIR) -$(COBJS): spgpuinc -objs: spgpuinc $(OBJS) iobjs cudaobjs spgpuobjs - /bin/cp -p *$(.mod) $(MODDIR) - /bin/cp -p *.h $(INCDIR) +mods: $(FOBJS) includes + $(INSTALL) -p *$(.mod) $(MODDIR) + +includes: spgpuinc + $(INSTALL) -p *.h $(INCDIR) + +objs: mods $(OBJS) iobjs cudaobjs spgpuobjs spgpuinc: - $(MAKE) -C spgpu includes + $(MAKE) -C spgpu incl spgpuobjs: $(MAKE) -C spgpu objs spgpulib: @@ -124,10 +127,10 @@ iobjs: $(FOBJS) cudaobjs: $(FOBJS) $(MAKE) -C CUDA objs -ilib: objs - $(MAKE) -C impl lib LIBNAME=$(LIBNAME) +ilib: objs spgpulib + $(MAKE) -C impl lib cudalib: objs ilib - $(MAKE) -C CUDA lib LIBNAME=$(LIBNAME) + $(MAKE) -C CUDA lib clean: cclean iclean cudaclean spgpuclean /bin/rm -f $(FOBJS) *$(.mod) *.a diff --git a/cuda/base_cusparse_mod.F90 b/cuda/base_cusparse_mod.F90 index 94a8255f0..382472c9e 100644 --- a/cuda/base_cusparse_mod.F90 +++ b/cuda/base_cusparse_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/c_cusparse_mod.F90 b/cuda/c_cusparse_mod.F90 index 3329f7331..3ac7911b9 100644 --- a/cuda/c_cusparse_mod.F90 +++ b/cuda/c_cusparse_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/ccusparse.c b/cuda/ccusparse.c index 6b5c8ea65..d3d5fd7cb 100644 --- a/cuda/ccusparse.c +++ b/cuda/ccusparse.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/ccusparse.h b/cuda/ccusparse.h index 8643211ad..549fd47ef 100644 --- a/cuda/ccusparse.h +++ b/cuda/ccusparse.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/cintrf.h b/cuda/cintrf.h index c9b70ce38..6555a5198 100644 --- a/cuda/cintrf.h +++ b/cuda/cintrf.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/core_mod.f90 b/cuda/core_mod.f90 index d30f8a996..3eb62f48a 100644 --- a/cuda/core_mod.f90 +++ b/cuda/core_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/cuda_util.c b/cuda/cuda_util.c index 8ae2e6631..707c88de1 100644 --- a/cuda/cuda_util.c +++ b/cuda/cuda_util.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -37,6 +37,9 @@ static int hasUVA=-1; static struct cudaDeviceProp *prop=NULL; static spgpuHandle_t psb_cuda_handle = NULL; static cublasHandle_t psb_cublas_handle = NULL; +#if PSB_CUDA_VERSION >= 13000 +static int memoryClockRate=-1; +#endif #if defined(TRACK_CUDA_MALLOC) static int64_t total_cuda_mem = 0; #endif @@ -244,14 +247,14 @@ int gpuInit(int dev) void gpuClose() { cudaStream_t st1, st2; - if (! psb_cuda_handle) + if ((! psb_cuda_handle)&&(! psb_cublas_handle)) { st1=spgpuGetStream(psb_cuda_handle); - if (! psb_cublas_handle) cublasGetStream(psb_cublas_handle,&st2); + if (st1 != st2) + psb_cudaDestroyCublasHandle(); + } FcusparseDestroy(); psb_cudaDestroyHandle(); - if (st1 != st2) - psb_cudaDestroyCublasHandle(); free(prop); prop=NULL; hasUVA=-1; @@ -310,17 +313,28 @@ int getGPUMultiProcessors() int getGPUMemoryBusWidth() { int count=0; -#if CUDART_VERSION >= 5000 +#if PSB_CUDA_VERSION >= 5000 if (prop!=NULL) count = prop->memoryBusWidth; #endif return(count); } + +#if PSB_CUDA_VERSION >= 13000 +int getGPUMemoryClockRate(int dev) +#else int getGPUMemoryClockRate() +#endif { int count=0; -#if CUDART_VERSION >= 5000 +#if PSB_CUDA_VERSION >= 5000 +#if PSB_CUDA_VERSION >= 13000 + cudaDeviceGetAttribute(&memoryClockRate, + cudaDevAttrMemoryClockRate, dev); + count = memoryClockRate; +#else if (prop!=NULL) count = prop->memoryClockRate; +#endif #endif return(count); } diff --git a/cuda/cuda_util.h b/cuda/cuda_util.h index 609e6f43f..3163b8ee3 100644 --- a/cuda/cuda_util.h +++ b/cuda/cuda_util.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -59,7 +59,11 @@ int getDeviceHasUVA(); int setDevice(int dev); int getGPUMultiProcessors(); int getGPUMemoryBusWidth(); +#if PSB_CUDA_VERSION >= 13000 +int getGPUMemoryClockRate(int dev); +#else int getGPUMemoryClockRate(); +#endif int getGPUWarpSize(); int getGPUMaxThreadsPerBlock(); int getGPUMaxThreadsPerMP(); diff --git a/cuda/cusparse_mod.F90 b/cuda/cusparse_mod.F90 index 4ae16cffc..97f09b1e3 100644 --- a/cuda/cusparse_mod.F90 +++ b/cuda/cusparse_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/cvectordev.c b/cuda/cvectordev.c index 0eaacbdbd..5304525c2 100644 --- a/cuda/cvectordev.c +++ b/cuda/cvectordev.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -42,6 +42,14 @@ int registerMappedFloatComplex(void *buff, void **d_p, int n, cuFloatComplex du return registerMappedMemory(buff,d_p,((size_t) n)*sizeof(cuFloatComplex)); } +int checkMultiVecDeviceFloatComplex(void* deviceMultiVec) +{ + struct MultiVectDevice *devVec = (struct MultiVectDevice *) deviceMultiVec; + fprintf(stderr,"checkMultiVecDeviceInt Size: %d Pointer %p\n", + devVec->size_,devVec->v_); + return(0); +} + int writeMultiVecDeviceFloatComplex(void* deviceVec, cuFloatComplex* hostVec) { int i; struct MultiVectDevice *devVec = (struct MultiVectDevice *) deviceVec; diff --git a/cuda/cvectordev.h b/cuda/cvectordev.h index 423da33e9..8f717a3d6 100644 --- a/cuda/cvectordev.h +++ b/cuda/cvectordev.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -40,6 +40,7 @@ #include "vector.h" int registerMappedFloatComplex(void *, void **, int, cuFloatComplex); +int checkMultiVecDeviceFloatComplex(void* deviceMultiVec); int writeMultiVecDeviceFloatComplex(void* deviceMultiVec, cuFloatComplex* hostMultiVec); int writeMultiVecDeviceFloatComplexR2(void* deviceMultiVec, cuFloatComplex* hostMultiVec, int ld); int readMultiVecDeviceFloatComplex(void* deviceMultiVec, cuFloatComplex* hostMultiVec); diff --git a/cuda/d_cusparse_mod.F90 b/cuda/d_cusparse_mod.F90 index 55751475d..598dccb05 100644 --- a/cuda/d_cusparse_mod.F90 +++ b/cuda/d_cusparse_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/dcusparse.c b/cuda/dcusparse.c index 9af4ce381..80a6d83c7 100644 --- a/cuda/dcusparse.c +++ b/cuda/dcusparse.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/dcusparse.h b/cuda/dcusparse.h index 4b00173b5..149f7b530 100644 --- a/cuda/dcusparse.h +++ b/cuda/dcusparse.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/diagdev.c b/cuda/diagdev.c index 0cf78a41f..7c26e65e1 100644 --- a/cuda/diagdev.c +++ b/cuda/diagdev.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/diagdev.h b/cuda/diagdev.h index 3a062fb78..f5cb51f6b 100644 --- a/cuda/diagdev.h +++ b/cuda/diagdev.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/diagdev_mod.F90 b/cuda/diagdev_mod.F90 index 70d58d4e5..42714902a 100644 --- a/cuda/diagdev_mod.F90 +++ b/cuda/diagdev_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/dnsdev.c b/cuda/dnsdev.c index 3cf57976f..ce253f5fe 100644 --- a/cuda/dnsdev.c +++ b/cuda/dnsdev.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/dnsdev.h b/cuda/dnsdev.h index aa536105d..f5e006240 100644 --- a/cuda/dnsdev.h +++ b/cuda/dnsdev.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/dnsdev_mod.F90 b/cuda/dnsdev_mod.F90 index fd257e0ef..9dfc3b73b 100644 --- a/cuda/dnsdev_mod.F90 +++ b/cuda/dnsdev_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/dvectordev.c b/cuda/dvectordev.c index 10bbc3267..ea1da37af 100644 --- a/cuda/dvectordev.c +++ b/cuda/dvectordev.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -42,6 +42,14 @@ int registerMappedDouble(void *buff, void **d_p, int n, double dummy) return registerMappedMemory(buff,d_p,((size_t) n)*sizeof(double)); } +int checkMultiVecDeviceDouble(void* deviceMultiVec) +{ + struct MultiVectDevice *devVec = (struct MultiVectDevice *) deviceMultiVec; + fprintf(stderr,"checkMultiVecDeviceInt Size: %d Pointer %p\n", + devVec->size_,devVec->v_); + return(0); +} + int writeMultiVecDeviceDouble(void* deviceVec, double* hostVec) { int i; struct MultiVectDevice *devVec = (struct MultiVectDevice *) deviceVec; diff --git a/cuda/dvectordev.h b/cuda/dvectordev.h index 0d2d2ab36..263c4b473 100644 --- a/cuda/dvectordev.h +++ b/cuda/dvectordev.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -38,6 +38,7 @@ #include "vector.h" int registerMappedDouble(void *, void **, int, double); +int checkMultiVecDeviceDouble(void* deviceMultiVec); int writeMultiVecDeviceDouble(void* deviceMultiVec, double* hostMultiVec); int writeMultiVecDeviceDoubleR2(void* deviceMultiVec, double* hostMultiVec, int ld); int readMultiVecDeviceDouble(void* deviceMultiVec, double* hostMultiVec); diff --git a/cuda/elldev.c b/cuda/elldev.c index cf49aadd9..f2678f64f 100644 --- a/cuda/elldev.c +++ b/cuda/elldev.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/elldev.h b/cuda/elldev.h index 4e69bb3af..273ffe43c 100644 --- a/cuda/elldev.h +++ b/cuda/elldev.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/elldev_mod.F90 b/cuda/elldev_mod.F90 index 40cf8e495..bbeae25de 100644 --- a/cuda/elldev_mod.F90 +++ b/cuda/elldev_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/fcusparse.c b/cuda/fcusparse.c index 094348cec..4479efe74 100644 --- a/cuda/fcusparse.c +++ b/cuda/fcusparse.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/fcusparse.h b/cuda/fcusparse.h index 73417591f..bf1b46bec 100644 --- a/cuda/fcusparse.h +++ b/cuda/fcusparse.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/fcusparse_dat.h b/cuda/fcusparse_dat.h index 09de4363c..bbda6b1e3 100644 --- a/cuda/fcusparse_dat.h +++ b/cuda/fcusparse_dat.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/fcusparse_fct.h b/cuda/fcusparse_fct.h index e8ce7934b..d30af56c7 100644 --- a/cuda/fcusparse_fct.h +++ b/cuda/fcusparse_fct.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/hdiagdev.c b/cuda/hdiagdev.c index 813e4fab5..6f0e4ef6c 100644 --- a/cuda/hdiagdev.c +++ b/cuda/hdiagdev.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/hdiagdev.h b/cuda/hdiagdev.h index c02fcc690..9aae0b026 100644 --- a/cuda/hdiagdev.h +++ b/cuda/hdiagdev.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/hdiagdev_mod.F90 b/cuda/hdiagdev_mod.F90 index 9a3530e73..1af4d069b 100644 --- a/cuda/hdiagdev_mod.F90 +++ b/cuda/hdiagdev_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/hlldev.c b/cuda/hlldev.c index 186831d38..879f165df 100644 --- a/cuda/hlldev.c +++ b/cuda/hlldev.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/hlldev.h b/cuda/hlldev.h index 3b47f5ea1..f80e905dc 100644 --- a/cuda/hlldev.h +++ b/cuda/hlldev.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/hlldev_mod.F90 b/cuda/hlldev_mod.F90 index 90b8e13c8..7a3f13c67 100644 --- a/cuda/hlldev_mod.F90 +++ b/cuda/hlldev_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/Makefile b/cuda/impl/Makefile old mode 100755 new mode 100644 index 2d9a774d8..63f416606 --- a/cuda/impl/Makefile +++ b/cuda/impl/Makefile @@ -11,7 +11,7 @@ LDLIBS=$(PSBLDLIBS) #CCOPT= -g FINCLUDES=$(FMFLAG).. $(FMFLAG)$(MODDIR) $(FMFLAG)$(INCDIR) $(FIFLAG).. CINCLUDES=-I$(GPU_INCDIR) -I$(CUDA_INCDIR) -LIBNAME=libpsb_gpu.a +LIBNAME=libpsb_cuda.a CXXDEFINES=$(PSBCXXDEFINES) $(SPGPU_DEFINES) $(CUDA_DEFINES) CDEFINES=$(PSBCDEFINES) $(SPGPU_DEFINES) $(CUDA_DEFINES) FDEFINES=$(PSBFDEFINES) $(SPGPU_DEFINES) $(CUDA_DEFINES) diff --git a/cuda/impl/psb_c_cuda_cp_csrg_from_coo.F90 b/cuda/impl/psb_c_cuda_cp_csrg_from_coo.F90 index aa6a3ba35..3ee98b177 100644 --- a/cuda/impl/psb_c_cuda_cp_csrg_from_coo.F90 +++ b/cuda/impl/psb_c_cuda_cp_csrg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_cp_csrg_from_fmt.F90 b/cuda/impl/psb_c_cuda_cp_csrg_from_fmt.F90 index e9d42139f..54dfa69ff 100644 --- a/cuda/impl/psb_c_cuda_cp_csrg_from_fmt.F90 +++ b/cuda/impl/psb_c_cuda_cp_csrg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_cp_diag_from_coo.F90 b/cuda/impl/psb_c_cuda_cp_diag_from_coo.F90 index e70a044e8..88dfec87f 100644 --- a/cuda/impl/psb_c_cuda_cp_diag_from_coo.F90 +++ b/cuda/impl/psb_c_cuda_cp_diag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_cp_elg_from_coo.F90 b/cuda/impl/psb_c_cuda_cp_elg_from_coo.F90 index c6105e886..d70fdabac 100644 --- a/cuda/impl/psb_c_cuda_cp_elg_from_coo.F90 +++ b/cuda/impl/psb_c_cuda_cp_elg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_cp_elg_from_fmt.F90 b/cuda/impl/psb_c_cuda_cp_elg_from_fmt.F90 index f7e5351ed..bdd39f00b 100644 --- a/cuda/impl/psb_c_cuda_cp_elg_from_fmt.F90 +++ b/cuda/impl/psb_c_cuda_cp_elg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_cp_hdiag_from_coo.F90 b/cuda/impl/psb_c_cuda_cp_hdiag_from_coo.F90 index 9be741c98..2d1c01d1f 100644 --- a/cuda/impl/psb_c_cuda_cp_hdiag_from_coo.F90 +++ b/cuda/impl/psb_c_cuda_cp_hdiag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_cp_hlg_from_coo.F90 b/cuda/impl/psb_c_cuda_cp_hlg_from_coo.F90 index 8b0d9f2a6..e6c6b894b 100644 --- a/cuda/impl/psb_c_cuda_cp_hlg_from_coo.F90 +++ b/cuda/impl/psb_c_cuda_cp_hlg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_cp_hlg_from_fmt.F90 b/cuda/impl/psb_c_cuda_cp_hlg_from_fmt.F90 index 96a5c5e8d..06d8a1869 100644 --- a/cuda/impl/psb_c_cuda_cp_hlg_from_fmt.F90 +++ b/cuda/impl/psb_c_cuda_cp_hlg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_cp_hybg_from_coo.F90 b/cuda/impl/psb_c_cuda_cp_hybg_from_coo.F90 index d69247d0e..35c972510 100644 --- a/cuda/impl/psb_c_cuda_cp_hybg_from_coo.F90 +++ b/cuda/impl/psb_c_cuda_cp_hybg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_cp_hybg_from_fmt.F90 b/cuda/impl/psb_c_cuda_cp_hybg_from_fmt.F90 index a6e87518d..4b6b6a578 100644 --- a/cuda/impl/psb_c_cuda_cp_hybg_from_fmt.F90 +++ b/cuda/impl/psb_c_cuda_cp_hybg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_csrg_allocate_mnnz.F90 b/cuda/impl/psb_c_cuda_csrg_allocate_mnnz.F90 index f1e002f39..d5bea71c1 100644 --- a/cuda/impl/psb_c_cuda_csrg_allocate_mnnz.F90 +++ b/cuda/impl/psb_c_cuda_csrg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_csrg_csmm.F90 b/cuda/impl/psb_c_cuda_csrg_csmm.F90 index b30129521..9b2dfba78 100644 --- a/cuda/impl/psb_c_cuda_csrg_csmm.F90 +++ b/cuda/impl/psb_c_cuda_csrg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_csrg_csmv.F90 b/cuda/impl/psb_c_cuda_csrg_csmv.F90 index ae90cb7eb..9d323f923 100644 --- a/cuda/impl/psb_c_cuda_csrg_csmv.F90 +++ b/cuda/impl/psb_c_cuda_csrg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_csrg_from_gpu.F90 b/cuda/impl/psb_c_cuda_csrg_from_gpu.F90 index 1b18195d1..7622cc410 100644 --- a/cuda/impl/psb_c_cuda_csrg_from_gpu.F90 +++ b/cuda/impl/psb_c_cuda_csrg_from_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_csrg_inner_vect_sv.F90 b/cuda/impl/psb_c_cuda_csrg_inner_vect_sv.F90 index 7e5bb6143..43c2aa3aa 100644 --- a/cuda/impl/psb_c_cuda_csrg_inner_vect_sv.F90 +++ b/cuda/impl/psb_c_cuda_csrg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_csrg_mold.F90 b/cuda/impl/psb_c_cuda_csrg_mold.F90 index 405f2736c..4f531d14e 100644 --- a/cuda/impl/psb_c_cuda_csrg_mold.F90 +++ b/cuda/impl/psb_c_cuda_csrg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_csrg_reallocate_nz.F90 b/cuda/impl/psb_c_cuda_csrg_reallocate_nz.F90 index a757f4776..9db2fe74f 100644 --- a/cuda/impl/psb_c_cuda_csrg_reallocate_nz.F90 +++ b/cuda/impl/psb_c_cuda_csrg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_csrg_scal.F90 b/cuda/impl/psb_c_cuda_csrg_scal.F90 index 137163394..1c9af3056 100644 --- a/cuda/impl/psb_c_cuda_csrg_scal.F90 +++ b/cuda/impl/psb_c_cuda_csrg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_csrg_scals.F90 b/cuda/impl/psb_c_cuda_csrg_scals.F90 index 5334be3db..aa5db9d6b 100644 --- a/cuda/impl/psb_c_cuda_csrg_scals.F90 +++ b/cuda/impl/psb_c_cuda_csrg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_csrg_to_gpu.F90 b/cuda/impl/psb_c_cuda_csrg_to_gpu.F90 index 8dac41c0f..fe6a2e7e2 100644 --- a/cuda/impl/psb_c_cuda_csrg_to_gpu.F90 +++ b/cuda/impl/psb_c_cuda_csrg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_csrg_vect_mv.F90 b/cuda/impl/psb_c_cuda_csrg_vect_mv.F90 index c58e7ec09..dd9fab0d7 100644 --- a/cuda/impl/psb_c_cuda_csrg_vect_mv.F90 +++ b/cuda/impl/psb_c_cuda_csrg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_diag_csmv.F90 b/cuda/impl/psb_c_cuda_diag_csmv.F90 index c09409035..e1bdec7a0 100644 --- a/cuda/impl/psb_c_cuda_diag_csmv.F90 +++ b/cuda/impl/psb_c_cuda_diag_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_diag_mold.F90 b/cuda/impl/psb_c_cuda_diag_mold.F90 index 4c8a3c567..f916322ee 100644 --- a/cuda/impl/psb_c_cuda_diag_mold.F90 +++ b/cuda/impl/psb_c_cuda_diag_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_diag_to_gpu.F90 b/cuda/impl/psb_c_cuda_diag_to_gpu.F90 index 88bbd8b53..916cb0cd1 100644 --- a/cuda/impl/psb_c_cuda_diag_to_gpu.F90 +++ b/cuda/impl/psb_c_cuda_diag_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_diag_vect_mv.F90 b/cuda/impl/psb_c_cuda_diag_vect_mv.F90 index fba22bc5d..41fdbda62 100644 --- a/cuda/impl/psb_c_cuda_diag_vect_mv.F90 +++ b/cuda/impl/psb_c_cuda_diag_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_dnsg_mat_impl.F90 b/cuda/impl/psb_c_cuda_dnsg_mat_impl.F90 index 65a42640e..746011ae9 100644 --- a/cuda/impl/psb_c_cuda_dnsg_mat_impl.F90 +++ b/cuda/impl/psb_c_cuda_dnsg_mat_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_allocate_mnnz.F90 b/cuda/impl/psb_c_cuda_elg_allocate_mnnz.F90 index 7f50d547e..f9e660520 100644 --- a/cuda/impl/psb_c_cuda_elg_allocate_mnnz.F90 +++ b/cuda/impl/psb_c_cuda_elg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_asb.f90 b/cuda/impl/psb_c_cuda_elg_asb.f90 index 16d70736f..5b83ae948 100644 --- a/cuda/impl/psb_c_cuda_elg_asb.f90 +++ b/cuda/impl/psb_c_cuda_elg_asb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_csmm.F90 b/cuda/impl/psb_c_cuda_elg_csmm.F90 index f7ae98926..0a450cd1d 100644 --- a/cuda/impl/psb_c_cuda_elg_csmm.F90 +++ b/cuda/impl/psb_c_cuda_elg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_csmv.F90 b/cuda/impl/psb_c_cuda_elg_csmv.F90 index a23d4a60e..0f04f193f 100644 --- a/cuda/impl/psb_c_cuda_elg_csmv.F90 +++ b/cuda/impl/psb_c_cuda_elg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_csput.F90 b/cuda/impl/psb_c_cuda_elg_csput.F90 index 3da928f0e..98dea017a 100644 --- a/cuda/impl/psb_c_cuda_elg_csput.F90 +++ b/cuda/impl/psb_c_cuda_elg_csput.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_from_gpu.F90 b/cuda/impl/psb_c_cuda_elg_from_gpu.F90 index 34c6e4a62..4a21bd7fa 100644 --- a/cuda/impl/psb_c_cuda_elg_from_gpu.F90 +++ b/cuda/impl/psb_c_cuda_elg_from_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_inner_vect_sv.F90 b/cuda/impl/psb_c_cuda_elg_inner_vect_sv.F90 index 148d72d20..a4d1a5430 100644 --- a/cuda/impl/psb_c_cuda_elg_inner_vect_sv.F90 +++ b/cuda/impl/psb_c_cuda_elg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_mold.F90 b/cuda/impl/psb_c_cuda_elg_mold.F90 index bb94bf075..22bc84580 100644 --- a/cuda/impl/psb_c_cuda_elg_mold.F90 +++ b/cuda/impl/psb_c_cuda_elg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_reallocate_nz.F90 b/cuda/impl/psb_c_cuda_elg_reallocate_nz.F90 index 6a1f87639..3f5618196 100644 --- a/cuda/impl/psb_c_cuda_elg_reallocate_nz.F90 +++ b/cuda/impl/psb_c_cuda_elg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_scal.F90 b/cuda/impl/psb_c_cuda_elg_scal.F90 index 65f847684..49bf887fb 100644 --- a/cuda/impl/psb_c_cuda_elg_scal.F90 +++ b/cuda/impl/psb_c_cuda_elg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_scals.F90 b/cuda/impl/psb_c_cuda_elg_scals.F90 index 966f2e918..291dddf5a 100644 --- a/cuda/impl/psb_c_cuda_elg_scals.F90 +++ b/cuda/impl/psb_c_cuda_elg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_to_gpu.F90 b/cuda/impl/psb_c_cuda_elg_to_gpu.F90 index 495207c73..3cf6e7710 100644 --- a/cuda/impl/psb_c_cuda_elg_to_gpu.F90 +++ b/cuda/impl/psb_c_cuda_elg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_trim.f90 b/cuda/impl/psb_c_cuda_elg_trim.f90 index 78dbe1937..bea106719 100644 --- a/cuda/impl/psb_c_cuda_elg_trim.f90 +++ b/cuda/impl/psb_c_cuda_elg_trim.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_elg_vect_mv.F90 b/cuda/impl/psb_c_cuda_elg_vect_mv.F90 index 9da6a34ac..903047d46 100644 --- a/cuda/impl/psb_c_cuda_elg_vect_mv.F90 +++ b/cuda/impl/psb_c_cuda_elg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hdiag_csmv.F90 b/cuda/impl/psb_c_cuda_hdiag_csmv.F90 index 36928062a..8385d743d 100644 --- a/cuda/impl/psb_c_cuda_hdiag_csmv.F90 +++ b/cuda/impl/psb_c_cuda_hdiag_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hdiag_mold.F90 b/cuda/impl/psb_c_cuda_hdiag_mold.F90 index 27402cfc7..64bde1349 100644 --- a/cuda/impl/psb_c_cuda_hdiag_mold.F90 +++ b/cuda/impl/psb_c_cuda_hdiag_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hdiag_to_gpu.F90 b/cuda/impl/psb_c_cuda_hdiag_to_gpu.F90 index 8d1b61a1b..65705d115 100644 --- a/cuda/impl/psb_c_cuda_hdiag_to_gpu.F90 +++ b/cuda/impl/psb_c_cuda_hdiag_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hdiag_vect_mv.F90 b/cuda/impl/psb_c_cuda_hdiag_vect_mv.F90 index 0c7ce856f..4b661c77b 100644 --- a/cuda/impl/psb_c_cuda_hdiag_vect_mv.F90 +++ b/cuda/impl/psb_c_cuda_hdiag_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hlg_allocate_mnnz.F90 b/cuda/impl/psb_c_cuda_hlg_allocate_mnnz.F90 index 1b41f1326..c122f7ca6 100644 --- a/cuda/impl/psb_c_cuda_hlg_allocate_mnnz.F90 +++ b/cuda/impl/psb_c_cuda_hlg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hlg_csmm.F90 b/cuda/impl/psb_c_cuda_hlg_csmm.F90 index 88aa53a84..3acfc1156 100644 --- a/cuda/impl/psb_c_cuda_hlg_csmm.F90 +++ b/cuda/impl/psb_c_cuda_hlg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hlg_csmv.F90 b/cuda/impl/psb_c_cuda_hlg_csmv.F90 index 18db6ad10..ee3649434 100644 --- a/cuda/impl/psb_c_cuda_hlg_csmv.F90 +++ b/cuda/impl/psb_c_cuda_hlg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hlg_from_gpu.F90 b/cuda/impl/psb_c_cuda_hlg_from_gpu.F90 index d06d54888..e197a5dbe 100644 --- a/cuda/impl/psb_c_cuda_hlg_from_gpu.F90 +++ b/cuda/impl/psb_c_cuda_hlg_from_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hlg_inner_vect_sv.F90 b/cuda/impl/psb_c_cuda_hlg_inner_vect_sv.F90 index 87d7c662e..cc36e4089 100644 --- a/cuda/impl/psb_c_cuda_hlg_inner_vect_sv.F90 +++ b/cuda/impl/psb_c_cuda_hlg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hlg_mold.F90 b/cuda/impl/psb_c_cuda_hlg_mold.F90 index a702e2110..be1cebf90 100644 --- a/cuda/impl/psb_c_cuda_hlg_mold.F90 +++ b/cuda/impl/psb_c_cuda_hlg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hlg_reallocate_nz.F90 b/cuda/impl/psb_c_cuda_hlg_reallocate_nz.F90 index 2ec5fa2ca..2b5d6f7ec 100644 --- a/cuda/impl/psb_c_cuda_hlg_reallocate_nz.F90 +++ b/cuda/impl/psb_c_cuda_hlg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hlg_scal.F90 b/cuda/impl/psb_c_cuda_hlg_scal.F90 index 770d17345..267ee7808 100644 --- a/cuda/impl/psb_c_cuda_hlg_scal.F90 +++ b/cuda/impl/psb_c_cuda_hlg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hlg_scals.F90 b/cuda/impl/psb_c_cuda_hlg_scals.F90 index ef6bc1e39..1a5ba0295 100644 --- a/cuda/impl/psb_c_cuda_hlg_scals.F90 +++ b/cuda/impl/psb_c_cuda_hlg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hlg_to_gpu.F90 b/cuda/impl/psb_c_cuda_hlg_to_gpu.F90 index d7d179e75..5d28e9f8e 100644 --- a/cuda/impl/psb_c_cuda_hlg_to_gpu.F90 +++ b/cuda/impl/psb_c_cuda_hlg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hlg_vect_mv.F90 b/cuda/impl/psb_c_cuda_hlg_vect_mv.F90 index 3789ef17a..af4ae84ec 100644 --- a/cuda/impl/psb_c_cuda_hlg_vect_mv.F90 +++ b/cuda/impl/psb_c_cuda_hlg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hybg_allocate_mnnz.F90 b/cuda/impl/psb_c_cuda_hybg_allocate_mnnz.F90 index dbbeb1f2a..1a2cd1293 100644 --- a/cuda/impl/psb_c_cuda_hybg_allocate_mnnz.F90 +++ b/cuda/impl/psb_c_cuda_hybg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hybg_csmm.F90 b/cuda/impl/psb_c_cuda_hybg_csmm.F90 index 8899f54e6..817c30f8e 100644 --- a/cuda/impl/psb_c_cuda_hybg_csmm.F90 +++ b/cuda/impl/psb_c_cuda_hybg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hybg_csmv.F90 b/cuda/impl/psb_c_cuda_hybg_csmv.F90 index 5832cf347..898e6ebbd 100644 --- a/cuda/impl/psb_c_cuda_hybg_csmv.F90 +++ b/cuda/impl/psb_c_cuda_hybg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hybg_inner_vect_sv.F90 b/cuda/impl/psb_c_cuda_hybg_inner_vect_sv.F90 index 4444397ca..cdfe30fd6 100644 --- a/cuda/impl/psb_c_cuda_hybg_inner_vect_sv.F90 +++ b/cuda/impl/psb_c_cuda_hybg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hybg_mold.F90 b/cuda/impl/psb_c_cuda_hybg_mold.F90 index ba0e31a06..57a658fd9 100644 --- a/cuda/impl/psb_c_cuda_hybg_mold.F90 +++ b/cuda/impl/psb_c_cuda_hybg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hybg_reallocate_nz.F90 b/cuda/impl/psb_c_cuda_hybg_reallocate_nz.F90 index c3bd728bd..78f631e49 100644 --- a/cuda/impl/psb_c_cuda_hybg_reallocate_nz.F90 +++ b/cuda/impl/psb_c_cuda_hybg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hybg_scal.F90 b/cuda/impl/psb_c_cuda_hybg_scal.F90 index d7e360190..0c86f603f 100644 --- a/cuda/impl/psb_c_cuda_hybg_scal.F90 +++ b/cuda/impl/psb_c_cuda_hybg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hybg_scals.F90 b/cuda/impl/psb_c_cuda_hybg_scals.F90 index 03106f7af..c3e162480 100644 --- a/cuda/impl/psb_c_cuda_hybg_scals.F90 +++ b/cuda/impl/psb_c_cuda_hybg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hybg_to_gpu.F90 b/cuda/impl/psb_c_cuda_hybg_to_gpu.F90 index a424c7959..f2e585c78 100644 --- a/cuda/impl/psb_c_cuda_hybg_to_gpu.F90 +++ b/cuda/impl/psb_c_cuda_hybg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_hybg_vect_mv.F90 b/cuda/impl/psb_c_cuda_hybg_vect_mv.F90 index cb38321f9..34da8f889 100644 --- a/cuda/impl/psb_c_cuda_hybg_vect_mv.F90 +++ b/cuda/impl/psb_c_cuda_hybg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_mv_csrg_from_coo.F90 b/cuda/impl/psb_c_cuda_mv_csrg_from_coo.F90 index f0a74c093..2667c3a4d 100644 --- a/cuda/impl/psb_c_cuda_mv_csrg_from_coo.F90 +++ b/cuda/impl/psb_c_cuda_mv_csrg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_mv_csrg_from_fmt.F90 b/cuda/impl/psb_c_cuda_mv_csrg_from_fmt.F90 index eb3698b0f..aac8298c2 100644 --- a/cuda/impl/psb_c_cuda_mv_csrg_from_fmt.F90 +++ b/cuda/impl/psb_c_cuda_mv_csrg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_mv_diag_from_coo.F90 b/cuda/impl/psb_c_cuda_mv_diag_from_coo.F90 index c1ee2ba99..39a8b8ab0 100644 --- a/cuda/impl/psb_c_cuda_mv_diag_from_coo.F90 +++ b/cuda/impl/psb_c_cuda_mv_diag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_mv_elg_from_coo.F90 b/cuda/impl/psb_c_cuda_mv_elg_from_coo.F90 index f9555729b..a836f2232 100644 --- a/cuda/impl/psb_c_cuda_mv_elg_from_coo.F90 +++ b/cuda/impl/psb_c_cuda_mv_elg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_mv_elg_from_fmt.F90 b/cuda/impl/psb_c_cuda_mv_elg_from_fmt.F90 index 59615e25b..7332c1f42 100644 --- a/cuda/impl/psb_c_cuda_mv_elg_from_fmt.F90 +++ b/cuda/impl/psb_c_cuda_mv_elg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_mv_hdiag_from_coo.F90 b/cuda/impl/psb_c_cuda_mv_hdiag_from_coo.F90 index 21ee731d4..9b044d95c 100644 --- a/cuda/impl/psb_c_cuda_mv_hdiag_from_coo.F90 +++ b/cuda/impl/psb_c_cuda_mv_hdiag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_mv_hlg_from_coo.F90 b/cuda/impl/psb_c_cuda_mv_hlg_from_coo.F90 index 50c20fad9..c7380d813 100644 --- a/cuda/impl/psb_c_cuda_mv_hlg_from_coo.F90 +++ b/cuda/impl/psb_c_cuda_mv_hlg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_mv_hlg_from_fmt.F90 b/cuda/impl/psb_c_cuda_mv_hlg_from_fmt.F90 index 3fba905a8..0c5e5e5ed 100644 --- a/cuda/impl/psb_c_cuda_mv_hlg_from_fmt.F90 +++ b/cuda/impl/psb_c_cuda_mv_hlg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_mv_hybg_from_coo.F90 b/cuda/impl/psb_c_cuda_mv_hybg_from_coo.F90 index 72837aa69..83a445329 100644 --- a/cuda/impl/psb_c_cuda_mv_hybg_from_coo.F90 +++ b/cuda/impl/psb_c_cuda_mv_hybg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_c_cuda_mv_hybg_from_fmt.F90 b/cuda/impl/psb_c_cuda_mv_hybg_from_fmt.F90 index da910175a..3a3d36566 100644 --- a/cuda/impl/psb_c_cuda_mv_hybg_from_fmt.F90 +++ b/cuda/impl/psb_c_cuda_mv_hybg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_cp_csrg_from_coo.F90 b/cuda/impl/psb_d_cuda_cp_csrg_from_coo.F90 index ab3a72561..ceb85ec2e 100644 --- a/cuda/impl/psb_d_cuda_cp_csrg_from_coo.F90 +++ b/cuda/impl/psb_d_cuda_cp_csrg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_cp_csrg_from_fmt.F90 b/cuda/impl/psb_d_cuda_cp_csrg_from_fmt.F90 index 8f8e8cbed..41455df8a 100644 --- a/cuda/impl/psb_d_cuda_cp_csrg_from_fmt.F90 +++ b/cuda/impl/psb_d_cuda_cp_csrg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_cp_diag_from_coo.F90 b/cuda/impl/psb_d_cuda_cp_diag_from_coo.F90 index dc0401d52..66b9e1b3e 100644 --- a/cuda/impl/psb_d_cuda_cp_diag_from_coo.F90 +++ b/cuda/impl/psb_d_cuda_cp_diag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_cp_elg_from_coo.F90 b/cuda/impl/psb_d_cuda_cp_elg_from_coo.F90 index 890bdc392..dd82d1b4d 100644 --- a/cuda/impl/psb_d_cuda_cp_elg_from_coo.F90 +++ b/cuda/impl/psb_d_cuda_cp_elg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_cp_elg_from_fmt.F90 b/cuda/impl/psb_d_cuda_cp_elg_from_fmt.F90 index 7beea7f16..be6fbce8a 100644 --- a/cuda/impl/psb_d_cuda_cp_elg_from_fmt.F90 +++ b/cuda/impl/psb_d_cuda_cp_elg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_cp_hdiag_from_coo.F90 b/cuda/impl/psb_d_cuda_cp_hdiag_from_coo.F90 index 82ef48766..7729b1bb0 100644 --- a/cuda/impl/psb_d_cuda_cp_hdiag_from_coo.F90 +++ b/cuda/impl/psb_d_cuda_cp_hdiag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_cp_hlg_from_coo.F90 b/cuda/impl/psb_d_cuda_cp_hlg_from_coo.F90 index 34b999a9c..503d737d9 100644 --- a/cuda/impl/psb_d_cuda_cp_hlg_from_coo.F90 +++ b/cuda/impl/psb_d_cuda_cp_hlg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_cp_hlg_from_fmt.F90 b/cuda/impl/psb_d_cuda_cp_hlg_from_fmt.F90 index ecb15157b..cc5de351e 100644 --- a/cuda/impl/psb_d_cuda_cp_hlg_from_fmt.F90 +++ b/cuda/impl/psb_d_cuda_cp_hlg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_cp_hybg_from_coo.F90 b/cuda/impl/psb_d_cuda_cp_hybg_from_coo.F90 index 6405c61d1..b26f2bc11 100644 --- a/cuda/impl/psb_d_cuda_cp_hybg_from_coo.F90 +++ b/cuda/impl/psb_d_cuda_cp_hybg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_cp_hybg_from_fmt.F90 b/cuda/impl/psb_d_cuda_cp_hybg_from_fmt.F90 index a6f9391ba..2029bab87 100644 --- a/cuda/impl/psb_d_cuda_cp_hybg_from_fmt.F90 +++ b/cuda/impl/psb_d_cuda_cp_hybg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_csrg_allocate_mnnz.F90 b/cuda/impl/psb_d_cuda_csrg_allocate_mnnz.F90 index 056f2deb3..0aa23bd9b 100644 --- a/cuda/impl/psb_d_cuda_csrg_allocate_mnnz.F90 +++ b/cuda/impl/psb_d_cuda_csrg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_csrg_csmm.F90 b/cuda/impl/psb_d_cuda_csrg_csmm.F90 index ddac1373c..eca4fc5cf 100644 --- a/cuda/impl/psb_d_cuda_csrg_csmm.F90 +++ b/cuda/impl/psb_d_cuda_csrg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_csrg_csmv.F90 b/cuda/impl/psb_d_cuda_csrg_csmv.F90 index c1c889f83..98b98100c 100644 --- a/cuda/impl/psb_d_cuda_csrg_csmv.F90 +++ b/cuda/impl/psb_d_cuda_csrg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_csrg_from_gpu.F90 b/cuda/impl/psb_d_cuda_csrg_from_gpu.F90 index 9b5c4e4c1..509fea629 100644 --- a/cuda/impl/psb_d_cuda_csrg_from_gpu.F90 +++ b/cuda/impl/psb_d_cuda_csrg_from_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_csrg_inner_vect_sv.F90 b/cuda/impl/psb_d_cuda_csrg_inner_vect_sv.F90 index 9a45ee176..cf964bea9 100644 --- a/cuda/impl/psb_d_cuda_csrg_inner_vect_sv.F90 +++ b/cuda/impl/psb_d_cuda_csrg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_csrg_mold.F90 b/cuda/impl/psb_d_cuda_csrg_mold.F90 index eec34975f..8fe1d44fc 100644 --- a/cuda/impl/psb_d_cuda_csrg_mold.F90 +++ b/cuda/impl/psb_d_cuda_csrg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_csrg_reallocate_nz.F90 b/cuda/impl/psb_d_cuda_csrg_reallocate_nz.F90 index c27cb943a..74d3f786f 100644 --- a/cuda/impl/psb_d_cuda_csrg_reallocate_nz.F90 +++ b/cuda/impl/psb_d_cuda_csrg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_csrg_scal.F90 b/cuda/impl/psb_d_cuda_csrg_scal.F90 index 860e93962..a518de842 100644 --- a/cuda/impl/psb_d_cuda_csrg_scal.F90 +++ b/cuda/impl/psb_d_cuda_csrg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_csrg_scals.F90 b/cuda/impl/psb_d_cuda_csrg_scals.F90 index 87ef588d9..cadbb53bd 100644 --- a/cuda/impl/psb_d_cuda_csrg_scals.F90 +++ b/cuda/impl/psb_d_cuda_csrg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_csrg_to_gpu.F90 b/cuda/impl/psb_d_cuda_csrg_to_gpu.F90 index b4067e880..f173522fe 100644 --- a/cuda/impl/psb_d_cuda_csrg_to_gpu.F90 +++ b/cuda/impl/psb_d_cuda_csrg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_csrg_vect_mv.F90 b/cuda/impl/psb_d_cuda_csrg_vect_mv.F90 index 03fefbdd5..a0beaeba8 100644 --- a/cuda/impl/psb_d_cuda_csrg_vect_mv.F90 +++ b/cuda/impl/psb_d_cuda_csrg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_diag_csmv.F90 b/cuda/impl/psb_d_cuda_diag_csmv.F90 index 0317a3699..4ba861fae 100644 --- a/cuda/impl/psb_d_cuda_diag_csmv.F90 +++ b/cuda/impl/psb_d_cuda_diag_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_diag_mold.F90 b/cuda/impl/psb_d_cuda_diag_mold.F90 index 7cea069e3..61efcb7e9 100644 --- a/cuda/impl/psb_d_cuda_diag_mold.F90 +++ b/cuda/impl/psb_d_cuda_diag_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_diag_to_gpu.F90 b/cuda/impl/psb_d_cuda_diag_to_gpu.F90 index 9b6489622..46f526478 100644 --- a/cuda/impl/psb_d_cuda_diag_to_gpu.F90 +++ b/cuda/impl/psb_d_cuda_diag_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_diag_vect_mv.F90 b/cuda/impl/psb_d_cuda_diag_vect_mv.F90 index 3bc2372d8..bbe8d8d6c 100644 --- a/cuda/impl/psb_d_cuda_diag_vect_mv.F90 +++ b/cuda/impl/psb_d_cuda_diag_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_dnsg_mat_impl.F90 b/cuda/impl/psb_d_cuda_dnsg_mat_impl.F90 index e4419d810..7724db91e 100644 --- a/cuda/impl/psb_d_cuda_dnsg_mat_impl.F90 +++ b/cuda/impl/psb_d_cuda_dnsg_mat_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_allocate_mnnz.F90 b/cuda/impl/psb_d_cuda_elg_allocate_mnnz.F90 index 6db20c966..a827921f5 100644 --- a/cuda/impl/psb_d_cuda_elg_allocate_mnnz.F90 +++ b/cuda/impl/psb_d_cuda_elg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_asb.f90 b/cuda/impl/psb_d_cuda_elg_asb.f90 index 7d510ee27..1ae9a4150 100644 --- a/cuda/impl/psb_d_cuda_elg_asb.f90 +++ b/cuda/impl/psb_d_cuda_elg_asb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_csmm.F90 b/cuda/impl/psb_d_cuda_elg_csmm.F90 index f77d72d83..aa588fa38 100644 --- a/cuda/impl/psb_d_cuda_elg_csmm.F90 +++ b/cuda/impl/psb_d_cuda_elg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_csmv.F90 b/cuda/impl/psb_d_cuda_elg_csmv.F90 index 351ad99d8..49d94fa74 100644 --- a/cuda/impl/psb_d_cuda_elg_csmv.F90 +++ b/cuda/impl/psb_d_cuda_elg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_csput.F90 b/cuda/impl/psb_d_cuda_elg_csput.F90 index 0d16de1f8..18c055e9e 100644 --- a/cuda/impl/psb_d_cuda_elg_csput.F90 +++ b/cuda/impl/psb_d_cuda_elg_csput.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_from_gpu.F90 b/cuda/impl/psb_d_cuda_elg_from_gpu.F90 index 720a6d733..296e950c4 100644 --- a/cuda/impl/psb_d_cuda_elg_from_gpu.F90 +++ b/cuda/impl/psb_d_cuda_elg_from_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_inner_vect_sv.F90 b/cuda/impl/psb_d_cuda_elg_inner_vect_sv.F90 index 5e5d72eff..4fcbad08d 100644 --- a/cuda/impl/psb_d_cuda_elg_inner_vect_sv.F90 +++ b/cuda/impl/psb_d_cuda_elg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_mold.F90 b/cuda/impl/psb_d_cuda_elg_mold.F90 index 107f19afb..538c4ec55 100644 --- a/cuda/impl/psb_d_cuda_elg_mold.F90 +++ b/cuda/impl/psb_d_cuda_elg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_reallocate_nz.F90 b/cuda/impl/psb_d_cuda_elg_reallocate_nz.F90 index 474647605..c9e60e49f 100644 --- a/cuda/impl/psb_d_cuda_elg_reallocate_nz.F90 +++ b/cuda/impl/psb_d_cuda_elg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_scal.F90 b/cuda/impl/psb_d_cuda_elg_scal.F90 index 420c710ee..b1828a73c 100644 --- a/cuda/impl/psb_d_cuda_elg_scal.F90 +++ b/cuda/impl/psb_d_cuda_elg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_scals.F90 b/cuda/impl/psb_d_cuda_elg_scals.F90 index ff22002e4..9986d613d 100644 --- a/cuda/impl/psb_d_cuda_elg_scals.F90 +++ b/cuda/impl/psb_d_cuda_elg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_to_gpu.F90 b/cuda/impl/psb_d_cuda_elg_to_gpu.F90 index 9b88af69b..8bcfdb41e 100644 --- a/cuda/impl/psb_d_cuda_elg_to_gpu.F90 +++ b/cuda/impl/psb_d_cuda_elg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_trim.f90 b/cuda/impl/psb_d_cuda_elg_trim.f90 index a371c6738..d50d3f62d 100644 --- a/cuda/impl/psb_d_cuda_elg_trim.f90 +++ b/cuda/impl/psb_d_cuda_elg_trim.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_elg_vect_mv.F90 b/cuda/impl/psb_d_cuda_elg_vect_mv.F90 index f0b83c2bd..f8a165d64 100644 --- a/cuda/impl/psb_d_cuda_elg_vect_mv.F90 +++ b/cuda/impl/psb_d_cuda_elg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hdiag_csmv.F90 b/cuda/impl/psb_d_cuda_hdiag_csmv.F90 index bf4dacc18..c4553b0ec 100644 --- a/cuda/impl/psb_d_cuda_hdiag_csmv.F90 +++ b/cuda/impl/psb_d_cuda_hdiag_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hdiag_mold.F90 b/cuda/impl/psb_d_cuda_hdiag_mold.F90 index b858b56d0..212f6aa2f 100644 --- a/cuda/impl/psb_d_cuda_hdiag_mold.F90 +++ b/cuda/impl/psb_d_cuda_hdiag_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hdiag_to_gpu.F90 b/cuda/impl/psb_d_cuda_hdiag_to_gpu.F90 index 73c4a47de..b413397b6 100644 --- a/cuda/impl/psb_d_cuda_hdiag_to_gpu.F90 +++ b/cuda/impl/psb_d_cuda_hdiag_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hdiag_vect_mv.F90 b/cuda/impl/psb_d_cuda_hdiag_vect_mv.F90 index c18c80ac9..537234447 100644 --- a/cuda/impl/psb_d_cuda_hdiag_vect_mv.F90 +++ b/cuda/impl/psb_d_cuda_hdiag_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hlg_allocate_mnnz.F90 b/cuda/impl/psb_d_cuda_hlg_allocate_mnnz.F90 index 68d9ab50e..f6a1f2202 100644 --- a/cuda/impl/psb_d_cuda_hlg_allocate_mnnz.F90 +++ b/cuda/impl/psb_d_cuda_hlg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hlg_csmm.F90 b/cuda/impl/psb_d_cuda_hlg_csmm.F90 index ee8424e69..972cddbd0 100644 --- a/cuda/impl/psb_d_cuda_hlg_csmm.F90 +++ b/cuda/impl/psb_d_cuda_hlg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hlg_csmv.F90 b/cuda/impl/psb_d_cuda_hlg_csmv.F90 index 58892c1fe..4f7cce512 100644 --- a/cuda/impl/psb_d_cuda_hlg_csmv.F90 +++ b/cuda/impl/psb_d_cuda_hlg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hlg_from_gpu.F90 b/cuda/impl/psb_d_cuda_hlg_from_gpu.F90 index 752fd944d..05890c0e6 100644 --- a/cuda/impl/psb_d_cuda_hlg_from_gpu.F90 +++ b/cuda/impl/psb_d_cuda_hlg_from_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hlg_inner_vect_sv.F90 b/cuda/impl/psb_d_cuda_hlg_inner_vect_sv.F90 index f4a0424d2..5394605d3 100644 --- a/cuda/impl/psb_d_cuda_hlg_inner_vect_sv.F90 +++ b/cuda/impl/psb_d_cuda_hlg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hlg_mold.F90 b/cuda/impl/psb_d_cuda_hlg_mold.F90 index e41d56f27..a188bdd0b 100644 --- a/cuda/impl/psb_d_cuda_hlg_mold.F90 +++ b/cuda/impl/psb_d_cuda_hlg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hlg_reallocate_nz.F90 b/cuda/impl/psb_d_cuda_hlg_reallocate_nz.F90 index e696d304b..68fef0650 100644 --- a/cuda/impl/psb_d_cuda_hlg_reallocate_nz.F90 +++ b/cuda/impl/psb_d_cuda_hlg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hlg_scal.F90 b/cuda/impl/psb_d_cuda_hlg_scal.F90 index 042e58050..026b45204 100644 --- a/cuda/impl/psb_d_cuda_hlg_scal.F90 +++ b/cuda/impl/psb_d_cuda_hlg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hlg_scals.F90 b/cuda/impl/psb_d_cuda_hlg_scals.F90 index 4c81faa99..7a01fa943 100644 --- a/cuda/impl/psb_d_cuda_hlg_scals.F90 +++ b/cuda/impl/psb_d_cuda_hlg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hlg_to_gpu.F90 b/cuda/impl/psb_d_cuda_hlg_to_gpu.F90 index 566c94bd5..5fa80c1ba 100644 --- a/cuda/impl/psb_d_cuda_hlg_to_gpu.F90 +++ b/cuda/impl/psb_d_cuda_hlg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hlg_vect_mv.F90 b/cuda/impl/psb_d_cuda_hlg_vect_mv.F90 index cccba74bb..9feee7074 100644 --- a/cuda/impl/psb_d_cuda_hlg_vect_mv.F90 +++ b/cuda/impl/psb_d_cuda_hlg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hybg_allocate_mnnz.F90 b/cuda/impl/psb_d_cuda_hybg_allocate_mnnz.F90 index b9c5d3d03..33cf91e8e 100644 --- a/cuda/impl/psb_d_cuda_hybg_allocate_mnnz.F90 +++ b/cuda/impl/psb_d_cuda_hybg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hybg_csmm.F90 b/cuda/impl/psb_d_cuda_hybg_csmm.F90 index dbf339907..825ea9887 100644 --- a/cuda/impl/psb_d_cuda_hybg_csmm.F90 +++ b/cuda/impl/psb_d_cuda_hybg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hybg_csmv.F90 b/cuda/impl/psb_d_cuda_hybg_csmv.F90 index 1565c6481..acd05eeca 100644 --- a/cuda/impl/psb_d_cuda_hybg_csmv.F90 +++ b/cuda/impl/psb_d_cuda_hybg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hybg_inner_vect_sv.F90 b/cuda/impl/psb_d_cuda_hybg_inner_vect_sv.F90 index 902f871dc..ea6d8db0a 100644 --- a/cuda/impl/psb_d_cuda_hybg_inner_vect_sv.F90 +++ b/cuda/impl/psb_d_cuda_hybg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hybg_mold.F90 b/cuda/impl/psb_d_cuda_hybg_mold.F90 index 3e51acf60..1ebac3548 100644 --- a/cuda/impl/psb_d_cuda_hybg_mold.F90 +++ b/cuda/impl/psb_d_cuda_hybg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hybg_reallocate_nz.F90 b/cuda/impl/psb_d_cuda_hybg_reallocate_nz.F90 index e9699e773..3b876f8ae 100644 --- a/cuda/impl/psb_d_cuda_hybg_reallocate_nz.F90 +++ b/cuda/impl/psb_d_cuda_hybg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hybg_scal.F90 b/cuda/impl/psb_d_cuda_hybg_scal.F90 index 15a33d7b6..2bd149b76 100644 --- a/cuda/impl/psb_d_cuda_hybg_scal.F90 +++ b/cuda/impl/psb_d_cuda_hybg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hybg_scals.F90 b/cuda/impl/psb_d_cuda_hybg_scals.F90 index 34faa15d9..303fe312f 100644 --- a/cuda/impl/psb_d_cuda_hybg_scals.F90 +++ b/cuda/impl/psb_d_cuda_hybg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hybg_to_gpu.F90 b/cuda/impl/psb_d_cuda_hybg_to_gpu.F90 index ba8596224..76893ea13 100644 --- a/cuda/impl/psb_d_cuda_hybg_to_gpu.F90 +++ b/cuda/impl/psb_d_cuda_hybg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_hybg_vect_mv.F90 b/cuda/impl/psb_d_cuda_hybg_vect_mv.F90 index 49060c3c1..5b72c916f 100644 --- a/cuda/impl/psb_d_cuda_hybg_vect_mv.F90 +++ b/cuda/impl/psb_d_cuda_hybg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_mv_csrg_from_coo.F90 b/cuda/impl/psb_d_cuda_mv_csrg_from_coo.F90 index 559bfb2ce..cdbe2552f 100644 --- a/cuda/impl/psb_d_cuda_mv_csrg_from_coo.F90 +++ b/cuda/impl/psb_d_cuda_mv_csrg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_mv_csrg_from_fmt.F90 b/cuda/impl/psb_d_cuda_mv_csrg_from_fmt.F90 index c2411e90c..11b160e60 100644 --- a/cuda/impl/psb_d_cuda_mv_csrg_from_fmt.F90 +++ b/cuda/impl/psb_d_cuda_mv_csrg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_mv_diag_from_coo.F90 b/cuda/impl/psb_d_cuda_mv_diag_from_coo.F90 index a6a39a1c5..6ebbabddd 100644 --- a/cuda/impl/psb_d_cuda_mv_diag_from_coo.F90 +++ b/cuda/impl/psb_d_cuda_mv_diag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_mv_elg_from_coo.F90 b/cuda/impl/psb_d_cuda_mv_elg_from_coo.F90 index 9886e90c9..7742ccd2e 100644 --- a/cuda/impl/psb_d_cuda_mv_elg_from_coo.F90 +++ b/cuda/impl/psb_d_cuda_mv_elg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_mv_elg_from_fmt.F90 b/cuda/impl/psb_d_cuda_mv_elg_from_fmt.F90 index da2d47a19..046051098 100644 --- a/cuda/impl/psb_d_cuda_mv_elg_from_fmt.F90 +++ b/cuda/impl/psb_d_cuda_mv_elg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_mv_hdiag_from_coo.F90 b/cuda/impl/psb_d_cuda_mv_hdiag_from_coo.F90 index b3c4f650a..d163e3892 100644 --- a/cuda/impl/psb_d_cuda_mv_hdiag_from_coo.F90 +++ b/cuda/impl/psb_d_cuda_mv_hdiag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_mv_hlg_from_coo.F90 b/cuda/impl/psb_d_cuda_mv_hlg_from_coo.F90 index 95e862938..f162c2897 100644 --- a/cuda/impl/psb_d_cuda_mv_hlg_from_coo.F90 +++ b/cuda/impl/psb_d_cuda_mv_hlg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_mv_hlg_from_fmt.F90 b/cuda/impl/psb_d_cuda_mv_hlg_from_fmt.F90 index 02578b192..f39a93a4c 100644 --- a/cuda/impl/psb_d_cuda_mv_hlg_from_fmt.F90 +++ b/cuda/impl/psb_d_cuda_mv_hlg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_mv_hybg_from_coo.F90 b/cuda/impl/psb_d_cuda_mv_hybg_from_coo.F90 index 42f3aca31..33d43beea 100644 --- a/cuda/impl/psb_d_cuda_mv_hybg_from_coo.F90 +++ b/cuda/impl/psb_d_cuda_mv_hybg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_d_cuda_mv_hybg_from_fmt.F90 b/cuda/impl/psb_d_cuda_mv_hybg_from_fmt.F90 index f9c34f358..49aeac74d 100644 --- a/cuda/impl/psb_d_cuda_mv_hybg_from_fmt.F90 +++ b/cuda/impl/psb_d_cuda_mv_hybg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_cp_csrg_from_coo.F90 b/cuda/impl/psb_s_cuda_cp_csrg_from_coo.F90 index 0e3f9113a..f0b7f1622 100644 --- a/cuda/impl/psb_s_cuda_cp_csrg_from_coo.F90 +++ b/cuda/impl/psb_s_cuda_cp_csrg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_cp_csrg_from_fmt.F90 b/cuda/impl/psb_s_cuda_cp_csrg_from_fmt.F90 index 76871b59f..487d9cb3c 100644 --- a/cuda/impl/psb_s_cuda_cp_csrg_from_fmt.F90 +++ b/cuda/impl/psb_s_cuda_cp_csrg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_cp_diag_from_coo.F90 b/cuda/impl/psb_s_cuda_cp_diag_from_coo.F90 index 07025d776..de773e834 100644 --- a/cuda/impl/psb_s_cuda_cp_diag_from_coo.F90 +++ b/cuda/impl/psb_s_cuda_cp_diag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_cp_elg_from_coo.F90 b/cuda/impl/psb_s_cuda_cp_elg_from_coo.F90 index 66abf76ad..8268419a0 100644 --- a/cuda/impl/psb_s_cuda_cp_elg_from_coo.F90 +++ b/cuda/impl/psb_s_cuda_cp_elg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_cp_elg_from_fmt.F90 b/cuda/impl/psb_s_cuda_cp_elg_from_fmt.F90 index 77df12b3a..1e8010a7e 100644 --- a/cuda/impl/psb_s_cuda_cp_elg_from_fmt.F90 +++ b/cuda/impl/psb_s_cuda_cp_elg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_cp_hdiag_from_coo.F90 b/cuda/impl/psb_s_cuda_cp_hdiag_from_coo.F90 index 75210478e..c2a89511a 100644 --- a/cuda/impl/psb_s_cuda_cp_hdiag_from_coo.F90 +++ b/cuda/impl/psb_s_cuda_cp_hdiag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_cp_hlg_from_coo.F90 b/cuda/impl/psb_s_cuda_cp_hlg_from_coo.F90 index c254b15a8..ea1a425e6 100644 --- a/cuda/impl/psb_s_cuda_cp_hlg_from_coo.F90 +++ b/cuda/impl/psb_s_cuda_cp_hlg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_cp_hlg_from_fmt.F90 b/cuda/impl/psb_s_cuda_cp_hlg_from_fmt.F90 index f04b65e5e..160080557 100644 --- a/cuda/impl/psb_s_cuda_cp_hlg_from_fmt.F90 +++ b/cuda/impl/psb_s_cuda_cp_hlg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_cp_hybg_from_coo.F90 b/cuda/impl/psb_s_cuda_cp_hybg_from_coo.F90 index bf33a7a45..0bc7e7cb2 100644 --- a/cuda/impl/psb_s_cuda_cp_hybg_from_coo.F90 +++ b/cuda/impl/psb_s_cuda_cp_hybg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_cp_hybg_from_fmt.F90 b/cuda/impl/psb_s_cuda_cp_hybg_from_fmt.F90 index 2f22252d3..9dd4c8691 100644 --- a/cuda/impl/psb_s_cuda_cp_hybg_from_fmt.F90 +++ b/cuda/impl/psb_s_cuda_cp_hybg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_csrg_allocate_mnnz.F90 b/cuda/impl/psb_s_cuda_csrg_allocate_mnnz.F90 index 7e6f0c862..aa5fbcdc4 100644 --- a/cuda/impl/psb_s_cuda_csrg_allocate_mnnz.F90 +++ b/cuda/impl/psb_s_cuda_csrg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_csrg_csmm.F90 b/cuda/impl/psb_s_cuda_csrg_csmm.F90 index 453f5260d..9f8416cfc 100644 --- a/cuda/impl/psb_s_cuda_csrg_csmm.F90 +++ b/cuda/impl/psb_s_cuda_csrg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_csrg_csmv.F90 b/cuda/impl/psb_s_cuda_csrg_csmv.F90 index a387fd34c..c526f4a54 100644 --- a/cuda/impl/psb_s_cuda_csrg_csmv.F90 +++ b/cuda/impl/psb_s_cuda_csrg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_csrg_from_gpu.F90 b/cuda/impl/psb_s_cuda_csrg_from_gpu.F90 index da1a71842..67c4c972d 100644 --- a/cuda/impl/psb_s_cuda_csrg_from_gpu.F90 +++ b/cuda/impl/psb_s_cuda_csrg_from_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_csrg_inner_vect_sv.F90 b/cuda/impl/psb_s_cuda_csrg_inner_vect_sv.F90 index df11952c4..ed3fa3bc9 100644 --- a/cuda/impl/psb_s_cuda_csrg_inner_vect_sv.F90 +++ b/cuda/impl/psb_s_cuda_csrg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_csrg_mold.F90 b/cuda/impl/psb_s_cuda_csrg_mold.F90 index 5e33850b2..05fdd12ce 100644 --- a/cuda/impl/psb_s_cuda_csrg_mold.F90 +++ b/cuda/impl/psb_s_cuda_csrg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_csrg_reallocate_nz.F90 b/cuda/impl/psb_s_cuda_csrg_reallocate_nz.F90 index dfd115e78..90658038a 100644 --- a/cuda/impl/psb_s_cuda_csrg_reallocate_nz.F90 +++ b/cuda/impl/psb_s_cuda_csrg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_csrg_scal.F90 b/cuda/impl/psb_s_cuda_csrg_scal.F90 index ea3406a1a..ae509f191 100644 --- a/cuda/impl/psb_s_cuda_csrg_scal.F90 +++ b/cuda/impl/psb_s_cuda_csrg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_csrg_scals.F90 b/cuda/impl/psb_s_cuda_csrg_scals.F90 index 307d58494..282bd582c 100644 --- a/cuda/impl/psb_s_cuda_csrg_scals.F90 +++ b/cuda/impl/psb_s_cuda_csrg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_csrg_to_gpu.F90 b/cuda/impl/psb_s_cuda_csrg_to_gpu.F90 index 0c918dd40..ea4d57bb5 100644 --- a/cuda/impl/psb_s_cuda_csrg_to_gpu.F90 +++ b/cuda/impl/psb_s_cuda_csrg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_csrg_vect_mv.F90 b/cuda/impl/psb_s_cuda_csrg_vect_mv.F90 index 528204360..d8516c5ac 100644 --- a/cuda/impl/psb_s_cuda_csrg_vect_mv.F90 +++ b/cuda/impl/psb_s_cuda_csrg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_diag_csmv.F90 b/cuda/impl/psb_s_cuda_diag_csmv.F90 index 016b82bcd..0f0e261f8 100644 --- a/cuda/impl/psb_s_cuda_diag_csmv.F90 +++ b/cuda/impl/psb_s_cuda_diag_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_diag_mold.F90 b/cuda/impl/psb_s_cuda_diag_mold.F90 index 9e6c58a62..d3dd61d33 100644 --- a/cuda/impl/psb_s_cuda_diag_mold.F90 +++ b/cuda/impl/psb_s_cuda_diag_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_diag_to_gpu.F90 b/cuda/impl/psb_s_cuda_diag_to_gpu.F90 index c8578e75d..2e556d819 100644 --- a/cuda/impl/psb_s_cuda_diag_to_gpu.F90 +++ b/cuda/impl/psb_s_cuda_diag_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_diag_vect_mv.F90 b/cuda/impl/psb_s_cuda_diag_vect_mv.F90 index d68e5193e..d2ec5143c 100644 --- a/cuda/impl/psb_s_cuda_diag_vect_mv.F90 +++ b/cuda/impl/psb_s_cuda_diag_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_dnsg_mat_impl.F90 b/cuda/impl/psb_s_cuda_dnsg_mat_impl.F90 index 3f12b2935..731ce670b 100644 --- a/cuda/impl/psb_s_cuda_dnsg_mat_impl.F90 +++ b/cuda/impl/psb_s_cuda_dnsg_mat_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_allocate_mnnz.F90 b/cuda/impl/psb_s_cuda_elg_allocate_mnnz.F90 index b771ca1b0..e370a6315 100644 --- a/cuda/impl/psb_s_cuda_elg_allocate_mnnz.F90 +++ b/cuda/impl/psb_s_cuda_elg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_asb.f90 b/cuda/impl/psb_s_cuda_elg_asb.f90 index 53a17a32b..6c5735ad1 100644 --- a/cuda/impl/psb_s_cuda_elg_asb.f90 +++ b/cuda/impl/psb_s_cuda_elg_asb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_csmm.F90 b/cuda/impl/psb_s_cuda_elg_csmm.F90 index ff7b78487..d16189410 100644 --- a/cuda/impl/psb_s_cuda_elg_csmm.F90 +++ b/cuda/impl/psb_s_cuda_elg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_csmv.F90 b/cuda/impl/psb_s_cuda_elg_csmv.F90 index caf106cb5..2b8310130 100644 --- a/cuda/impl/psb_s_cuda_elg_csmv.F90 +++ b/cuda/impl/psb_s_cuda_elg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_csput.F90 b/cuda/impl/psb_s_cuda_elg_csput.F90 index d43294bf8..280def3f1 100644 --- a/cuda/impl/psb_s_cuda_elg_csput.F90 +++ b/cuda/impl/psb_s_cuda_elg_csput.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_from_gpu.F90 b/cuda/impl/psb_s_cuda_elg_from_gpu.F90 index d995157ed..0b571a32e 100644 --- a/cuda/impl/psb_s_cuda_elg_from_gpu.F90 +++ b/cuda/impl/psb_s_cuda_elg_from_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_inner_vect_sv.F90 b/cuda/impl/psb_s_cuda_elg_inner_vect_sv.F90 index 537365a6a..f5b88c8a6 100644 --- a/cuda/impl/psb_s_cuda_elg_inner_vect_sv.F90 +++ b/cuda/impl/psb_s_cuda_elg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_mold.F90 b/cuda/impl/psb_s_cuda_elg_mold.F90 index 7ff9c7aeb..9f5f3aa04 100644 --- a/cuda/impl/psb_s_cuda_elg_mold.F90 +++ b/cuda/impl/psb_s_cuda_elg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_reallocate_nz.F90 b/cuda/impl/psb_s_cuda_elg_reallocate_nz.F90 index 5b99b9adb..a49b889ca 100644 --- a/cuda/impl/psb_s_cuda_elg_reallocate_nz.F90 +++ b/cuda/impl/psb_s_cuda_elg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_scal.F90 b/cuda/impl/psb_s_cuda_elg_scal.F90 index dfa99cf19..440e0d2aa 100644 --- a/cuda/impl/psb_s_cuda_elg_scal.F90 +++ b/cuda/impl/psb_s_cuda_elg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_scals.F90 b/cuda/impl/psb_s_cuda_elg_scals.F90 index f0aa2504b..8b0fe49a3 100644 --- a/cuda/impl/psb_s_cuda_elg_scals.F90 +++ b/cuda/impl/psb_s_cuda_elg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_to_gpu.F90 b/cuda/impl/psb_s_cuda_elg_to_gpu.F90 index 9c16ea8d1..6ba09d055 100644 --- a/cuda/impl/psb_s_cuda_elg_to_gpu.F90 +++ b/cuda/impl/psb_s_cuda_elg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_trim.f90 b/cuda/impl/psb_s_cuda_elg_trim.f90 index 2d3903436..c703e696e 100644 --- a/cuda/impl/psb_s_cuda_elg_trim.f90 +++ b/cuda/impl/psb_s_cuda_elg_trim.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_elg_vect_mv.F90 b/cuda/impl/psb_s_cuda_elg_vect_mv.F90 index 6c898fda5..bca9b3f58 100644 --- a/cuda/impl/psb_s_cuda_elg_vect_mv.F90 +++ b/cuda/impl/psb_s_cuda_elg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hdiag_csmv.F90 b/cuda/impl/psb_s_cuda_hdiag_csmv.F90 index 3f34c2e79..093437890 100644 --- a/cuda/impl/psb_s_cuda_hdiag_csmv.F90 +++ b/cuda/impl/psb_s_cuda_hdiag_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hdiag_mold.F90 b/cuda/impl/psb_s_cuda_hdiag_mold.F90 index c11283ddc..f4621492c 100644 --- a/cuda/impl/psb_s_cuda_hdiag_mold.F90 +++ b/cuda/impl/psb_s_cuda_hdiag_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hdiag_to_gpu.F90 b/cuda/impl/psb_s_cuda_hdiag_to_gpu.F90 index bc3fa3253..2442f162b 100644 --- a/cuda/impl/psb_s_cuda_hdiag_to_gpu.F90 +++ b/cuda/impl/psb_s_cuda_hdiag_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hdiag_vect_mv.F90 b/cuda/impl/psb_s_cuda_hdiag_vect_mv.F90 index 03215047c..5a9302d1d 100644 --- a/cuda/impl/psb_s_cuda_hdiag_vect_mv.F90 +++ b/cuda/impl/psb_s_cuda_hdiag_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hlg_allocate_mnnz.F90 b/cuda/impl/psb_s_cuda_hlg_allocate_mnnz.F90 index 480f6677a..3852392e3 100644 --- a/cuda/impl/psb_s_cuda_hlg_allocate_mnnz.F90 +++ b/cuda/impl/psb_s_cuda_hlg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hlg_csmm.F90 b/cuda/impl/psb_s_cuda_hlg_csmm.F90 index 0dc28c7f6..2d6428882 100644 --- a/cuda/impl/psb_s_cuda_hlg_csmm.F90 +++ b/cuda/impl/psb_s_cuda_hlg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hlg_csmv.F90 b/cuda/impl/psb_s_cuda_hlg_csmv.F90 index c029c9081..4fff1ab5b 100644 --- a/cuda/impl/psb_s_cuda_hlg_csmv.F90 +++ b/cuda/impl/psb_s_cuda_hlg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hlg_from_gpu.F90 b/cuda/impl/psb_s_cuda_hlg_from_gpu.F90 index 8d9a315b7..39526c34a 100644 --- a/cuda/impl/psb_s_cuda_hlg_from_gpu.F90 +++ b/cuda/impl/psb_s_cuda_hlg_from_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hlg_inner_vect_sv.F90 b/cuda/impl/psb_s_cuda_hlg_inner_vect_sv.F90 index 2985a1ab3..77c392375 100644 --- a/cuda/impl/psb_s_cuda_hlg_inner_vect_sv.F90 +++ b/cuda/impl/psb_s_cuda_hlg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hlg_mold.F90 b/cuda/impl/psb_s_cuda_hlg_mold.F90 index 89e329e7f..783fe71ed 100644 --- a/cuda/impl/psb_s_cuda_hlg_mold.F90 +++ b/cuda/impl/psb_s_cuda_hlg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hlg_reallocate_nz.F90 b/cuda/impl/psb_s_cuda_hlg_reallocate_nz.F90 index 037429586..33bff84f5 100644 --- a/cuda/impl/psb_s_cuda_hlg_reallocate_nz.F90 +++ b/cuda/impl/psb_s_cuda_hlg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hlg_scal.F90 b/cuda/impl/psb_s_cuda_hlg_scal.F90 index 7074b8b68..116b29db1 100644 --- a/cuda/impl/psb_s_cuda_hlg_scal.F90 +++ b/cuda/impl/psb_s_cuda_hlg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hlg_scals.F90 b/cuda/impl/psb_s_cuda_hlg_scals.F90 index 2c9f5ae88..faf1b411c 100644 --- a/cuda/impl/psb_s_cuda_hlg_scals.F90 +++ b/cuda/impl/psb_s_cuda_hlg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hlg_to_gpu.F90 b/cuda/impl/psb_s_cuda_hlg_to_gpu.F90 index 91cfd5ad0..ab158c2fa 100644 --- a/cuda/impl/psb_s_cuda_hlg_to_gpu.F90 +++ b/cuda/impl/psb_s_cuda_hlg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hlg_vect_mv.F90 b/cuda/impl/psb_s_cuda_hlg_vect_mv.F90 index 946969491..9b5197d7d 100644 --- a/cuda/impl/psb_s_cuda_hlg_vect_mv.F90 +++ b/cuda/impl/psb_s_cuda_hlg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hybg_allocate_mnnz.F90 b/cuda/impl/psb_s_cuda_hybg_allocate_mnnz.F90 index a8e31ad81..349043ecc 100644 --- a/cuda/impl/psb_s_cuda_hybg_allocate_mnnz.F90 +++ b/cuda/impl/psb_s_cuda_hybg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hybg_csmm.F90 b/cuda/impl/psb_s_cuda_hybg_csmm.F90 index 85250fe33..d0705ce4d 100644 --- a/cuda/impl/psb_s_cuda_hybg_csmm.F90 +++ b/cuda/impl/psb_s_cuda_hybg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hybg_csmv.F90 b/cuda/impl/psb_s_cuda_hybg_csmv.F90 index 993195f17..880253e08 100644 --- a/cuda/impl/psb_s_cuda_hybg_csmv.F90 +++ b/cuda/impl/psb_s_cuda_hybg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hybg_inner_vect_sv.F90 b/cuda/impl/psb_s_cuda_hybg_inner_vect_sv.F90 index 6a230f827..f4b6af83c 100644 --- a/cuda/impl/psb_s_cuda_hybg_inner_vect_sv.F90 +++ b/cuda/impl/psb_s_cuda_hybg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hybg_mold.F90 b/cuda/impl/psb_s_cuda_hybg_mold.F90 index d1b41c2b0..015beb36e 100644 --- a/cuda/impl/psb_s_cuda_hybg_mold.F90 +++ b/cuda/impl/psb_s_cuda_hybg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hybg_reallocate_nz.F90 b/cuda/impl/psb_s_cuda_hybg_reallocate_nz.F90 index d43da4d9d..d69ff47dd 100644 --- a/cuda/impl/psb_s_cuda_hybg_reallocate_nz.F90 +++ b/cuda/impl/psb_s_cuda_hybg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hybg_scal.F90 b/cuda/impl/psb_s_cuda_hybg_scal.F90 index b1e244261..9084af3eb 100644 --- a/cuda/impl/psb_s_cuda_hybg_scal.F90 +++ b/cuda/impl/psb_s_cuda_hybg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hybg_scals.F90 b/cuda/impl/psb_s_cuda_hybg_scals.F90 index 93c747568..39eefed8b 100644 --- a/cuda/impl/psb_s_cuda_hybg_scals.F90 +++ b/cuda/impl/psb_s_cuda_hybg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hybg_to_gpu.F90 b/cuda/impl/psb_s_cuda_hybg_to_gpu.F90 index 3f85a5c67..b34bd4ef5 100644 --- a/cuda/impl/psb_s_cuda_hybg_to_gpu.F90 +++ b/cuda/impl/psb_s_cuda_hybg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_hybg_vect_mv.F90 b/cuda/impl/psb_s_cuda_hybg_vect_mv.F90 index e786afe10..bbc6c5756 100644 --- a/cuda/impl/psb_s_cuda_hybg_vect_mv.F90 +++ b/cuda/impl/psb_s_cuda_hybg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_mv_csrg_from_coo.F90 b/cuda/impl/psb_s_cuda_mv_csrg_from_coo.F90 index b61e94d68..a3837a91c 100644 --- a/cuda/impl/psb_s_cuda_mv_csrg_from_coo.F90 +++ b/cuda/impl/psb_s_cuda_mv_csrg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_mv_csrg_from_fmt.F90 b/cuda/impl/psb_s_cuda_mv_csrg_from_fmt.F90 index 52643a10c..f8f80e4b5 100644 --- a/cuda/impl/psb_s_cuda_mv_csrg_from_fmt.F90 +++ b/cuda/impl/psb_s_cuda_mv_csrg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_mv_diag_from_coo.F90 b/cuda/impl/psb_s_cuda_mv_diag_from_coo.F90 index 1b2fe8a1c..53cbbfb2c 100644 --- a/cuda/impl/psb_s_cuda_mv_diag_from_coo.F90 +++ b/cuda/impl/psb_s_cuda_mv_diag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_mv_elg_from_coo.F90 b/cuda/impl/psb_s_cuda_mv_elg_from_coo.F90 index e8dbbabfc..dff1437d9 100644 --- a/cuda/impl/psb_s_cuda_mv_elg_from_coo.F90 +++ b/cuda/impl/psb_s_cuda_mv_elg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_mv_elg_from_fmt.F90 b/cuda/impl/psb_s_cuda_mv_elg_from_fmt.F90 index 21d9a339b..0be48fca2 100644 --- a/cuda/impl/psb_s_cuda_mv_elg_from_fmt.F90 +++ b/cuda/impl/psb_s_cuda_mv_elg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_mv_hdiag_from_coo.F90 b/cuda/impl/psb_s_cuda_mv_hdiag_from_coo.F90 index b0370ebb0..5c852d9c8 100644 --- a/cuda/impl/psb_s_cuda_mv_hdiag_from_coo.F90 +++ b/cuda/impl/psb_s_cuda_mv_hdiag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_mv_hlg_from_coo.F90 b/cuda/impl/psb_s_cuda_mv_hlg_from_coo.F90 index 4c8aab71a..bf6021fc4 100644 --- a/cuda/impl/psb_s_cuda_mv_hlg_from_coo.F90 +++ b/cuda/impl/psb_s_cuda_mv_hlg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_mv_hlg_from_fmt.F90 b/cuda/impl/psb_s_cuda_mv_hlg_from_fmt.F90 index a162e2aaf..b21482cf8 100644 --- a/cuda/impl/psb_s_cuda_mv_hlg_from_fmt.F90 +++ b/cuda/impl/psb_s_cuda_mv_hlg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_mv_hybg_from_coo.F90 b/cuda/impl/psb_s_cuda_mv_hybg_from_coo.F90 index a22741fcd..7e78211b3 100644 --- a/cuda/impl/psb_s_cuda_mv_hybg_from_coo.F90 +++ b/cuda/impl/psb_s_cuda_mv_hybg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_s_cuda_mv_hybg_from_fmt.F90 b/cuda/impl/psb_s_cuda_mv_hybg_from_fmt.F90 index 53865e65b..567bc4ad5 100644 --- a/cuda/impl/psb_s_cuda_mv_hybg_from_fmt.F90 +++ b/cuda/impl/psb_s_cuda_mv_hybg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_cp_csrg_from_coo.F90 b/cuda/impl/psb_z_cuda_cp_csrg_from_coo.F90 index 90f3fb4f7..a96a7272b 100644 --- a/cuda/impl/psb_z_cuda_cp_csrg_from_coo.F90 +++ b/cuda/impl/psb_z_cuda_cp_csrg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_cp_csrg_from_fmt.F90 b/cuda/impl/psb_z_cuda_cp_csrg_from_fmt.F90 index e086c8a49..037573029 100644 --- a/cuda/impl/psb_z_cuda_cp_csrg_from_fmt.F90 +++ b/cuda/impl/psb_z_cuda_cp_csrg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_cp_diag_from_coo.F90 b/cuda/impl/psb_z_cuda_cp_diag_from_coo.F90 index 347065024..a13f40548 100644 --- a/cuda/impl/psb_z_cuda_cp_diag_from_coo.F90 +++ b/cuda/impl/psb_z_cuda_cp_diag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_cp_elg_from_coo.F90 b/cuda/impl/psb_z_cuda_cp_elg_from_coo.F90 index e8553cbf0..15d32d5a8 100644 --- a/cuda/impl/psb_z_cuda_cp_elg_from_coo.F90 +++ b/cuda/impl/psb_z_cuda_cp_elg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_cp_elg_from_fmt.F90 b/cuda/impl/psb_z_cuda_cp_elg_from_fmt.F90 index 85066cef7..eaad3b87f 100644 --- a/cuda/impl/psb_z_cuda_cp_elg_from_fmt.F90 +++ b/cuda/impl/psb_z_cuda_cp_elg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_cp_hdiag_from_coo.F90 b/cuda/impl/psb_z_cuda_cp_hdiag_from_coo.F90 index 36013faa1..cac0954df 100644 --- a/cuda/impl/psb_z_cuda_cp_hdiag_from_coo.F90 +++ b/cuda/impl/psb_z_cuda_cp_hdiag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_cp_hlg_from_coo.F90 b/cuda/impl/psb_z_cuda_cp_hlg_from_coo.F90 index f7be08358..121dea29b 100644 --- a/cuda/impl/psb_z_cuda_cp_hlg_from_coo.F90 +++ b/cuda/impl/psb_z_cuda_cp_hlg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_cp_hlg_from_fmt.F90 b/cuda/impl/psb_z_cuda_cp_hlg_from_fmt.F90 index 253a034f0..4054c90ad 100644 --- a/cuda/impl/psb_z_cuda_cp_hlg_from_fmt.F90 +++ b/cuda/impl/psb_z_cuda_cp_hlg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_cp_hybg_from_coo.F90 b/cuda/impl/psb_z_cuda_cp_hybg_from_coo.F90 index f49742cd2..33f900951 100644 --- a/cuda/impl/psb_z_cuda_cp_hybg_from_coo.F90 +++ b/cuda/impl/psb_z_cuda_cp_hybg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_cp_hybg_from_fmt.F90 b/cuda/impl/psb_z_cuda_cp_hybg_from_fmt.F90 index bc59cdba7..d062bca94 100644 --- a/cuda/impl/psb_z_cuda_cp_hybg_from_fmt.F90 +++ b/cuda/impl/psb_z_cuda_cp_hybg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_csrg_allocate_mnnz.F90 b/cuda/impl/psb_z_cuda_csrg_allocate_mnnz.F90 index a7988dd37..ea7ee2a7f 100644 --- a/cuda/impl/psb_z_cuda_csrg_allocate_mnnz.F90 +++ b/cuda/impl/psb_z_cuda_csrg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_csrg_csmm.F90 b/cuda/impl/psb_z_cuda_csrg_csmm.F90 index 731b7417e..4395f0dbc 100644 --- a/cuda/impl/psb_z_cuda_csrg_csmm.F90 +++ b/cuda/impl/psb_z_cuda_csrg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_csrg_csmv.F90 b/cuda/impl/psb_z_cuda_csrg_csmv.F90 index f6b01e7e4..b74d446b7 100644 --- a/cuda/impl/psb_z_cuda_csrg_csmv.F90 +++ b/cuda/impl/psb_z_cuda_csrg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_csrg_from_gpu.F90 b/cuda/impl/psb_z_cuda_csrg_from_gpu.F90 index 202f9f751..f40c25d30 100644 --- a/cuda/impl/psb_z_cuda_csrg_from_gpu.F90 +++ b/cuda/impl/psb_z_cuda_csrg_from_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_csrg_inner_vect_sv.F90 b/cuda/impl/psb_z_cuda_csrg_inner_vect_sv.F90 index 9a3f8281c..31600091b 100644 --- a/cuda/impl/psb_z_cuda_csrg_inner_vect_sv.F90 +++ b/cuda/impl/psb_z_cuda_csrg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_csrg_mold.F90 b/cuda/impl/psb_z_cuda_csrg_mold.F90 index 23bb658ae..59079041d 100644 --- a/cuda/impl/psb_z_cuda_csrg_mold.F90 +++ b/cuda/impl/psb_z_cuda_csrg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_csrg_reallocate_nz.F90 b/cuda/impl/psb_z_cuda_csrg_reallocate_nz.F90 index 964cd84e0..fbffb371c 100644 --- a/cuda/impl/psb_z_cuda_csrg_reallocate_nz.F90 +++ b/cuda/impl/psb_z_cuda_csrg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_csrg_scal.F90 b/cuda/impl/psb_z_cuda_csrg_scal.F90 index 9d97433e3..d9d5c172f 100644 --- a/cuda/impl/psb_z_cuda_csrg_scal.F90 +++ b/cuda/impl/psb_z_cuda_csrg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_csrg_scals.F90 b/cuda/impl/psb_z_cuda_csrg_scals.F90 index 1479ea3aa..712858290 100644 --- a/cuda/impl/psb_z_cuda_csrg_scals.F90 +++ b/cuda/impl/psb_z_cuda_csrg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_csrg_to_gpu.F90 b/cuda/impl/psb_z_cuda_csrg_to_gpu.F90 index 154c91f8e..781bb8d8e 100644 --- a/cuda/impl/psb_z_cuda_csrg_to_gpu.F90 +++ b/cuda/impl/psb_z_cuda_csrg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_csrg_vect_mv.F90 b/cuda/impl/psb_z_cuda_csrg_vect_mv.F90 index 977d7ff99..7f9d63013 100644 --- a/cuda/impl/psb_z_cuda_csrg_vect_mv.F90 +++ b/cuda/impl/psb_z_cuda_csrg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_diag_csmv.F90 b/cuda/impl/psb_z_cuda_diag_csmv.F90 index fde7147e7..8a7943f38 100644 --- a/cuda/impl/psb_z_cuda_diag_csmv.F90 +++ b/cuda/impl/psb_z_cuda_diag_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_diag_mold.F90 b/cuda/impl/psb_z_cuda_diag_mold.F90 index 5b11b41c9..4ed593703 100644 --- a/cuda/impl/psb_z_cuda_diag_mold.F90 +++ b/cuda/impl/psb_z_cuda_diag_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_diag_to_gpu.F90 b/cuda/impl/psb_z_cuda_diag_to_gpu.F90 index 672ce9385..4e8e866d8 100644 --- a/cuda/impl/psb_z_cuda_diag_to_gpu.F90 +++ b/cuda/impl/psb_z_cuda_diag_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_diag_vect_mv.F90 b/cuda/impl/psb_z_cuda_diag_vect_mv.F90 index c6d11f045..fd55c4f1f 100644 --- a/cuda/impl/psb_z_cuda_diag_vect_mv.F90 +++ b/cuda/impl/psb_z_cuda_diag_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_dnsg_mat_impl.F90 b/cuda/impl/psb_z_cuda_dnsg_mat_impl.F90 index 7f41b22d4..66dfa7595 100644 --- a/cuda/impl/psb_z_cuda_dnsg_mat_impl.F90 +++ b/cuda/impl/psb_z_cuda_dnsg_mat_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_allocate_mnnz.F90 b/cuda/impl/psb_z_cuda_elg_allocate_mnnz.F90 index 5c54d00bc..cf9e1533d 100644 --- a/cuda/impl/psb_z_cuda_elg_allocate_mnnz.F90 +++ b/cuda/impl/psb_z_cuda_elg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_asb.f90 b/cuda/impl/psb_z_cuda_elg_asb.f90 index 65b584257..7f5a10ab3 100644 --- a/cuda/impl/psb_z_cuda_elg_asb.f90 +++ b/cuda/impl/psb_z_cuda_elg_asb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_csmm.F90 b/cuda/impl/psb_z_cuda_elg_csmm.F90 index 4414f0e60..78be93e3a 100644 --- a/cuda/impl/psb_z_cuda_elg_csmm.F90 +++ b/cuda/impl/psb_z_cuda_elg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_csmv.F90 b/cuda/impl/psb_z_cuda_elg_csmv.F90 index 060147b91..2b875c838 100644 --- a/cuda/impl/psb_z_cuda_elg_csmv.F90 +++ b/cuda/impl/psb_z_cuda_elg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_csput.F90 b/cuda/impl/psb_z_cuda_elg_csput.F90 index a9eb7c433..b55c5ba9b 100644 --- a/cuda/impl/psb_z_cuda_elg_csput.F90 +++ b/cuda/impl/psb_z_cuda_elg_csput.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_from_gpu.F90 b/cuda/impl/psb_z_cuda_elg_from_gpu.F90 index b1291ab2f..4aa5c0cff 100644 --- a/cuda/impl/psb_z_cuda_elg_from_gpu.F90 +++ b/cuda/impl/psb_z_cuda_elg_from_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_inner_vect_sv.F90 b/cuda/impl/psb_z_cuda_elg_inner_vect_sv.F90 index 443e7cbb1..dbce28980 100644 --- a/cuda/impl/psb_z_cuda_elg_inner_vect_sv.F90 +++ b/cuda/impl/psb_z_cuda_elg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_mold.F90 b/cuda/impl/psb_z_cuda_elg_mold.F90 index e9a3891da..86b0d56cc 100644 --- a/cuda/impl/psb_z_cuda_elg_mold.F90 +++ b/cuda/impl/psb_z_cuda_elg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_reallocate_nz.F90 b/cuda/impl/psb_z_cuda_elg_reallocate_nz.F90 index 3a8c2760f..233f44162 100644 --- a/cuda/impl/psb_z_cuda_elg_reallocate_nz.F90 +++ b/cuda/impl/psb_z_cuda_elg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_scal.F90 b/cuda/impl/psb_z_cuda_elg_scal.F90 index a98463625..9863c7264 100644 --- a/cuda/impl/psb_z_cuda_elg_scal.F90 +++ b/cuda/impl/psb_z_cuda_elg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_scals.F90 b/cuda/impl/psb_z_cuda_elg_scals.F90 index b44625890..02a505ab4 100644 --- a/cuda/impl/psb_z_cuda_elg_scals.F90 +++ b/cuda/impl/psb_z_cuda_elg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_to_gpu.F90 b/cuda/impl/psb_z_cuda_elg_to_gpu.F90 index 3a0ecd140..18d0e359c 100644 --- a/cuda/impl/psb_z_cuda_elg_to_gpu.F90 +++ b/cuda/impl/psb_z_cuda_elg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_trim.f90 b/cuda/impl/psb_z_cuda_elg_trim.f90 index 98f92efe5..9c51bdc1f 100644 --- a/cuda/impl/psb_z_cuda_elg_trim.f90 +++ b/cuda/impl/psb_z_cuda_elg_trim.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_elg_vect_mv.F90 b/cuda/impl/psb_z_cuda_elg_vect_mv.F90 index 1b1a0720b..7000de4b0 100644 --- a/cuda/impl/psb_z_cuda_elg_vect_mv.F90 +++ b/cuda/impl/psb_z_cuda_elg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hdiag_csmv.F90 b/cuda/impl/psb_z_cuda_hdiag_csmv.F90 index 187655a8c..51a9cf8b1 100644 --- a/cuda/impl/psb_z_cuda_hdiag_csmv.F90 +++ b/cuda/impl/psb_z_cuda_hdiag_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hdiag_mold.F90 b/cuda/impl/psb_z_cuda_hdiag_mold.F90 index 7b86b3a37..4221211ea 100644 --- a/cuda/impl/psb_z_cuda_hdiag_mold.F90 +++ b/cuda/impl/psb_z_cuda_hdiag_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hdiag_to_gpu.F90 b/cuda/impl/psb_z_cuda_hdiag_to_gpu.F90 index a11409612..9bde8c6c2 100644 --- a/cuda/impl/psb_z_cuda_hdiag_to_gpu.F90 +++ b/cuda/impl/psb_z_cuda_hdiag_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hdiag_vect_mv.F90 b/cuda/impl/psb_z_cuda_hdiag_vect_mv.F90 index aef5628c5..667ba8a9e 100644 --- a/cuda/impl/psb_z_cuda_hdiag_vect_mv.F90 +++ b/cuda/impl/psb_z_cuda_hdiag_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hlg_allocate_mnnz.F90 b/cuda/impl/psb_z_cuda_hlg_allocate_mnnz.F90 index f85666612..aebcca1d1 100644 --- a/cuda/impl/psb_z_cuda_hlg_allocate_mnnz.F90 +++ b/cuda/impl/psb_z_cuda_hlg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hlg_csmm.F90 b/cuda/impl/psb_z_cuda_hlg_csmm.F90 index 8eb30ef9f..3bf65cc15 100644 --- a/cuda/impl/psb_z_cuda_hlg_csmm.F90 +++ b/cuda/impl/psb_z_cuda_hlg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hlg_csmv.F90 b/cuda/impl/psb_z_cuda_hlg_csmv.F90 index 1a8070169..81229f362 100644 --- a/cuda/impl/psb_z_cuda_hlg_csmv.F90 +++ b/cuda/impl/psb_z_cuda_hlg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hlg_from_gpu.F90 b/cuda/impl/psb_z_cuda_hlg_from_gpu.F90 index 8260ecd73..0cd72c4d2 100644 --- a/cuda/impl/psb_z_cuda_hlg_from_gpu.F90 +++ b/cuda/impl/psb_z_cuda_hlg_from_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hlg_inner_vect_sv.F90 b/cuda/impl/psb_z_cuda_hlg_inner_vect_sv.F90 index 6a914fc0c..d776a0ca1 100644 --- a/cuda/impl/psb_z_cuda_hlg_inner_vect_sv.F90 +++ b/cuda/impl/psb_z_cuda_hlg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hlg_mold.F90 b/cuda/impl/psb_z_cuda_hlg_mold.F90 index bc631eced..964abb264 100644 --- a/cuda/impl/psb_z_cuda_hlg_mold.F90 +++ b/cuda/impl/psb_z_cuda_hlg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hlg_reallocate_nz.F90 b/cuda/impl/psb_z_cuda_hlg_reallocate_nz.F90 index ac3fbbd10..5862c55cf 100644 --- a/cuda/impl/psb_z_cuda_hlg_reallocate_nz.F90 +++ b/cuda/impl/psb_z_cuda_hlg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hlg_scal.F90 b/cuda/impl/psb_z_cuda_hlg_scal.F90 index 7b9df998a..d96300539 100644 --- a/cuda/impl/psb_z_cuda_hlg_scal.F90 +++ b/cuda/impl/psb_z_cuda_hlg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hlg_scals.F90 b/cuda/impl/psb_z_cuda_hlg_scals.F90 index b867e3b85..0284be5d9 100644 --- a/cuda/impl/psb_z_cuda_hlg_scals.F90 +++ b/cuda/impl/psb_z_cuda_hlg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hlg_to_gpu.F90 b/cuda/impl/psb_z_cuda_hlg_to_gpu.F90 index 8f81842a7..22656cd92 100644 --- a/cuda/impl/psb_z_cuda_hlg_to_gpu.F90 +++ b/cuda/impl/psb_z_cuda_hlg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hlg_vect_mv.F90 b/cuda/impl/psb_z_cuda_hlg_vect_mv.F90 index e2e93b851..2b0f123f2 100644 --- a/cuda/impl/psb_z_cuda_hlg_vect_mv.F90 +++ b/cuda/impl/psb_z_cuda_hlg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hybg_allocate_mnnz.F90 b/cuda/impl/psb_z_cuda_hybg_allocate_mnnz.F90 index dbfbfb916..69a89007a 100644 --- a/cuda/impl/psb_z_cuda_hybg_allocate_mnnz.F90 +++ b/cuda/impl/psb_z_cuda_hybg_allocate_mnnz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hybg_csmm.F90 b/cuda/impl/psb_z_cuda_hybg_csmm.F90 index 3c53acbd2..0da8702b3 100644 --- a/cuda/impl/psb_z_cuda_hybg_csmm.F90 +++ b/cuda/impl/psb_z_cuda_hybg_csmm.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hybg_csmv.F90 b/cuda/impl/psb_z_cuda_hybg_csmv.F90 index 17b35b405..9f0c2606d 100644 --- a/cuda/impl/psb_z_cuda_hybg_csmv.F90 +++ b/cuda/impl/psb_z_cuda_hybg_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hybg_inner_vect_sv.F90 b/cuda/impl/psb_z_cuda_hybg_inner_vect_sv.F90 index 9b06d4993..b6bf86ff4 100644 --- a/cuda/impl/psb_z_cuda_hybg_inner_vect_sv.F90 +++ b/cuda/impl/psb_z_cuda_hybg_inner_vect_sv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hybg_mold.F90 b/cuda/impl/psb_z_cuda_hybg_mold.F90 index 236c83599..27517ea34 100644 --- a/cuda/impl/psb_z_cuda_hybg_mold.F90 +++ b/cuda/impl/psb_z_cuda_hybg_mold.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hybg_reallocate_nz.F90 b/cuda/impl/psb_z_cuda_hybg_reallocate_nz.F90 index 2479226c7..a6631661d 100644 --- a/cuda/impl/psb_z_cuda_hybg_reallocate_nz.F90 +++ b/cuda/impl/psb_z_cuda_hybg_reallocate_nz.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hybg_scal.F90 b/cuda/impl/psb_z_cuda_hybg_scal.F90 index c365499f2..58fe7c289 100644 --- a/cuda/impl/psb_z_cuda_hybg_scal.F90 +++ b/cuda/impl/psb_z_cuda_hybg_scal.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hybg_scals.F90 b/cuda/impl/psb_z_cuda_hybg_scals.F90 index 95bb12733..1bc9e81d2 100644 --- a/cuda/impl/psb_z_cuda_hybg_scals.F90 +++ b/cuda/impl/psb_z_cuda_hybg_scals.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hybg_to_gpu.F90 b/cuda/impl/psb_z_cuda_hybg_to_gpu.F90 index b75f9df7e..6295c929f 100644 --- a/cuda/impl/psb_z_cuda_hybg_to_gpu.F90 +++ b/cuda/impl/psb_z_cuda_hybg_to_gpu.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_hybg_vect_mv.F90 b/cuda/impl/psb_z_cuda_hybg_vect_mv.F90 index a5c082de7..0432f2bde 100644 --- a/cuda/impl/psb_z_cuda_hybg_vect_mv.F90 +++ b/cuda/impl/psb_z_cuda_hybg_vect_mv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_mv_csrg_from_coo.F90 b/cuda/impl/psb_z_cuda_mv_csrg_from_coo.F90 index 7cfd4f191..0691bcf8a 100644 --- a/cuda/impl/psb_z_cuda_mv_csrg_from_coo.F90 +++ b/cuda/impl/psb_z_cuda_mv_csrg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_mv_csrg_from_fmt.F90 b/cuda/impl/psb_z_cuda_mv_csrg_from_fmt.F90 index f03294c8d..4ad93f174 100644 --- a/cuda/impl/psb_z_cuda_mv_csrg_from_fmt.F90 +++ b/cuda/impl/psb_z_cuda_mv_csrg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_mv_diag_from_coo.F90 b/cuda/impl/psb_z_cuda_mv_diag_from_coo.F90 index 8e702e7ea..3d8678d2f 100644 --- a/cuda/impl/psb_z_cuda_mv_diag_from_coo.F90 +++ b/cuda/impl/psb_z_cuda_mv_diag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_mv_elg_from_coo.F90 b/cuda/impl/psb_z_cuda_mv_elg_from_coo.F90 index f0cb23f39..c161b7d44 100644 --- a/cuda/impl/psb_z_cuda_mv_elg_from_coo.F90 +++ b/cuda/impl/psb_z_cuda_mv_elg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_mv_elg_from_fmt.F90 b/cuda/impl/psb_z_cuda_mv_elg_from_fmt.F90 index 29f634233..e247442d7 100644 --- a/cuda/impl/psb_z_cuda_mv_elg_from_fmt.F90 +++ b/cuda/impl/psb_z_cuda_mv_elg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_mv_hdiag_from_coo.F90 b/cuda/impl/psb_z_cuda_mv_hdiag_from_coo.F90 index dd6dae1e5..f3d05ace7 100644 --- a/cuda/impl/psb_z_cuda_mv_hdiag_from_coo.F90 +++ b/cuda/impl/psb_z_cuda_mv_hdiag_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_mv_hlg_from_coo.F90 b/cuda/impl/psb_z_cuda_mv_hlg_from_coo.F90 index 609680b92..3c3e3278a 100644 --- a/cuda/impl/psb_z_cuda_mv_hlg_from_coo.F90 +++ b/cuda/impl/psb_z_cuda_mv_hlg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_mv_hlg_from_fmt.F90 b/cuda/impl/psb_z_cuda_mv_hlg_from_fmt.F90 index e67c8d83c..66eed8793 100644 --- a/cuda/impl/psb_z_cuda_mv_hlg_from_fmt.F90 +++ b/cuda/impl/psb_z_cuda_mv_hlg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_mv_hybg_from_coo.F90 b/cuda/impl/psb_z_cuda_mv_hybg_from_coo.F90 index dbf0e5122..dc694ae2e 100644 --- a/cuda/impl/psb_z_cuda_mv_hybg_from_coo.F90 +++ b/cuda/impl/psb_z_cuda_mv_hybg_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/impl/psb_z_cuda_mv_hybg_from_fmt.F90 b/cuda/impl/psb_z_cuda_mv_hybg_from_fmt.F90 index d39da2913..a820ac42e 100644 --- a/cuda/impl/psb_z_cuda_mv_hybg_from_fmt.F90 +++ b/cuda/impl/psb_z_cuda_mv_hybg_from_fmt.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/ivectordev.c b/cuda/ivectordev.c index f908e3917..1e139d578 100644 --- a/cuda/ivectordev.c +++ b/cuda/ivectordev.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -42,6 +42,14 @@ int registerMappedInt(void *buff, void **d_p, int n, int dummy) return registerMappedMemory(buff,d_p,((size_t) n)*sizeof(int)); } +int checkMultiVecDeviceInt(void* deviceMultiVec) +{ + struct MultiVectDevice *devVec = (struct MultiVectDevice *) deviceMultiVec; + fprintf(stderr,"checkMultiVecDeviceInt Size: %d Pointer %p\n", + devVec->size_,devVec->v_); + return(0); +} + int writeMultiVecDeviceInt(void* deviceVec, int* hostVec) { int i; struct MultiVectDevice *devVec = (struct MultiVectDevice *) deviceVec; diff --git a/cuda/ivectordev.h b/cuda/ivectordev.h index 6f3a32a08..54811a5a5 100644 --- a/cuda/ivectordev.h +++ b/cuda/ivectordev.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -38,6 +38,7 @@ #include "vector.h" int registerMappedInt(void *, void **, int, int); +int checkMultiVecDeviceInt(void* deviceMultiVec); int writeMultiVecDeviceInt(void* deviceMultiVec, int* hostMultiVec); int writeMultiVecDeviceIntR2(void* deviceMultiVec, int* hostMultiVec, int ld); int readMultiVecDeviceInt(void* deviceMultiVec, int* hostMultiVec); diff --git a/cuda/psb_base_vectordev_mod.F90 b/cuda/psb_base_vectordev_mod.F90 index da02b2f33..955e268fd 100644 --- a/cuda/psb_base_vectordev_mod.F90 +++ b/cuda/psb_base_vectordev_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_c_cuda_csrg_mat_mod.F90 b/cuda/psb_c_cuda_csrg_mat_mod.F90 index 1fdeec4a7..e86106603 100644 --- a/cuda/psb_c_cuda_csrg_mat_mod.F90 +++ b/cuda/psb_c_cuda_csrg_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_c_cuda_diag_mat_mod.F90 b/cuda/psb_c_cuda_diag_mat_mod.F90 index d3232965f..20bff37fc 100644 --- a/cuda/psb_c_cuda_diag_mat_mod.F90 +++ b/cuda/psb_c_cuda_diag_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_c_cuda_dnsg_mat_mod.F90 b/cuda/psb_c_cuda_dnsg_mat_mod.F90 index 97bacb7df..736fc505f 100644 --- a/cuda/psb_c_cuda_dnsg_mat_mod.F90 +++ b/cuda/psb_c_cuda_dnsg_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_c_cuda_elg_mat_mod.F90 b/cuda/psb_c_cuda_elg_mat_mod.F90 index c507a6c71..a152f413a 100644 --- a/cuda/psb_c_cuda_elg_mat_mod.F90 +++ b/cuda/psb_c_cuda_elg_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_c_cuda_hdiag_mat_mod.F90 b/cuda/psb_c_cuda_hdiag_mat_mod.F90 index f06e501ea..070dc0d53 100644 --- a/cuda/psb_c_cuda_hdiag_mat_mod.F90 +++ b/cuda/psb_c_cuda_hdiag_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_c_cuda_hlg_mat_mod.F90 b/cuda/psb_c_cuda_hlg_mat_mod.F90 index 5b80d3f6f..07fb159bf 100644 --- a/cuda/psb_c_cuda_hlg_mat_mod.F90 +++ b/cuda/psb_c_cuda_hlg_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_c_cuda_hybg_mat_mod.F90 b/cuda/psb_c_cuda_hybg_mat_mod.F90 index 89ec14a53..5ebff1e96 100644 --- a/cuda/psb_c_cuda_hybg_mat_mod.F90 +++ b/cuda/psb_c_cuda_hybg_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_c_cuda_vect_mod.F90 b/cuda/psb_c_cuda_vect_mod.F90 index 95f6d6025..8d49f7a4b 100644 --- a/cuda/psb_c_cuda_vect_mod.F90 +++ b/cuda/psb_c_cuda_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -86,6 +86,7 @@ module psb_c_cuda_vect_mod procedure, nopass :: device_wait => c_cuda_device_wait procedure, pass(x) :: free_buffer => c_cuda_free_buffer procedure, pass(x) :: maybe_free_buffer => c_cuda_maybe_free_buffer + procedure, pass(x) :: check_addr => c_cuda_check_addr procedure, pass(x) :: dot_v => c_cuda_dot_v procedure, pass(x) :: dot_a => c_cuda_dot_a procedure, pass(y) :: axpby_v => c_cuda_axpby_v @@ -219,6 +220,17 @@ contains end subroutine c_cuda_free_buffer + subroutine c_cuda_check_addr(x) + class(psb_c_vect_cuda), intent(inout) :: x + integer(psb_ipk_) info; + select type(ii=> x) + class is (psb_c_vect_cuda) + info = checkMultiVecDeviceFloatComplex(x%deviceVect) + class default + write(0,*) 'Check addr: cuda version, why am I here? ' + end select + end subroutine c_cuda_check_addr + subroutine c_cuda_gthzv_x(i,n,idx,x,y) use psb_cuda_env_mod use psi_serial_mod @@ -560,12 +572,20 @@ contains end subroutine c_cuda_sctb_buf - subroutine c_cuda_bld_x(x,this) + subroutine c_cuda_bld_x(x,this,scratch) use psb_base_mod complex(psb_spk_), intent(in) :: this(:) class(psb_c_vect_cuda), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(size(this),x%v,info) if (info /= 0) then info=psb_err_alloc_request_ @@ -578,11 +598,19 @@ contains end subroutine c_cuda_bld_x - subroutine c_cuda_bld_mn(x,n) + subroutine c_cuda_bld_mn(x,n,scratch) integer(psb_mpk_), intent(in) :: n class(psb_c_vect_cuda), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%all(n,info) if (info /= 0) then call psb_errpush(info,'c_cuda_bld_n',i_err=(/n,n,n,n,n/)) @@ -679,26 +707,34 @@ contains call x%set_scal(czero) end subroutine c_cuda_zero - subroutine c_cuda_asb_m(n, x, info) + subroutine c_cuda_asb_m(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_c_vect_cuda), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_mpk_) :: nd - + + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (x%is_dev()) then nd = getMultiVecDeviceSize(x%deviceVect) if (nd < n) then call x%sync() - call x%psb_c_base_vect_type%asb(n,info) + call x%psb_c_base_vect_type%asb(n,info,scratch=scratch_) if (info == psb_success_) call x%sync_space(info) call x%set_host() end if else ! if (x%get_nrows()= 13000) + function psb_C_get_MemoryClockRate(dev) & + & result(res) bind(c,name='getGPUMemoryClockRate') + use iso_c_binding + integer(c_int), value :: dev + integer(c_int) :: res + end function psb_C_get_MemoryClockRate +#else function psb_C_get_MemoryClockRate() & & result(res) bind(c,name='getGPUMemoryClockRate') use iso_c_binding integer(c_int) :: res end function psb_C_get_MemoryClockRate +#endif function psb_C_get_WarpSize() & & result(res) bind(c,name='getGPUWarpSize') use iso_c_binding @@ -174,8 +183,9 @@ module psb_cuda_env_mod end subroutine psb_C_cpy_NameString end interface - logical, private :: gpu_do_maybe_free_buffer = .false. - + logical, private, save :: gpu_do_maybe_free_buffer = .false. + integer(c_int), private, save :: myDevice + Contains function psb_cuda_get_maybe_free_buffer() result(res) @@ -217,6 +227,7 @@ Contains if (present(dev)) then info = psb_C_gpu_init(dev) + myDevice = dev else if (count >0) then dev_ = mod(iam,count) @@ -224,6 +235,7 @@ Contains dev_ = 0 end if info = psb_C_gpu_init(dev_) + myDevice = dev_ end if if (info == 0) info = initFcusparse() if (info /= 0) then @@ -283,7 +295,11 @@ Contains function psb_cuda_MemoryClockRate() result(res) integer(psb_ipk_) :: res +#if (PSB_CUDA_VERSION >= 13000) + res = psb_C_get_MemoryClockRate(myDevice) +#else res = psb_C_get_MemoryClockRate() +#endif end function psb_cuda_MemoryClockRate function psb_cuda_MemoryBusWidth() result(res) @@ -296,35 +312,18 @@ Contains ! Formula here: 2*ClockRate(KHz)*BusWidth(bit) ! normalization: bit/byte, KHz/MHz ! output: MBytes/s +#if PSB_CUDA_VERSION >= 13000 + res = 2.d0*0.125d0*1.d-3*psb_C_get_MemoryBusWidth()*psb_C_get_MemoryClockRate(myDevice) +#else res = 2.d0*0.125d0*1.d-3*psb_C_get_MemoryBusWidth()*psb_C_get_MemoryClockRate() +#endif end function psb_cuda_MemoryPeakBandwidth function psb_cuda_DeviceName() result(res) character(len=256) :: res character :: cstring(256) call psb_C_cpy_NameString(cstring) - call stringc2f(cstring,res) + call psb_stringc2f(cstring,res) end function psb_cuda_DeviceName - - subroutine stringc2f(cstring,fstring) - character(c_char) :: cstring(*) - character(len=*) :: fstring - integer :: i - - i = 1 - do - if (cstring(i) == c_null_char) exit - if (i > len(fstring)) exit - fstring(i:i) = cstring(i) - i = i + 1 - end do - do - if (i > len(fstring)) exit - fstring(i:i) = " " - i = i + 1 - end do - return - end subroutine stringc2f - end module psb_cuda_env_mod diff --git a/cuda/psb_cuda_mod.F90 b/cuda/psb_cuda_mod.F90 index 12b91b90e..b9f1b8c78 100644 --- a/cuda/psb_cuda_mod.F90 +++ b/cuda/psb_cuda_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_d_cuda_csrg_mat_mod.F90 b/cuda/psb_d_cuda_csrg_mat_mod.F90 index 101959bde..276637283 100644 --- a/cuda/psb_d_cuda_csrg_mat_mod.F90 +++ b/cuda/psb_d_cuda_csrg_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_d_cuda_diag_mat_mod.F90 b/cuda/psb_d_cuda_diag_mat_mod.F90 index 3f570799c..5d72ae501 100644 --- a/cuda/psb_d_cuda_diag_mat_mod.F90 +++ b/cuda/psb_d_cuda_diag_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_d_cuda_dnsg_mat_mod.F90 b/cuda/psb_d_cuda_dnsg_mat_mod.F90 index ffa17eeb4..1fdaba933 100644 --- a/cuda/psb_d_cuda_dnsg_mat_mod.F90 +++ b/cuda/psb_d_cuda_dnsg_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_d_cuda_elg_mat_mod.F90 b/cuda/psb_d_cuda_elg_mat_mod.F90 index 3fde2075f..74313ce99 100644 --- a/cuda/psb_d_cuda_elg_mat_mod.F90 +++ b/cuda/psb_d_cuda_elg_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_d_cuda_hdiag_mat_mod.F90 b/cuda/psb_d_cuda_hdiag_mat_mod.F90 index 46b63b43d..25a7f9249 100644 --- a/cuda/psb_d_cuda_hdiag_mat_mod.F90 +++ b/cuda/psb_d_cuda_hdiag_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_d_cuda_hlg_mat_mod.F90 b/cuda/psb_d_cuda_hlg_mat_mod.F90 index a1a2539d4..2f474ce41 100644 --- a/cuda/psb_d_cuda_hlg_mat_mod.F90 +++ b/cuda/psb_d_cuda_hlg_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_d_cuda_hybg_mat_mod.F90 b/cuda/psb_d_cuda_hybg_mat_mod.F90 index 4ff72f51f..220e8b680 100644 --- a/cuda/psb_d_cuda_hybg_mat_mod.F90 +++ b/cuda/psb_d_cuda_hybg_mat_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/psb_d_cuda_vect_mod.F90 b/cuda/psb_d_cuda_vect_mod.F90 index 080c86862..0dacc511a 100644 --- a/cuda/psb_d_cuda_vect_mod.F90 +++ b/cuda/psb_d_cuda_vect_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -86,6 +86,7 @@ module psb_d_cuda_vect_mod procedure, nopass :: device_wait => d_cuda_device_wait procedure, pass(x) :: free_buffer => d_cuda_free_buffer procedure, pass(x) :: maybe_free_buffer => d_cuda_maybe_free_buffer + procedure, pass(x) :: check_addr => d_cuda_check_addr procedure, pass(x) :: dot_v => d_cuda_dot_v procedure, pass(x) :: dot_a => d_cuda_dot_a procedure, pass(y) :: axpby_v => d_cuda_axpby_v @@ -219,6 +220,17 @@ contains end subroutine d_cuda_free_buffer + subroutine d_cuda_check_addr(x) + class(psb_d_vect_cuda), intent(inout) :: x + integer(psb_ipk_) info; + select type(ii=> x) + class is (psb_d_vect_cuda) + info = checkMultiVecDeviceDouble(x%deviceVect) + class default + write(0,*) 'Check addr: cuda version, why am I here? ' + end select + end subroutine d_cuda_check_addr + subroutine d_cuda_gthzv_x(i,n,idx,x,y) use psb_cuda_env_mod use psi_serial_mod @@ -560,12 +572,20 @@ contains end subroutine d_cuda_sctb_buf - subroutine d_cuda_bld_x(x,this) + subroutine d_cuda_bld_x(x,this,scratch) use psb_base_mod real(psb_dpk_), intent(in) :: this(:) class(psb_d_vect_cuda), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(size(this),x%v,info) if (info /= 0) then info=psb_err_alloc_request_ @@ -578,11 +598,19 @@ contains end subroutine d_cuda_bld_x - subroutine d_cuda_bld_mn(x,n) + subroutine d_cuda_bld_mn(x,n,scratch) integer(psb_mpk_), intent(in) :: n class(psb_d_vect_cuda), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%all(n,info) if (info /= 0) then call psb_errpush(info,'d_cuda_bld_n',i_err=(/n,n,n,n,n/)) @@ -679,26 +707,34 @@ contains call x%set_scal(dzero) end subroutine d_cuda_zero - subroutine d_cuda_asb_m(n, x, info) + subroutine d_cuda_asb_m(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_d_vect_cuda), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_mpk_) :: nd - + + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (x%is_dev()) then nd = getMultiVecDeviceSize(x%deviceVect) if (nd < n) then call x%sync() - call x%psb_d_base_vect_type%asb(n,info) + call x%psb_d_base_vect_type%asb(n,info,scratch=scratch_) if (info == psb_success_) call x%sync_space(info) call x%set_host() end if else ! if (x%get_nrows() i_cuda_device_wait procedure, pass(x) :: free_buffer => i_cuda_free_buffer procedure, pass(x) :: maybe_free_buffer => i_cuda_maybe_free_buffer + procedure, pass(x) :: check_addr => i_cuda_check_addr final :: i_cuda_vect_finalize end type psb_i_vect_cuda @@ -201,6 +202,17 @@ contains end subroutine i_cuda_free_buffer + subroutine i_cuda_check_addr(x) + class(psb_i_vect_cuda), intent(inout) :: x + integer(psb_ipk_) info; + select type(ii=> x) + class is (psb_i_vect_cuda) + info = checkMultiVecDeviceInt(x%deviceVect) + class default + write(0,*) 'Check addr: cuda version, why am I here? ' + end select + end subroutine i_cuda_check_addr + subroutine i_cuda_gthzv_x(i,n,idx,x,y) use psb_cuda_env_mod use psi_serial_mod @@ -542,12 +554,20 @@ contains end subroutine i_cuda_sctb_buf - subroutine i_cuda_bld_x(x,this) + subroutine i_cuda_bld_x(x,this,scratch) use psb_base_mod integer(psb_ipk_), intent(in) :: this(:) class(psb_i_vect_cuda), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(size(this),x%v,info) if (info /= 0) then info=psb_err_alloc_request_ @@ -560,11 +580,19 @@ contains end subroutine i_cuda_bld_x - subroutine i_cuda_bld_mn(x,n) + subroutine i_cuda_bld_mn(x,n,scratch) integer(psb_mpk_), intent(in) :: n class(psb_i_vect_cuda), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%all(n,info) if (info /= 0) then call psb_errpush(info,'i_cuda_bld_n',i_err=(/n,n,n,n,n/)) @@ -661,26 +689,34 @@ contains call x%set_scal(izero) end subroutine i_cuda_zero - subroutine i_cuda_asb_m(n, x, info) + subroutine i_cuda_asb_m(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_i_vect_cuda), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_mpk_) :: nd - + + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (x%is_dev()) then nd = getMultiVecDeviceSize(x%deviceVect) if (nd < n) then call x%sync() - call x%psb_i_base_vect_type%asb(n,info) + call x%psb_i_base_vect_type%asb(n,info,scratch=scratch_) if (info == psb_success_) call x%sync_space(info) call x%set_host() end if else ! if (x%get_nrows() s_cuda_device_wait procedure, pass(x) :: free_buffer => s_cuda_free_buffer procedure, pass(x) :: maybe_free_buffer => s_cuda_maybe_free_buffer + procedure, pass(x) :: check_addr => s_cuda_check_addr procedure, pass(x) :: dot_v => s_cuda_dot_v procedure, pass(x) :: dot_a => s_cuda_dot_a procedure, pass(y) :: axpby_v => s_cuda_axpby_v @@ -219,6 +220,17 @@ contains end subroutine s_cuda_free_buffer + subroutine s_cuda_check_addr(x) + class(psb_s_vect_cuda), intent(inout) :: x + integer(psb_ipk_) info; + select type(ii=> x) + class is (psb_s_vect_cuda) + info = checkMultiVecDeviceFloat(x%deviceVect) + class default + write(0,*) 'Check addr: cuda version, why am I here? ' + end select + end subroutine s_cuda_check_addr + subroutine s_cuda_gthzv_x(i,n,idx,x,y) use psb_cuda_env_mod use psi_serial_mod @@ -560,12 +572,20 @@ contains end subroutine s_cuda_sctb_buf - subroutine s_cuda_bld_x(x,this) + subroutine s_cuda_bld_x(x,this,scratch) use psb_base_mod real(psb_spk_), intent(in) :: this(:) class(psb_s_vect_cuda), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(size(this),x%v,info) if (info /= 0) then info=psb_err_alloc_request_ @@ -578,11 +598,19 @@ contains end subroutine s_cuda_bld_x - subroutine s_cuda_bld_mn(x,n) + subroutine s_cuda_bld_mn(x,n,scratch) integer(psb_mpk_), intent(in) :: n class(psb_s_vect_cuda), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%all(n,info) if (info /= 0) then call psb_errpush(info,'s_cuda_bld_n',i_err=(/n,n,n,n,n/)) @@ -679,26 +707,34 @@ contains call x%set_scal(szero) end subroutine s_cuda_zero - subroutine s_cuda_asb_m(n, x, info) + subroutine s_cuda_asb_m(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_s_vect_cuda), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_mpk_) :: nd - + + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (x%is_dev()) then nd = getMultiVecDeviceSize(x%deviceVect) if (nd < n) then call x%sync() - call x%psb_s_base_vect_type%asb(n,info) + call x%psb_s_base_vect_type%asb(n,info,scratch=scratch_) if (info == psb_success_) call x%sync_space(info) call x%set_host() end if else ! if (x%get_nrows() z_cuda_device_wait procedure, pass(x) :: free_buffer => z_cuda_free_buffer procedure, pass(x) :: maybe_free_buffer => z_cuda_maybe_free_buffer + procedure, pass(x) :: check_addr => z_cuda_check_addr procedure, pass(x) :: dot_v => z_cuda_dot_v procedure, pass(x) :: dot_a => z_cuda_dot_a procedure, pass(y) :: axpby_v => z_cuda_axpby_v @@ -219,6 +220,17 @@ contains end subroutine z_cuda_free_buffer + subroutine z_cuda_check_addr(x) + class(psb_z_vect_cuda), intent(inout) :: x + integer(psb_ipk_) info; + select type(ii=> x) + class is (psb_z_vect_cuda) + info = checkMultiVecDeviceDoubleComplex(x%deviceVect) + class default + write(0,*) 'Check addr: cuda version, why am I here? ' + end select + end subroutine z_cuda_check_addr + subroutine z_cuda_gthzv_x(i,n,idx,x,y) use psb_cuda_env_mod use psi_serial_mod @@ -560,12 +572,20 @@ contains end subroutine z_cuda_sctb_buf - subroutine z_cuda_bld_x(x,this) + subroutine z_cuda_bld_x(x,this,scratch) use psb_base_mod complex(psb_dpk_), intent(in) :: this(:) class(psb_z_vect_cuda), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call psb_realloc(size(this),x%v,info) if (info /= 0) then info=psb_err_alloc_request_ @@ -578,11 +598,19 @@ contains end subroutine z_cuda_bld_x - subroutine z_cuda_bld_mn(x,n) + subroutine z_cuda_bld_mn(x,n,scratch) integer(psb_mpk_), intent(in) :: n class(psb_z_vect_cuda), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%all(n,info) if (info /= 0) then call psb_errpush(info,'z_cuda_bld_n',i_err=(/n,n,n,n,n/)) @@ -679,26 +707,34 @@ contains call x%set_scal(zzero) end subroutine z_cuda_zero - subroutine z_cuda_asb_m(n, x, info) + subroutine z_cuda_asb_m(n, x, info, scratch) use psi_serial_mod use psb_realloc_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_z_vect_cuda), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_mpk_) :: nd - + + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (x%is_dev()) then nd = getMultiVecDeviceSize(x%deviceVect) if (nd < n) then call x%sync() - call x%psb_z_base_vect_type%asb(n,info) + call x%psb_z_base_vect_type%asb(n,info,scratch=scratch_) if (info == psb_success_) call x%sync_space(info) call x%set_host() end if else ! if (x%get_nrows() diff --git a/cuda/spgpu/core.c b/cuda/spgpu/core.c index e89aa2cfd..154ad244d 100644 --- a/cuda/spgpu/core.c +++ b/cuda/spgpu/core.c @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "core.h" diff --git a/cuda/spgpu/core.h b/cuda/spgpu/core.h index 35d5849d5..9a35deab3 100644 --- a/cuda/spgpu/core.h +++ b/cuda/spgpu/core.h @@ -6,14 +6,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ @@ -36,14 +28,6 @@ * Valeria Cardellini - University of Rome Tor Vergata\n * Salvatore Filippone - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or\n - * modify it under the terms of the GNU General Public License\n - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful,\n - * but WITHOUT ANY WARRANTY; without even the implied warranty of\n - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n - * GNU General Public License for more details. */ #include "psb_config.h" diff --git a/cuda/spgpu/debug.h b/cuda/spgpu/debug.h index d5bc6de2e..433f1a2ca 100644 --- a/cuda/spgpu/debug.h +++ b/cuda/spgpu/debug.h @@ -6,14 +6,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/dia.h b/cuda/spgpu/dia.h index a0b5e2074..e3d342e03 100644 --- a/cuda/spgpu/dia.h +++ b/cuda/spgpu/dia.h @@ -6,14 +6,6 @@ * Copyright (C) 2010 - 2013 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "core.h" diff --git a/cuda/spgpu/dia_conv.h b/cuda/spgpu/dia_conv.h index 3a4de93a4..e0fce4c37 100644 --- a/cuda/spgpu/dia_conv.h +++ b/cuda/spgpu/dia_conv.h @@ -6,14 +6,6 @@ * Copyright (C) 2010 - 2013 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "dia.h" diff --git a/cuda/spgpu/ell.h b/cuda/spgpu/ell.h index 1aa787482..5dae6f040 100644 --- a/cuda/spgpu/ell.h +++ b/cuda/spgpu/ell.h @@ -6,14 +6,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "core.h" diff --git a/cuda/spgpu/ell_conv.h b/cuda/spgpu/ell_conv.h index d6ec37a9c..5ac010de6 100644 --- a/cuda/spgpu/ell_conv.h +++ b/cuda/spgpu/ell_conv.h @@ -6,14 +6,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "ell.h" diff --git a/cuda/spgpu/hdia.h b/cuda/spgpu/hdia.h index e8808fb7c..8cb2f3538 100644 --- a/cuda/spgpu/hdia.h +++ b/cuda/spgpu/hdia.h @@ -6,14 +6,6 @@ * Copyright (C) 2010 - 2013 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "core.h" diff --git a/cuda/spgpu/hdia_conv.h b/cuda/spgpu/hdia_conv.h index c22bf9903..3ddda224d 100644 --- a/cuda/spgpu/hdia_conv.h +++ b/cuda/spgpu/hdia_conv.h @@ -6,14 +6,6 @@ * Copyright (C) 2010 - 2013 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "core.h" diff --git a/cuda/spgpu/hell.h b/cuda/spgpu/hell.h index d177686cd..64af409de 100644 --- a/cuda/spgpu/hell.h +++ b/cuda/spgpu/hell.h @@ -6,14 +6,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "core.h" diff --git a/cuda/spgpu/hell_conv.h b/cuda/spgpu/hell_conv.h index 301fd3032..b7de21da5 100644 --- a/cuda/spgpu/hell_conv.h +++ b/cuda/spgpu/hell_conv.h @@ -6,14 +6,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "hell.h" diff --git a/cuda/spgpu/kernels/Makefile b/cuda/spgpu/kernels/Makefile index 37113c754..f73e74a71 100644 --- a/cuda/spgpu/kernels/Makefile +++ b/cuda/spgpu/kernels/Makefile @@ -6,8 +6,7 @@ include $(TOP)/Make.inc LIBDIR=$(TOP)/lib INCDIR=$(TOP)/include MODDIR=$(TOP)/modules -UP=.. -LIBNAME=$(UP)/libspgpu.a +LIBNAME=libpsb_cuda.a CINCLUDES=-I$(INCDIR) CU_INCLUDES=-I$(INCDIR) $(CUDA_INCLUDES) OBJS=cabs.o camax.o casum.o caxpby.o caxy.o cdot.o cgath.o \ @@ -24,7 +23,7 @@ OBJS=cabs.o camax.o casum.o caxpby.o caxy.o cdot.o cgath.o \ objs: $(OBJS) lib: objs - $(AR) $(UP)/$(LIBNAME) $(OBJS) + $(AR) ../../$(LIBNAME) $(OBJS) clean: diff --git a/cuda/spgpu/kernels/abs_base.cuh b/cuda/spgpu/kernels/abs_base.cuh index d48f815d0..6b3cc8d78 100644 --- a/cuda/spgpu/kernels/abs_base.cuh +++ b/cuda/spgpu/kernels/abs_base.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/amax_base.cuh b/cuda/spgpu/kernels/amax_base.cuh index 4d7e7d4a8..8136b8e45 100644 --- a/cuda/spgpu/kernels/amax_base.cuh +++ b/cuda/spgpu/kernels/amax_base.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/asum_base.cuh b/cuda/spgpu/kernels/asum_base.cuh index 33f1695c5..8bd609730 100644 --- a/cuda/spgpu/kernels/asum_base.cuh +++ b/cuda/spgpu/kernels/asum_base.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/axy_base.cuh b/cuda/spgpu/kernels/axy_base.cuh index e1a776fe4..d0752f02e 100644 --- a/cuda/spgpu/kernels/axy_base.cuh +++ b/cuda/spgpu/kernels/axy_base.cuh @@ -5,14 +5,6 @@ * Salvatore Filippone - University of Rome Tor Vergata * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/cabs.cu b/cuda/spgpu/kernels/cabs.cu index 4c6df219d..ac619cd56 100644 --- a/cuda/spgpu/kernels/cabs.cu +++ b/cuda/spgpu/kernels/cabs.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/camax.cu b/cuda/spgpu/kernels/camax.cu index 05d701e4f..db8653416 100644 --- a/cuda/spgpu/kernels/camax.cu +++ b/cuda/spgpu/kernels/camax.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/casum.cu b/cuda/spgpu/kernels/casum.cu index 7362cff87..ca522d53c 100644 --- a/cuda/spgpu/kernels/casum.cu +++ b/cuda/spgpu/kernels/casum.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/caxpby.cu b/cuda/spgpu/kernels/caxpby.cu index a89f2b9ce..a892dfa2e 100644 --- a/cuda/spgpu/kernels/caxpby.cu +++ b/cuda/spgpu/kernels/caxpby.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" #include "cudalang.h" diff --git a/cuda/spgpu/kernels/caxy.cu b/cuda/spgpu/kernels/caxy.cu index 7b2a06cca..93522407a 100644 --- a/cuda/spgpu/kernels/caxy.cu +++ b/cuda/spgpu/kernels/caxy.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/cdot.cu b/cuda/spgpu/kernels/cdot.cu index 6ad40bae4..ab1a159cc 100644 --- a/cuda/spgpu/kernels/cdot.cu +++ b/cuda/spgpu/kernels/cdot.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/cgath.cu b/cuda/spgpu/kernels/cgath.cu index 256254c3b..5d0fb3a50 100644 --- a/cuda/spgpu/kernels/cgath.cu +++ b/cuda/spgpu/kernels/cgath.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/cnrm2.cu b/cuda/spgpu/kernels/cnrm2.cu index 23e133e88..318c0e693 100644 --- a/cuda/spgpu/kernels/cnrm2.cu +++ b/cuda/spgpu/kernels/cnrm2.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/cscal.cu b/cuda/spgpu/kernels/cscal.cu index 26ffaf3d8..a3ad2c2ca 100644 --- a/cuda/spgpu/kernels/cscal.cu +++ b/cuda/spgpu/kernels/cscal.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/cscat.cu b/cuda/spgpu/kernels/cscat.cu index 683f0ddd8..af3b7d716 100644 --- a/cuda/spgpu/kernels/cscat.cu +++ b/cuda/spgpu/kernels/cscat.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/csetscal.cu b/cuda/spgpu/kernels/csetscal.cu index f87742614..e49a9fffc 100644 --- a/cuda/spgpu/kernels/csetscal.cu +++ b/cuda/spgpu/kernels/csetscal.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/cudadebug.h b/cuda/spgpu/kernels/cudadebug.h index 5367ab3ba..f196c6f94 100644 --- a/cuda/spgpu/kernels/cudadebug.h +++ b/cuda/spgpu/kernels/cudadebug.h @@ -6,14 +6,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cuda_runtime.h" diff --git a/cuda/spgpu/kernels/cudalang.h b/cuda/spgpu/kernels/cudalang.h index ede4f2918..f63124d63 100644 --- a/cuda/spgpu/kernels/cudalang.h +++ b/cuda/spgpu/kernels/cudalang.h @@ -6,14 +6,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ // Used to avoid mad.f32 instructions on c.c. 1.* diff --git a/cuda/spgpu/kernels/cupd_xyz.cu b/cuda/spgpu/kernels/cupd_xyz.cu index e8dc93007..e8cc0eab5 100644 --- a/cuda/spgpu/kernels/cupd_xyz.cu +++ b/cuda/spgpu/kernels/cupd_xyz.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/cxyzw.cu b/cuda/spgpu/kernels/cxyzw.cu index 783c77147..65b9935df 100644 --- a/cuda/spgpu/kernels/cxyzw.cu +++ b/cuda/spgpu/kernels/cxyzw.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/dabs.cu b/cuda/spgpu/kernels/dabs.cu index a27f21e4a..ce19d6d17 100644 --- a/cuda/spgpu/kernels/dabs.cu +++ b/cuda/spgpu/kernels/dabs.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/damax.cu b/cuda/spgpu/kernels/damax.cu index eee0b0650..26b5a8757 100644 --- a/cuda/spgpu/kernels/damax.cu +++ b/cuda/spgpu/kernels/damax.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/dasum.cu b/cuda/spgpu/kernels/dasum.cu index 5d7d7f9b4..7c63c85e2 100644 --- a/cuda/spgpu/kernels/dasum.cu +++ b/cuda/spgpu/kernels/dasum.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/daxpby.cu b/cuda/spgpu/kernels/daxpby.cu index 41e493b1b..110ed46e2 100644 --- a/cuda/spgpu/kernels/daxpby.cu +++ b/cuda/spgpu/kernels/daxpby.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/daxy.cu b/cuda/spgpu/kernels/daxy.cu index 3131a7af0..3a4d132ac 100644 --- a/cuda/spgpu/kernels/daxy.cu +++ b/cuda/spgpu/kernels/daxy.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/ddot.cu b/cuda/spgpu/kernels/ddot.cu index 49f189430..1ac54689b 100644 --- a/cuda/spgpu/kernels/ddot.cu +++ b/cuda/spgpu/kernels/ddot.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/dgath.cu b/cuda/spgpu/kernels/dgath.cu index 26f12647e..eeec50657 100644 --- a/cuda/spgpu/kernels/dgath.cu +++ b/cuda/spgpu/kernels/dgath.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/dia_cspmv.cu b/cuda/spgpu/kernels/dia_cspmv.cu index d4d56dc91..455fe27e8 100644 --- a/cuda/spgpu/kernels/dia_cspmv.cu +++ b/cuda/spgpu/kernels/dia_cspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/dia_dspmv.cu b/cuda/spgpu/kernels/dia_dspmv.cu index 21d16570f..1294088fa 100644 --- a/cuda/spgpu/kernels/dia_dspmv.cu +++ b/cuda/spgpu/kernels/dia_dspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/dia_spmv_base.cuh b/cuda/spgpu/kernels/dia_spmv_base.cuh index afcb38679..a77b4695c 100644 --- a/cuda/spgpu/kernels/dia_spmv_base.cuh +++ b/cuda/spgpu/kernels/dia_spmv_base.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/dia_spmv_base_template.cuh b/cuda/spgpu/kernels/dia_spmv_base_template.cuh index 792fa7ede..38b90f46c 100644 --- a/cuda/spgpu/kernels/dia_spmv_base_template.cuh +++ b/cuda/spgpu/kernels/dia_spmv_base_template.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/dia_sspmv.cu b/cuda/spgpu/kernels/dia_sspmv.cu index 17464b432..bc2746c48 100644 --- a/cuda/spgpu/kernels/dia_sspmv.cu +++ b/cuda/spgpu/kernels/dia_sspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/dia_zspmv.cu b/cuda/spgpu/kernels/dia_zspmv.cu index 4f53bf5e8..af9ee56a9 100644 --- a/cuda/spgpu/kernels/dia_zspmv.cu +++ b/cuda/spgpu/kernels/dia_zspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/dnrm2.cu b/cuda/spgpu/kernels/dnrm2.cu index aae3edfce..a4f546c5f 100644 --- a/cuda/spgpu/kernels/dnrm2.cu +++ b/cuda/spgpu/kernels/dnrm2.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/dscal.cu b/cuda/spgpu/kernels/dscal.cu index 9e3b240cb..56c2e4ff9 100644 --- a/cuda/spgpu/kernels/dscal.cu +++ b/cuda/spgpu/kernels/dscal.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/dscat.cu b/cuda/spgpu/kernels/dscat.cu index c6bcf9076..e097a13bb 100644 --- a/cuda/spgpu/kernels/dscat.cu +++ b/cuda/spgpu/kernels/dscat.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/dsetscal.cu b/cuda/spgpu/kernels/dsetscal.cu index 46af07b3b..a45476f75 100644 --- a/cuda/spgpu/kernels/dsetscal.cu +++ b/cuda/spgpu/kernels/dsetscal.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/dupd_xyz.cu b/cuda/spgpu/kernels/dupd_xyz.cu index 11fc6c9af..d37be35dc 100644 --- a/cuda/spgpu/kernels/dupd_xyz.cu +++ b/cuda/spgpu/kernels/dupd_xyz.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/dxyzw.cu b/cuda/spgpu/kernels/dxyzw.cu index f9964cc7d..d78d29786 100644 --- a/cuda/spgpu/kernels/dxyzw.cu +++ b/cuda/spgpu/kernels/dxyzw.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/ell_ccsput.cu b/cuda/spgpu/kernels/ell_ccsput.cu index 66126bd09..f7b28c699 100644 --- a/cuda/spgpu/kernels/ell_ccsput.cu +++ b/cuda/spgpu/kernels/ell_ccsput.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/ell_cspmv.cu b/cuda/spgpu/kernels/ell_cspmv.cu index b2a5ca3a5..9ec798c52 100644 --- a/cuda/spgpu/kernels/ell_cspmv.cu +++ b/cuda/spgpu/kernels/ell_cspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/ell_csput_base.cuh b/cuda/spgpu/kernels/ell_csput_base.cuh index 95e0e33d7..32f6621e9 100644 --- a/cuda/spgpu/kernels/ell_csput_base.cuh +++ b/cuda/spgpu/kernels/ell_csput_base.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/ell_dcsput.cu b/cuda/spgpu/kernels/ell_dcsput.cu index b1a25d52c..f9f2c904b 100644 --- a/cuda/spgpu/kernels/ell_dcsput.cu +++ b/cuda/spgpu/kernels/ell_dcsput.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/ell_dspmv.cu b/cuda/spgpu/kernels/ell_dspmv.cu index e4e2e8159..1a265878f 100644 --- a/cuda/spgpu/kernels/ell_dspmv.cu +++ b/cuda/spgpu/kernels/ell_dspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/ell_scsput.cu b/cuda/spgpu/kernels/ell_scsput.cu index 0e3ed7b38..383ad1e90 100644 --- a/cuda/spgpu/kernels/ell_scsput.cu +++ b/cuda/spgpu/kernels/ell_scsput.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/ell_spmv_base.cuh b/cuda/spgpu/kernels/ell_spmv_base.cuh index e2af5896f..366f46bb1 100644 --- a/cuda/spgpu/kernels/ell_spmv_base.cuh +++ b/cuda/spgpu/kernels/ell_spmv_base.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/ell_spmv_base_nors.cuh b/cuda/spgpu/kernels/ell_spmv_base_nors.cuh index 8cd897049..0c70f81cc 100644 --- a/cuda/spgpu/kernels/ell_spmv_base_nors.cuh +++ b/cuda/spgpu/kernels/ell_spmv_base_nors.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ __device__ void diff --git a/cuda/spgpu/kernels/ell_spmv_base_template.cuh b/cuda/spgpu/kernels/ell_spmv_base_template.cuh index fa39d8a6f..2b423c064 100644 --- a/cuda/spgpu/kernels/ell_spmv_base_template.cuh +++ b/cuda/spgpu/kernels/ell_spmv_base_template.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #define THREAD_BLOCK 128 diff --git a/cuda/spgpu/kernels/ell_sspmv.cu b/cuda/spgpu/kernels/ell_sspmv.cu index 298ff1cb7..60175e9b1 100644 --- a/cuda/spgpu/kernels/ell_sspmv.cu +++ b/cuda/spgpu/kernels/ell_sspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/ell_zcsput.cu b/cuda/spgpu/kernels/ell_zcsput.cu index 9fbd43116..fda901b47 100644 --- a/cuda/spgpu/kernels/ell_zcsput.cu +++ b/cuda/spgpu/kernels/ell_zcsput.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/ell_zspmv.cu b/cuda/spgpu/kernels/ell_zspmv.cu index dd1bc72d4..f7f7edf7a 100644 --- a/cuda/spgpu/kernels/ell_zspmv.cu +++ b/cuda/spgpu/kernels/ell_zspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/gath_base.cuh b/cuda/spgpu/kernels/gath_base.cuh index a0e77b44f..4ca94f2ea 100644 --- a/cuda/spgpu/kernels/gath_base.cuh +++ b/cuda/spgpu/kernels/gath_base.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/hdia_cspmv.cu b/cuda/spgpu/kernels/hdia_cspmv.cu index 27bb30e14..f8853932d 100644 --- a/cuda/spgpu/kernels/hdia_cspmv.cu +++ b/cuda/spgpu/kernels/hdia_cspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/hdia_dspmv.cu b/cuda/spgpu/kernels/hdia_dspmv.cu index c1ac9af1d..940ba79e6 100644 --- a/cuda/spgpu/kernels/hdia_dspmv.cu +++ b/cuda/spgpu/kernels/hdia_dspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/hdia_spmv_base.cuh b/cuda/spgpu/kernels/hdia_spmv_base.cuh index 2c8cfbaff..0391d6c2d 100644 --- a/cuda/spgpu/kernels/hdia_spmv_base.cuh +++ b/cuda/spgpu/kernels/hdia_spmv_base.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/hdia_spmv_base_template.cuh b/cuda/spgpu/kernels/hdia_spmv_base_template.cuh index 155179fd6..32a575859 100644 --- a/cuda/spgpu/kernels/hdia_spmv_base_template.cuh +++ b/cuda/spgpu/kernels/hdia_spmv_base_template.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #define THREAD_BLOCK 128 diff --git a/cuda/spgpu/kernels/hdia_sspmv.cu b/cuda/spgpu/kernels/hdia_sspmv.cu index ad1d77e7d..a4b8b7ddd 100644 --- a/cuda/spgpu/kernels/hdia_sspmv.cu +++ b/cuda/spgpu/kernels/hdia_sspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/hdia_zspmv.cu b/cuda/spgpu/kernels/hdia_zspmv.cu index f0b592f6e..ffff9fef2 100644 --- a/cuda/spgpu/kernels/hdia_zspmv.cu +++ b/cuda/spgpu/kernels/hdia_zspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/hell_cspmv.cu b/cuda/spgpu/kernels/hell_cspmv.cu index c2b174199..e5800cc36 100644 --- a/cuda/spgpu/kernels/hell_cspmv.cu +++ b/cuda/spgpu/kernels/hell_cspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/hell_dspmv.cu b/cuda/spgpu/kernels/hell_dspmv.cu index fe379841b..e6b14b42b 100644 --- a/cuda/spgpu/kernels/hell_dspmv.cu +++ b/cuda/spgpu/kernels/hell_dspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/hell_spmv_base.cuh b/cuda/spgpu/kernels/hell_spmv_base.cuh index ca074d338..cdd4b367e 100644 --- a/cuda/spgpu/kernels/hell_spmv_base.cuh +++ b/cuda/spgpu/kernels/hell_spmv_base.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/hell_spmv_base_template.cuh b/cuda/spgpu/kernels/hell_spmv_base_template.cuh index 9ecd8f745..b732f22e7 100644 --- a/cuda/spgpu/kernels/hell_spmv_base_template.cuh +++ b/cuda/spgpu/kernels/hell_spmv_base_template.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #define IDX2 #define THREAD_BLOCK 128 diff --git a/cuda/spgpu/kernels/hell_sspmv.cu b/cuda/spgpu/kernels/hell_sspmv.cu index 86b4c7b3f..f33619386 100644 --- a/cuda/spgpu/kernels/hell_sspmv.cu +++ b/cuda/spgpu/kernels/hell_sspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/hell_zspmv.cu b/cuda/spgpu/kernels/hell_zspmv.cu index aa8f6418d..8d079fa72 100644 --- a/cuda/spgpu/kernels/hell_zspmv.cu +++ b/cuda/spgpu/kernels/hell_zspmv.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/igath.cu b/cuda/spgpu/kernels/igath.cu index a97a1c98d..0494c4f36 100644 --- a/cuda/spgpu/kernels/igath.cu +++ b/cuda/spgpu/kernels/igath.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/iscat.cu b/cuda/spgpu/kernels/iscat.cu index dfb7e3ca2..ad4f33d9c 100644 --- a/cuda/spgpu/kernels/iscat.cu +++ b/cuda/spgpu/kernels/iscat.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/isetscal.cu b/cuda/spgpu/kernels/isetscal.cu index fe028b0ed..1ecc5604a 100644 --- a/cuda/spgpu/kernels/isetscal.cu +++ b/cuda/spgpu/kernels/isetscal.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/sabs.cu b/cuda/spgpu/kernels/sabs.cu index ee0efd8ba..9a82d5099 100644 --- a/cuda/spgpu/kernels/sabs.cu +++ b/cuda/spgpu/kernels/sabs.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/samax.cu b/cuda/spgpu/kernels/samax.cu index 8366e3e1a..51d564077 100644 --- a/cuda/spgpu/kernels/samax.cu +++ b/cuda/spgpu/kernels/samax.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/sasum.cu b/cuda/spgpu/kernels/sasum.cu index 3620775b4..dd02d07c0 100644 --- a/cuda/spgpu/kernels/sasum.cu +++ b/cuda/spgpu/kernels/sasum.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/saxpby.cu b/cuda/spgpu/kernels/saxpby.cu index ab103bbb2..aee2c5504 100644 --- a/cuda/spgpu/kernels/saxpby.cu +++ b/cuda/spgpu/kernels/saxpby.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" #include "cudalang.h" diff --git a/cuda/spgpu/kernels/saxy.cu b/cuda/spgpu/kernels/saxy.cu index 9277a2c8b..a1a641cb6 100644 --- a/cuda/spgpu/kernels/saxy.cu +++ b/cuda/spgpu/kernels/saxy.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/scal_base.cuh b/cuda/spgpu/kernels/scal_base.cuh index c82f97387..2d28327f3 100644 --- a/cuda/spgpu/kernels/scal_base.cuh +++ b/cuda/spgpu/kernels/scal_base.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/scat_base.cuh b/cuda/spgpu/kernels/scat_base.cuh index f6f619b17..d03146bc1 100644 --- a/cuda/spgpu/kernels/scat_base.cuh +++ b/cuda/spgpu/kernels/scat_base.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/sdot.cu b/cuda/spgpu/kernels/sdot.cu index 5952c34e1..ef2bf295e 100644 --- a/cuda/spgpu/kernels/sdot.cu +++ b/cuda/spgpu/kernels/sdot.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/setscal_base.cuh b/cuda/spgpu/kernels/setscal_base.cuh index afe821cf1..ba1dc34fc 100644 --- a/cuda/spgpu/kernels/setscal_base.cuh +++ b/cuda/spgpu/kernels/setscal_base.cuh @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ diff --git a/cuda/spgpu/kernels/sgath.cu b/cuda/spgpu/kernels/sgath.cu index 6ccfa7966..8e9cb1b0d 100644 --- a/cuda/spgpu/kernels/sgath.cu +++ b/cuda/spgpu/kernels/sgath.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/snrm2.cu b/cuda/spgpu/kernels/snrm2.cu index 1186cbe92..888e3c841 100644 --- a/cuda/spgpu/kernels/snrm2.cu +++ b/cuda/spgpu/kernels/snrm2.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/sscal.cu b/cuda/spgpu/kernels/sscal.cu index 496d37a0c..4a5e80e52 100644 --- a/cuda/spgpu/kernels/sscal.cu +++ b/cuda/spgpu/kernels/sscal.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/sscat.cu b/cuda/spgpu/kernels/sscat.cu index 44e5dad98..06361b8b7 100644 --- a/cuda/spgpu/kernels/sscat.cu +++ b/cuda/spgpu/kernels/sscat.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/ssetscal.cu b/cuda/spgpu/kernels/ssetscal.cu index dee8e9ab5..dadb2f372 100644 --- a/cuda/spgpu/kernels/ssetscal.cu +++ b/cuda/spgpu/kernels/ssetscal.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/supd_xyz.cu b/cuda/spgpu/kernels/supd_xyz.cu index 0bfed1ae6..cd455302e 100644 --- a/cuda/spgpu/kernels/supd_xyz.cu +++ b/cuda/spgpu/kernels/supd_xyz.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/sxyzw.cu b/cuda/spgpu/kernels/sxyzw.cu index 26422e550..f8b4367e3 100644 --- a/cuda/spgpu/kernels/sxyzw.cu +++ b/cuda/spgpu/kernels/sxyzw.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/zabs.cu b/cuda/spgpu/kernels/zabs.cu index 4bef9294e..e8e95c02b 100644 --- a/cuda/spgpu/kernels/zabs.cu +++ b/cuda/spgpu/kernels/zabs.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/zamax.cu b/cuda/spgpu/kernels/zamax.cu index 4e65cf223..fc5212315 100644 --- a/cuda/spgpu/kernels/zamax.cu +++ b/cuda/spgpu/kernels/zamax.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/zasum.cu b/cuda/spgpu/kernels/zasum.cu index fa40b58ca..84323f1ed 100644 --- a/cuda/spgpu/kernels/zasum.cu +++ b/cuda/spgpu/kernels/zasum.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/zaxpby.cu b/cuda/spgpu/kernels/zaxpby.cu index 07122ff5f..7378b47fb 100644 --- a/cuda/spgpu/kernels/zaxpby.cu +++ b/cuda/spgpu/kernels/zaxpby.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/zaxy.cu b/cuda/spgpu/kernels/zaxy.cu index cdc21adb3..c2a46cb21 100644 --- a/cuda/spgpu/kernels/zaxy.cu +++ b/cuda/spgpu/kernels/zaxy.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/zdot.cu b/cuda/spgpu/kernels/zdot.cu index 1b4b12c9d..bc824e5a7 100644 --- a/cuda/spgpu/kernels/zdot.cu +++ b/cuda/spgpu/kernels/zdot.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/zgath.cu b/cuda/spgpu/kernels/zgath.cu index 59cebf6ed..4a9583c59 100644 --- a/cuda/spgpu/kernels/zgath.cu +++ b/cuda/spgpu/kernels/zgath.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/znrm2.cu b/cuda/spgpu/kernels/znrm2.cu index 3d1ed304b..479900663 100644 --- a/cuda/spgpu/kernels/znrm2.cu +++ b/cuda/spgpu/kernels/znrm2.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/zscal.cu b/cuda/spgpu/kernels/zscal.cu index 13f3ad153..01f17a171 100644 --- a/cuda/spgpu/kernels/zscal.cu +++ b/cuda/spgpu/kernels/zscal.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2014 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/zscat.cu b/cuda/spgpu/kernels/zscat.cu index b43ab761f..0cbb9c0a2 100644 --- a/cuda/spgpu/kernels/zscat.cu +++ b/cuda/spgpu/kernels/zscat.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/zsetscal.cu b/cuda/spgpu/kernels/zsetscal.cu index 70afa01c4..12bf9a5cb 100644 --- a/cuda/spgpu/kernels/zsetscal.cu +++ b/cuda/spgpu/kernels/zsetscal.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2015 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "stdio.h" diff --git a/cuda/spgpu/kernels/zupd_xyz.cu b/cuda/spgpu/kernels/zupd_xyz.cu index 3a7f4c00b..0bfbe8508 100644 --- a/cuda/spgpu/kernels/zupd_xyz.cu +++ b/cuda/spgpu/kernels/zupd_xyz.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/kernels/zxyzw.cu b/cuda/spgpu/kernels/zxyzw.cu index c02991dd9..24c2305df 100644 --- a/cuda/spgpu/kernels/zxyzw.cu +++ b/cuda/spgpu/kernels/zxyzw.cu @@ -4,14 +4,6 @@ * Copyright (C) 2010 - 2012 * Davide Barbieri - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "cudadebug.h" diff --git a/cuda/spgpu/vector.h b/cuda/spgpu/vector.h index 26c3443d6..20980cfef 100644 --- a/cuda/spgpu/vector.h +++ b/cuda/spgpu/vector.h @@ -7,14 +7,6 @@ * Davide Barbieri - University of Rome Tor Vergata * Salvatore Filippone - University of Rome Tor Vergata * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * version 3 as published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. */ #include "core.h" diff --git a/cuda/svectordev.c b/cuda/svectordev.c index e1c43b5e9..5b6ec2b43 100644 --- a/cuda/svectordev.c +++ b/cuda/svectordev.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -42,6 +42,14 @@ int registerMappedFloat(void *buff, void **d_p, int n, float dummy) return registerMappedMemory(buff,d_p,((size_t) n)*sizeof(float)); } +int checkMultiVecDeviceFloat(void* deviceMultiVec) +{ + struct MultiVectDevice *devVec = (struct MultiVectDevice *) deviceMultiVec; + fprintf(stderr,"checkMultiVecDeviceInt Size: %d Pointer %p\n", + devVec->size_,devVec->v_); + return(0); +} + int writeMultiVecDeviceFloat(void* deviceVec, float* hostVec) { int i; struct MultiVectDevice *devVec = (struct MultiVectDevice *) deviceVec; diff --git a/cuda/svectordev.h b/cuda/svectordev.h index 887a7755a..1265df4d7 100644 --- a/cuda/svectordev.h +++ b/cuda/svectordev.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -38,6 +38,7 @@ #include "vector.h" int registerMappedFloat(void *, void **, int, float); +int checkMultiVecDeviceFloat(void* deviceMultiVec); int writeMultiVecDeviceFloat(void* deviceMultiVec, float* hostMultiVec); int writeMultiVecDeviceFloatR2(void* deviceMultiVec, float* hostMultiVec, int ld); int readMultiVecDeviceFloat(void* deviceMultiVec, float* hostMultiVec); diff --git a/cuda/vectordev.c b/cuda/vectordev.c index db976fe9b..3c0bd7651 100644 --- a/cuda/vectordev.c +++ b/cuda/vectordev.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/vectordev.h b/cuda/vectordev.h index 93cf11895..95d5164a6 100644 --- a/cuda/vectordev.h +++ b/cuda/vectordev.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/z_cusparse_mod.F90 b/cuda/z_cusparse_mod.F90 index a4f154553..9ad6825d4 100644 --- a/cuda/z_cusparse_mod.F90 +++ b/cuda/z_cusparse_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/cuda/zcusparse.c b/cuda/zcusparse.c index 93142d221..1a950966b 100644 --- a/cuda/zcusparse.c +++ b/cuda/zcusparse.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/zcusparse.h b/cuda/zcusparse.h index ca0aeeff8..9b0ccf3d5 100644 --- a/cuda/zcusparse.h +++ b/cuda/zcusparse.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/cuda/zvectordev.c b/cuda/zvectordev.c index 102ba0d2c..f7b33ac7c 100644 --- a/cuda/zvectordev.c +++ b/cuda/zvectordev.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -42,6 +42,14 @@ int registerMappedDoubleComplex(void *buff, void **d_p, int n, cuDoubleComplex return registerMappedMemory(buff,d_p,((size_t) n)*sizeof(cuDoubleComplex)); } +int checkMultiVecDeviceDoubleComplex(void* deviceMultiVec) +{ + struct MultiVectDevice *devVec = (struct MultiVectDevice *) deviceMultiVec; + fprintf(stderr,"checkMultiVecDeviceInt Size: %d Pointer %p\n", + devVec->size_,devVec->v_); + return(0); +} + int writeMultiVecDeviceDoubleComplex(void* deviceVec, cuDoubleComplex* hostVec) { int i; struct MultiVectDevice *devVec = (struct MultiVectDevice *) deviceVec; diff --git a/cuda/zvectordev.h b/cuda/zvectordev.h index 023c7f130..136e77010 100644 --- a/cuda/zvectordev.h +++ b/cuda/zvectordev.h @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ @@ -40,6 +40,7 @@ #include "vector.h" int registerMappedDoubleComplex(void *, void **, int, cuDoubleComplex); +int checkMultiVecDeviceDoubleComplex(void* deviceMultiVec); int writeMultiVecDeviceDoubleComplex(void* deviceMultiVec, cuDoubleComplex* hostMultiVec); int writeMultiVecDeviceDoubleComplexR2(void* deviceMultiVec, cuDoubleComplex* hostMultiVec, int ld); diff --git a/docs/html/index.html b/docs/html/index.html index aca213556..0fb6b60e3 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -23,7 +23,7 @@ class="pplb7t-">Alfredo Buttari
Fabio Durastante
Software version: 3.9.0
June 9th, 2025 +class="newline" />December 23rd, 2025 diff --git a/docs/html/psblas.png b/docs/html/psblas.png index c904340d8..33a35ba01 100644 Binary files a/docs/html/psblas.png and b/docs/html/psblas.png differ diff --git a/docs/html/userhtml.html b/docs/html/userhtml.html index aca213556..0fb6b60e3 100644 --- a/docs/html/userhtml.html +++ b/docs/html/userhtml.html @@ -23,7 +23,7 @@ class="pplb7t-">Alfredo Buttari
Fabio Durastante
Software version: 3.9.0
June 9th, 2025 +class="newline" />December 23rd, 2025 diff --git a/docs/html/userhtml22x.png b/docs/html/userhtml22x.png index f0a71dab6..d2003c619 100644 Binary files a/docs/html/userhtml22x.png and b/docs/html/userhtml22x.png differ diff --git a/docs/html/userhtml23x.png b/docs/html/userhtml23x.png index d8e518ee1..b8d8f41f9 100644 Binary files a/docs/html/userhtml23x.png and b/docs/html/userhtml23x.png differ diff --git a/docs/html/userhtml24x.png b/docs/html/userhtml24x.png index 3ade441e5..4cc24d4e2 100644 Binary files a/docs/html/userhtml24x.png and b/docs/html/userhtml24x.png differ diff --git a/docs/html/userhtml33x.png b/docs/html/userhtml33x.png index 6e996fede..bb148bb5f 100644 Binary files a/docs/html/userhtml33x.png and b/docs/html/userhtml33x.png differ diff --git a/docs/html/userhtml6.html b/docs/html/userhtml6.html index 655a00468..5e7123938 100644 --- a/docs/html/userhtml6.html +++ b/docs/html/userhtml6.html @@ -11,7 +11,7 @@
-

1In our prototype implementation we provide sample scatter/gather routines.

diff --git a/docs/html/userhtml7.html b/docs/html/userhtml7.html index aed722b35..e0a1208fc 100644 --- a/docs/html/userhtml7.html +++ b/docs/html/userhtml7.html @@ -11,7 +11,7 @@
-

2This is the normal situation when the pattern of the sparse matrix is symmetric, which is equivalent to diff --git a/docs/html/userhtml8.html b/docs/html/userhtml8.html index 61ffca5a8..45b2dc72d 100644 --- a/docs/html/userhtml8.html +++ b/docs/html/userhtml8.html @@ -11,7 +11,7 @@

-

3The subroutine style psb_gefree — Frees a
  6.16 psb_gelp — Applies a left permutation to a dense matrix
  6.17 psb_glob_to_loc — Global to local indices convertion +href="userhtmlse6.html#x12-950006.17" id="QQ2-12-124">psb_glob_to_loc — Global to local indices conversion

  6.18 psb_loc_to_glob — Local to global indices conversion
  6.19

The software architecture allows us to offer support for many alternatives in the implementation, including usage of heterogeneous platforms, and computations -performed on GPUs throuh CUDA. There is support for GPU computations through -OpenACC, but it is at this time a highly experimental version; we plan to +performed on GPUs throuh CUDA. There is also support for GPU computations +through OpenACC, but it is at this time a highly experimental version; we plan to also look at using accelerators through OpenMP as support from compilers improves.

The project is lead by Salvatore Filippone; a number of people have been @@ -58,7 +58,7 @@ chronological order:
Dario Pascucci

-
@@ -801,27 +801,27 @@ class="pplri7t-">must not be
 call psb_sum(ctxt, dat [, root, mode, request])
 
-

-

This subroutine implements a sum reduction operation based on the underlying +

+

This subroutine implements a sum reduction operation based on the underlying communication library.

-

+

Type:

-

Synchronous. +

Synchronous.

-

+

On Entry

-

-

+

+

ctxt

-

the communication context identifying the virtual parallel machine.

the communication context identifying the virtual parallel machine.
Scope: global.
Type: Intent: in.
Specified as: an integer variable.

-

+

dat

-

The local contribution to the global sum.

The local contribution to the global sum.
Scope: global.
Type: Specified as: an integer, real or complex variable, which may or a rank 1 or 2 array.  Type, kind, rank and size must agree on all processes.

-

+

root

-

Process to hold the final sum, or

Process to hold the final sum, or -1 to make it available on all processes.
Scope: global.
- 1, default -1.  

-

+

mode

-

Whether the call is started in non-blocking mode and completed later, or +

Whether the call is started in non-blocking mode and completed later, or is executed synchronously.
Scope: global.
psb_collective_end_. Default: both fields a selected (i.e. require synchronous completion).

-

+

request

-

A request variable to check for operation completion.

A request variable to check for operation completion.
Scope: local.
Type: Intent: inout.
If mode specifies non-blocking action, then this variable must be present.

-

+

-

+

On Return

-

-

+

+

dat

-

On destination process(es), the result of the sum operation.

On destination process(es), the result of the sum operation.
Scope: global.
Type: Specified as: an integer, real or complex variable, which may or a rank 1 or 2 array.
Type, kind, rank and size must agree on all processes.

-

+

request

-

A request variable to check for operation completion.

A request variable to check for operation completion.
Scope: local.
Type: mode specifies non-blocking action, then th -

Notes

  1. -

    The

    The dat argument is both input and output, and its value may be changed even on processes different from the final result destination.

  2. -

    The

    The mode argument can be built with the bitwise IOR() operator; in the following example, the argument is forcing immediate completion, hence the @@ -961,27 +961,27 @@ class="cmtt-10">IOR() operator; in the class="cmtt-10">request argument needs not be specified:

    -

    +

       call psb_sum(ctxt,dat,mode=ior(psb_collective_start_,psb_collective_end_))
     
    -

    +

  • -

    When splitting the operation in two calls, the

    When splitting the operation in two calls, the dat argument must not be accessed between calls:

    -

    +

       call psb_sum(ctxt,dat,mode=psb_collective_start_,request=sum_request)
       ....... ! Do not access dat
       call psb_sum(ctxt,dat,mode=psb_collective_end_,request=sum_request)
     
    -

    +

  • @@ -994,27 +994,27 @@ class="pplri7t-">must not be
     call psb_max(ctxt, dat [, root, mode, request])
     
    -

    -

    This subroutine implements a maximum valuereduction operation based on the +

    +

    This subroutine implements a maximum valuereduction operation based on the underlying communication library.

    -

    +

    Type:

    -

    Synchronous. +

    Synchronous.

    -

    +

    On Entry

    -

    -

    +

    +

    ctxt

    -

    the communication context identifying the virtual parallel machine.

    the communication context identifying the virtual parallel machine.
    Scope: global.
    Type: Intent: in.
    Specified as: an integer variable.

    -

    +

    dat

    -

    The local contribution to the global maximum.

    The local contribution to the global maximum.
    Scope: local.
    Type: inout.
    Specified as: an integer or real variable, which may be a scalar, or a rank 1 or 2 array.  Type, kind, rank and size must agree on all processes.

    -

    +

    root

    -

    Process to hold the final maximum, or

    Process to hold the final maximum, or -1 to make it available on all processes.
    Scope:

    -

    +

    mode

    -

    Whether the call is started in non-blocking mode and completed later, or +

    Whether the call is started in non-blocking mode and completed later, or is executed synchronously.
    Scope: global.
    psb_collective_end_. Default: both fields a selected (i.e. require synchronous completion).

    -

    +

    request

    -

    A request variable to check for operation completion.

    A request variable to check for operation completion.
    Scope: local.
    Type: Intent: inout.
    If mode specifies non-blocking action, then this variable must be present.

    -

    +

    -

    +

    On Return

    -

    -

    +

    +

    dat

    -

    On destination process(es), the result of the maximum operation.

    On destination process(es), the result of the maximum operation.
    Scope: global.
    Type: in.
    Specified as: an integer or real variable, which may be a scalar, or a rank 1 or 2 array.  Type, kind, rank and size must agree on all processes.

    -

    +

    request

    -

    A request variable to check for operation completion.

    A request variable to check for operation completion.
    Scope: local.
    Type: mode specifies non-blocking action, then th -

    Notes

    1. -

      The

      The dat argument is both input and output, and its value may be changed even on processes different from the final result destination.

    2. -

      The

      The mode argument can be built with the bitwise IOR() operator; in the following example, the argument is forcing immediate completion, hence the @@ -1154,27 +1154,27 @@ class="cmtt-10">IOR() operator; in the class="cmtt-10">request argument needs not be specified:

      -

      +

         call psb_max(ctxt,dat,mode=ior(psb_collective_start_,psb_collective_end_))
       
      -

      +

    3. -

      When splitting the operation in two calls, the

      When splitting the operation in two calls, the dat argument must not be accessed between calls:

      -

      +

         call psb_max(ctxt,dat,mode=psb_collective_start_,request=max_request)
         ....... ! Do not access dat
         call psb_max(ctxt,dat,mode=psb_collective_end_,request=max_request)
       
      -

      +

    @@ -1187,27 +1187,27 @@ class="pplri7t-">must not be
     call psb_min(ctxt, dat [, root, mode, request])
     
    -

    -

    This subroutine implements a minimum value reduction operation based on the +

    +

    This subroutine implements a minimum value reduction operation based on the underlying communication library.

    -

    +

    Type:

    -

    Synchronous. +

    Synchronous.

    -

    +

    On Entry

    -

    -

    +

    +

    ctxt

    -

    the communication context identifying the virtual parallel machine.

    the communication context identifying the virtual parallel machine.
    Scope: global.
    Type: Intent: in.
    Specified as: an integer variable.

    -

    +

    dat

    -

    The local contribution to the global minimum.

    The local contribution to the global minimum.
    Scope: local.
    Type: inout.
    Specified as: an integer or real variable, which may be a scalar, or a rank 1 or 2 array.  Type, kind, rank and size must agree on all processes.

    -

    +

    root

    -

    Process to hold the final value, or

    Process to hold the final value, or -1 to make it available on all processes.
    Scope: global.

    -

    +

    mode

    -

    Whether the call is started in non-blocking mode and completed later, or +

    Whether the call is started in non-blocking mode and completed later, or is executed synchronously.
    Scope: global.
    psb_collective_end_. Default: both fields a selected (i.e. require synchronous completion).

    -

    +

    request

    -

    A request variable to check for operation completion.

    A request variable to check for operation completion.
    Scope: local.
    Type: Intent: inout.
    If mode specifies non-blocking action, then this variable must be present.

    -

    +

    -

    +

    On Return

    -

    -

    +

    +

    dat

    -

    On destination process(es), the result of the minimum operation.

    On destination process(es), the result of the minimum operation.
    Scope: global.
    Type: Specified as: an integer or real variable, which may be a scal 1 or 2 array.
    Type, kind, rank and size must agree on all processes.

    -

    +

    request

    -

    A request variable to check for operation completion.

    A request variable to check for operation completion.
    Scope: local.
    Type: mode specifies non-blocking action, then th -

    Notes

    1. -

      The

      The dat argument is both input and output, and its value may be changed even on processes different from the final result destination.

    2. -

      The

      The mode argument can be built with the bitwise IOR() operator; in the following example, the argument is forcing immediate completion, hence the @@ -1347,27 +1347,27 @@ class="cmtt-10">IOR() operator; in the class="cmtt-10">request argument needs not be specified:

      -

      +

         call psb_min(ctxt,dat,mode=ior(psb_collective_start_,psb_collective_end_))
       
      -

      +

    3. -

      When splitting the operation in two calls, the

      When splitting the operation in two calls, the dat argument must not be accessed between calls:

      -

      +

         call psb_min(ctxt,dat,mode=psb_collective_start_,request=min_request)
         ....... ! Do not access dat
         call psb_min(ctxt,dat,mode=psb_collective_end_,request=min_request)
       
      -

      +

    @@ -1380,27 +1380,27 @@ class="pplri7t-">must not be
     call psb_amx(ctxt, dat [, root, mode, request])
     
    -

    -

    This subroutine implements a maximum absolute value reduction operation +

    +

    This subroutine implements a maximum absolute value reduction operation based on the underlying communication library.

    -

    +

    Type:

    -

    Synchronous. +

    Synchronous.

    -

    +

    On Entry

    -

    -

    +

    +

    ctxt

    -

    the communication context identifying the virtual parallel machine.

    the communication context identifying the virtual parallel machine.
    Scope: global.
    Type: Intent: in.
    Specified as: an integer variable.

    -

    +

    dat

    -

    The local contribution to the global maximum.

    The local contribution to the global maximum.
    Scope: local.
    Type: Specified as: an integer, real or complex variable, which may or a rank 1 or 2 array.  Type, kind, rank and size must agree on all processes.

    -

    +

    root

    -

    Process to hold the final value, or

    Process to hold the final value, or -1 to make it available on all processes.
    Scope: global.

    -

    +

    mode

    -

    Whether the call is started in non-blocking mode and completed later, or +

    Whether the call is started in non-blocking mode and completed later, or is executed synchronously.
    Scope: global.
    psb_collective_end_. Default: both fields a selected (i.e. require synchronous completion).

    -

    +

    request

    -

    A request variable to check for operation completion.

    A request variable to check for operation completion.
    Scope: local.
    Type: Intent: inout.
    If mode specifies non-blocking action, then this variable must be present.

    -

    +

    -

    +

    On Return

    -

    -

    +

    +

    dat

    -

    On destination process(es), the result of the maximum operation.

    On destination process(es), the result of the maximum operation.
    Scope: global.
    Type: Specified as: an integer, real or complex variable, which may or a rank 1 or 2 array.  Type, kind, rank and size must agree on all processes.

    -

    +

    request

    -

    A request variable to check for operation completion.

    A request variable to check for operation completion.
    Scope: local.
    Type: mode specifies non-blocking action, then th -

    Notes

    1. -

      The

      The dat argument is both input and output, and its value may be changed even on processes different from the final result destination.

    2. -

      The

      The mode argument can be built with the bitwise IOR() operator; in the following example, the argument is forcing immediate completion, hence the @@ -1541,27 +1541,27 @@ class="cmtt-10">IOR() operator; in the class="cmtt-10">request argument needs not be specified:

      -

      +

         call psb_amx(ctxt,dat,mode=ior(psb_collective_start_,psb_collective_end_))
       
      -

      +

    3. -

      When splitting the operation in two calls, the

      When splitting the operation in two calls, the dat argument must not be accessed between calls:

      -

      +

         call psb_amx(ctxt,dat,mode=psb_collective_start_,request=amx_request)
         ....... ! Do not access dat
         call psb_amx(ctxt,dat,mode=psb_collective_end_,request=amx_request)
       
      -

      +

    @@ -1574,27 +1574,27 @@ class="pplri7t-">must not be
     call psb_amn(ctxt, dat [, root, mode, request])
     
    -

    -

    This subroutine implements a minimum absolute value reduction operation +

    +

    This subroutine implements a minimum absolute value reduction operation based on the underlying communication library.

    -

    +

    Type:

    -

    Synchronous. +

    Synchronous.

    -

    +

    On Entry

    -

    -

    +

    +

    ctxt

    -

    the communication context identifying the virtual parallel machine.

    the communication context identifying the virtual parallel machine.
    Scope: global.
    Type: Intent: in.
    Specified as: an integer variable.

    -

    +

    dat

    -

    The local contribution to the global minimum.

    The local contribution to the global minimum.
    Scope: local.
    Type: Specified as: an integer, real or complex variable, which may or a rank 1 or 2 array.  Type, kind, rank and size must agree on all processes.

    -

    +

    root

    -

    Process to hold the final value, or

    Process to hold the final value, or -1 to make it available on all processes.
    Scope: global.

    -

    +

    mode

    -

    Whether the call is started in non-blocking mode and completed later, or +

    Whether the call is started in non-blocking mode and completed later, or is executed synchronously.
    Scope: global.
    psb_collective_end_. Default: both fields a selected (i.e. require synchronous completion).

    -

    +

    request

    -

    A request variable to check for operation completion.

    A request variable to check for operation completion.
    Scope: local.
    Type: Intent: inout.
    If mode specifies non-blocking action, then this variable must be present.

    -

    +

    -

    +

    On Return

    -

    -

    +

    +

    dat

    -

    On destination process(es), the result of the minimum operation.

    On destination process(es), the result of the minimum operation.
    Scope: global.
    Type: Specified as: an integer, real or complex variable, which may or a rank 1 or 2 array.
    Type, kind, rank and size must agree on all processes.

    -

    +

    request

    -

    A request variable to check for operation completion.

    A request variable to check for operation completion.
    Scope: local.
    Type: mode specifies non-blocking action, then th -

    Notes

    1. -

      The

      The dat argument is both input and output, and its value may be changed even on processes different from the final result destination.

    2. -

      The

      The mode argument can be built with the bitwise IOR() operator; in the following example, the argument is forcing immediate completion, hence the @@ -1735,27 +1735,27 @@ class="cmtt-10">IOR() operator; in the class="cmtt-10">request argument needs not be specified:

      -

      +

         call psb_amn(ctxt,dat,mode=ior(psb_collective_start_,psb_collective_end_))
       
      -

      +

    3. -

      When splitting the operation in two calls, the

      When splitting the operation in two calls, the dat argument must not be accessed between calls:

      -

      +

         call psb_amn(ctxt,dat,mode=psb_collective_start_,request=amn_request)
         ....... ! Do not access dat
         call psb_amn(ctxt,dat,mode=psb_collective_end_,request=amn_request)
       
      -

      +

    @@ -1768,27 +1768,27 @@ class="pplri7t-">must not be
     call psb_nrm2(ctxt, dat [, root, mode, request])
     
    -

    -

    This subroutine implements a 2-norm value reduction operation based on the +

    +

    This subroutine implements a 2-norm value reduction operation based on the underlying communication library.

    -

    +

    Type:

    -

    Synchronous. +

    Synchronous.

    -

    +

    On Entry

    -

    -

    +

    +

    ctxt

    -

    the communication context identifying the virtual parallel machine.

    the communication context identifying the virtual parallel machine.
    Scope: global.
    Type: Intent: in.
    Specified as: an integer variable.

    -

    +

    dat

    -

    The local contribution to the global minimum.

    The local contribution to the global minimum.
    Scope: local.
    Type: inout.
    Specified as: a real variable, which may be a scalar, or a rank 1 array.  Kind, rank and size must agree on all processes.

    -

    +

    root

    -

    Process to hold the final value, or

    Process to hold the final value, or -1 to make it available on all processes.
    Scope: global.

    -

    +

    mode

    -

    Whether the call is started in non-blocking mode and completed later, or +

    Whether the call is started in non-blocking mode and completed later, or is executed synchronously.
    Scope: global.
    psb_collective_end_. Default: both fields a selected (i.e. require synchronous completion).

    -

    +

    request

    -

    A request variable to check for operation completion.

    A request variable to check for operation completion.
    Scope: local.
    Type: Intent: inout.
    If mode specifies non-blocking action, then this variable must be present.

    -

    +

    -

    +

    On Return

    -

    -

    +

    +

    dat

    -

    On destination process(es), the result of the 2-norm reduction.

    On destination process(es), the result of the 2-norm reduction.
    Scope: global.
    Type: inout.
    Specified as: a real variable, which may be a scalar, or a rank 1 array.
    Kind, rank and size must agree on all processes.

    -

    +

    request

    -

    A request variable to check for operation completion.

    A request variable to check for operation completion.
    Scope: local.
    Type: mode specifies non-blocking action, then th -

    Notes

    1. -

      This reduction is appropriate to compute the results of multiple (local) +

      This reduction is appropriate to compute the results of multiple (local) NRM2 operations at the same time.

    2. -

      Denoting by

      Denoting by dati the value of the variable dat on process -

      with care taken to avoid unnecessary overflow. +

      with care taken to avoid unnecessary overflow.

    3. -

      The

      The dat argument is both input and output, and its value may be changed even on processes different from the final result destination.

    4. -

      The

      The mode argument can be built with the bitwise IOR() operator; in the following example, the argument is forcing immediate completion, hence the @@ -1949,15 +1949,15 @@ class="cmtt-10">IOR() operator; in the class="cmtt-10">request argument needs not be specified:

      -

      +

         call psb_nrm2(ctxt,dat,mode=ior(psb_collective_start_,psb_collective_end_))
       
      -

      +

    5. -

      When splitting the operation in two calls, the

      When splitting the operation in two calls, the dat argument must not be accessed between calls: @@ -1966,13 +1966,13 @@ class="pplri7t-">must not be

      -

      +

         call psb_nrm2(ctxt,dat,mode=psb_collective_start_,request=nrm2_request)
         ....... ! Do not access dat
         call psb_nrm2(ctxt,dat,mode=psb_collective_end_,request=nrm2_request)
       
      -

      +

    @@ -1985,26 +1985,26 @@ class="pplri7t-">must not be
     call psb_snd(ctxt, dat, dst, m)
     
    -

    -

    This subroutine sends a packet of data to a destination. +

    +

    This subroutine sends a packet of data to a destination.

    -

    +

    Type:

    -

    Synchronous: see usage notes. +

    Synchronous: see usage notes.

    -

    +

    On Entry

    -

    -

    +

    +

    ctxt

    -

    the communication context identifying the virtual parallel machine.

    the communication context identifying the virtual parallel machine.
    Scope: global.
    Type: Intent: in.
    Specified as: an integer variable.

    -

    +

    dat

    -

    The data to be sent.

    The data to be sent.
    Scope: local.
    Type: Specified as: an integer, real or complex variable, which may class="zplmr7m-">m is not specified, size must agree as well.

    -

    +

    dst

    -

    Destination process.

    Destination process.
    Scope: global.
    Type:

    -

    +

    m

    -

    Number of rows.

    Number of rows.
    Scope: global.
    Type: (dat, 1); must have the same value on sending and receiving processes.

    -

    +

    -

    +

    On Return

    -

    -

    +

    Notes

    1. -

      This subroutine implies a synchronization, but only between the calling +

      This subroutine implies a synchronization, but only between the calling process and the destination process dst.

    @@ -2107,26 +2107,26 @@ class="zplmr7m-">dst.
     call psb_rcv(ctxt, dat, src, m)
     
    -

    -

    This subroutine receives a packet of data to a destination. +

    +

    This subroutine receives a packet of data to a destination.

    -

    +

    Type:

    -

    Synchronous: see usage notes. +

    Synchronous: see usage notes.

    -

    +

    On Entry

    -

    -

    +

    +

    ctxt

    -

    the communication context identifying the virtual parallel machine.

    the communication context identifying the virtual parallel machine.
    Scope: global.
    Type: Intent: in.
    Specified as: an integer variable.

    -

    +

    src

    -

    Source process.

    Source process.
    Scope: global.
    Type: np- 1.

    -

    +

    m

    -

    Number of rows.

    Number of rows.
    Scope: global.
    Type: ); must have the same -

    +

    -

    +

    On Return

    -

    -

    +

    +

    dat

    -

    The data to be received.

    The data to be received.
    Scope: local.
    Type: Specified as: an integer, real or complex variable, which may rank must agree on sender and receiver process; if m is not specified, size must agree as well.

    -

    Notes

    1. -

      This subroutine implies a synchronization, but only between the calling +

      This subroutine implies a synchronization, but only between the calling process and the source process src.

    diff --git a/docs/html/userhtmlse8.html b/docs/html/userhtmlse8.html index 029136a82..6094efdec 100644 --- a/docs/html/userhtmlse8.html +++ b/docs/html/userhtmlse8.html @@ -18,10 +18,10 @@ href="userhtmlse5.html#tailuserhtmlse8.html">tail] [up]

    8 Error handling

    -

    The PSBLAS library error handling policy has been completely rewritten in version -2.0. The idea behind the design of this new error handling strategy is to keep error +

    The PSBLAS library error handling policy has been defined at the time version 2.0 +was written. The idea behind the design of error handling strategy is to keep error messages on a stack allowing the user to trace back up to the point where the first -error message has been generated. Every routine in the PSBLAS-2.0 library has, as +error message has been generated. Every routine in the PSBLAS library has, as last non-optional argument, an integer info variable; whenever, inside the routine, an error is detected, this variable is set to a value corresponding to a @@ -38,16 +38,16 @@ execution.

    Figure 5 shows the layout of a generic psb_foo routine with respect to the -PSBLAS-2.0 error handling policy. It is possible to see how, whenever an error -condition is detected, the info variable is set to the corresponding error code which -is, then, pushed on top of the stack by means of the psb_errpush. An error condition -may be directly detected inside a routine or indirectly checking the error code -returned returned by a called routine. Whenever an error is encountered, after it has -been pushed on stack, the program execution skips to a point where the error -condition is handled; the error condition is handled either by returning control to the -caller routine or by calling the info variable is set to the corresponding error code which is, then, +pushed on top of the stack by means of the psb_errpush. An error condition may be +directly detected inside a routine or indirectly checking the error code returned +returned by a called routine. Whenever an error is encountered, after it has been +pushed on stack, the program execution skips to a point where the error condition is +handled; the error condition is handled either by returning control to the caller +routine or by calling the psb\_error routine which prints the content of the error stack and aborts the program execution, according to the choice made by the user with


    Figure 6 reports a sample error message generated by the PSBLAS-2.0 -library. This error has been generated by the fact that the user has chosen the -invalid “FOO” storage format to represent the sparse matrix. From this -error message it is possible to see that the error has been detected inside -the psb_cest subroutine called by psb_spasb ... by process 0 (i.e. the root -process). +href="#x14-124026r6">6 reports a sample error message generated by the PSBLAS library. This +error has been generated by the fact that the user has chosen the invalid “FOO” +storage format to represent the sparse matrix. From this error message it is possible +to see that the error has been detected inside the psb_cest subroutine called by +psb_spasb ... by process 0 (i.e. the root process). @@ -331,8 +330,8 @@ Aborting...


    Listing 6: A sample PSBLAS-3.0 error message. Process 0 detected an error +>Listing 6: A sample PSBLAS error message. Process 0 detected an error condition inside the psb_cest subroutine
    diff --git a/docs/psblas-3.9.pdf b/docs/psblas-3.9.pdf index 6f6505c65..2411eb8f1 100644 --- a/docs/psblas-3.9.pdf +++ b/docs/psblas-3.9.pdf @@ -418,7 +418,7 @@ stream % 379 0 obj << /S /GoTo /D (subsection.6.17) >> % 382 0 obj -(\376\377\0006\000.\0001\0007\000\040\000p\000s\000b\000\137\000g\000l\000o\000b\000\137\000t\000o\000\137\000l\000o\000c\000\040\040\024\000\040\000G\000l\000o\000b\000a\000l\000\040\000t\000o\000\040\000l\000o\000c\000a\000l\000\040\000i\000n\000d\000i\000c\000e\000s\000\040\000c\000o\000n\000v\000e\000r\000t\000i\000o\000n) +(\376\377\0006\000.\0001\0007\000\040\000p\000s\000b\000\137\000g\000l\000o\000b\000\137\000t\000o\000\137\000l\000o\000c\000\040\040\024\000\040\000G\000l\000o\000b\000a\000l\000\040\000t\000o\000\040\000l\000o\000c\000a\000l\000\040\000i\000n\000d\000i\000c\000e\000s\000\040\000c\000o\000n\000v\000e\000r\000s\000i\000o\000n) % 383 0 obj << /S /GoTo /D (subsection.6.18) >> % 386 0 obj @@ -665,7 +665,7 @@ endstream endobj 682 0 obj << -/Length 767 +/Length 777 >> stream 0 g 0 G @@ -674,21 +674,21 @@ stream 0 g 0 G 0 g 0 G BT -/F75 24.7871 Tf 169.511 628.583 Td [(PSBLAS)-250(3.9.0)-250(User)-55(')55(s)-250(guide)]TJ +/F75 24.7871 Tf 169.511 628.503 Td [(PSBLAS)-250(3.9.0)-250(User)-55(')55(s)-250(guide)]TJ ET q -1 0 0 1 125.3 611.955 cm +1 0 0 1 125.3 611.875 cm 0 0 343.711 4.981 re f Q BT -/F78 14.3462 Tf 156.541 588.762 Td [(A)-250(r)18(efer)18(ence)-250(guide)-250(for)-250(the)-250(Parallel)-250(Sparse)-250(BLAS)-250(library)]TJ +/F78 14.3462 Tf 156.541 588.682 Td [(A)-250(r)18(efer)18(ence)-250(guide)-250(for)-250(the)-250(Parallel)-250(Sparse)-250(BLAS)-250(library)]TJ 0 g 0 G 0 g 0 G 0 g 0 G 0 g 0 G 0 g 0 G ET -1 0 0 1 168.637 349.474 cm +1 0 0 1 168.637 349.314 cm q .42964 0 0 .42964 0 0 cm q @@ -699,9 +699,9 @@ Q 0 g 0 G 0 g 0 G 0 g 0 G -1 0 0 1 -168.637 -349.474 cm +1 0 0 1 -168.637 -349.314 cm BT -/F75 9.9626 Tf 365.51 270.624 Td [(by)-250(Salvatore)-250(Filippone)]TJ 34.042 -11.956 Td [(Alfredo)-250(Buttari)]TJ -8.847 -11.955 Td [(Fabio)-250(Durastante)]TJ/F84 9.9626 Tf 16.987 -11.955 Td [(June)-250(9th,)-250(2025)]TJ +/F75 9.9626 Tf 365.51 270.385 Td [(by)-250(Salvatore)-250(Filippone)]TJ 34.042 -11.956 Td [(Alfredo)-250(Buttari)]TJ -8.847 -11.955 Td [(Fabio)-250(Durastante)]TJ/F84 9.9626 Tf -13.589 -11.955 Td [(December)-250(23r)18(d,)-250(2025)]TJ 0 g 0 G 0 g 0 G ET @@ -2588,9 +2588,9 @@ q []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F84 9.9626 Tf 192.009 645.674 Td [(loc)-250(\227)-250(Global)-250(to)-250(local)-250(indices)-250(convertion)]TJ +/F84 9.9626 Tf 192.009 645.674 Td [(loc)-250(\227)-250(Global)-250(to)-250(local)-250(indices)-250(conversion)]TJ 0 g 0 G - [-457(.)-500(.)-500(.)-500(.)-500(.)-500(.)-500(.)]TJ + [-359(.)-500(.)-500(.)-500(.)-500(.)-500(.)-500(.)]TJ 0 g 0 G [-1500(98)]TJ 0 g 0 G @@ -4138,7 +4138,7 @@ stream /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [113.843 641.868 367.818 653.928] +/Rect [113.843 641.868 368.794 653.928] /A << /S /GoTo /D (subsection.6.17) >> >> % 802 0 obj @@ -4524,13 +4524,13 @@ endstream endobj 893 0 obj << -/Length 4149 +/Length 4155 >> stream 0 g 0 G 0 g 0 G BT -/F75 14.3462 Tf 99.895 705.784 Td [(Preface)]TJ/F84 9.9626 Tf 0.98 0 0 1 99.587 683.082 Tm [(This)-249(manual)-250(describes)-249(the)-250(main)-250(featur)19(es)-250(of)-249(PSBLAS,)-250(a)-249(library)-250(for)-249(parallel)-250(sparse)]TJ 1 0 0 1 99.895 671.127 Tm [(computations)-250(that)-250(has)-250(been)-250(developed)-250(over)-250(a)-250(number)-250(of)-250(years.)]TJ 1.01 0 0 1 114.839 659.172 Tm [(Our)-248(work)-248(has)-248(been)-247(mainly)-248(devoted)-248(to)-248(pr)18(oviding)-248(a)-248(foundational)-248(toolkit)-247(on)]TJ 1.02 0 0 1 99.477 647.217 Tm [(which)-264(many)-265(algorithms)-264(can)-264(be)-265(implemented;)-274(the)-264(toolkit)-264(has)-265(pr)18(oven)-264(its)-265(ef)18(fec-)]TJ 1.02 0 0 1 99.895 635.261 Tm [(tiveness)-269(and)-268(\003exibility)-269(in)-268(many)-269(ways.)-374(The)-268(PSBLAS)-269(component)-268(deals)-269(mostly)]TJ 1.02 0 0 1 99.477 623.306 Tm [(with)-285(the)-286(computational)-285(kernels)-286(and)-285(envir)17(onment)-285(handling;)-306(it)-285(supports)-286(com-)]TJ 1.017 0 0 1 99.596 611.351 Tm [(putations)-245(on)-246(normal)-245(CPUs,)-246(including)-245(the)-245(usage)-246(of)-245(OpenMP)-246(for)-245(parallellizing)]TJ 1 0 0 1 99.895 599.396 Tm [(acr)18(oss)-250(multiple)-250(cor)18(es.)]TJ 1.02 0 0 1 114.839 587.441 Tm [(This)-283(foundational)-284(package)-283(pr)17(ovides)-283(linear)-283(solvers)-284(and)-283(some)-284(very)-283(simple)]TJ 1.019 0 0 1 99.596 575.486 Tm [(pr)18(econditioners;)-247(the)-246(companion)-246(package)-246(AMG4PSBLAS)-247(exp)1(lor)17(es)-246(how)-246(to)-246(use)]TJ 0.981 0 0 1 99.895 563.53 Tm [(the)-256(base)-256(toolkit)-256(to)-256(build)-256(much)-256(mor)18(e)-256(sophisticated)-256(pr)19(econditioners)-256(which)-256(can)-256(be)]TJ 1 0 0 1 99.596 551.575 Tm [(plugged)-250(seamlessly)-250(into)-250(the)-250(base)-250(solvers.)]TJ 0.98 0 0 1 114.839 539.62 Tm [(The)-253(softwar)19(e)-253(ar)18(chite)1(ctur)18(e)-253(allows)-252(us)-253(to)-253(of)19(f)-1(er)-252(support)-253(for)-252(many)-253(alternatives)-253(in)]TJ 1.005 0 0 1 99.895 527.665 Tm [(the)-249(implementation,)-250(including)-249(usage)-249(of)-250(heter)18(ogeneous)-249(platforms,)-249(and)-250(compu-)]TJ 1.02 0 0 1 99.895 515.71 Tm [(tations)-245(performed)-245(on)-245(GPUs)-246(thr)18(ouh)-245(CUDA.)-245(Ther)17(e)-245(is)-245(support)-245(for)-245(GPU)-245(compu-)]TJ 1.007 0 0 1 99.895 503.755 Tm [(tations)-247(thr)17(ough)-247(OpenACC,)-247(but)-248(it)-247(is)-248(at)-247(this)-248(time)-247(a)-248(highly)-247(experimental)-247(version;)]TJ 1.02 0 0 1 99.477 491.799 Tm [(we)-281(plan)-281(to)-281(also)-281(look)-281(at)-281(using)-281(accelerato)1(rs)-281(thr)17(ough)-281(OpenMP)-281(as)-281(support)-280(fr)17(om)]TJ 1 0 0 1 99.895 479.844 Tm [(compilers)-250(impr)18(oves.)]TJ 1.02 0 0 1 114.839 467.889 Tm [(The)-272(pr)17(oject)-272(is)-272(lead)-272(by)-272(Salvator)17(e)-272(Filippone;)-285(a)-273(numb)1(er)-273(of)-272(people)-272(have)-272(been)]TJ 1.02 0 0 1 99.895 455.934 Tm [(contributing)-317(to)-317(this)-318(package)-317(over)-317(the)-317(years;)-353(contributors)-318(in)-317(r)18(oughly)-317(r)17(everse)]TJ 1 0 0 1 99.895 443.979 Tm [(chr)18(onological)-250(or)18(der:)]TJ 14.944 -11.955 Td [(Luca)-250(Pep)]TJ 41.494 0.025 Td [(\036)]TJ -0.727 -0.025 Td [(e)-250(Sciarria)]TJ -40.767 -11.956 Td [(Theophane)-250(Loloum)]TJ 0 -11.955 Td [(Dimitri)-250(W)92(alther)]TJ 0 -11.955 Td [(Andea)-250(Di)-250(Iorio)]TJ 0 -11.955 Td [(Stefano)-250(Petrilli)]TJ 0 -11.955 Td [(Sor)18(en)-250(Rasmussen)]TJ 0 -11.955 Td [(Zaak)-250(Beekman)]TJ 0 -11.956 Td [(Ambra)-250(Abdullahi)-250(Hassan)]TJ 0 -11.955 Td [(Pasqua)-250(D'Ambra)]TJ 0 -11.955 Td [(Daniela)-250(di)-250(Sera\002no)]TJ 0 -11.955 Td [(Michele)-250(Martone)]TJ 0 -11.955 Td [(Michele)-250(Colajanni)]TJ 0 -11.955 Td [(Fabio)-250(Cerioni)]TJ 0 -11.956 Td [(Stefano)-250(Maiolatesi)]TJ 0 -11.955 Td [(Dario)-250(Pascucci)]TJ +/F75 14.3462 Tf 99.895 705.784 Td [(Preface)]TJ/F84 9.9626 Tf 0.98 0 0 1 99.587 683.082 Tm [(This)-249(manual)-250(describes)-249(the)-250(main)-250(featur)19(es)-250(of)-249(PSBLAS,)-250(a)-249(library)-250(for)-249(parallel)-250(sparse)]TJ 1 0 0 1 99.895 671.127 Tm [(computations)-250(that)-250(has)-250(been)-250(developed)-250(over)-250(a)-250(number)-250(of)-250(years.)]TJ 1.01 0 0 1 114.839 659.172 Tm [(Our)-248(work)-248(has)-248(been)-247(mainly)-248(devoted)-248(to)-248(pr)18(oviding)-248(a)-248(foundational)-248(toolkit)-247(on)]TJ 1.02 0 0 1 99.477 647.217 Tm [(which)-264(many)-265(algorithms)-264(can)-264(be)-265(implemented;)-274(the)-264(toolkit)-264(has)-265(pr)18(oven)-264(its)-265(ef)18(fec-)]TJ 1.02 0 0 1 99.895 635.261 Tm [(tiveness)-269(and)-268(\003exibility)-269(in)-268(many)-269(ways.)-374(The)-268(PSBLAS)-269(component)-268(deals)-269(mostly)]TJ 1.02 0 0 1 99.477 623.306 Tm [(with)-285(the)-286(computational)-285(kernels)-286(and)-285(envir)17(onment)-285(handling;)-306(it)-285(supports)-286(com-)]TJ 1.017 0 0 1 99.596 611.351 Tm [(putations)-245(on)-246(normal)-245(CPUs,)-246(including)-245(the)-245(usage)-246(of)-245(OpenMP)-246(for)-245(parallellizing)]TJ 1 0 0 1 99.895 599.396 Tm [(acr)18(oss)-250(multiple)-250(cor)18(es.)]TJ 1.02 0 0 1 114.839 587.441 Tm [(This)-283(foundational)-284(package)-283(pr)17(ovides)-283(linear)-283(solvers)-284(and)-283(some)-284(very)-283(simple)]TJ 1.019 0 0 1 99.596 575.486 Tm [(pr)18(econditioners;)-247(the)-246(companion)-246(package)-246(AMG4PSBLAS)-247(exp)1(lor)17(es)-246(how)-246(to)-246(use)]TJ 0.981 0 0 1 99.895 563.53 Tm [(the)-256(base)-256(toolkit)-256(to)-256(build)-256(much)-256(mor)18(e)-256(sophisticated)-256(pr)19(econditioners)-256(which)-256(can)-256(be)]TJ 1 0 0 1 99.596 551.575 Tm [(plugged)-250(seamlessly)-250(into)-250(the)-250(base)-250(solvers.)]TJ 1.016 0 0 1 114.839 539.62 Tm [(The)-246(softwar)18(e)-246(ar)18(chitectur)18(e)-246(allows)-246(us)-245(to)-246(of)18(fer)-246(suppor)1(t)-246(for)-246(many)-246(alter)1(natives)]TJ 1.008 0 0 1 99.895 527.665 Tm [(in)-247(the)-247(implementation,)-247(including)-247(usage)-247(of)-247(heter)18(ogeneous)-247(platforms,)-247(and)-247(com-)]TJ 1.02 0 0 1 99.596 515.71 Tm [(putations)-274(p)1(erformed)-274(on)-273(GPUs)-274(thr)18(ouh)-274(CUDA.)-273(Ther)17(e)-273(is)-274(also)-273(support)-274(for)-273(GPU)]TJ 1.02 0 0 1 99.895 503.755 Tm [(computations)-260(thr)17(ough)-260(OpenACC,)-260(but)-261(it)-260(is)-260(at)-261(th)1(is)-261(time)-260(a)-260(highly)-261(experimental)]TJ 0.989 0 0 1 99.616 491.799 Tm [(version;)-252(we)-253(plan)-252(to)-252(also)-252(look)-252(at)-253(using)-252(accelerators)-252(thr)18(ough)-252(OpenMP)-252(as)-252(support)]TJ 1 0 0 1 99.895 479.844 Tm [(fr)18(om)-250(compilers)-250(impr)18(oves.)]TJ 1.02 0 0 1 114.839 467.889 Tm [(The)-272(pr)17(oject)-272(is)-272(lead)-272(by)-272(Salvator)17(e)-272(Filippone;)-285(a)-273(numb)1(er)-273(of)-272(people)-272(have)-272(been)]TJ 1.02 0 0 1 99.895 455.934 Tm [(contributing)-317(to)-317(this)-318(package)-317(over)-317(the)-317(years;)-353(contributors)-318(in)-317(r)18(oughly)-317(r)17(everse)]TJ 1 0 0 1 99.895 443.979 Tm [(chr)18(onological)-250(or)18(der:)]TJ 14.944 -11.955 Td [(Luca)-250(Pep)]TJ 41.494 0.025 Td [(\036)]TJ -0.727 -0.025 Td [(e)-250(Sciarria)]TJ -40.767 -11.956 Td [(Theophane)-250(Loloum)]TJ 0 -11.955 Td [(Dimitri)-250(W)92(alther)]TJ 0 -11.955 Td [(Andea)-250(Di)-250(Iorio)]TJ 0 -11.955 Td [(Stefano)-250(Petrilli)]TJ 0 -11.955 Td [(Sor)18(en)-250(Rasmussen)]TJ 0 -11.955 Td [(Zaak)-250(Beekman)]TJ 0 -11.956 Td [(Ambra)-250(Abdullahi)-250(Hassan)]TJ 0 -11.955 Td [(Pasqua)-250(D'Ambra)]TJ 0 -11.955 Td [(Daniela)-250(di)-250(Sera\002no)]TJ 0 -11.955 Td [(Michele)-250(Martone)]TJ 0 -11.955 Td [(Michele)-250(Colajanni)]TJ 0 -11.955 Td [(Fabio)-250(Cerioni)]TJ 0 -11.956 Td [(Stefano)-250(Maiolatesi)]TJ 0 -11.955 Td [(Dario)-250(Pascucci)]TJ 0 g 0 G 0 g 0 G 243.12 -21.918 Td [(Salvator)18(e)-250(Filippone)]TJ 18.729 -11.955 Td [(Alfr)18(edo)-250(Buttari)]TJ -8.847 -11.955 Td [(Fabio)-250(Durastante)]TJ @@ -4543,7 +4543,7 @@ endstream endobj 907 0 obj << -/Length 9122 +/Length 9243 >> stream 0 g 0 G @@ -4565,11 +4565,11 @@ BT 1 0 0 rg 1 0 0 RG 1 0 0 1 330.659 503.326 Tm [(19)]TJ 0 g 0 G - 0.98 0 0 1 340.622 503.326 Tm [(];)-220(suf)18(\002cient)-203(support)-202(for)-203(Fortran)-202(2008)]TJ 1.018 0 0 1 150.705 491.371 Tm [(is)-245(now)-245(available)-245(fr)17(om)-245(many)-245(compilers,)-245(including)-245(r)17(ecent)-245(versions)-245(of)-245(the)-245(GNU)]TJ 0.985 0 0 1 150.705 479.416 Tm [(Fortran)-254(compiler)-253(fr)18(om)-254(the)-254(Fr)19(ee)-254(Softwar)18(e)-254(Foundation,)-254(and)-253(the)-254(FLANG)-254(compiler)]TJ 1 0 0 1 150.705 467.461 Tm [(fr)18(om)-250(the)-250(LL)92(VM)-250(pr)18(oject.)]TJ 0.98 0 0 1 165.649 455.397 Tm [(Pr)18(evious)-234(appr)19(oaches)-234(have)-234(been)-234(based)-234(on)-234(mixing)-234(Fortran)-234(95,)-239(with)-234(its)-234(support)]TJ 1.02 0 0 1 150.705 443.442 Tm [(for)-260(object-based)-260(design,)-264(with)-260(other)-260(languages;)-267(these)-260(have)-260(been)-260(advocated)-260(by)]TJ 1.016 0 0 1 150.705 431.486 Tm [(a)-246(number)-246(of)-246(authors,)-247(e.g.)-246([)]TJ + 0.98 0 0 1 340.622 503.326 Tm [(];)-220(suf)18(\002cient)-203(support)-202(for)-203(Fortran)-202(2008)]TJ 1.018 0 0 1 150.705 491.371 Tm [(is)-245(now)-245(available)-245(fr)17(om)-245(many)-245(compilers,)-245(including)-245(r)17(ecent)-245(versions)-245(of)-245(the)-245(GNU)]TJ 0.98 0 0 1 150.705 479.416 Tm [(Fortran)-224(compiler)-225(fr)18(om)-224(the)-224(Fr)18(ee)-225(Softwar)19(e)-225(Foundation,)-230(the)-225(FLANG)-224(compiler)-225(fr)19(om)]TJ 0.987 0 0 1 150.705 467.461 Tm [(the)-254(LL)93(VM)-255(pr)19(oject,)-255(and)-254(the)-255(Intel)-254(OneAPI)-255(compiler)75(.)-317(The)-254(README)-255(\002le)-254(contains)-255(a)]TJ 1 0 0 1 150.705 455.506 Tm [(list)-250(of)-250(compilers)-250(against)-250(which)-250(we)-250(have)-250(successfully)-250(tested)-250(the)-250(curr)18(ent)-250(r)18(elease.)]TJ 0.98 0 0 1 165.649 443.442 Tm [(Pr)18(evious)-234(appr)19(oaches)-234(have)-234(been)-234(based)-234(on)-234(mixing)-234(Fortran)-234(95,)-239(with)-234(its)-234(support)]TJ 1.02 0 0 1 150.705 431.486 Tm [(for)-260(object-based)-260(design,)-264(with)-260(other)-260(languages;)-267(these)-260(have)-260(been)-260(advocated)-260(by)]TJ 1.02 0 0 1 150.705 419.531 Tm [(a)-273(number)-274(of)-273(authors,)-281(e.g.)-273([)]TJ 1 0 0 rg 1 0 0 RG - 1 0 0 1 268.108 431.486 Tm [(16)]TJ + 1 0 0 1 270.027 419.531 Tm [(16)]TJ 0 g 0 G - 1.016 0 0 1 278.071 431.486 Tm [(].)-305(Mor)17(eover)73(,)-246(the)-246(Fortran)-246(95)-246(facilities)-247(for)-246(dynamic)]TJ 1.006 0 0 1 150.705 419.531 Tm [(memory)-248(management)-248(and)-247(interface)-248(overloading)-248(gr)18(eatly)-248(enhance)-247(the)-248(usability)]TJ 1.02 0 0 1 150.705 407.576 Tm [(of)-287(the)-287(PSBLAS)-287(subr)17(outines.)-430(In)-287(this)-287(way)109(,)-298(the)-287(library)-287(can)-288(take)-287(car)18(e)-287(of)-288(r)8(untime)]TJ 1.02 0 0 1 150.705 395.621 Tm [(memory)-248(r)18(equir)17(ements)-248(that)-248(ar)18(e)-249(qui)1(te)-249(dif)18(\002cult)-248(or)-248(even)-248(impossible)-248(to)-248(pr)17(edict)-248(at)]TJ 1 0 0 1 150.705 383.666 Tm [(implementation)-250(or)-250(compilation)-250(time.)]TJ 14.944 -12.064 Td [(The)-249(pr)18(esentation)-250(of)-249(the)-249(PSBLAS)-250(library)-249(follows)-250(the)-249(general)-249(str)8(uctur)18(e)-250(of)-249(the)]TJ 0.98 0 0 1 150.406 359.647 Tm [(pr)18(oposal)-255(for)-255(s)1(erial)-255(Sparse)-255(BLAS)-255([)]TJ + 1.02 0 0 1 279.99 419.531 Tm [(].)-389(The)-273(Fortran)-274(95)-273(facilities)-273(for)-274(dynamic)-273(memory)]TJ 1.02 0 0 1 150.705 407.576 Tm [(management)-294(and)-293(interface)-294(overloading)-293(ensur)17(e)-293(that)-294(the)-293(library)-294(can)-294(take)-293(car)17(e)]TJ 1.006 0 0 1 150.705 395.621 Tm [(of)-248(r)8(untime)-248(memory)-248(r)18(equir)18(ements)-248(that)-247(ar)18(e)-248(quite)-248(dif)18(\002cult)-248(or)-248(even)-248(impossible)-247(to)]TJ 1 0 0 1 150.406 383.666 Tm [(pr)18(edict)-250(at)-250(implementation)-250(or)-250(compilation)-250(time.)]TJ 15.243 -12.064 Td [(The)-249(pr)18(esentation)-250(of)-249(the)-249(PSBLAS)-250(library)-249(follows)-250(the)-249(general)-249(str)8(uctur)18(e)-250(of)-249(the)]TJ 0.98 0 0 1 150.406 359.647 Tm [(pr)18(oposal)-255(for)-255(s)1(erial)-255(Sparse)-255(BLAS)-255([)]TJ 1 0 0 rg 1 0 0 RG 1 0 0 1 292.915 359.647 Tm [(8)]TJ 0 g 0 G @@ -4589,7 +4589,7 @@ BT 1 0 0 rg 1 0 0 RG [-250(6)]TJ 0 g 0 G - [(].)]TJ 1.016 0 0 1 165.649 335.627 Tm [(The)-245(applicability)-245(of)-246(sparse)-245(iterative)-245(solvers)-245(to)-245(many)-245(dif)17(f)1(er)17(ent)-245(ar)18(eas)-245(causes)]TJ 0.98 0 0 1 150.705 323.672 Tm [(some)-251(terminology)-252(pr)19(oblems)-252(because)-251(the)-252(same)-251(concept)-251(may)-252(be)-251(denoted)-252(thr)19(ough)]TJ 1.013 0 0 1 150.705 311.717 Tm [(dif)18(fer)18(ent)-248(names)-247(depending)-247(on)-248(the)-247(application)-248(ar)18(ea.)-308(The)-247(PSBLAS)-247(featur)17(es)-247(pr)18(e-)]TJ 1.02 0 0 1 150.705 299.762 Tm [(sented)-289(in)-290(this)-289(document)-290(will)-289(be)-290(discussed)-289(r)17(eferring)-289(to)-290(a)-289(\002nite)-290(dif)18(fer)18(ence)-289(dis-)]TJ 1.012 0 0 1 150.705 287.807 Tm [(cr)18(etization)-248(of)-248(a)-248(Partial)-248(Dif)18(fer)18(ential)-248(Equation)-248(\050PDE\051.)-247(However)73(,)-248(the)-248(scope)-248(of)-248(the)]TJ 1.02 0 0 1 150.705 275.852 Tm [(library)-249(is)-249(wider)-249(than)-249(that:)-312(for)-250(exampl)1(e,)-251(it)-249(can)-249(be)-249(applied)-249(to)-249(\002nite)-249(element)-249(dis-)]TJ 0.98 0 0 1 150.705 263.896 Tm [(cr)18(etizations)-240(of)-241(PDEs,)-243(and)-241(even)-241(to)-240(dif)18(fer)18(ent)-241(classes)-240(of)-241(pr)18(oblems)-240(such)-241(as)-241(nonlinear)]TJ 1 0 0 1 150.705 251.941 Tm [(optimization,)-250(for)-250(example)-250(in)-250(optimal)-250(contr)18(ol)-250(pr)18(oblems.)]TJ 1.02 0 0 1 165.649 239.877 Tm [(The)-346(design)-346(of)-345(a)-346(solver)-346(for)-346(sparse)-346(linear)-346(systems)-345(is)-346(driven)-346(by)-346(many)-346(con-)]TJ 1.006 0 0 1 150.705 227.922 Tm [(\003icting)-250(objectives,)-249(such)-250(as)-250(limiting)-249(occupation)-250(of)-250(storage)-249(r)18(esour)18(ces,)-250(exploiting)]TJ 1.013 0 0 1 150.705 215.967 Tm [(r)18(egularities)-247(in)-247(the)-247(input)-247(data,)-247(exploi)1(ting)-247(har)17(dwar)18(e)-247(characteristics)-247(of)-246(the)-247(paral-)]TJ 1.02 0 0 1 150.705 204.012 Tm [(lel)-293(platform.)-447(T)90(o)-292(achieve)-293(an)-293(optimal)-293(communication)-292(to)-293(computation)-293(ratio)-293(on)]TJ 1.02 0 0 1 150.705 192.057 Tm [(distributed)-322(memory)-322(machines)-323(it)-322(is)-322(essential)-322(to)-323(ke)1(ep)-323(the)]TJ/F78 9.9626 Tf 1.02 0 0 1 407.18 192.057 Tm [(data)-322(locality)]TJ/F84 9.9626 Tf 1.02 0 0 1 461.316 192.057 Tm [(as)-322(high)]TJ 1.02 0 0 1 150.705 180.101 Tm [(as)-270(possible;)-283(this)-270(can)-270(be)-270(done)-271(thr)18(ough)-270(an)-270(appr)17(opriate)-270(data)-270(allocation)-270(strategy)109(.)]TJ 1.02 0 0 1 150.396 168.146 Tm [(The)-264(choice)-265(of)-264(the)-265(pr)18(econditioner)-264(is)-265(another)-264(very)-265(important)-264(factor)-265(that)-264(af)18(fects)]TJ 1.02 0 0 1 150.705 156.191 Tm [(ef)18(\002ciency)-247(of)-248(the)-248(impleme)1(nted)-248(application.)-311(Optimal)-248(data)-247(distribution)-248(r)18(equir)18(e-)]TJ 1.014 0 0 1 150.705 144.236 Tm [(ments)-247(for)-246(a)-247(given)-247(pr)18(econditioner)-247(may)-246(con\003ict)-247(with)-247(distribution)-246(r)17(equir)18(ements)]TJ 1.02 0 0 1 150.705 132.281 Tm [(of)-310(the)-311(r)18(est)-310(of)-311(the)-310(solver)72(.)-499(Finding)-311(the)-310(optimal)-310(trade-of)17(f)-310(may)-310(be)-310(very)-311(dif)18(\002cult)]TJ 1.016 0 0 1 150.705 120.326 Tm [(because)-246(it)-245(is)-246(application)-245(dependent.)-305(Possible)-246(solutions)-246(to)-245(these)-246(pr)18(oblems)-246(and)]TJ + [(].)]TJ 1.016 0 0 1 165.649 335.627 Tm [(The)-245(applicability)-245(of)-246(sparse)-245(iterative)-245(solvers)-245(to)-245(many)-245(dif)17(f)1(er)17(ent)-245(ar)18(eas)-245(causes)]TJ 0.98 0 0 1 150.705 323.672 Tm [(some)-219(terminology)-219(pr)19(oblems)-219(because)-219(the)-219(same)-219(concept)-219(may)-218(be)-219(denoted)-219(by)-219(dif)18(fer)18(-)]TJ 1.003 0 0 1 150.705 311.717 Tm [(ent)-249(names)-249(depending)-249(on)-248(the)-249(application)-249(ar)18(ea.)-309(The)-249(PSBLAS)-249(featur)18(es)-249(pr)18(esented)]TJ 1.01 0 0 1 150.705 299.762 Tm [(in)-247(this)-246(document)-247(will)-247(be)-246(discussed)-247(taking)-246(as)-247(a)-247(r)18(efer)18(ence)-247(a)-246(\002nite)-247(dif)18(fer)18(ence)-247(dis-)]TJ 1.012 0 0 1 150.705 287.807 Tm [(cr)18(etization)-248(of)-248(a)-248(Partial)-248(Dif)18(fer)18(ential)-248(Equation)-248(\050PDE\051.)-247(However)73(,)-248(the)-248(scope)-248(of)-248(the)]TJ 1.02 0 0 1 150.705 275.852 Tm [(library)-333(is)-332(wider)-333(than)-333(that:)-479(it)-332(can)-333(be)-333(applied)-332(to)-333(\002nite)-332(element)-333(and)-333(other)-332(dis-)]TJ 0.98 0 0 1 150.705 263.896 Tm [(cr)18(etizations)-240(of)-241(PDEs,)-243(and)-241(even)-241(to)-240(dif)18(fer)18(ent)-241(classes)-240(of)-241(pr)18(oblems)-240(such)-241(as)-241(nonlinear)]TJ 1 0 0 1 150.705 251.941 Tm [(optimization,)-250(for)-250(example)-250(in)-250(optimal)-250(contr)18(ol)-250(pr)18(oblems.)]TJ 1.02 0 0 1 165.649 239.877 Tm [(The)-346(design)-346(of)-345(a)-346(solver)-346(for)-346(sparse)-346(linear)-346(systems)-345(is)-346(driven)-346(by)-346(many)-346(con-)]TJ 1.006 0 0 1 150.705 227.922 Tm [(\003icting)-250(objectives,)-249(such)-250(as)-250(limiting)-249(occupation)-250(of)-250(storage)-249(r)18(esour)18(ces,)-250(exploiting)]TJ 1.013 0 0 1 150.705 215.967 Tm [(r)18(egularities)-247(in)-247(the)-247(input)-247(data,)-247(exploi)1(ting)-247(har)17(dwar)18(e)-247(characteristics)-247(of)-246(the)-247(paral-)]TJ 1.02 0 0 1 150.705 204.012 Tm [(lel)-293(platform.)-447(T)90(o)-292(achieve)-293(an)-293(optimal)-293(communication)-292(to)-293(computation)-293(ratio)-293(on)]TJ 1.02 0 0 1 150.705 192.057 Tm [(distributed)-322(memory)-322(machines)-323(it)-322(is)-322(essential)-322(to)-323(ke)1(ep)-323(the)]TJ/F78 9.9626 Tf 1.02 0 0 1 407.18 192.057 Tm [(data)-322(locality)]TJ/F84 9.9626 Tf 1.02 0 0 1 461.316 192.057 Tm [(as)-322(high)]TJ 1.02 0 0 1 150.705 180.101 Tm [(as)-270(possible;)-283(this)-270(can)-270(be)-270(done)-271(thr)18(ough)-270(an)-270(appr)17(opriate)-270(data)-270(allocation)-270(strategy)109(.)]TJ 1.02 0 0 1 150.396 168.146 Tm [(The)-264(choice)-265(of)-264(the)-265(pr)18(econditioner)-264(is)-265(another)-264(very)-265(important)-264(factor)-265(that)-264(af)18(fects)]TJ 1.02 0 0 1 150.705 156.191 Tm [(ef)18(\002ciency)-247(of)-248(the)-248(impleme)1(nted)-248(application.)-311(Optimal)-248(data)-247(distribution)-248(r)18(equir)18(e-)]TJ 1.014 0 0 1 150.705 144.236 Tm [(ments)-247(for)-246(a)-247(given)-247(pr)18(econditioner)-247(may)-246(con\003ict)-247(with)-247(distribution)-246(r)17(equir)18(ements)]TJ 1.02 0 0 1 150.705 132.281 Tm [(of)-310(the)-311(r)18(est)-310(of)-311(the)-310(solver)72(.)-499(Finding)-311(the)-310(optimal)-310(trade-of)17(f)-310(may)-310(be)-310(very)-311(dif)18(\002cult)]TJ 1.016 0 0 1 150.705 120.326 Tm [(because)-246(it)-245(is)-246(application)-245(dependent.)-305(Possible)-246(solutions)-246(to)-245(these)-246(pr)18(oblems)-246(and)]TJ 0 g 0 G 1 0 0 1 320.07 90.438 Tm [(2)]TJ 0 g 0 G @@ -4609,7 +4609,7 @@ BT 0 0 1 rg 0 0 1 RG [-250(1)]TJ 0 g 0 G - [(;)-251(lower)-251(layers)-251(of)-250(the)-251(library)-251(indicate)-250(an)]TJ 1.005 0 0 1 99.895 518.447 Tm [(encapsulation)-247(r)18(elationship)-247(with)-247(upper)-247(layers.)-308(The)-247(ongoing)-247(discussion)-247(focuses)]TJ 1.018 0 0 1 99.895 506.491 Tm [(on)-245(the)-244(Fortran)-244(2008)-245(layer)-244(immediately)-245(below)-244(the)-245(application)-244(layer)72(.)-304(The)-244(serial)]TJ 0.98 0 0 1 99.596 494.536 Tm [(parts)-246(of)-245(the)-246(computation)-246(on)-245(each)-246(pr)18(ocess)-245(ar)18(e)-246(executed)-245(thr)18(ough)-246(calls)-245(to)-246(the)-246(serial)]TJ 0.98 0 0 1 99.895 482.581 Tm [(sparse)-243(BLAS)-243(subr)18(outines.)-312(In)-243(a)-243(similar)-243(way)113(,)-245(the)-243(inter)18(-pr)19(ocess)-243(message)-243(exchanges)]TJ 1 0 0 1 99.895 470.626 Tm [(ar)18(e)-251(encapsulated)-251(in)-251(an)-251(applicaiton)-251(layer)-251(that)-251(has)-251(been)-251(str)18(ongly)-251(inspir)18(ed)-251(by)-251(the)]TJ 0.987 0 0 1 99.895 458.671 Tm [(Basic)-251(Linear)-252(Algebra)-251(Communication)-251(Subr)18(outines)-251(\050BLACS\051)-252(library)-251([)]TJ + [(;)-251(lower)-251(layers)-251(of)-250(the)-251(library)-251(indicate)-250(an)]TJ 1.005 0 0 1 99.895 518.447 Tm [(encapsulation)-247(r)18(elationship)-247(with)-247(upper)-247(layers.)-308(The)-247(ongoing)-247(discussion)-247(focuses)]TJ 1.018 0 0 1 99.895 506.491 Tm [(on)-245(the)-244(Fortran)-244(2008)-245(layer)-244(immediately)-245(below)-244(the)-245(application)-244(layer)72(.)-304(The)-244(serial)]TJ 0.98 0 0 1 99.596 494.536 Tm [(parts)-246(of)-245(the)-246(computation)-246(on)-245(each)-246(pr)18(ocess)-245(ar)18(e)-246(executed)-245(thr)18(ough)-246(calls)-245(to)-246(the)-246(serial)]TJ 0.98 0 0 1 99.895 482.581 Tm [(sparse)-243(BLAS)-243(subr)18(outines.)-312(In)-243(a)-243(similar)-243(way)113(,)-245(the)-243(inter)18(-pr)19(ocess)-243(message)-243(exchanges)]TJ 1 0 0 1 99.895 470.626 Tm [(ar)18(e)-251(encapsulated)-251(in)-251(an)-251(application)-251(layer)-251(that)-251(has)-251(been)-251(str)18(ongly)-251(inspir)18(ed)-251(by)-251(the)]TJ 0.987 0 0 1 99.895 458.671 Tm [(Basic)-251(Linear)-252(Algebra)-251(Communication)-251(Subr)18(outines)-251(\050BLACS\051)-252(library)-251([)]TJ 1 0 0 rg 1 0 0 RG 1 0 0 1 396.344 458.671 Tm [(7)]TJ 0 g 0 G @@ -4622,7 +4622,7 @@ BT 0 g 0 G 0 g 0 G ET -1 0 0 1 207.727 270.025 cm +1 0 0 1 208.702 270.025 cm q .65 0 0 .65 0 0 cm q @@ -4631,7 +4631,7 @@ q Q Q 0 g 0 G -1 0 0 1 -207.727 -270.025 cm +1 0 0 1 -208.702 -270.025 cm BT /F84 9.9626 Tf 165.575 238.145 Td [(Figur)18(e)-250(1:)-310(PSBLAS)-250(library)-250(components)-250(hierar)18(chy)111(.)]TJ 0 g 0 G @@ -4652,85 +4652,94 @@ endobj /PTEX.FileName (./figures/psblas.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 928 0 R -/BBox [0 0 197 215] +/BBox [0 0 194 215] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 929 0 R ->>/Font << /R8 930 0 R>> +/R9 929 0 R +>>/Font << /R7 930 0 R>> >> -/Length 898 +/Length 872 /Filter /FlateDecode >> stream -xVM7 W4Y>&@[HMl cu;{#QvvK{#=RuɯOlg7_ 7 // l7ɠE,E(%̫q{:~e0syyc>(ڿM, - 3"dQ7_۳Xm20 -(:HhU3vܪœA f6=A΃A!9` -PwAt_UOϡOOl8fPHY櫇+k(*XIuyQ - *cv ( ̐JBtFpͩvvVՑ -rӑ&@^ -2!)՚\a87L )]a`;v pba=WYHj.82Rt%` R=E 4{4_pXFwt{[f.vʑyGާxqc++SJgšBr5XUFZYMv8\HM!%rl9ٛbh0g3E-:i>9/aUvu`Lk¡tEs0ȽI -~hP+I`8ws~LU92ߔMF -޲-u1 u -}qX|VbA6QY8% -擎=EA5) -}iV<\rDݠ7xU -Ͻ'Ǜa>=|9hBu湣$Lq5k^޽;>NiZ\V+9D8NLG׻~0+'mw>o;{=EaѲ8S4%ǥ_N#OΏ +xVM7 W4"qLk==G1vv Dى(Zyo'<-Q{>lܻĨl][F@<+ {3͟z_2H{u}ݺwwN1DV{iII)b +2Lg* &#iP9e1<90̎B`Li0[ũ^Ma Oѭ݋xܹzfgػ"a0+1ʄRPe Eȣ-F$U8yxr#rnk#W^:s~ o4 +`3R@ cޞw>3^0bCRh _ژZAY`HMP7NtG7Ǧ6J3 +0 jE +쯘E !&TJB&=cɹ5a)}0EJK_Z'rb23JT# +R)Cp79h>3ݳ ڞ,v:&Y0t8sf(>^1D\T]Ef5r0)HkcWRk;pƠx<탤0TO5FFʃb)BDX<ڜ|*%]kD/*y!!qtl5:1jY[BÓ0QPw:$ϒ Zʪ7Oaˍ[1 F,#PH4m_GE(4*Gx nu(Y%->^w9(EXhq6rnŌuw:mvp=zR{ecwq1/sA/}ͭE endstream endobj 932 0 obj << /Filter /FlateDecode +/Length 310 +>> +stream +x]An0нOc8lM PA,zj&I]ho<.Cuzqd'[ +y|l `[Z {6@gdž  us$6@$6@ tI?lSHъy6in}n5MOU.2/zK-R +endstream +endobj +933 0 obj +<< +/Filter /FlateDecode /Subtype /Type1C -/Length 2887 +/Length 2770 >> stream -xeiXSWo =Z-iʦ m]*VYZQU (! KBI ,A8,!, քMT*(Q n:Jg9|v~/y?0%Fs SbEb I?w0VbБV82ԫ2*xhr}X&HH|pp{k׮&Y D_(EbobA!,{ ck0?l=mvc{Mاg~0wxѲiW]A~}2&&Όg^Ʒg YK-= ,'E oXhafrMM$rs(ʌGgm:{-e spAO*7+rT/Q Ȇic8'pDvUZl(.Y\UDPDQ4@;@G =k|Lx.»{Tط/(f9ofy1'7;#}pVR6$g\ pVo= XIrW|N5w[Fp8k@ؑb>36մ67'H_7xVkWRӭ'aY܉{!RUwsѠef8KUEc#mPtTNİ׽֒9? O׸j1{Zr%8gg\|뀌+˾kSj/2AјR4݄U3Hȅ&VKSzB"ss -kiqֱF|g~ &7U3Zr@oWv=^K; ա -7f's;H@ңv wr#J-{3t=ή+.5@V8,(ؗCiW`+Lp )}漵Zԫj l=2 V זIAr7' hFRs.D"e2ٖ6JctVZD جlژ'ћu_)4. [s;U{':x ziα,f א-:t]V0ry%%EЭjruP%Vzl>1͝HlHB7^8B 4698&L}MEUV`5+nh(Y=5q|zA;ľ+۠mvvSBոK3F8v;?šEUDus5̚BNA^a^]XZwxn~A^dn錹ru)4R~Eq3梌y3 stp:gIT͸Oyvԩ8Sy9>,9A µ݇.l*G nq8PJ1 FfX2[Z,%= -ꁵyUts'7W*La`$e 5=N&Co?5Dn 7 'axwQ ]\KLvT5rS Z̍-v^aT^~B6y rso4QF̭whh@aF4 -0NË5gZv'pH/81m=&7FsaKfGn/W.%$dVފ<ykMP$gJ23W4޷ 6tZgnVH"\٧?3G݋hL^]~"K""-3l-P٥X!3 -"d~+[,U@ TT(.>*#IDaV, ۆCCm6~Z'ȣ~ށS$'I&2@sQ N?~wI)ax\62$Ot%ץQy_gy:Y[j(FETVT&<"^/xQY٭psB+T֧Tj0Vx(O\ -IZt4w!}^gh9@^ ҅s2=3B2H>yn7C#h-whGtBVպ`u1F3vo34\z",P&+ڻoB03xs!F/m'~n?vaD+5t0 +ԷsRztJxFzQ`/d2j@7G.?wyc$OI(SMEߌ| ^`2!-"VIN"̂B-e/uV9:6:.ǰMɪH +xViTSW!KŴ%&ԶuCb=;ZdAİ) K’HM5"\"Tm).`:}t>{9˽ c0A IhzʠQNbQO \YxFGkAs,稡-K="u! l(՗k+!gi-W;rq ?GDN,xNthP6 +9cSEtJRZ)uH̙SUB'HU{ks+4_d&ښ}hO}|Y`TZP(H reD$T'`B_8hN ݿE;8]ODFϠ`b&kj再Mq&j]sԙ3AwBUyX:EL\@kӃĮ4xuL={J̓ѫҊbNh%4fX\hr5)A(UvRU +n`/R";![|t51GδY]2:y> ݃*=0җ2+W)嵀a4}3gwsU(lv-~bc`j,֔hJrM,-ƞ-}r_։I<&N_ԍކywrkLZJ:%[JK[͈D\Eu +%)0,H6baR yf3RIKJ$U[|w)iBn@PR II x<僉A^w{vÛ[i]Z92[QaOM{K ^&3 ؑ(ho*/A/K׹fiR-_ c@(#_F4QSNSO:s]5ٰCDvbeeZΠ\\f-';)^M&"a*nMbwϐ3g8L9$\JeQ[ Y0~ǎƜ甤T+5{"vOFgk\+a]1p:{θ"Go}M\Wվ72xǪSj)|:If +~& +uX+;ITj 2L +9 -}N KTJ7A0Z?P@v] 6 /óu@4ڙWBN,Z@ ֭7:3!t~zƤDh1S_y8ڄ|8Np_m0(D;}L۠r: +ӡ\j!F-lm۠Μqt"W_uoߑ4cջy4cCp&v"9m<='^Gs ##w{?;r8Nz ǝC`x7gKc˫ +Ywd^Q| /H endstream endobj -938 0 obj +939 0 obj << -/Length 9368 +/Length 9520 >> stream 0 g 0 G 0 g 0 G BT -/F84 9.9626 Tf 1.02 0 0 1 150.705 706.129 Tm [(assigned)-295(to)-294(a)-295(pr)17(oce)1(ss)-295(that)-295(will)-295(own)-294(the)-295(corr)18(esponding)-295(r)18(ow)-295(in)-295(the)-295(coef)18(\002cient)]TJ 1.02 0 0 1 150.705 694.174 Tm [(matrix)-247(and)-246(will)-247(carry)-247(out)-247(all)-246(r)17(elated)-247(computations.)-308(This)-247(allocation)-247(strategy)-247(is)]TJ 0.98 0 0 1 150.705 682.219 Tm [(equivalent)-251(to)-251(a)-251(partition)-252(of)-251(the)-251(discr)19(etization)-252(mesh)-251(into)]TJ/F78 9.9626 Tf 0.98 0 0 1 390.229 682.219 Tm [(sub-domains)]TJ/F84 9.9626 Tf 0.98 0 0 1 440.314 682.219 Tm [(.)-315(Our)-251(library)]TJ 1.02 0 0 1 150.705 670.263 Tm [(supports)-297(any)-298(distribution)-297(that)-297(keeps)-298(together)-297(the)-297(coef)17(\002)1(cients)-297(of)-298(each)-297(matrix)]TJ 1.02 0 0 1 150.705 658.308 Tm [(r)18(ow;)-366(ther)18(e)-326(ar)18(e)-325(no)-326(other)-325(constraints)-325(on)-326(the)-325(variable)-326(assignment)1(.)-545(This)-326(choice)]TJ 1.02 0 0 1 150.705 646.353 Tm [(is)-276(consistent)-275(with)-276(simple)-276(data)-276(dist)1(ributions)-276(such)-276(as)]TJ/F145 9.9626 Tf 1 0 0 1 383.652 646.353 Tm [(CYCLIC\050N\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 433.526 646.353 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 453.532 646.353 Tm [(BLOCK)]TJ/F84 9.9626 Tf 1.02 0 0 1 479.684 646.353 Tm [(,)-276(as)]TJ 1.02 0 0 1 150.286 634.398 Tm [(well)-256(as)-256(completely)-256(arbitrary)-256(assignments)-256(of)-256(equation)-256(indices)-256(to)-256(pr)18(ocesses.)-337(In)]TJ 1.002 0 0 1 150.406 622.443 Tm [(particular)-250(it)-250(is)-251(consistent)-250(with)-250(the)-250(usage)-250(of)-251(graph)-250(partitioning)-250(tools)-250(commonly)]TJ 1.02 0 0 1 150.705 610.488 Tm [(available)-288(in)-288(the)-289(literatur)18(e,)-299(e.g.)-434(METIS)-288([)]TJ +/F84 9.9626 Tf 1.02 0 0 1 150.705 706.129 Tm [(assigned)-295(to)-294(a)-295(pr)17(oce)1(ss)-295(that)-295(will)-295(own)-294(the)-295(corr)18(esponding)-295(r)18(ow)-295(in)-295(the)-295(coef)18(\002cient)]TJ 1.02 0 0 1 150.705 694.174 Tm [(matrix)-247(and)-246(will)-247(carry)-247(out)-247(all)-246(r)17(elated)-247(computations.)-308(This)-247(allocation)-247(strategy)-247(is)]TJ 0.988 0 0 1 150.705 682.219 Tm [(equivalent)-253(to)-253(a)-252(partition)-253(of)-253(the)-253(discr)18(etization)-252(mesh)-253(into)]TJ/F78 9.9626 Tf 0.988 0 0 1 392.332 682.219 Tm [(sub-domains)]TJ/F84 9.9626 Tf 0.988 0 0 1 442.826 682.219 Tm [(;)-253(our)-253(library)]TJ 1.02 0 0 1 150.705 670.263 Tm [(supports)-297(any)-298(distribution)-297(that)-297(keeps)-298(together)-297(the)-297(coef)17(\002)1(cients)-297(of)-298(each)-297(matrix)]TJ 1.02 0 0 1 150.705 658.308 Tm [(r)18(ow;)-366(ther)18(e)-326(ar)18(e)-325(no)-326(other)-325(constraints)-325(on)-326(the)-325(variable)-326(assignment)1(.)-545(This)-326(choice)]TJ 1.02 0 0 1 150.705 646.353 Tm [(is)-276(consistent)-275(with)-276(simple)-276(data)-276(dist)1(ributions)-276(such)-276(as)]TJ/F147 9.9626 Tf 1 0 0 1 383.652 646.353 Tm [(CYCLIC\050N\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 433.526 646.353 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 453.532 646.353 Tm [(BLOCK)]TJ/F84 9.9626 Tf 1.02 0 0 1 479.684 646.353 Tm [(,)-276(as)]TJ 1.02 0 0 1 150.286 634.398 Tm [(well)-256(as)-256(completely)-256(arbitrary)-256(assignments)-256(of)-256(equation)-256(indices)-256(to)-256(pr)18(ocesses.)-337(In)]TJ 1.002 0 0 1 150.406 622.443 Tm [(particular)-250(it)-250(is)-251(consistent)-250(with)-250(the)-250(usage)-250(of)-251(graph)-250(partitioning)-250(tools)-250(commonly)]TJ 1.02 0 0 1 150.705 610.488 Tm [(available)-288(in)-288(the)-289(literatur)18(e,)-299(e.g.)-434(METIS)-288([)]TJ 1 0 0 rg 1 0 0 RG 1 0 0 1 326.838 610.488 Tm [(14)]TJ 0 g 0 G - 1.02 0 0 1 336.801 610.488 Tm [(].)-433(Dense)-289(vectors)-288(conform)-288(to)-288(sparse)]TJ 0.98 0 0 1 150.705 598.532 Tm [(matrices,)-228(that)-221(is,)-229(the)-221(entries)-221(of)-222(a)-221(vector)-221(follow)-222(the)-221(same)-222(distribution)-221(of)-221(the)-222(matrix)]TJ 1 0 0 1 150.705 586.577 Tm [(r)18(ows.)]TJ 1.02 0 0 1 165.649 573.93 Tm [(W)90(e)-290(assume)-290(that)-291(the)-290(sparse)-290(matrix)-290(is)-291(built)-290(in)-290(parallel,)-302(wher)18(e)-290(each)-291(pr)18(ocess)]TJ 1.002 0 0 1 150.705 561.974 Tm [(generates)-249(its)-249(own)-249(portion.)-310(W)92(e)-249(never)-249(r)18(equir)18(e)-249(that)-250(the)-249(entir)18(e)-249(matrix)-249(be)-249(available)]TJ 0.98 0 0 1 150.705 550.019 Tm [(on)-244(a)-244(single)-244(node.)-313(However)76(,)-247(i)1(t)-245(is)-244(possible)-244(to)-244(hold)-244(the)-244(entir)19(e)-244(matrix)-244(in)-245(on)1(e)-245(pr)19(ocess)]TJ 0.98 0 0 1 150.705 538.064 Tm [(and)-198(distribute)-199(it)-198(explicitly)]TJ + 1.02 0 0 1 336.801 610.488 Tm [(].)-433(Dense)-289(vectors)-288(conform)-288(to)-288(sparse)]TJ 0.98 0 0 1 150.705 598.532 Tm [(matrices,)-228(that)-221(is,)-229(the)-221(entries)-221(of)-222(a)-221(vector)-221(follow)-222(the)-221(same)-222(distribution)-221(of)-221(the)-222(matrix)]TJ 1 0 0 1 150.705 586.577 Tm [(r)18(ows.)]TJ 1.02 0 0 1 165.649 573.93 Tm [(W)90(e)-290(assume)-290(that)-291(the)-290(sparse)-290(matrix)-290(is)-291(built)-290(in)-290(parallel,)-302(wher)18(e)-290(each)-291(pr)18(ocess)]TJ 0.98 0 0 1 150.705 561.974 Tm [(generates)-234(its)-235(own)-234(portion:)-306(we)-235(never)]TJ/F78 9.9626 Tf 0.98 0 0 1 307.419 561.974 Tm [(r)18(equir)19(e)]TJ/F84 9.9626 Tf 0.98 0 0 1 337.204 561.974 Tm [(that)-234(the)-235(entir)19(e)-235(matrix)-234(be)-235(available)-234(on)]TJ 0.98 0 0 1 150.705 550.019 Tm [(a)-204(single)-204(node.)-299(However)75(,)-214(it)-204(is)-204(possible)-204(to)-204(hold)-205(th)1(e)-205(entir)19(e)-204(matrix)-204(in)-204(one)-204(pr)18(ocess)-204(and)]TJ 1.02 0 0 1 150.705 538.064 Tm [(distribute)-258(it)-258(explicitly)]TJ 0 0 1 rg 0 0 1 RG -/F84 7.5716 Tf 1 0 0 1 260.936 541.68 Tm [(1)]TJ +/F84 7.5716 Tf 1 0 0 1 247.424 541.68 Tm [(1)]TJ 0 g 0 G -/F84 9.9626 Tf 0.98 0 0 1 265.22 538.064 Tm [(,)-210(even)-198(though)-199(the)-198(r)18(esulting)-198(memory)-199(bottleneck)-198(would)]TJ 1 0 0 1 150.705 526.109 Tm [(make)-250(this)-250(option)-250(unattractive)-250(in)-250(most)-250(cases.)]TJ/F75 11.9552 Tf 0 -33.074 Td [(2.1)-1000(Basic)-250(Nomenclature)]TJ/F84 9.9626 Tf 1.02 0 0 1 150.705 472.73 Tm [(Our)-254(computational)-254(model)-255(implies)-254(that)-254(the)-254(data)-255(alloc)1(ation)-255(on)-254(the)-254(parallel)-254(dis-)]TJ 0.981 0 0 1 150.705 460.774 Tm [(tributed)-253(memory)-254(machine)-254(is)-253(guided)-254(by)-253(the)-254(str)8(uctur)19(e)-254(of)-253(the)-254(physical)-253(model,)-254(and)]TJ 1 0 0 1 150.705 448.819 Tm [(speci\002cally)-250(by)-250(the)-250(discr)18(etization)-250(mesh)-250(of)-250(the)-250(PDE.)]TJ 1.02 0 0 1 165.649 436.172 Tm [(Each)-341(point)-341(of)-341(the)-341(discr)18(etization)-341(mesh)-341(will)-341(have)-341(\050at)-341(least\051)-341(one)-341(associated)]TJ 1.02 0 0 1 150.705 424.216 Tm [(equation/variable,)-353(and)-332(ther)18(efor)17(e)-331(one)-332(index.)-564(W)91(e)-332(say)-332(that)-332(point)]TJ/F78 9.9626 Tf 1 0 0 1 440.497 424.216 Tm [(i)]TJ 1.02 0 0 1 446.831 424.216 Tm [(depends)]TJ/F84 9.9626 Tf 1.02 0 0 1 482.953 424.216 Tm [(on)]TJ 1.02 0 0 1 150.406 412.261 Tm [(point)]TJ/F78 9.9626 Tf 1 0 0 1 177.509 412.261 Tm [(j)]TJ/F84 9.9626 Tf 1.02 0 0 1 183.194 412.261 Tm [(if)-275(the)-274(equation)-275(for)-274(a)-275(variable)-275(associate)1(d)-275(with)]TJ/F78 9.9626 Tf 1 0 0 1 386.696 412.261 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 392.451 412.261 Tm [(contains)-275(a)-274(term)-275(in)]TJ/F78 9.9626 Tf 1 0 0 1 476.753 412.261 Tm [(j)]TJ/F84 9.9626 Tf 1.02 0 0 1 479.647 412.261 Tm [(,)-282(or)]TJ 1.02 0 0 1 150.705 400.306 Tm [(equivalently)-262(if)]TJ/F78 9.9626 Tf 1 0 0 1 218.767 400.306 Tm [(a)]TJ/F78 7.5716 Tf 4.589 -1.96 Td [(i)-67(j)]TJ/F190 10.3811 Tf 8.519 1.96 Td [(6)]TJ/F192 10.3811 Tf 0.249 0 Td [(=)]TJ/F84 9.9626 Tf 1.02 0 0 1 243.403 400.306 Tm [(0.)-354(After)-262(the)-262(partition)-262(of)-262(the)-262(discr)18(etization)-262(mesh)-262(into)]TJ/F78 9.9626 Tf 1.02 0 0 1 478.378 400.306 Tm [(sub-)]TJ 1.02 0 0 1 150.705 388.351 Tm [(domains)]TJ/F84 9.9626 Tf 1.02 0 0 1 188.452 388.351 Tm [(assigned)-326(to)-325(the)-326(parallel)-325(pr)17(ocesses,)-345(we)-326(classify)-326(the)-325(points)-326(of)-325(a)-326(given)]TJ 1 0 0 1 150.705 376.396 Tm [(sub-domain)-250(as)-250(following.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 251.707 538.064 Tm [(,)-261(even)-258(though)-258(the)-258(r)17(e)1(sulting)-258(memory)-258(bottleneck)-258(would)]TJ 1 0 0 1 150.705 526.109 Tm [(make)-250(this)-250(option)-250(unattractive)-250(in)-250(most)-250(cases.)]TJ/F75 11.9552 Tf 0 -33.074 Td [(2.1)-1000(Basic)-250(Nomenclature)]TJ/F84 9.9626 Tf 1.02 0 0 1 150.705 472.73 Tm [(Our)-254(computational)-254(model)-255(implies)-254(that)-254(the)-254(data)-255(alloc)1(ation)-255(on)-254(the)-254(parallel)-254(dis-)]TJ 0.981 0 0 1 150.705 460.774 Tm [(tributed)-253(memory)-254(machine)-254(is)-253(guided)-254(by)-253(the)-254(str)8(uctur)19(e)-254(of)-253(the)-254(physical)-253(model,)-254(and)]TJ 1 0 0 1 150.705 448.819 Tm [(speci\002cally)-250(by)-250(the)-250(discr)18(etization)-250(mesh)-250(of)-250(the)-250(PDE.)]TJ 1.02 0 0 1 165.649 436.172 Tm [(Each)-341(point)-341(of)-341(the)-341(discr)18(etization)-341(mesh)-341(will)-341(have)-341(\050at)-341(least\051)-341(one)-341(associated)]TJ 1.02 0 0 1 150.705 424.216 Tm [(equation/variable,)-353(and)-332(ther)18(efor)17(e)-331(one)-332(index.)-564(W)91(e)-332(say)-332(that)-332(point)]TJ/F78 9.9626 Tf 1 0 0 1 440.497 424.216 Tm [(i)]TJ 1.02 0 0 1 446.831 424.216 Tm [(depends)]TJ/F84 9.9626 Tf 1.02 0 0 1 482.953 424.216 Tm [(on)]TJ 1.02 0 0 1 150.406 412.261 Tm [(point)]TJ/F78 9.9626 Tf 1 0 0 1 177.509 412.261 Tm [(j)]TJ/F84 9.9626 Tf 1.02 0 0 1 183.194 412.261 Tm [(if)-275(the)-274(equation)-275(for)-274(a)-275(variable)-275(associate)1(d)-275(with)]TJ/F78 9.9626 Tf 1 0 0 1 386.696 412.261 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 392.451 412.261 Tm [(contains)-275(a)-274(term)-275(in)]TJ/F78 9.9626 Tf 1 0 0 1 476.753 412.261 Tm [(j)]TJ/F84 9.9626 Tf 1.02 0 0 1 479.647 412.261 Tm [(,)-282(or)]TJ 1.02 0 0 1 150.705 400.306 Tm [(equivalently)-262(if)]TJ/F78 9.9626 Tf 1 0 0 1 218.767 400.306 Tm [(a)]TJ/F78 7.5716 Tf 4.589 -1.96 Td [(i)-67(j)]TJ/F195 10.3811 Tf 8.519 1.96 Td [(6)]TJ/F197 10.3811 Tf 0.249 0 Td [(=)]TJ/F84 9.9626 Tf 1.02 0 0 1 243.403 400.306 Tm [(0.)-354(After)-262(the)-262(partition)-262(of)-262(the)-262(discr)18(etization)-262(mesh)-262(into)]TJ/F78 9.9626 Tf 1.02 0 0 1 478.378 400.306 Tm [(sub-)]TJ 1.02 0 0 1 150.705 388.351 Tm [(domains)]TJ/F84 9.9626 Tf 1.02 0 0 1 188.452 388.351 Tm [(assigned)-326(to)-325(the)-326(parallel)-325(pr)17(ocesses,)-345(we)-326(classify)-326(the)-325(points)-326(of)-325(a)-326(given)]TJ 1 0 0 1 150.705 376.396 Tm [(sub-domain)-250(as)-250(following.)]TJ 0 g 0 G /F75 9.9626 Tf 0 -22.003 Td [(Internal.)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 194.311 354.393 Tm [(An)-313(internal)-313(point)-312(of)-313(a)-313(given)-313(domain)]TJ/F78 9.9626 Tf 1.02 0 0 1 363.064 354.393 Tm [(depends)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.994 354.393 Tm [(only)-313(on)-313(points)-312(of)-313(the)]TJ 1.02 0 0 1 175.611 342.438 Tm [(same)-387(domain.)-729(If)-387(all)-387(points)-387(of)-386(a)-387(domain)-387(ar)17(e)-386(assigned)-387(to)-387(one)-387(pr)18(ocess,)]TJ 0.991 0 0 1 175.611 330.483 Tm [(then)-252(a)-252(computational)-251(step)-252(\050e.g.,)-252(a)-252(matrix-vector)-252(pr)19(oduct\051)-252(of)-252(the)-252(equations)]TJ 1.02 0 0 1 175.611 318.527 Tm [(associated)-369(with)-368(the)-369(internal)-368(points)-369(r)18(equir)18(es)-369(no)-368(data)-369(items)-368(fr)17(om)-368(other)]TJ 1 0 0 1 175.611 306.572 Tm [(domains)-250(and)-250(no)-250(communications.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 194.311 354.393 Tm [(An)-293(internal)-294(point)-293(of)-294(a)-293(given)-293(sub-domain)]TJ/F78 9.9626 Tf 1.02 0 0 1 381.125 354.393 Tm [(depends)]TJ/F84 9.9626 Tf 1.02 0 0 1 416.858 354.393 Tm [(only)-293(on)-294(points)-293(of)]TJ 1.02 0 0 1 175.611 342.438 Tm [(the)-259(same)-259(sub-domain.)-346(If)-259(all)-259(point)1(s)-259(of)-259(a)-259(sub-domain)-259(ar)17(e)-259(assigned)-259(to)-259(one)]TJ 1.018 0 0 1 175.313 330.483 Tm [(pr)18(ocess,)-246(then)-246(a)-245(computational)-246(step)-245(\050e.g.,)-246(a)-246(matrix-vector)-245(pr)18(oduct\051)-246(of)-246(the)]TJ 0.994 0 0 1 175.611 318.527 Tm [(equations)-250(associated)-251(with)-250(the)-251(internal)-250(points)-251(r)18(equir)18(es)-250(no)-250(data)-251(items)-250(fr)18(om)]TJ 1 0 0 1 175.611 306.572 Tm [(other)-250(sub-domains)-250(and)-250(no)-250(communications.)]TJ 0 g 0 G /F75 9.9626 Tf -24.906 -22.695 Td [(Boundary)92(.)]TJ 0 g 0 G -/F84 9.9626 Tf 0.98 0 0 1 201.713 283.877 Tm [(A)-237(point)-238(of)-237(a)-237(given)-237(domain)-238(is)-237(a)-237(boundary)-237(point)-238(if)-237(it)]TJ/F78 9.9626 Tf 0.98 0 0 1 420.258 283.877 Tm [(depends)]TJ/F84 9.9626 Tf 0.98 0 0 1 454.042 283.877 Tm [(on)-237(points)]TJ 1 0 0 1 175.611 271.922 Tm [(belonging)-250(to)-250(other)-250(domains.)]TJ +/F84 9.9626 Tf 1.013 0 0 1 201.713 283.877 Tm [(A)-246(point)-247(of)-246(a)-246(given)-247(sub-domain)-246(is)-246(a)-247(boundary)-246(point)-246(if)-247(i)1(t)]TJ/F78 9.9626 Tf 1.013 0 0 1 448.019 283.877 Tm [(depends)]TJ/F84 9.9626 Tf 1.013 0 0 1 483.032 283.877 Tm [(on)]TJ 1 0 0 1 175.313 271.922 Tm [(points)-250(belonging)-250(to)-250(other)-250(sub-domains.)]TJ 0 g 0 G -/F75 9.9626 Tf -24.906 -22.695 Td [(Halo.)]TJ +/F75 9.9626 Tf -24.608 -22.695 Td [(Halo.)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 179.925 249.227 Tm [(A)-357(halo)-357(point)-356(for)-357(a)-357(given)-357(domain)-357(is)-357(a)-357(point)-356(belonging)-357(to)-357(another)-357(do-)]TJ 1.009 0 0 1 175.611 237.271 Tm [(main)-248(such)-247(that)-247(ther)17(e)-247(is)-248(a)-247(boundary)-248(point)-247(which)]TJ/F78 9.9626 Tf 1.009 0 0 1 388.252 237.271 Tm [(depends)]TJ/F84 9.9626 Tf 1.009 0 0 1 423.138 237.271 Tm [(on)-247(it.)-308(Whenever)]TJ 1.02 0 0 1 175.313 225.316 Tm [(performing)-297(a)-297(computational)-297(step,)-311(such)-297(as)-297(a)-297(matrix-vector)-297(pr)17(oduct,)-310(the)]TJ 1.012 0 0 1 175.333 213.361 Tm [(values)-247(associated)-247(with)-247(halo)-248(points)-247(ar)18(e)-247(r)18(equested)-248(fr)18(om)-247(other)-247(domains.)-307(A)]TJ 1.005 0 0 1 175.611 201.406 Tm [(boundary)-248(point)-248(of)-248(a)-247(given)-248(domain)-248(is)-248(usually)-248(a)-248(halo)-247(point)-248(for)-248(some)-248(other)]TJ 0.999 0 0 1 175.611 189.451 Tm [(domain)]TJ +/F84 9.9626 Tf 0.989 0 0 1 179.925 249.227 Tm [(A)-252(halo)-252(point)-253(f)1(or)-253(a)-252(given)-252(sub-domain)-252(is)-252(a)-253(poi)1(nt)-253(belonging)-252(to)-252(another)-252(sub-)]TJ 0.98 0 0 1 175.611 237.271 Tm [(domain)-228(such)-227(that)-228(ther)18(e)-228(i)1(s)-228(a)-228(boundary)-228(point)-227(which)]TJ/F78 9.9626 Tf 0.98 0 0 1 391.694 237.271 Tm [(depends)]TJ/F84 9.9626 Tf 0.98 0 0 1 425.385 237.271 Tm [(on)-228(it.)-307(Whenever)]TJ 1.02 0 0 1 175.313 225.316 Tm [(performing)-297(a)-297(computational)-297(step,)-311(such)-297(as)-297(a)-297(matrix-vector)-297(pr)17(oduct,)-310(the)]TJ 0.989 0 0 1 175.333 213.361 Tm [(values)-252(associated)-253(with)-252(halo)-253(points)-252(ar)18(e)-252(r)18(equested)-253(fr)19(om)-253(other)-252(sub-domains.)]TJ 0.993 0 0 1 175.223 201.406 Tm [(A)-251(boundary)-251(point)-251(of)-251(a)-251(given)-251(sub-domain)-251(is)-251(usually)-251(a)-251(halo)-251(point)-251(for)-251(some)]TJ 1.02 0 0 1 175.611 189.451 Tm [(other)-255(sub-domain)]TJ 0 0 1 rg 0 0 1 RG -/F84 7.5716 Tf 1 0 0 1 209.58 193.067 Tm [(2)]TJ +/F84 7.5716 Tf 1 0 0 1 255.982 193.067 Tm [(2)]TJ 0 g 0 G -/F84 9.9626 Tf 0.999 0 0 1 213.864 189.451 Tm [(;)-250(ther)18(efor)18(e)-249(the)-249(car)18(dinality)-250(of)-249(the)-250(boundary)-249(points)-249(set)-250(determines)]TJ 1 0 0 1 175.611 177.496 Tm [(the)-250(amount)-250(of)-250(data)-250(sent)-250(to)-250(other)-250(domains.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 260.266 189.451 Tm [(;)-260(ther)17(efor)18(e)-255(the)-255(car)18(dinality)-256(of)-255(the)-255(boundary)-255(points)-255(set)]TJ 1 0 0 1 175.611 177.496 Tm [(determines)-250(the)-250(amount)-250(of)-250(data)-250(sent)-250(to)-250(other)-250(sub-domains.)]TJ 0 g 0 G ET q @@ -4747,9 +4756,9 @@ ET endstream endobj -951 0 obj +952 0 obj << -/Length 5241 +/Length 5249 >> stream 0 g 0 G @@ -4758,7 +4767,7 @@ stream BT /F75 9.9626 Tf 99.895 706.129 Td [(Overlap.)]TJ 0 g 0 G -/F84 9.9626 Tf 1.006 0 0 1 144.059 706.129 Tm [(An)-248(overlap)-248(point)-248(is)-248(a)-248(boundary)-249(point)-248(assigned)-248(to)-248(multiple)-248(domains.)]TJ 0.983 0 0 1 124.413 694.174 Tm [(Any)-254(ope)1(ration)-254(that)-253(involves)-254(an)-253(overlap)-254(point)-253(has)-254(to)-253(be)-254(r)19(eplicated)-254(for)-253(each)]TJ 1 0 0 1 124.802 682.219 Tm [(assignment.)]TJ 0.98 0 0 1 99.895 663.276 Tm [(Overlap)-232(points)-233(do)-232(not)-233(usually)-232(exist)-233(in)-232(the)-233(basic)-232(data)-233(distributions;)-240(however)-232(they)]TJ 0.989 0 0 1 99.895 651.321 Tm [(ar)18(e)-251(a)-252(featur)19(e)-252(of)-251(Domain)-252(Decomposi)1(tion)-252(Schwarz)-251(pr)18(econditioners)-251(which)-252(ar)18(e)-251(the)]TJ 1 0 0 1 99.895 639.365 Tm [(subject)-250(of)-250(r)18(elated)-250(r)18(esear)18(ch)-250(work)-250([)]TJ +/F84 9.9626 Tf 1.02 0 0 1 144.059 706.129 Tm [(An)-423(overlap)-424(point)-423(is)-423(a)-424(boundary)-423(point)-423(assigned)-424(to)-423(multiple)-423(sub-)]TJ 0.98 0 0 1 124.802 694.174 Tm [(domains.)-298(Any)-199(operation)-200(that)-200(inv)1(olves)-200(an)-200(overlap)-199(point)-200(has)-199(to)-200(be)-200(r)19(eplicated)]TJ 1 0 0 1 124.802 682.219 Tm [(for)-250(each)-250(assignment.)]TJ 0.98 0 0 1 99.895 663.276 Tm [(Overlap)-232(points)-233(do)-232(not)-233(usually)-232(exist)-233(in)-232(the)-233(basic)-232(data)-233(distributions;)-240(however)-232(they)]TJ 0.989 0 0 1 99.895 651.321 Tm [(ar)18(e)-251(a)-252(featur)19(e)-252(of)-251(Domain)-252(Decomposi)1(tion)-252(Schwarz)-251(pr)18(econditioners)-251(which)-252(ar)18(e)-251(the)]TJ 1 0 0 1 99.895 639.365 Tm [(subject)-250(of)-250(r)18(elated)-250(r)18(esear)18(ch)-250(work)-250([)]TJ 1 0 0 rg 1 0 0 RG [(4)]TJ 0 g 0 G @@ -4766,7 +4775,7 @@ BT 1 0 0 rg 1 0 0 RG [-250(3)]TJ 0 g 0 G - [(].)]TJ 0.995 0 0 1 114.839 627.41 Tm [(W)92(e)-251(denote)-251(the)-251(sets)-251(of)-251(internal,)-251(boundary)-251(and)-251(halo)-251(points)-251(for)-251(a)-251(given)-251(subdo-)]TJ 1.001 0 0 1 99.895 615.455 Tm [(main)-250(by)]TJ/F190 10.3811 Tf 1 0 0 1 138.553 615.455 Tm [(I)]TJ/F84 9.9626 Tf 1.001 0 0 1 145.084 615.455 Tm [(,)]TJ/F190 10.3811 Tf 1 0 0 1 150.19 615.455 Tm [(B)]TJ/F84 9.9626 Tf 1.001 0 0 1 159.926 615.455 Tm [(and)]TJ/F190 10.3811 Tf 1 0 0 1 179.422 615.455 Tm [(H)]TJ/F84 9.9626 Tf 1.001 0 0 1 188.394 615.455 Tm [(.)-310(Each)-249(subdomain)-249(is)-250(assigned)-249(to)-250(one)-249(pr)18(ocess;)-250(each)-249(pr)18(ocess)]TJ 1.02 0 0 1 99.895 603.5 Tm [(usually)-286(owns)-285(one)-286(subdomain,)-295(although)-286(the)-285(user)-286(may)-286(choose)-285(to)-286(assign)-285(mor)17(e)]TJ 1.02 0 0 1 99.895 591.545 Tm [(than)-257(one)-257(subdomain)-257(to)-257(a)-257(pr)18(ocess.)-340(If)-257(each)-257(pr)18(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 322.219 591.545 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 327.794 591.545 Tm [(owns)-257(one)-257(subdomain,)-260(the)]TJ 0.983 0 0 1 99.895 579.589 Tm [(number)-255(of)-255(r)19(ows)-255(in)-255(the)-255(local)-255(sparse)-255(matrix)-255(is)]TJ/F190 10.3811 Tf 1 0 0 1 292.255 579.589 Tm [(j)-24(I)]TJ/F78 7.5716 Tf 8.944 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F192 10.3811 Tf 5.067 0 Td [(+)]TJ/F190 10.3811 Tf 10.258 0 Td [(j)-24(B)]TJ/F78 7.5716 Tf 10.109 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F84 9.9626 Tf 0.983 0 0 1 335.387 579.589 Tm [(,)-255(and)-255(the)-255(number)-255(of)-254(local)]TJ 0.982 0 0 1 99.895 567.634 Tm [(columns)-254(\050i.e.)-316(those)-254(for)-255(which)-254(ther)18(e)-254(exists)-254(at)-255(least)-254(one)-254(non-zer)18(o)-255(ent)1(ry)-255(in)-254(the)-255(local)]TJ 1 0 0 1 99.895 555.679 Tm [(r)18(ows\051)-250(is)]TJ/F190 10.3811 Tf 37.275 0 Td [(j)-24(I)]TJ/F78 7.5716 Tf 8.944 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F192 10.3811 Tf 5.065 0 Td [(+)]TJ/F190 10.3811 Tf 10.256 0 Td [(j)-24(B)]TJ/F78 7.5716 Tf 10.109 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F192 10.3811 Tf 5.065 0 Td [(+)]TJ/F190 10.3811 Tf 10.256 0 Td [(j)-24(H)]TJ/F78 7.5716 Tf 12.052 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F84 9.9626 Tf 3.004 0 Td [(.)]TJ + [(].)]TJ 0.995 0 0 1 114.839 627.41 Tm [(W)92(e)-251(denote)-251(the)-251(sets)-251(of)-251(internal,)-251(boundary)-251(and)-251(halo)-251(points)-251(for)-251(a)-251(given)-251(subdo-)]TJ 1.001 0 0 1 99.895 615.455 Tm [(main)-250(by)]TJ/F195 10.3811 Tf 1 0 0 1 138.553 615.455 Tm [(I)]TJ/F84 9.9626 Tf 1.001 0 0 1 145.084 615.455 Tm [(,)]TJ/F195 10.3811 Tf 1 0 0 1 150.19 615.455 Tm [(B)]TJ/F84 9.9626 Tf 1.001 0 0 1 159.926 615.455 Tm [(and)]TJ/F195 10.3811 Tf 1 0 0 1 179.422 615.455 Tm [(H)]TJ/F84 9.9626 Tf 1.001 0 0 1 188.394 615.455 Tm [(.)-310(Each)-249(subdomain)-249(is)-250(assigned)-249(to)-250(one)-249(pr)18(ocess;)-250(each)-249(pr)18(ocess)]TJ 1.02 0 0 1 99.895 603.5 Tm [(usually)-286(owns)-285(one)-286(subdomain,)-295(although)-286(the)-285(user)-286(may)-286(choose)-285(to)-286(assign)-285(mor)17(e)]TJ 1.02 0 0 1 99.895 591.545 Tm [(than)-257(one)-257(subdomain)-257(to)-257(a)-257(pr)18(ocess.)-340(If)-257(each)-257(pr)18(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 322.219 591.545 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 327.794 591.545 Tm [(owns)-257(one)-257(subdomain,)-260(the)]TJ 0.983 0 0 1 99.895 579.589 Tm [(number)-255(of)-255(r)19(ows)-255(in)-255(the)-255(local)-255(sparse)-255(matrix)-255(is)]TJ/F195 10.3811 Tf 1 0 0 1 292.255 579.589 Tm [(j)-24(I)]TJ/F78 7.5716 Tf 8.944 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F197 10.3811 Tf 5.067 0 Td [(+)]TJ/F195 10.3811 Tf 10.258 0 Td [(j)-24(B)]TJ/F78 7.5716 Tf 10.109 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F84 9.9626 Tf 0.983 0 0 1 335.387 579.589 Tm [(,)-255(and)-255(the)-255(number)-255(of)-254(local)]TJ 0.982 0 0 1 99.895 567.634 Tm [(columns)-254(\050i.e.)-316(those)-254(for)-255(which)-254(ther)18(e)-254(exists)-254(at)-255(least)-254(one)-254(non-zer)18(o)-255(ent)1(ry)-255(in)-254(the)-255(local)]TJ 1 0 0 1 99.895 555.679 Tm [(r)18(ows\051)-250(is)]TJ/F195 10.3811 Tf 37.275 0 Td [(j)-24(I)]TJ/F78 7.5716 Tf 8.944 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F197 10.3811 Tf 5.065 0 Td [(+)]TJ/F195 10.3811 Tf 10.256 0 Td [(j)-24(B)]TJ/F78 7.5716 Tf 10.109 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F197 10.3811 Tf 5.065 0 Td [(+)]TJ/F195 10.3811 Tf 10.256 0 Td [(j)-24(H)]TJ/F78 7.5716 Tf 12.052 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F84 9.9626 Tf 3.004 0 Td [(.)]TJ 0 g 0 G 0 g 0 G 0 g 0 G @@ -4824,20 +4833,20 @@ ET endstream endobj -948 0 obj +949 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/points.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 954 0 R +/PTEX.InfoDict 955 0 R /BBox [0 0 274 308] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 955 0 R ->>/Font << /R8 956 0 R>> +/R7 956 0 R +>>/Font << /R8 957 0 R>> >> /Length 1397 /Filter /FlateDecode @@ -4847,7 +4856,7 @@ x  3B=bAH}ϩc?ׄe]_?dwGad"沾}e4ߠ,s,_x/w׷~[Z.1uoO*x/22T<ᜇd&o/VC1V^dR 9^Ӿ͚zzõ7!SjJRWZSNm ide3fyRO|J_F~]~z2}VНm΀sQ<I}y5N p%UW@E$|pxE`&U %AIU0G]&MJxT.)~C8}~WۢvKK,8͗&`[C*ONs m 9؆u!`{P9mKI7oB*O샹~̳'^IavRy!zw'`x"0.Ѥb'i|sP:-%X/[^#ahdPY/)Zq&-VֽONtnGY& ˒וB̜Mnng%#؜ǂ"d;)(\X0}Zp#`ӆS%Hvţf``-+ЎQ49Ç,xO/,f,zinv$-܌`?禩|,7c;@!os]?ݲta0yҥZdyORܐ<%9䃀[}拇6m8uIPhf>m))YꓠҐ<%9䃀[}kWOr= A} 0' 9S,ir+\_uݿѐE?{'ȋB#4_$&`[qq&/> M5^_'`[BO% /]07o[qq &/M 5^_'n޶4.16sܥ%]!CgVe@ٖ$)5-5}?Lg+ |>{>hO‘jX5~,>0x},1c X€5Xb$3 څt=>tp8Շ$i>-%TXJR#gL“-J/0jȶw.ickZ,Ԥ^kU Wjǂ.UEzgP,"e̋:t!*%~ *Q@emPM1:ޒX(4 N]J' endstream endobj -963 0 obj +964 0 obj << /Length 5321 >> @@ -4889,35 +4898,35 @@ BT 0 g 0 G 13.888 -23.137 Td [(\225)]TJ 0 g 0 G - [-500(all)-250(symbols)-250(\050i.e.)-310(subr)18(outine)-250(names,)-250(data)-250(types...\051)-310(ar)18(e)-250(pr)18(e\002xed)-250(by)]TJ/F145 9.9626 Tf 294.183 0 Td [(psb_)]TJ + [-500(all)-250(symbols)-250(\050i.e.)-310(subr)18(outine)-250(names,)-250(data)-250(types...\051)-310(ar)18(e)-250(pr)18(e\002xed)-250(by)]TJ/F147 9.9626 Tf 294.183 0 Td [(psb_)]TJ 0 g 0 G /F84 9.9626 Tf -294.183 -24.208 Td [(\225)]TJ 0 g 0 G - [-500(all)-250(data)-250(type)-250(names)-250(ar)18(e)-250(suf)18(\002xed)-250(by)]TJ/F145 9.9626 Tf 166.604 0 Td [(_type)]TJ + [-500(all)-250(data)-250(type)-250(names)-250(ar)18(e)-250(suf)18(\002xed)-250(by)]TJ/F147 9.9626 Tf 166.604 0 Td [(_type)]TJ 0 g 0 G /F84 9.9626 Tf -166.604 -24.208 Td [(\225)]TJ 0 g 0 G - [-500(all)-250(constants)-250(ar)18(e)-250(suf)18(\002xed)-250(by)]TJ/F145 9.9626 Tf 135.59 0 Td [(_)]TJ + [-500(all)-250(constants)-250(ar)18(e)-250(suf)18(\002xed)-250(by)]TJ/F147 9.9626 Tf 135.59 0 Td [(_)]TJ 0 g 0 G /F84 9.9626 Tf -135.59 -24.208 Td [(\225)]TJ 0 g 0 G - 1.013 0 0 1 175.611 430.327 Tm [(all)-246(top-level)-246(subr)18(outine)-246(names)-246(follow)-246(the)-246(r)8(ule)]TJ/F145 9.9626 Tf 1 0 0 1 381.038 430.327 Tm [(psb_xxname)]TJ/F84 9.9626 Tf 1.013 0 0 1 435.824 430.327 Tm [(wher)18(e)]TJ/F145 9.9626 Tf 1 0 0 1 466.072 430.327 Tm [(xx)]TJ/F84 9.9626 Tf 1.013 0 0 1 479.015 430.327 Tm [(can)]TJ 1 0 0 1 175.611 418.372 Tm [(be)-250(either:)]TJ + 1.013 0 0 1 175.611 430.327 Tm [(all)-246(top-level)-246(subr)18(outine)-246(names)-246(follow)-246(the)-246(r)8(ule)]TJ/F147 9.9626 Tf 1 0 0 1 381.038 430.327 Tm [(psb_xxname)]TJ/F84 9.9626 Tf 1.013 0 0 1 435.824 430.327 Tm [(wher)18(e)]TJ/F147 9.9626 Tf 1 0 0 1 466.072 430.327 Tm [(xx)]TJ/F84 9.9626 Tf 1.013 0 0 1 479.015 430.327 Tm [(can)]TJ 1 0 0 1 175.611 418.372 Tm [(be)-250(either:)]TJ 0 g 0 G /F75 9.9626 Tf 11.956 -24.208 Td [(\226)]TJ 0 g 0 G -/F145 9.9626 Tf 9.962 0 Td [(ge)]TJ/F84 9.9626 Tf 10.461 0 Td [(:)-310(the)-250(r)18(outine)-250(is)-250(r)18(elated)-250(to)-250(dense)-250(data,)]TJ +/F147 9.9626 Tf 9.962 0 Td [(ge)]TJ/F84 9.9626 Tf 10.461 0 Td [(:)-310(the)-250(r)18(outine)-250(is)-250(r)18(elated)-250(to)-250(dense)-250(data,)]TJ 0 g 0 G /F75 9.9626 Tf -20.423 -18.081 Td [(\226)]TJ 0 g 0 G -/F145 9.9626 Tf 9.962 0 Td [(sp)]TJ/F84 9.9626 Tf 10.461 0 Td [(:)-310(the)-250(r)18(outine)-250(is)-250(r)18(elated)-250(to)-250(sparse)-250(data,)]TJ +/F147 9.9626 Tf 9.962 0 Td [(sp)]TJ/F84 9.9626 Tf 10.461 0 Td [(:)-310(the)-250(r)18(outine)-250(is)-250(r)18(elated)-250(to)-250(sparse)-250(data,)]TJ 0 g 0 G /F75 9.9626 Tf -20.423 -18.081 Td [(\226)]TJ 0 g 0 G -/F145 9.9626 Tf 9.962 0 Td [(cd)]TJ/F84 9.9626 Tf 10.461 0 Td [(:)-310(the)-250(r)18(outine)-250(is)-250(r)18(elated)-250(to)-250(communication)-250(descriptor)-250(\050see)]TJ +/F147 9.9626 Tf 9.962 0 Td [(cd)]TJ/F84 9.9626 Tf 10.461 0 Td [(:)-310(the)-250(r)18(outine)-250(is)-250(r)18(elated)-250(to)-250(communication)-250(descriptor)-250(\050see)]TJ 0 0 1 rg 0 0 1 RG [-250(3)]TJ 0 g 0 G - [(\051.)]TJ 0.981 0 0 1 175.611 333.794 Tm [(For)-254(example)-255(the)]TJ/F145 9.9626 Tf 1 0 0 1 247.896 333.794 Tm [(psb_geins)]TJ/F84 9.9626 Tf 0.981 0 0 1 294.969 333.794 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 299.899 333.794 Tm [(psb_spins)]TJ/F84 9.9626 Tf 0.981 0 0 1 349.458 333.794 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 368.491 333.794 Tm [(psb_cdins)]TJ/F84 9.9626 Tf 0.981 0 0 1 418.05 333.794 Tm [(perform)-254(the)-255(same)]TJ 1.02 0 0 1 175.611 321.839 Tm [(action)-359(\050see)]TJ + [(\051.)]TJ 0.981 0 0 1 175.611 333.794 Tm [(For)-254(example)-255(the)]TJ/F147 9.9626 Tf 1 0 0 1 247.896 333.794 Tm [(psb_geins)]TJ/F84 9.9626 Tf 0.981 0 0 1 294.969 333.794 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 299.899 333.794 Tm [(psb_spins)]TJ/F84 9.9626 Tf 0.981 0 0 1 349.458 333.794 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 368.491 333.794 Tm [(psb_cdins)]TJ/F84 9.9626 Tf 0.981 0 0 1 418.05 333.794 Tm [(perform)-254(the)-255(same)]TJ 1.02 0 0 1 175.611 321.839 Tm [(action)-359(\050see)]TJ 0 0 1 rg 0 0 1 RG [-360(6)]TJ 0 g 0 G @@ -4929,7 +4938,7 @@ BT 0 g 0 G /F75 9.9626 Tf -24.906 -24.208 Td [(local)]TJ 0 g 0 G -/F84 9.9626 Tf 26.56 0 Td [(Each)-250(pr)18(ocess)-250(has)-250(its)-250(own)-250(value\050s\051)-250(independently)111(.)]TJ -26.869 -23.137 Td [(T)92(o)-250(\002nish)-250(our)-250(general)-250(description,)-250(we)-250(de\002ne)-250(a)-250(version)-250(string)-250(with)-250(the)-250(constant)]TJ/F145 9.9626 Tf 122.476 -24.059 Td [(psb_version_string_)]TJ/F84 9.9626 Tf -122.586 -24.059 Td [(whose)-250(curr)18(ent)-250(value)-250(is)]TJ/F145 9.9626 Tf 101.857 0 Td [(3.9.0)]TJ +/F84 9.9626 Tf 26.56 0 Td [(Each)-250(pr)18(ocess)-250(has)-250(its)-250(own)-250(value\050s\051)-250(independently)111(.)]TJ -26.869 -23.137 Td [(T)92(o)-250(\002nish)-250(our)-250(general)-250(description,)-250(we)-250(de\002ne)-250(a)-250(version)-250(string)-250(with)-250(the)-250(constant)]TJ/F147 9.9626 Tf 122.476 -24.059 Td [(psb_version_string_)]TJ/F84 9.9626 Tf -122.586 -24.059 Td [(whose)-250(curr)18(ent)-250(value)-250(is)]TJ/F147 9.9626 Tf 101.857 0 Td [(3.9.0)]TJ 0 g 0 G /F84 9.9626 Tf 67.927 -29.888 Td [(6)]TJ 0 g 0 G @@ -4937,31 +4946,31 @@ ET endstream endobj -968 0 obj +969 0 obj << -/Length 9648 +/Length 9680 >> stream 0 g 0 G 0 g 0 G BT -/F75 11.9552 Tf 99.895 706.129 Td [(2.3)-1000(Application)-250(structure)]TJ/F84 9.9626 Tf 0.999 0 0 1 99.587 686.748 Tm [(The)-249(main)-249(underlying)-250(principle)-249(of)-249(the)-249(PSBLAS)-250(library)-249(is)-249(that)-249(the)-249(library)-250(objects)]TJ 0.999 0 0 1 99.895 674.792 Tm [(ar)18(e)-251(cr)18(eated)-251(and)-251(exist)-251(with)-251(r)18(efer)18(ence)-251(to)-251(a)-251(discr)18(etized)-251(space)-251(to)-251(which)-251(ther)18(e)-251(corr)18(e-)]TJ 0.98 0 0 1 99.895 662.837 Tm [(sponds)-255(an)-254(index)-255(space)-255(and)-254(a)-255(matrix)-255(sparsity)-254(pattern.)-316(As)-255(an)-255(example,)-255(consider)-254(a)]TJ 1.015 0 0 1 99.895 650.882 Tm [(cell-center)18(ed)-246(\002nite-volume)-246(discr)18(etization)-246(of)-246(the)-246(Navier)18(-Stokes)-246(equations)-245(on)-246(a)]TJ 0.98 0 0 1 99.895 638.927 Tm [(simulation)-233(domain;)-240(the)-233(index)-233(space)-232(1)]TJ 1 0 0 1 261.657 638.927 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)]TJ/F84 9.9626 Tf 0.98 0 0 1 282.794 638.927 Tm [(is)-233(isomorphic)-233(to)-232(the)-233(set)-233(of)-233(cell)-233(centers,)]TJ 1.02 0 0 1 99.477 626.972 Tm [(wher)18(eas)-332(the)-332(pattern)-332(of)-332(the)-332(associated)-332(linear)-332(system)-332(matrix)-332(is)-332(isomorphic)-332(to)]TJ 1.014 0 0 1 99.895 615.017 Tm [(the)-246(adjacency)-247(gr)1(aph)-247(imposed)-246(on)-246(the)-246(discr)17(etization)-246(mesh)-246(by)-246(the)-247(discr)18(etization)]TJ 1 0 0 1 99.895 603.061 Tm [(stencil.)]TJ 1.02 0 0 1 114.839 590.891 Tm [(Thus)-298(the)-297(\002rst)-298(or)18(der)-298(of)-297(business)-298(is)-298(to)-297(establish)-298(an)-298(i)1(ndex)-298(space,)-311(and)-297(this)-298(is)]TJ 0.989 0 0 1 99.895 578.936 Tm [(done)-253(with)-253(a)-253(call)-253(to)]TJ/F145 9.9626 Tf 1 0 0 1 182.801 578.936 Tm [(psb_cdall)]TJ/F84 9.9626 Tf 0.989 0 0 1 232.368 578.936 Tm [(in)-253(which)-253(we)-253(specify)-253(the)-253(size)-253(of)-253(the)-253(index)-253(space)]TJ/F78 9.9626 Tf 1 0 0 1 437.943 578.936 Tm [(n)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.895 566.98 Tm [(and)-250(the)-249(allocation)-249(of)-250(the)-249(elements)-250(of)-249(the)-250(index)-249(space)-250(to)-249(the)-250(various)-249(pr)17(ocesses)]TJ 1 0 0 1 99.895 555.025 Tm [(making)-250(up)-250(the)-250(MPI)-250(\050virtual\051)-250(parallel)-250(machine.)]TJ 0.987 0 0 1 114.839 542.855 Tm [(The)-254(index)-255(space)-254(is)-254(partitioned)-254(among)-255(pr)19(ocesses,)-255(and)-254(this)-254(cr)18(eates)-255(a)-254(mapping)]TJ 1.02 0 0 1 99.895 530.899 Tm [(fr)18(om)-313(the)-312(\223global\224)-313(numbering)-312(1)]TJ 1 0 0 1 243.306 530.899 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)]TJ/F84 9.9626 Tf 1.02 0 0 1 265.345 530.899 Tm [(to)-312(a)-313(numbering)-312(\223local\224)-313(to)-312(each)-312(pr)17(ocess;)]TJ 1.02 0 0 1 99.895 518.944 Tm [(each)-357(pr)17(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 161.071 518.944 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 167.665 518.944 Tm [(will)-357(own)-357(a)-358(certain)-357(subset)-357(1)]TJ 1 0 0 1 294.248 518.944 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)]TJ/F84 9.9626 Tf 5.664 -1.494 Td [(r)18(ow)]TJ/F78 5.9776 Tf 17.537 -1.649 Td [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 333.423 518.944 Tm [(,)-385(each)-357(element)-358(of)-357(which)]TJ 1.004 0 0 1 99.895 506.989 Tm [(corr)18(esponds)-250(to)-249(a)-250(certain)-249(element)-250(of)-249(1)]TJ 1 0 0 1 263.855 506.989 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)]TJ/F84 9.9626 Tf 1.004 0 0 1 282.719 506.989 Tm [(.)-310(The)-250(user)-250(does)-249(not)-250(set)-249(explicitly)-250(this)]TJ 0.987 0 0 1 99.895 495.034 Tm [(mapping;)-253(when)-254(the)-253(application)-253(needs)-254(to)-253(indicate)-253(to)-254(which)-253(element)-253(of)-254(the)-253(index)]TJ 1.02 0 0 1 99.895 483.079 Tm [(space)-263(a)-262(certain)-263(item)-263(is)-262(r)17(elated,)-267(such)-262(as)-263(the)-263(r)18(ow)-263(and)-263(colu)1(mn)-263(index)-263(of)-263(a)-262(matrix)]TJ 1.011 0 0 1 99.895 471.124 Tm [(coef)18(\002cient,)-246(it)-247(does)-246(so)-246(in)-246(the)-246(\223global\224)-247(numbering,)-246(and)-246(the)-246(library)-247(will)-246(translate)]TJ 1 0 0 1 99.895 459.168 Tm [(into)-250(the)-250(appr)18(opriate)-250(\223local\224)-250(numbering.)]TJ 0.98 0 0 1 114.839 446.998 Tm [(For)-242(a)-242(given)-241(index)-242(space)-242(1)]TJ 1 0 0 1 225.057 446.998 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)]TJ/F84 9.9626 Tf 0.98 0 0 1 246.282 446.998 Tm [(ther)18(e)-241(ar)18(e)-242(many)-242(possible)-242(associat)1(ed)-242(topologies,)]TJ 0.98 0 0 1 99.895 435.043 Tm [(i.e.)-308(many)-230(dif)18(fer)18(ent)-230(discr)19(etization)-230(stencils;)-239(thus)-230(the)-230(description)-230(of)-230(the)-230(index)-230(space)]TJ 1.011 0 0 1 99.895 423.087 Tm [(is)-247(not)-247(completed)-248(until)-247(the)-247(user)-247(has)-247(de\002ned)-248(a)-247(sparsity)-247(pattern,)-247(either)-247(explicitly)]TJ 0.98 0 0 1 99.895 411.132 Tm [(thr)18(ough)]TJ/F145 9.9626 Tf 1 0 0 1 137.076 411.132 Tm [(psb_cdins)]TJ/F84 9.9626 Tf 0.98 0 0 1 186.458 411.132 Tm [(or)-237(imp)1(licitly)-237(thr)18(ough)]TJ/F145 9.9626 Tf 1 0 0 1 279.084 411.132 Tm [(psb_spins)]TJ/F84 9.9626 Tf 0.98 0 0 1 326.157 411.132 Tm [(.)-310(The)-237(descriptor)-236(is)-237(\002nalized)]TJ 1.02 0 0 1 99.477 399.177 Tm [(with)-294(a)-294(call)-293(to)]TJ/F145 9.9626 Tf 1 0 0 1 161.528 399.177 Tm [(psb_cdasb)]TJ/F84 9.9626 Tf 1.02 0 0 1 211.587 399.177 Tm [(and)-294(a)-294(sparse)-293(matrix)-294(with)-294(a)-294(call)-294(to)]TJ/F145 9.9626 Tf 1 0 0 1 366.134 399.177 Tm [(psb_spasb)]TJ/F84 9.9626 Tf 1.02 0 0 1 413.207 399.177 Tm [(.)-450(After)]TJ/F145 9.9626 Tf 1 0 0 1 99.895 387.222 Tm [(psb_cdasb)]TJ/F84 9.9626 Tf 1.001 0 0 1 149.464 387.222 Tm [(each)-250(pr)18(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 207.364 387.222 Tm [(i)]TJ/F84 9.9626 Tf 1.001 0 0 1 212.823 387.222 Tm [(will)-250(have)-250(de\002ned)-251(a)-250(set)-250(of)-250(\223halo\224)-250(\050or)-251(\223ghost\224\051)-250(indices)]TJ/F78 9.9626 Tf 1 0 0 1 100.02 375.267 Tm [(n)]TJ/F84 9.9626 Tf 5.664 -1.495 Td [(r)18(ow)]TJ/F78 5.9776 Tf 17.537 -1.648 Td [(i)]TJ/F192 10.3811 Tf 4.654 3.143 Td [(+)]TJ/F84 9.9626 Tf 0.98 0 0 1 137.825 375.267 Tm [(1)]TJ 1 0 0 1 144.492 375.267 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)]TJ/F84 9.9626 Tf 5.664 -3.831 Td [(col)]TJ/F78 5.9776 Tf 12.795 -1.648 Td [(i)]TJ/F84 9.9626 Tf 0.98 0 0 1 178.925 375.267 Tm [(,)-239(denoting)-235(elements)-235(of)-235(the)-235(index)-235(space)-235(that)-235(ar)18(e)]TJ/F78 9.9626 Tf 0.98 0 0 1 379.735 375.267 Tm [(not)]TJ/F84 9.9626 Tf 0.98 0 0 1 395.044 375.267 Tm [(assigned)-235(to)]TJ 1.01 0 0 1 99.596 361.477 Tm [(pr)18(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 135.289 361.477 Tm [(i)]TJ/F84 9.9626 Tf 1.01 0 0 1 138.252 361.477 Tm [(;)-247(however)-246(the)-247(variables)-246(associated)-247(with)-246(them)-247(ar)18(e)-247(needed)-246(to)-247(complete)]TJ 1.02 0 0 1 99.895 349.522 Tm [(computations)-284(associated)-284(with)-285(the)-284(sparse)-284(matrix)]TJ/F78 9.9626 Tf 1 0 0 1 318.756 349.522 Tm [(A)]TJ/F84 9.9626 Tf 1.02 0 0 1 326.074 349.522 Tm [(,)-294(and)-284(thus)-284(they)-285(have)-284(to)-284(be)]TJ 1.02 0 0 1 99.895 337.567 Tm [(fetched)-303(fr)18(om)-304(\050neighbouring\051)-303(pr)18(ocesses.)-478(The)-303(descriptor)-303(of)-303(the)-303(index)-304(space)-303(is)]TJ 1.007 0 0 1 99.895 325.612 Tm [(built)-249(exactly)-248(for)-249(the)-249(purpose)-249(of)-248(pr)17(op)1(erly)-249(sequencing)-249(the)-249(communication)-248(steps)]TJ 1 0 0 1 99.895 313.656 Tm [(r)18(equir)18(ed)-250(to)-250(achieve)-250(this)-250(objective.)]TJ 0.987 0 0 1 114.839 301.486 Tm [(A)-253(simple)-253(application)-254(str)8(u)1(ctur)18(e)-253(will)-254(walk)-253(thr)18(ough)-253(the)-253(index)-253(space)-253(allocation,)]TJ 1 0 0 1 99.895 289.531 Tm [(matrix/vector)-250(cr)18(eation)-250(and)-250(linear)-250(system)-250(solution)-250(as)-250(follows:)]TJ +/F75 11.9552 Tf 99.895 706.129 Td [(2.3)-1000(Application)-250(structure)]TJ/F84 9.9626 Tf 0.999 0 0 1 99.587 686.748 Tm [(The)-249(main)-249(underlying)-250(principle)-249(of)-249(the)-249(PSBLAS)-250(library)-249(is)-249(that)-249(the)-249(library)-250(objects)]TJ 0.999 0 0 1 99.895 674.792 Tm [(ar)18(e)-251(cr)18(eated)-251(and)-251(exist)-251(with)-251(r)18(efer)18(ence)-251(to)-251(a)-251(discr)18(etized)-251(space)-251(to)-251(which)-251(ther)18(e)-251(corr)18(e-)]TJ 0.98 0 0 1 99.895 662.837 Tm [(sponds)-255(an)-254(index)-255(space)-255(and)-254(a)-255(matrix)-255(sparsity)-254(pattern.)-316(As)-255(an)-255(example,)-255(consider)-254(a)]TJ 1.015 0 0 1 99.895 650.882 Tm [(cell-center)18(ed)-246(\002nite-volume)-246(discr)18(etization)-246(of)-246(the)-246(Navier)18(-Stokes)-246(equations)-245(on)-246(a)]TJ 0.98 0 0 1 99.895 638.927 Tm [(simulation)-233(domain;)-240(the)-233(index)-233(space)-232(1)]TJ 1 0 0 1 261.657 638.927 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)]TJ/F84 9.9626 Tf 0.98 0 0 1 282.794 638.927 Tm [(is)-233(isomorphic)-233(to)-232(the)-233(set)-233(of)-233(cell)-233(centers,)]TJ 1.02 0 0 1 99.477 626.972 Tm [(wher)18(eas)-332(the)-332(pattern)-332(of)-332(the)-332(associated)-332(linear)-332(system)-332(matrix)-332(is)-332(isomorphic)-332(to)]TJ 1.014 0 0 1 99.895 615.017 Tm [(the)-246(adjacency)-247(gr)1(aph)-247(imposed)-246(on)-246(the)-246(discr)17(etization)-246(mesh)-246(by)-246(the)-247(discr)18(etization)]TJ 1 0 0 1 99.895 603.061 Tm [(stencil.)]TJ 1.02 0 0 1 114.839 590.891 Tm [(Thus)-298(the)-297(\002rst)-298(or)18(der)-298(of)-297(business)-298(is)-298(to)-297(establish)-298(an)-298(i)1(ndex)-298(space,)-311(and)-297(this)-298(is)]TJ 0.989 0 0 1 99.895 578.936 Tm [(done)-253(with)-253(a)-253(call)-253(to)]TJ/F147 9.9626 Tf 1 0 0 1 182.801 578.936 Tm [(psb_cdall)]TJ/F84 9.9626 Tf 0.989 0 0 1 232.368 578.936 Tm [(in)-253(which)-253(we)-253(specify)-253(the)-253(size)-253(of)-253(the)-253(index)-253(space)]TJ/F78 9.9626 Tf 1 0 0 1 437.943 578.936 Tm [(n)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.895 566.98 Tm [(and)-250(the)-249(allocation)-249(of)-250(the)-249(elements)-250(of)-249(the)-250(index)-249(space)-250(to)-249(the)-250(various)-249(pr)17(ocesses)]TJ 1 0 0 1 99.895 555.025 Tm [(making)-250(up)-250(the)-250(MPI)-250(\050virtual\051)-250(parallel)-250(machine.)]TJ 0.987 0 0 1 114.839 542.855 Tm [(The)-254(index)-255(space)-254(is)-254(partitioned)-254(among)-255(pr)19(ocesses,)-255(and)-254(this)-254(cr)18(eates)-255(a)-254(mapping)]TJ 1.02 0 0 1 99.895 530.899 Tm [(fr)18(om)-313(the)-312(\223global\224)-313(numbering)-312(1)]TJ 1 0 0 1 243.306 530.899 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)]TJ/F84 9.9626 Tf 1.02 0 0 1 265.345 530.899 Tm [(to)-312(a)-313(numbering)-312(\223local\224)-313(to)-312(each)-312(pr)17(ocess;)]TJ 1.02 0 0 1 99.895 518.944 Tm [(each)-357(pr)17(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 161.071 518.944 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 167.665 518.944 Tm [(will)-357(own)-357(a)-358(certain)-357(subset)-357(1)]TJ 1 0 0 1 294.248 518.944 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)]TJ/F84 9.9626 Tf 5.664 -1.494 Td [(r)18(ow)]TJ/F78 5.9776 Tf 17.537 -1.649 Td [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 333.423 518.944 Tm [(,)-385(each)-357(element)-358(of)-357(which)]TJ 1.004 0 0 1 99.895 506.989 Tm [(corr)18(esponds)-250(to)-249(a)-250(certain)-249(element)-250(of)-249(1)]TJ 1 0 0 1 263.855 506.989 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)]TJ/F84 9.9626 Tf 1.004 0 0 1 282.719 506.989 Tm [(.)-310(The)-250(user)-250(does)-249(not)-250(set)-249(explicitly)-250(this)]TJ 0.987 0 0 1 99.895 495.034 Tm [(mapping;)-253(when)-254(the)-253(application)-253(needs)-254(to)-253(indicate)-253(to)-254(which)-253(element)-253(of)-254(the)-253(index)]TJ 1.02 0 0 1 99.895 483.079 Tm [(space)-263(a)-262(certain)-263(item)-263(is)-262(r)17(elated,)-267(such)-262(as)-263(the)-263(r)18(ow)-263(and)-263(colu)1(mn)-263(index)-263(of)-263(a)-262(matrix)]TJ 1.02 0 0 1 99.895 471.124 Tm [(coef)18(\002cient,)-272(it)-266(usually)-267(does)-266(so)-267(in)-266(the)-267(\223global\224)-266(numbering,)-272(and)-267(the)-266(library)-267(will)]TJ 1 0 0 1 99.895 459.168 Tm [(translate)-250(into)-250(the)-250(appr)18(opriate)-250(\223local\224)-250(numbering.)]TJ 0.98 0 0 1 114.839 446.998 Tm [(For)-242(a)-242(given)-241(index)-242(space)-242(1)]TJ 1 0 0 1 225.057 446.998 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)]TJ/F84 9.9626 Tf 0.98 0 0 1 246.282 446.998 Tm [(ther)18(e)-241(ar)18(e)-242(many)-242(possible)-242(associat)1(ed)-242(topologies,)]TJ 1.02 0 0 1 99.895 435.043 Tm [(i.e.)-592(many)-341(dif)18(fer)18(ent)-341(discr)18(etization)-341(stencils;)-389(thus)-341(the)-341(description)-341(of)-341(the)-341(index)]TJ 1.02 0 0 1 99.895 423.087 Tm [(space)-355(is)-355(not)-354(completed)-355(until)-355(the)-354(user)-355(has)-355(de\002ned)-355(a)-354(sparsity)-355(pattern,)-382(either)]TJ 1.006 0 0 1 99.895 411.132 Tm [(explicitly)-249(thr)18(ough)]TJ/F147 9.9626 Tf 1 0 0 1 181.63 411.132 Tm [(psb_cdins)]TJ/F84 9.9626 Tf 1.006 0 0 1 231.195 411.132 Tm [(or)-249(implicitly)-248(thr)18(ough)]TJ/F147 9.9626 Tf 1 0 0 1 326.646 411.132 Tm [(psb_spins)]TJ/F84 9.9626 Tf 1.006 0 0 1 373.719 411.132 Tm [(.)-308(The)-249(descriptor)]TJ 0.98 0 0 1 99.895 399.177 Tm [(is)-209(\002)1(nalized)-209(with)-208(a)-209(call)-208(to)]TJ/F147 9.9626 Tf 1 0 0 1 204.908 399.177 Tm [(psb_cdasb)]TJ/F84 9.9626 Tf 0.98 0 0 1 254.016 399.177 Tm [(and)-209(a)-208(sparse)-208(matrix)-209(with)-208(a)-209(call)-208(to)]TJ/F147 9.9626 Tf 1 0 0 1 395.836 399.177 Tm [(psb_spasb)]TJ/F84 9.9626 Tf 0.98 0 0 1 442.909 399.177 Tm [(.)]TJ 1.02 0 0 1 99.507 387.222 Tm [(After)]TJ/F147 9.9626 Tf 1 0 0 1 125.845 387.222 Tm [(psb_cdasb)]TJ/F84 9.9626 Tf 1.02 0 0 1 175.772 387.222 Tm [(each)-281(pr)18(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 235.396 387.222 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 241.214 387.222 Tm [(will)-281(have)-281(de\002ned)-281(a)-280(set)-281(of)-281(\223halo\224)-281(\050or)-281(\223ghost\224\051)]TJ 1.02 0 0 1 99.895 375.267 Tm [(indices)]TJ/F78 9.9626 Tf 1 0 0 1 134.824 375.267 Tm [(n)]TJ/F84 9.9626 Tf 5.663 -1.495 Td [(r)18(ow)]TJ/F78 5.9776 Tf 17.538 -1.648 Td [(i)]TJ/F197 10.3811 Tf 5.054 3.143 Td [(+)]TJ/F84 9.9626 Tf 1.02 0 0 1 173.428 375.267 Tm [(1)]TJ 1 0 0 1 180.294 375.267 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)]TJ/F84 9.9626 Tf 5.664 -3.831 Td [(col)]TJ/F78 5.9776 Tf 12.794 -1.648 Td [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 214.727 375.267 Tm [(,)-317(denoting)-303(elements)-303(of)-303(the)-303(index)-303(space)-303(that)-303(ar)18(e)]TJ/F78 9.9626 Tf 1.02 0 0 1 430.061 375.267 Tm [(not)]TJ/F84 9.9626 Tf 0.98 0 0 1 99.895 361.477 Tm [(assigned)-238(to)-238(pr)18(oce)1(ss)]TJ/F78 9.9626 Tf 1 0 0 1 185.354 361.477 Tm [(i)]TJ/F84 9.9626 Tf 0.98 0 0 1 188.318 361.477 Tm [(;)-244(the)-238(variables)-237(associated)-238(with)-238(them)-238(ar)18(e)-238(needed)-238(to)-238(complete)]TJ 1.02 0 0 1 99.895 349.522 Tm [(computations)-284(associated)-284(with)-285(the)-284(sparse)-284(matrix)]TJ/F78 9.9626 Tf 1 0 0 1 318.756 349.522 Tm [(A)]TJ/F84 9.9626 Tf 1.02 0 0 1 326.074 349.522 Tm [(,)-294(and)-284(thus)-284(they)-285(have)-284(to)-284(be)]TJ 1.02 0 0 1 99.895 337.567 Tm [(fetched)-303(fr)18(om)-304(\050neighbouring\051)-303(pr)18(ocesses.)-478(The)-303(descriptor)-303(of)-303(the)-303(index)-304(space)-303(is)]TJ 1.007 0 0 1 99.895 325.612 Tm [(built)-249(exactly)-248(for)-249(the)-249(purpose)-249(of)-248(pr)17(op)1(erly)-249(sequencing)-249(the)-249(communication)-248(steps)]TJ 1 0 0 1 99.895 313.656 Tm [(r)18(equir)18(ed)-250(to)-250(achieve)-250(this)-250(objective.)]TJ 0.987 0 0 1 114.839 301.486 Tm [(A)-253(simple)-253(application)-254(str)8(u)1(ctur)18(e)-253(will)-254(walk)-253(thr)18(ough)-253(the)-253(index)-253(space)-253(allocation,)]TJ 1 0 0 1 99.895 289.531 Tm [(matrix/vector)-250(cr)18(eation)-250(and)-250(linear)-250(system)-250(solution)-250(as)-250(follows:)]TJ 0 g 0 G 12.454 -20.572 Td [(1.)]TJ 0 g 0 G - [-500(Initialize)-250(parallel)-250(envir)18(onment)-250(with)]TJ/F145 9.9626 Tf 171.464 0 Td [(psb_init)]TJ/F84 9.9626 Tf 41.843 0 Td [(;)]TJ + [-500(Initialize)-250(parallel)-250(envir)18(onment)-250(with)]TJ/F147 9.9626 Tf 171.464 0 Td [(psb_init)]TJ/F84 9.9626 Tf 41.843 0 Td [(;)]TJ 0 g 0 G -213.307 -20.787 Td [(2.)]TJ 0 g 0 G - [-500(Initialize)-250(index)-250(space)-250(with)]TJ/F145 9.9626 Tf 130.489 0 Td [(psb_cdall)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)]TJ + [-500(Initialize)-250(index)-250(space)-250(with)]TJ/F147 9.9626 Tf 130.489 0 Td [(psb_cdall)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)]TJ 0 g 0 G -177.562 -20.787 Td [(3.)]TJ 0 g 0 G - 0.983 0 0 1 124.413 227.385 Tm [(Allocate)-254(sparse)-255(matrix)-254(and)-254(dense)-255(vectors)-254(with)]TJ/F145 9.9626 Tf 1 0 0 1 326.635 227.385 Tm [(psb_spall)]TJ/F84 9.9626 Tf 0.983 0 0 1 376.199 227.385 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 395.269 227.385 Tm [(psb_geall)]TJ/F84 9.9626 Tf 0.983 0 0 1 442.342 227.385 Tm [(;)]TJ + 0.983 0 0 1 124.413 227.385 Tm [(Allocate)-254(sparse)-255(matrix)-254(and)-254(dense)-255(vectors)-254(with)]TJ/F147 9.9626 Tf 1 0 0 1 326.635 227.385 Tm [(psb_spall)]TJ/F84 9.9626 Tf 0.983 0 0 1 376.199 227.385 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 395.269 227.385 Tm [(psb_geall)]TJ/F84 9.9626 Tf 0.983 0 0 1 442.342 227.385 Tm [(;)]TJ 0 g 0 G 1 0 0 1 112.349 206.597 Tm [(4.)]TJ 0 g 0 G - 1.02 0 0 1 124.802 206.597 Tm [(Loop)-265(over)-265(all)-266(local)-265(r)18(ows,)-270(generate)-266(matrix)-265(and)-265(vector)-265(entries,)-270(and)-266(insert)]TJ 1 0 0 1 124.802 194.642 Tm [(them)-250(with)]TJ/F145 9.9626 Tf 47.85 0 Td [(psb_spins)]TJ/F84 9.9626 Tf 49.564 0 Td [(and)]TJ/F145 9.9626 Tf 19.357 0 Td [(psb_geins)]TJ + 1.02 0 0 1 124.802 206.597 Tm [(Loop)-265(over)-265(all)-266(local)-265(r)18(ows,)-270(generate)-266(matrix)-265(and)-265(vector)-265(entries,)-270(and)-266(insert)]TJ 1 0 0 1 124.802 194.642 Tm [(them)-250(with)]TJ/F147 9.9626 Tf 47.85 0 Td [(psb_spins)]TJ/F84 9.9626 Tf 49.564 0 Td [(and)]TJ/F147 9.9626 Tf 19.357 0 Td [(psb_geins)]TJ 0 g 0 G /F84 9.9626 Tf -129.224 -20.787 Td [(5.)]TJ 0 g 0 G @@ -4969,15 +4978,15 @@ BT 0 g 0 G 17.773 -20.787 Td [(\050a\051)]TJ 0 g 0 G -/F145 9.9626 Tf 16.598 0 Td [(psb_cdasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(,)]TJ +/F147 9.9626 Tf 16.598 0 Td [(psb_cdasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(,)]TJ 0 g 0 G -64.199 -16.371 Td [(\050b\051)]TJ 0 g 0 G -/F145 9.9626 Tf 17.126 0 Td [(psb_spasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(,)]TJ +/F147 9.9626 Tf 17.126 0 Td [(psb_spasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(,)]TJ 0 g 0 G -63.113 -16.371 Td [(\050c\051)]TJ 0 g 0 G -/F145 9.9626 Tf 16.04 0 Td [(psb_geasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)]TJ +/F147 9.9626 Tf 16.04 0 Td [(psb_geasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)]TJ 0 g 0 G 75.467 -29.888 Td [(7)]TJ 0 g 0 G @@ -4990,7 +4999,7 @@ endobj /Type /ObjStm /N 100 /First 913 -/Length 13454 +/Length 13406 >> stream 849 0 889 152 850 304 851 449 852 602 853 755 854 908 855 1061 856 1214 857 1367 @@ -4998,11 +5007,11 @@ stream 868 3035 869 3183 870 3331 871 3479 872 3627 873 3775 874 3924 875 4073 876 4222 877 4371 878 4520 879 4669 880 4818 881 4967 882 5116 886 5264 883 5321 892 5401 7 5515 891 5569 906 5649 895 5855 896 6005 897 6155 898 6306 899 6460 900 6611 901 6761 902 6910 903 7058 -904 7206 11 7354 905 7410 924 7503 928 7653 929 7894 930 7936 931 8322 918 8622 919 8768 -920 8916 926 9059 15 9115 927 9170 923 9226 937 9347 922 9497 934 9645 935 9793 939 9941 -19 9998 943 10054 944 10111 936 10168 950 10303 954 10445 955 10559 956 10601 946 10670 947 10818 -952 10965 953 11021 23 11077 949 11132 962 11281 959 11423 960 11570 964 11717 961 11774 967 11868 -969 11982 27 12038 970 12093 971 12149 972 12205 973 12261 974 12317 975 12373 976 12429 977 12485 +904 7206 11 7354 905 7410 924 7503 928 7653 929 7822 930 7867 931 8272 918 8572 919 8718 +920 8866 926 9009 15 9065 927 9120 923 9176 938 9297 922 9447 935 9595 936 9744 940 9893 +19 9950 944 10006 945 10063 937 10120 951 10255 955 10397 956 10511 957 10553 947 10622 948 10770 +953 10917 954 10973 23 11029 950 11084 963 11233 960 11375 961 11522 965 11669 962 11726 968 11820 +970 11934 27 11990 971 12045 972 12101 973 12157 974 12213 975 12269 976 12325 977 12381 978 12437 % 849 0 obj << /Type /Annot @@ -5355,7 +5364,7 @@ stream /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[0 1 0] -/Rect [267.112 430.331 279.067 439.436] +/Rect [269.031 418.376 280.986 427.481] /A << /S /GoTo /D (cite.machiels) >> >> % 900 0 obj @@ -5418,33 +5427,33 @@ stream >> % 928 0 obj << -/Producer (GPL Ghostscript 9.04) -/CreationDate (D:20111215145523+01'00') -/ModDate (D:20111215145523+01'00') +/Producer (GPL Ghostscript 10.05.1) +/CreationDate (D:20251223132900) +/ModDate (D:20251223132900) /Title (psblas.fig) -/Creator (fig2dev Version 3.2 Patchlevel 5d) -/Author (sfilippo@donald \(Salvatore Filippone\)) +/Creator (fig2dev Version 3.2.9a) >> % 929 0 obj << /Type /ExtGState -/OPM 1 +/SA false >> % 930 0 obj << -/BaseFont /JEJNJE+Times-Roman +/BaseFont /BGFCTJ+Times-Roman /FontDescriptor 931 0 R +/ToUnicode 932 0 R /Type /Font /FirstChar 32 /LastChar 116 -/Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 500 500 0 0 0 0 0 0 0 0 0 0 0 0 0 722 667 0 0 0 556 0 0 333 0 0 611 889 0 0 556 0 0 556 0 0 0 0 0 0 0 0 0 0 0 0 0 444 0 444 0 444 333 500 0 278 0 0 278 0 500 500 500 0 333 389 278] +/Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 500 0 0 0 0 0 500 0 0 0 0 0 0 0 0 722 667 0 0 0 556 0 0 333 0 0 611 889 0 0 556 0 0 556 0 0 0 0 0 0 0 0 0 0 0 0 0 444 0 444 0 444 333 500 0 278 0 0 278 0 500 500 500 0 333 389 278] /Encoding /WinAnsiEncoding /Subtype /Type1 >> % 931 0 obj << /Type /FontDescriptor -/FontName /JEJNJE+Times-Roman +/FontName /BGFCTJ+Times-Roman /FontBBox [ 0 -218 863 683] /Flags 32 /Ascent 683 @@ -5452,10 +5461,10 @@ stream /Descent -218 /ItalicAngle 0 /StemV 129 -/MissingWidth 500 +/MissingWidth 250 /XHeight 460 -/CharSet (/A/B/F/I/L/M/P/S/a/c/e/f/g/i/l/n/o/p/r/s/space/t/three/two/zero) -/FontFile3 932 0 R +/CharSet (/A/B/F/I/L/M/P/S/a/c/e/eight/f/g/i/l/n/o/p/r/s/space/t/two/zero) +/FontFile3 933 0 R >> % 918 0 obj << @@ -5499,14 +5508,14 @@ stream /XObject << /Im2 921 0 R >> /ProcSet [ /PDF /Text ] >> -% 937 0 obj +% 938 0 obj << /Type /Page -/Contents 938 0 R -/Resources 936 0 R +/Contents 939 0 R +/Resources 937 0 R /MediaBox [0 0 595.276 841.89] /Parent 894 0 R -/Annots [ 922 0 R 934 0 R 935 0 R ] +/Annots [ 922 0 R 935 0 R 936 0 R ] >> % 922 0 obj << @@ -5516,70 +5525,70 @@ stream /Rect [325.842 609.432 337.797 618.438] /A << /S /GoTo /D (cite.METIS) >> >> -% 934 0 obj +% 935 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [259.94 534.258 266.216 547.962] +/Rect [246.427 534.258 252.704 547.962] /A << /S /GoTo /D (Hfootnote.1) >> >> -% 935 0 obj +% 936 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [208.583 185.645 214.86 199.235] +/Rect [254.986 185.645 261.263 199.235] /A << /S /GoTo /D (Hfootnote.2) >> >> -% 939 0 obj +% 940 0 obj << -/D [937 0 R /XYZ 149.705 753.953 null] +/D [938 0 R /XYZ 149.705 753.953 null] >> % 19 0 obj << -/D [937 0 R /XYZ 150.705 504.866 null] +/D [938 0 R /XYZ 150.705 504.866 null] >> -% 943 0 obj +% 944 0 obj << -/D [937 0 R /XYZ 165.051 167.999 null] +/D [938 0 R /XYZ 165.051 167.999 null] >> -% 944 0 obj +% 945 0 obj << -/D [937 0 R /XYZ 165.051 158.184 null] +/D [938 0 R /XYZ 165.051 158.184 null] >> -% 936 0 obj +% 937 0 obj << -/Font << /F84 687 0 R /F78 686 0 R /F145 940 0 R /F75 685 0 R /F190 941 0 R /F192 942 0 R >> +/Font << /F84 687 0 R /F78 686 0 R /F147 941 0 R /F75 685 0 R /F195 942 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 950 0 obj +% 951 0 obj << /Type /Page -/Contents 951 0 R -/Resources 949 0 R +/Contents 952 0 R +/Resources 950 0 R /MediaBox [0 0 595.276 841.89] /Parent 894 0 R -/Annots [ 946 0 R 947 0 R ] +/Annots [ 947 0 R 948 0 R ] >> -% 954 0 obj +% 955 0 obj << /Producer (ESP Ghostscript 815.03) /CreationDate (D:20070123225315) /ModDate (D:20070123225315) >> -% 955 0 obj +% 956 0 obj << /Type /ExtGState /OPM 1 >> -% 956 0 obj +% 957 0 obj << /BaseFont /Times-Roman /Type /Font /Subtype /Type1 >> -% 946 0 obj +% 947 0 obj << /Type /Annot /Subtype /Link @@ -5587,7 +5596,7 @@ stream /Rect [244.163 638.309 251.137 647.315] /A << /S /GoTo /D (cite.2007c) >> >> -% 947 0 obj +% 948 0 obj << /Type /Annot /Subtype /Link @@ -5595,34 +5604,34 @@ stream /Rect [254.125 638.21 261.099 647.166] /A << /S /GoTo /D (cite.2007d) >> >> -% 952 0 obj +% 953 0 obj << -/D [950 0 R /XYZ 98.895 753.953 null] +/D [951 0 R /XYZ 98.895 753.953 null] >> -% 953 0 obj +% 954 0 obj << -/D [950 0 R /XYZ 99.895 353.614 null] +/D [951 0 R /XYZ 99.895 353.614 null] >> % 23 0 obj << -/D [950 0 R /XYZ 99.895 270.035 null] +/D [951 0 R /XYZ 99.895 270.035 null] >> -% 949 0 obj +% 950 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F190 941 0 R /F78 686 0 R /F192 942 0 R >> -/XObject << /Im3 948 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F195 942 0 R /F78 686 0 R /F197 943 0 R >> +/XObject << /Im3 949 0 R >> /ProcSet [ /PDF /Text ] >> -% 962 0 obj +% 963 0 obj << /Type /Page -/Contents 963 0 R -/Resources 961 0 R +/Contents 964 0 R +/Resources 962 0 R /MediaBox [0 0 595.276 841.89] /Parent 894 0 R -/Annots [ 959 0 R 960 0 R ] +/Annots [ 960 0 R 961 0 R ] >> -% 959 0 obj +% 960 0 obj << /Type /Annot /Subtype /Link @@ -5630,7 +5639,7 @@ stream /Rect [455.548 354.196 462.522 366.255] /A << /S /GoTo /D (section.3) >> >> -% 960 0 obj +% 961 0 obj << /Type /Annot /Subtype /Link @@ -5638,67 +5647,67 @@ stream /Rect [226.669 318.033 233.743 330.093] /A << /S /GoTo /D (section.6) >> >> -% 964 0 obj +% 965 0 obj << -/D [962 0 R /XYZ 149.705 753.953 null] +/D [963 0 R /XYZ 149.705 753.953 null] >> -% 961 0 obj +% 962 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 967 0 obj +% 968 0 obj << /Type /Page -/Contents 968 0 R -/Resources 966 0 R +/Contents 969 0 R +/Resources 967 0 R /MediaBox [0 0 595.276 841.89] -/Parent 978 0 R +/Parent 979 0 R >> -% 969 0 obj +% 970 0 obj << -/D [967 0 R /XYZ 98.895 753.953 null] +/D [968 0 R /XYZ 98.895 753.953 null] >> % 27 0 obj << -/D [967 0 R /XYZ 99.895 716.092 null] ->> -% 970 0 obj -<< -/D [967 0 R /XYZ 99.895 282.521 null] +/D [968 0 R /XYZ 99.895 716.092 null] >> % 971 0 obj << -/D [967 0 R /XYZ 99.895 261.733 null] +/D [968 0 R /XYZ 99.895 282.521 null] >> % 972 0 obj << -/D [967 0 R /XYZ 99.895 240.946 null] +/D [968 0 R /XYZ 99.895 261.733 null] >> % 973 0 obj << -/D [967 0 R /XYZ 99.895 220.159 null] +/D [968 0 R /XYZ 99.895 240.946 null] >> % 974 0 obj << -/D [967 0 R /XYZ 99.895 188.012 null] +/D [968 0 R /XYZ 99.895 220.159 null] >> % 975 0 obj << -/D [967 0 R /XYZ 99.895 167.072 null] +/D [968 0 R /XYZ 99.895 188.012 null] >> % 976 0 obj << -/D [967 0 R /XYZ 99.895 148.646 null] +/D [968 0 R /XYZ 99.895 167.072 null] >> % 977 0 obj << -/D [967 0 R /XYZ 99.895 132.275 null] +/D [968 0 R /XYZ 99.895 148.646 null] +>> +% 978 0 obj +<< +/D [968 0 R /XYZ 99.895 132.275 null] >> endstream endobj -983 0 obj +984 0 obj << /Length 8991 >> @@ -5709,7 +5718,7 @@ stream BT /F84 9.9626 Tf 163.158 706.129 Td [(6.)]TJ 0 g 0 G - 0.984 0 0 1 175.611 706.129 Tm [(Choose)-254(the)-254(pr)19(econditioner)-254(to)-254(be)-254(u)1(sed)-254(with)]TJ/F145 9.9626 Tf 1 0 0 1 362.392 706.129 Tm [(prec%init)]TJ/F84 9.9626 Tf 0.984 0 0 1 411.953 706.129 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 431.037 706.129 Tm [(prec%set)]TJ/F84 9.9626 Tf 0.984 0 0 1 472.88 706.129 Tm [(,)-254(and)]TJ 1 0 0 1 175.611 694.174 Tm [(build)-250(it)-250(with)]TJ/F145 9.9626 Tf 57.275 0 Td [(prec%build)]TJ + 0.984 0 0 1 175.611 706.129 Tm [(Choose)-254(the)-254(pr)19(econditioner)-254(to)-254(be)-254(u)1(sed)-254(with)]TJ/F147 9.9626 Tf 1 0 0 1 362.392 706.129 Tm [(prec%init)]TJ/F84 9.9626 Tf 0.984 0 0 1 411.953 706.129 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 431.037 706.129 Tm [(prec%set)]TJ/F84 9.9626 Tf 0.984 0 0 1 472.88 706.129 Tm [(,)-254(and)]TJ 1 0 0 1 175.611 694.174 Tm [(build)-250(it)-250(with)]TJ/F147 9.9626 Tf 57.275 0 Td [(prec%build)]TJ 0 0 1 rg 0 0 1 RG /F84 7.5716 Tf 52.303 3.616 Td [(3)]TJ 0 g 0 G @@ -5717,27 +5726,27 @@ BT 0 g 0 G -126.315 -18.137 Td [(7.)]TJ 0 g 0 G - 0.98 0 0 1 175.611 676.037 Tm [(Call)-204(one)-203(of)-204(the)-204(iterative)-203(drivers)-204(with)-204(the)-203(method)-204(of)-204(choice,)-214(e.g.)]TJ/F145 9.9626 Tf 1 0 0 1 442.374 676.037 Tm [(psb_krylov)]TJ/F84 9.9626 Tf -267.181 -11.955 Td [(with)]TJ/F145 9.9626 Tf 22.744 0 Td [(bicgstab)]TJ/F84 9.9626 Tf 41.843 0 Td [(.)]TJ -89.384 -16.347 Td [(This)-250(is)-250(the)-250(str)8(uctur)18(e)-250(of)-250(the)-250(sample)-250(pr)18(ograms)-250(in)-250(the)-250(dir)18(ectory)]TJ/F145 9.9626 Tf 266.418 0 Td [(test/pargen/)]TJ/F84 9.9626 Tf 62.764 0 Td [(.)]TJ 0.98 0 0 1 165.649 635.78 Tm [(For)-227(a)-227(simulation)-227(in)-227(which)-227(the)-226(same)-227(discr)18(etization)-227(mesh)-227(is)-227(used)-227(over)-227(multiple)]TJ 1 0 0 1 150.705 623.824 Tm [(time)-250(steps,)-250(the)-250(following)-250(str)8(uctur)18(e)-250(may)-250(be)-250(mor)18(e)-250(appr)18(opriate:)]TJ + 0.98 0 0 1 175.611 676.037 Tm [(Call)-204(one)-203(of)-204(the)-204(iterative)-203(drivers)-204(with)-204(the)-203(method)-204(of)-204(choice,)-214(e.g.)]TJ/F147 9.9626 Tf 1 0 0 1 442.374 676.037 Tm [(psb_krylov)]TJ/F84 9.9626 Tf -267.181 -11.955 Td [(with)]TJ/F147 9.9626 Tf 22.744 0 Td [(bicgstab)]TJ/F84 9.9626 Tf 41.843 0 Td [(.)]TJ -89.384 -16.347 Td [(This)-250(is)-250(the)-250(str)8(uctur)18(e)-250(of)-250(the)-250(sample)-250(pr)18(ograms)-250(in)-250(the)-250(dir)18(ectory)]TJ/F147 9.9626 Tf 266.418 0 Td [(test/pargen/)]TJ/F84 9.9626 Tf 62.764 0 Td [(.)]TJ 0.98 0 0 1 165.649 635.78 Tm [(For)-227(a)-227(simulation)-227(in)-227(which)-227(the)-226(same)-227(discr)18(etization)-227(mesh)-227(is)-227(used)-227(over)-227(multiple)]TJ 1 0 0 1 150.705 623.824 Tm [(time)-250(steps,)-250(the)-250(following)-250(str)8(uctur)18(e)-250(may)-250(be)-250(mor)18(e)-250(appr)18(opriate:)]TJ 0 g 0 G 12.453 -16.347 Td [(1.)]TJ 0 g 0 G - [-500(Initialize)-250(parallel)-250(envir)18(onment)-250(with)]TJ/F145 9.9626 Tf 171.465 0 Td [(psb_init)]TJ + [-500(Initialize)-250(parallel)-250(envir)18(onment)-250(with)]TJ/F147 9.9626 Tf 171.465 0 Td [(psb_init)]TJ 0 g 0 G /F84 9.9626 Tf -171.465 -18.136 Td [(2.)]TJ 0 g 0 G - [-500(Initialize)-250(index)-250(space)-250(with)]TJ/F145 9.9626 Tf 130.489 0 Td [(psb_cdall)]TJ + [-500(Initialize)-250(index)-250(space)-250(with)]TJ/F147 9.9626 Tf 130.489 0 Td [(psb_cdall)]TJ 0 g 0 G /F84 9.9626 Tf -130.489 -18.137 Td [(3.)]TJ 0 g 0 G - 0.98 0 0 1 175.611 571.204 Tm [(Loop)-224(over)-225(the)-224(topology)-224(of)-224(the)-225(discr)19(etization)-225(mesh)-224(and)-224(build)-224(the)-225(descriptor)]TJ 1 0 0 1 175.193 559.249 Tm [(with)]TJ/F145 9.9626 Tf 22.744 0 Td [(psb_cdins)]TJ/F84 9.9626 Tf 47.074 0 Td [(;)]TJ + 0.98 0 0 1 175.611 571.204 Tm [(Loop)-224(over)-225(the)-224(topology)-224(of)-224(the)-225(discr)19(etization)-225(mesh)-224(and)-224(build)-224(the)-225(descriptor)]TJ 1 0 0 1 175.193 559.249 Tm [(with)]TJ/F147 9.9626 Tf 22.744 0 Td [(psb_cdins)]TJ/F84 9.9626 Tf 47.074 0 Td [(;)]TJ 0 g 0 G -81.853 -18.136 Td [(4.)]TJ 0 g 0 G - [-461(Assemble)-250(the)-250(descriptor)-250(with)]TJ/F145 9.9626 Tf 143.998 0 Td [(psb_cdasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)]TJ + [-461(Assemble)-250(the)-250(descriptor)-250(with)]TJ/F147 9.9626 Tf 143.998 0 Td [(psb_cdasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)]TJ 0 g 0 G -191.071 -18.136 Td [(5.)]TJ 0 g 0 G - 1.02 0 0 1 175.223 522.977 Tm [(Allocate)-407(the)-408(sparse)-407(matrices)-408(and)-407(dense)-408(vectors)-407(with;)]TJ/F145 9.9626 Tf 1 0 0 1 425.998 522.977 Tm [(psb_spall)]TJ/F84 9.9626 Tf 1.02 0 0 1 477.212 522.977 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 175.611 511.021 Tm [(psb_geall)]TJ/F84 9.9626 Tf 47.074 0 Td [(;)]TJ + 1.02 0 0 1 175.223 522.977 Tm [(Allocate)-407(the)-408(sparse)-407(matrices)-408(and)-407(dense)-408(vectors)-407(with;)]TJ/F147 9.9626 Tf 1 0 0 1 425.998 522.977 Tm [(psb_spall)]TJ/F84 9.9626 Tf 1.02 0 0 1 477.212 522.977 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 175.611 511.021 Tm [(psb_geall)]TJ/F84 9.9626 Tf 47.074 0 Td [(;)]TJ 0 g 0 G -59.527 -18.136 Td [(6.)]TJ 0 g 0 G @@ -5745,26 +5754,26 @@ BT 0 g 0 G 17.774 -18.136 Td [(\050a\051)]TJ 0 g 0 G - 1.02 0 0 1 197.529 474.749 Tm [(If)-260(after)-261(\002rst)-260(time)-260(step,)-264(r)18(einitialize)-261(the)-260(sparse)-260(matrix)-260(with)]TJ/F145 9.9626 Tf 1 0 0 1 451.278 474.749 Tm [(psb_sprn)]TJ/F84 9.9626 Tf 1.02 0 0 1 493.121 474.749 Tm [(;)]TJ 1 0 0 1 197.529 462.794 Tm [(also)-250(zer)18(o)-250(out)-250(the)-250(dense)-250(vectors;)]TJ + 1.02 0 0 1 197.529 474.749 Tm [(If)-260(after)-261(\002rst)-260(time)-260(step,)-264(r)18(einitialize)-261(the)-260(sparse)-260(matrix)-260(with)]TJ/F147 9.9626 Tf 1 0 0 1 451.278 474.749 Tm [(psb_sprn)]TJ/F84 9.9626 Tf 1.02 0 0 1 493.121 474.749 Tm [(;)]TJ 1 0 0 1 197.529 462.794 Tm [(also)-250(zer)18(o)-250(out)-250(the)-250(dense)-250(vectors;)]TJ 0 g 0 G -17.125 -14.152 Td [(\050b\051)]TJ 0 g 0 G - 1.02 0 0 1 197.529 448.642 Tm [(Loop)-358(o)1(ver)-358(the)-357(mesh,)-386(generate)-357(the)-358(coef)18(\002cients)-357(and)-358(insert/update)]TJ 1 0 0 1 197.529 436.687 Tm [(them)-250(with)]TJ/F145 9.9626 Tf 47.85 0 Td [(psb_spins)]TJ/F84 9.9626 Tf 49.564 0 Td [(and)]TJ/F145 9.9626 Tf 19.357 0 Td [(psb_geins)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)]TJ + 1.02 0 0 1 197.529 448.642 Tm [(Loop)-358(o)1(ver)-358(the)-357(mesh,)-386(generate)-357(the)-358(coef)18(\002cients)-357(and)-358(insert/update)]TJ 1 0 0 1 197.529 436.687 Tm [(them)-250(with)]TJ/F147 9.9626 Tf 47.85 0 Td [(psb_spins)]TJ/F84 9.9626 Tf 49.564 0 Td [(and)]TJ/F147 9.9626 Tf 19.357 0 Td [(psb_geins)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)]TJ 0 g 0 G -179.883 -14.151 Td [(\050c\051)]TJ 0 g 0 G - [-461(Assemble)-250(with)]TJ/F145 9.9626 Tf 83.834 0 Td [(psb_spasb)]TJ/F84 9.9626 Tf 49.564 0 Td [(and)]TJ/F145 9.9626 Tf 19.357 0 Td [(psb_geasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)]TJ + [-461(Assemble)-250(with)]TJ/F147 9.9626 Tf 83.834 0 Td [(psb_spasb)]TJ/F84 9.9626 Tf 49.564 0 Td [(and)]TJ/F147 9.9626 Tf 19.357 0 Td [(psb_geasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)]TJ 0 g 0 G -201.492 -14.151 Td [(\050d\051)]TJ 0 g 0 G 0 g 0 G 1.315 -14.152 Td [(\050e\051)]TJ 0 g 0 G - 0.98 0 0 1 197.529 394.233 Tm [(Choose)-245(the)-246(pr)18(econditione)1(r)-246(to)-245(be)-246(used)-245(with)]TJ/F145 9.9626 Tf 1 0 0 1 382.982 394.233 Tm [(prec%init)]TJ/F84 9.9626 Tf 0.98 0 0 1 432.452 394.233 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 451.378 394.233 Tm [(prec%set)]TJ/F84 9.9626 Tf 0.98 0 0 1 493.22 394.233 Tm [(,)]TJ 1 0 0 1 197.529 382.278 Tm [(and)-250(build)-250(it)-250(with)]TJ/F145 9.9626 Tf 76.632 0 Td [(prec%build)]TJ/F84 9.9626 Tf 52.303 0 Td [(;)]TJ + 0.98 0 0 1 197.529 394.233 Tm [(Choose)-245(the)-246(pr)18(econditione)1(r)-246(to)-245(be)-246(used)-245(with)]TJ/F147 9.9626 Tf 1 0 0 1 382.982 394.233 Tm [(prec%init)]TJ/F84 9.9626 Tf 0.98 0 0 1 432.452 394.233 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 451.378 394.233 Tm [(prec%set)]TJ/F84 9.9626 Tf 0.98 0 0 1 493.22 394.233 Tm [(,)]TJ 1 0 0 1 197.529 382.278 Tm [(and)-250(build)-250(it)-250(with)]TJ/F147 9.9626 Tf 76.632 0 Td [(prec%build)]TJ/F84 9.9626 Tf 52.303 0 Td [(;)]TJ 0 g 0 G -143.869 -14.151 Td [(\050f\051)]TJ 0 g 0 G - 1.02 0 0 1 197.529 368.127 Tm [(Call)-416(one)-415(of)-416(the)-416(it)1(erative)-416(drivers)-416(with)-415(the)-416(method)-416(of)-415(choice,)-458(e.g.)]TJ/F145 9.9626 Tf 1 0 0 1 197.529 356.172 Tm [(psb_krylov)]TJ/F84 9.9626 Tf 54.794 0 Td [(with)]TJ/F145 9.9626 Tf 22.745 0 Td [(bicgstab)]TJ/F84 9.9626 Tf 41.842 0 Td [(.)]TJ 0.98 0 0 1 150.396 338.035 Tm [(The)-247(insertion)-247(r)19(outines)-247(will)-247(be)-247(called)-247(as)-247(many)-247(times)-247(as)-247(needed;)-249(they)-247(only)-247(need)-247(to)]TJ 1.02 0 0 1 150.705 326.08 Tm [(be)-245(called)-245(on)-245(the)-245(data)-245(that)-245(is)-246(actually)-245(allocated)-245(to)-245(the)-245(curr)18(ent)-245(pr)17(ocess,)-245(i.e.)-304(each)]TJ 1 0 0 1 150.406 314.125 Tm [(pr)18(ocess)-250(generates)-250(its)-250(own)-250(data.)]TJ 0.981 0 0 1 165.649 302.17 Tm [(In)-256(principle)-255(ther)18(e)-256(is)-255(no)-256(speci\002c)-255(or)18(der)-256(in)-255(the)-256(calls)-256(to)]TJ/F145 9.9626 Tf 1 0 0 1 386.226 302.17 Tm [(psb_spins)]TJ/F84 9.9626 Tf 0.981 0 0 1 433.299 302.17 Tm [(,)-256(nor)-256(is)-255(ther)18(e)-255(a)]TJ 0.997 0 0 1 150.705 290.215 Tm [(r)18(equir)18(ement)-251(to)-251(build)-251(a)-251(matrix)-251(r)18(ow)-251(in)-251(its)-251(entir)18(ety)-251(befor)18(e)-251(calling)-251(the)-251(r)18(outine;)-251(this)]TJ 1.02 0 0 1 150.705 278.26 Tm [(allows)-288(the)-288(application)-289(p)1(r)17(ogrammer)-288(to)-288(walk)-288(thr)17(ough)-288(the)-288(discr)18(etization)-289(mesh)]TJ 1.02 0 0 1 150.705 266.304 Tm [(element)-265(by)-265(element,)-271(gen)1(erating)-266(the)-265(main)-265(part)-265(of)-265(a)-266(given)-265(matrix)-265(r)18(ow)-265(but)-266(also)]TJ 1 0 0 1 150.705 254.349 Tm [(contributions)-250(to)-250(the)-250(r)18(ows)-250(corr)18(esponding)-250(to)-250(neighbouring)-250(elements.)]TJ 1.02 0 0 1 165.649 242.394 Tm [(Fr)18(om)-284(a)-283(functional)-283(point)-284(of)-283(view)-284(it)-283(is)-283(even)-284(possible)-283(to)-284(execut)1(e)-284(one)-283(call)-284(for)]TJ 0.988 0 0 1 150.705 230.439 Tm [(each)-252(nonzer)18(o)-252(coef)18(\002cient;)-252(however)-252(this)-252(would)-252(have)-252(a)-252(substantial)-252(computational)]TJ 0.98 0 0 1 150.705 218.484 Tm [(over)18(head.)-306(It)-224(is)-225(ther)19(efor)18(e)-224(advisable)-225(to)-224(pack)-225(a)-224(certain)-225(amount)-224(of)-225(data)-224(into)-225(each)-224(call)]TJ 0.988 0 0 1 150.705 206.529 Tm [(to)-253(the)-254(insertion)-253(r)18(outine,)-253(say)-253(touching)-254(on)-253(a)-253(few)-254(tens)-253(of)-253(r)18(ows;)-254(the)-253(best)-253(performng)]TJ 1.009 0 0 1 150.426 194.573 Tm [(value)-247(would)-248(depend)-247(on)-248(both)-247(the)-248(ar)18(chitectur)18(e)-248(of)-247(the)-248(computer)-247(being)-248(used)-247(and)]TJ 1.02 0 0 1 150.705 182.618 Tm [(on)-333(the)-333(pr)18(oblem)-333(str)8(uctur)18(e.)-567(At)-333(the)-333(opposite)-332(extr)17(eme,)-355(it)-332(would)-333(be)-333(possible)-333(to)]TJ 0.996 0 0 1 150.705 170.663 Tm [(generate)-250(the)-251(entir)18(e)-250(part)-251(of)-250(a)-250(coef)18(\002cient)-251(matrix)-250(r)18(esiding)-251(on)-250(a)-250(pr)18(ocess)-251(and)-250(pass)-251(it)]TJ 0.981 0 0 1 150.705 158.708 Tm [(in)-255(a)-255(single)-254(call)-255(to)]TJ/F145 9.9626 Tf 1 0 0 1 225.645 158.708 Tm [(psb_spins)]TJ/F84 9.9626 Tf 0.981 0 0 1 272.718 158.708 Tm [(;)-255(this,)-255(however)76(,)-255(would)-255(entail)-254(a)-255(doubling)-255(of)-255(memory)]TJ 1 0 0 1 150.705 146.753 Tm [(occupation,)-250(and)-250(thus)-250(would)-250(be)-250(almost)-250(always)-250(far)-250(fr)18(om)-250(optimal.)]TJ + 1.02 0 0 1 197.529 368.127 Tm [(Call)-416(one)-415(of)-416(the)-416(it)1(erative)-416(drivers)-416(with)-415(the)-416(method)-416(of)-415(choice,)-458(e.g.)]TJ/F147 9.9626 Tf 1 0 0 1 197.529 356.172 Tm [(psb_krylov)]TJ/F84 9.9626 Tf 54.794 0 Td [(with)]TJ/F147 9.9626 Tf 22.745 0 Td [(bicgstab)]TJ/F84 9.9626 Tf 41.842 0 Td [(.)]TJ 0.98 0 0 1 150.396 338.035 Tm [(The)-247(insertion)-247(r)19(outines)-247(will)-247(be)-247(called)-247(as)-247(many)-247(times)-247(as)-247(needed;)-249(they)-247(only)-247(need)-247(to)]TJ 1.02 0 0 1 150.705 326.08 Tm [(be)-245(called)-245(on)-245(the)-245(data)-245(that)-245(is)-246(actually)-245(allocated)-245(to)-245(the)-245(curr)18(ent)-245(pr)17(ocess,)-245(i.e.)-304(each)]TJ 1 0 0 1 150.406 314.125 Tm [(pr)18(ocess)-250(generates)-250(its)-250(own)-250(data.)]TJ 0.981 0 0 1 165.649 302.17 Tm [(In)-256(principle)-255(ther)18(e)-256(is)-255(no)-256(speci\002c)-255(or)18(der)-256(in)-255(the)-256(calls)-256(to)]TJ/F147 9.9626 Tf 1 0 0 1 386.226 302.17 Tm [(psb_spins)]TJ/F84 9.9626 Tf 0.981 0 0 1 433.299 302.17 Tm [(,)-256(nor)-256(is)-255(ther)18(e)-255(a)]TJ 0.997 0 0 1 150.705 290.215 Tm [(r)18(equir)18(ement)-251(to)-251(build)-251(a)-251(matrix)-251(r)18(ow)-251(in)-251(its)-251(entir)18(ety)-251(befor)18(e)-251(calling)-251(the)-251(r)18(outine;)-251(this)]TJ 1.02 0 0 1 150.705 278.26 Tm [(allows)-288(the)-288(application)-289(p)1(r)17(ogrammer)-288(to)-288(walk)-288(thr)17(ough)-288(the)-288(discr)18(etization)-289(mesh)]TJ 1.02 0 0 1 150.705 266.304 Tm [(element)-265(by)-265(element,)-271(gen)1(erating)-266(the)-265(main)-265(part)-265(of)-265(a)-266(given)-265(matrix)-265(r)18(ow)-265(but)-266(also)]TJ 1 0 0 1 150.705 254.349 Tm [(contributions)-250(to)-250(the)-250(r)18(ows)-250(corr)18(esponding)-250(to)-250(neighbouring)-250(elements.)]TJ 1.02 0 0 1 165.649 242.394 Tm [(Fr)18(om)-284(a)-283(functional)-283(point)-284(of)-283(view)-284(it)-283(is)-283(even)-284(possible)-283(to)-284(execut)1(e)-284(one)-283(call)-284(for)]TJ 0.988 0 0 1 150.705 230.439 Tm [(each)-252(nonzer)18(o)-252(coef)18(\002cient;)-252(however)-252(this)-252(would)-252(have)-252(a)-252(substantial)-252(computational)]TJ 0.98 0 0 1 150.705 218.484 Tm [(over)18(head.)-306(It)-224(is)-225(ther)19(efor)18(e)-224(advisable)-225(to)-224(pack)-225(a)-224(certain)-225(amount)-224(of)-225(data)-224(into)-225(each)-224(call)]TJ 0.988 0 0 1 150.705 206.529 Tm [(to)-253(the)-254(insertion)-253(r)18(outine,)-253(say)-253(touching)-254(on)-253(a)-253(few)-254(tens)-253(of)-253(r)18(ows;)-254(the)-253(best)-253(performng)]TJ 1.009 0 0 1 150.426 194.573 Tm [(value)-247(would)-248(depend)-247(on)-248(both)-247(the)-248(ar)18(chitectur)18(e)-248(of)-247(the)-248(computer)-247(being)-248(used)-247(and)]TJ 1.02 0 0 1 150.705 182.618 Tm [(on)-333(the)-333(pr)18(oblem)-333(str)8(uctur)18(e.)-567(At)-333(the)-333(opposite)-332(extr)17(eme,)-355(it)-332(would)-333(be)-333(possible)-333(to)]TJ 0.996 0 0 1 150.705 170.663 Tm [(generate)-250(the)-251(entir)18(e)-250(part)-251(of)-250(a)-250(coef)18(\002cient)-251(matrix)-250(r)18(esiding)-251(on)-250(a)-250(pr)18(ocess)-251(and)-250(pass)-251(it)]TJ 0.981 0 0 1 150.705 158.708 Tm [(in)-255(a)-255(single)-254(call)-255(to)]TJ/F147 9.9626 Tf 1 0 0 1 225.645 158.708 Tm [(psb_spins)]TJ/F84 9.9626 Tf 0.981 0 0 1 272.718 158.708 Tm [(;)-255(this,)-255(however)76(,)-255(would)-255(entail)-254(a)-255(doubling)-255(of)-255(memory)]TJ 1 0 0 1 150.705 146.753 Tm [(occupation,)-250(and)-250(thus)-250(would)-250(be)-250(almost)-250(always)-250(far)-250(fr)18(om)-250(optimal.)]TJ 0 g 0 G ET q @@ -5772,21 +5781,21 @@ q []0 d 0 J 0.398 w 0 0 m 137.482 0 l S Q BT -/F84 5.9776 Tf 161.564 132.683 Td [(3)]TJ/F84 7.9701 Tf 0.981 0 0 1 164.804 129.79 Tm [(The)-255(subr)18(outine)-256(sty)1(le)]TJ/F215 7.9701 Tf 1 0 0 1 237.517 129.79 Tm [(psb)]TJ +/F84 5.9776 Tf 161.564 132.683 Td [(3)]TJ/F84 7.9701 Tf 0.981 0 0 1 164.804 129.79 Tm [(The)-255(subr)18(outine)-256(sty)1(le)]TJ/F220 7.9701 Tf 1 0 0 1 237.517 129.79 Tm [(psb)]TJ ET q 1 0 0 1 250.728 129.989 cm []0 d 0 J 0.398 w 0 0 m 2.541 0 l S Q BT -/F215 7.9701 Tf 253.269 129.79 Td [(precinit)]TJ/F84 7.9701 Tf 0.981 0 0 1 289.14 129.79 Tm [(and)]TJ/F215 7.9701 Tf 1 0 0 1 304.374 129.79 Tm [(psb)]TJ +/F220 7.9701 Tf 253.269 129.79 Td [(precinit)]TJ/F84 7.9701 Tf 0.981 0 0 1 289.14 129.79 Tm [(and)]TJ/F220 7.9701 Tf 1 0 0 1 304.374 129.79 Tm [(psb)]TJ ET q 1 0 0 1 317.585 129.989 cm []0 d 0 J 0.398 w 0 0 m 2.541 0 l S Q BT -/F215 7.9701 Tf 320.125 129.79 Td [(precbld)]TJ/F84 7.9701 Tf 0.981 0 0 1 351.762 129.79 Tm [(ar)18(e)-255(still)-256(support)1(ed)-256(for)-255(backwar)18(d)-256(compati)1(-)]TJ 1 0 0 1 150.705 120.326 Tm [(bility)]TJ +/F220 7.9701 Tf 320.125 129.79 Td [(precbld)]TJ/F84 7.9701 Tf 0.981 0 0 1 351.762 129.79 Tm [(ar)18(e)-255(still)-256(support)1(ed)-256(for)-255(backwar)18(d)-256(compati)1(-)]TJ 1 0 0 1 150.705 120.326 Tm [(bility)]TJ 0 g 0 G 0 g 0 G /F84 9.9626 Tf 169.365 -29.888 Td [(8)]TJ @@ -5795,9 +5804,9 @@ ET endstream endobj -1004 0 obj +1005 0 obj << -/Length 7843 +/Length 7839 >> stream 0 g 0 G @@ -5815,27 +5824,27 @@ BT 0 g 0 G -320.16 -19.926 Td [(2.)]TJ 0 g 0 G - [-469(The)-250(set)-250(of)-250(halo)-250(points)-250(must)-250(be)-250(mapped)-250(to)-250(the)-250(set)]TJ/F78 9.9626 Tf 227.977 0 Td [(n)]TJ/F84 9.9626 Tf 5.664 -1.494 Td [(r)18(ow)]TJ/F78 5.9776 Tf 17.537 -1.648 Td [(i)]TJ/F192 10.3811 Tf 4.836 3.142 Td [(+)]TJ/F84 9.9626 Tf 10.131 0 Td [(1)-179(.)-192(.)-192(.)]TJ/F78 9.9626 Tf 19.967 0 Td [(n)]TJ/F84 9.9626 Tf 5.664 -3.83 Td [(col)]TJ/F78 5.9776 Tf 12.795 -1.649 Td [(i)]TJ/F84 9.9626 Tf 2.774 5.479 Td [(;)]TJ 1.016 0 0 1 99.895 613.6 Tm [(but)-246(otherwise)-247(the)-246(mapping)-246(is)-247(arbit)1(rary)109(.)-306(The)-246(user)-247(application)-246(is)-246(r)17(esponsible)-246(to)]TJ 1.009 0 0 1 99.895 601.644 Tm [(ensur)18(e)-247(consistency)-247(of)-246(this)-247(mapping;)-247(some)-247(err)18(ors)-247(may)-246(be)-247(caught)-247(by)-247(the)-246(library)110(,)]TJ 0.994 0 0 1 99.895 589.689 Tm [(but)-253(this)-252(is)-253(not)-252(guaranteed.)-315(The)-253(application)-252(str)8(uctur)18(e)-253(to)-252(support)-253(this)-252(usage)-253(is)-252(as)]TJ 1 0 0 1 99.895 577.734 Tm [(follows:)]TJ + [-469(The)-250(set)-250(of)-250(halo)-250(points)-250(must)-250(be)-250(mapped)-250(to)-250(the)-250(set)]TJ/F78 9.9626 Tf 227.977 0 Td [(n)]TJ/F84 9.9626 Tf 5.664 -1.494 Td [(r)18(ow)]TJ/F78 5.9776 Tf 17.537 -1.648 Td [(i)]TJ/F197 10.3811 Tf 4.836 3.142 Td [(+)]TJ/F84 9.9626 Tf 10.131 0 Td [(1)-179(.)-192(.)-192(.)]TJ/F78 9.9626 Tf 19.967 0 Td [(n)]TJ/F84 9.9626 Tf 5.664 -3.83 Td [(col)]TJ/F78 5.9776 Tf 12.795 -1.649 Td [(i)]TJ/F84 9.9626 Tf 2.774 5.479 Td [(;)]TJ 1.016 0 0 1 99.895 613.6 Tm [(but)-246(otherwise)-247(the)-246(mapping)-246(is)-247(arbit)1(rary)109(.)-306(The)-246(user)-247(application)-246(is)-246(r)17(esponsible)-246(to)]TJ 1.009 0 0 1 99.895 601.644 Tm [(ensur)18(e)-247(consistency)-247(of)-246(this)-247(mapping;)-247(some)-247(err)18(ors)-247(may)-246(be)-247(caught)-247(by)-247(the)-246(library)110(,)]TJ 0.994 0 0 1 99.895 589.689 Tm [(but)-253(this)-252(is)-253(not)-252(guaranteed.)-315(The)-253(application)-252(str)8(uctur)18(e)-253(to)-252(support)-253(this)-252(usage)-253(is)-252(as)]TJ 1 0 0 1 99.895 577.734 Tm [(follows:)]TJ 0 g 0 G 12.454 -19.925 Td [(1.)]TJ 0 g 0 G - 0.98 0 0 1 124.802 557.809 Tm [(Initialize)-194(index)-194(space)-194(with)]TJ/F145 9.9626 Tf 1 0 0 1 238.285 557.809 Tm [(psb_cdall\050ictx,desc,info,vl=vl,lidx=lidx\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 124.503 545.854 Tm [(passing)-205(the)-205(vectors)]TJ/F145 9.9626 Tf 1 0 0 1 208.066 545.854 Tm [(vl\050:\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 236.218 545.854 Tm [(containing)-205(the)-205(set)-205(of)-205(global)-205(indices)-205(owned)-205(by)-205(the)]TJ 1 0 0 1 124.802 533.898 Tm [(curr)18(ent)-250(pr)18(ocess)-250(and)]TJ/F145 9.9626 Tf 89.105 0 Td [(lidx\050:\051)]TJ/F84 9.9626 Tf 39.103 0 Td [(containing)-250(the)-250(corr)18(esponding)-250(local)-250(indices;)]TJ + 0.98 0 0 1 124.802 557.809 Tm [(Initialize)-194(index)-194(space)-194(with)]TJ/F147 9.9626 Tf 1 0 0 1 238.285 557.809 Tm [(psb_cdall\050ictx,desc,info,vl=vl,lidx=lidx\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 124.503 545.854 Tm [(passing)-205(the)-205(vectors)]TJ/F147 9.9626 Tf 1 0 0 1 208.066 545.854 Tm [(vl\050:\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 236.218 545.854 Tm [(containing)-205(the)-205(set)-205(of)-205(global)-205(indices)-205(owned)-205(by)-205(the)]TJ 1 0 0 1 124.802 533.898 Tm [(curr)18(ent)-250(pr)18(ocess)-250(and)]TJ/F147 9.9626 Tf 89.105 0 Td [(lidx\050:\051)]TJ/F84 9.9626 Tf 39.103 0 Td [(containing)-250(the)-250(corr)18(esponding)-250(local)-250(indices;)]TJ 0 g 0 G -140.661 -19.925 Td [(2.)]TJ 0 g 0 G - 0.98 0 0 1 124.413 513.973 Tm [(Add)-241(the)-241(halo)-241(points)]TJ/F145 9.9626 Tf 1 0 0 1 212.672 513.973 Tm [(ja\050:\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 241.177 513.973 Tm [(and)-241(their)-241(associated)-241(local)-241(indices)]TJ/F145 9.9626 Tf 1 0 0 1 384.793 513.973 Tm [(lidx\050:\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 423.758 513.973 Tm [(with)]TJ 1 0 0 1 124.802 502.018 Tm [(a\050some\051)-250(call\050s\051)-250(to)]TJ/F145 9.9626 Tf 77.07 0 Td [(psb_cdins\050nz,ja,desc,info,lidx=lidx\051)]TJ/F84 9.9626 Tf 188.292 0 Td [(;)]TJ + 0.98 0 0 1 124.413 513.973 Tm [(Add)-241(the)-241(halo)-241(points)]TJ/F147 9.9626 Tf 1 0 0 1 212.672 513.973 Tm [(ja\050:\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 241.177 513.973 Tm [(and)-241(their)-241(associated)-241(local)-241(indices)]TJ/F147 9.9626 Tf 1 0 0 1 384.793 513.973 Tm [(lidx\050:\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 423.758 513.973 Tm [(with)]TJ 1 0 0 1 124.802 502.018 Tm [(a\050some\051)-250(call\050s\051)-250(to)]TJ/F147 9.9626 Tf 77.07 0 Td [(psb_cdins\050nz,ja,desc,info,lidx=lidx\051)]TJ/F84 9.9626 Tf 188.292 0 Td [(;)]TJ 0 g 0 G -277.815 -19.925 Td [(3.)]TJ 0 g 0 G - [-461(Assemble)-250(the)-250(descriptor)-250(with)]TJ/F145 9.9626 Tf 143.998 0 Td [(psb_cdasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)]TJ + [-461(Assemble)-250(the)-250(descriptor)-250(with)]TJ/F147 9.9626 Tf 143.998 0 Td [(psb_cdasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)]TJ 0 g 0 G -191.071 -19.926 Td [(4.)]TJ 0 g 0 G - 0.98 0 0 1 124.802 462.167 Tm [(Build)-206(the)-207(sparse)-206(matrices)-207(and)-206(vectors,)-216(optionally)-207(making)-206(use)-206(in)]TJ/F145 9.9626 Tf 1 0 0 1 396.533 462.167 Tm [(psb_spins)]TJ/F84 9.9626 Tf 1.02 0 0 1 124.802 450.212 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 144.844 450.212 Tm [(psb_geins)]TJ/F84 9.9626 Tf 1.02 0 0 1 194.755 450.212 Tm [(of)-279(the)]TJ/F145 9.9626 Tf 1 0 0 1 223.457 450.212 Tm [(local)]TJ/F84 9.9626 Tf 1.02 0 0 1 252.446 450.212 Tm [(ar)18(gument)-280(specifying)-279(that)-279(the)-279(indices)-279(in)]TJ/F145 9.9626 Tf 1 0 0 1 431.851 450.212 Tm [(ia)]TJ/F84 9.9626 Tf 1.02 0 0 1 442.311 450.212 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 438.257 Tm [(ja)]TJ/F84 9.9626 Tf 12.951 0 Td [(and)]TJ/F145 9.9626 Tf 19.358 0 Td [(irw)]TJ/F84 9.9626 Tf 15.691 0 Td [(,)-250(r)18(espectively)111(,)-250(ar)18(e)-250(alr)18(eady)-250(local)-250(indices.)]TJ/F75 11.9552 Tf -72.907 -29.133 Td [(2.4)-1000(Programming)-250(model)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 390.16 Tm [(The)-266(PSBLAS)-265(librarary)-266(is)-266(based)-265(on)-266(the)-266(Single)-266(Pr)18(ogram)-266(Multiple)-265(Data)-266(\050SPMD\051)]TJ 1.008 0 0 1 99.596 378.205 Tm [(pr)18(ogramming)-250(model:)-310(each)-250(pr)18(ocess)-250(participating)-249(in)-250(the)-250(computation)-249(performs)]TJ 1 0 0 1 99.895 366.25 Tm [(the)-250(same)-250(actions)-250(on)-250(a)-250(chunk)-250(of)-250(data.)-310(Parallelism)-250(is)-250(thus)-250(data-driven.)]TJ 1.019 0 0 1 114.839 354.295 Tm [(Because)-246(of)-246(this)-246(str)8(uctur)17(e,)-246(many)-246(subr)18(outines)-246(coor)18(dinate)-246(their)-246(action)-247(acr)18(oss)]TJ 1.02 0 0 1 99.895 342.34 Tm [(the)-265(various)-264(pr)18(ocesses,)-270(thus)-264(pr)17(oviding)-264(an)-265(implicit)-264(synchr)17(onization)-264(point,)-270(and)]TJ 1.02 0 0 1 99.895 330.384 Tm [(ther)18(efor)17(e)]TJ/F78 9.9626 Tf 1.02 0 0 1 143.363 330.384 Tm [(must)]TJ/F84 9.9626 Tf 1.02 0 0 1 167.293 330.384 Tm [(be)-299(called)-299(simultaneously)-299(by)-298(all)-299(pr)17(ocesses)-299(participat)1(ing)-299(in)-299(the)]TJ 0.98 0 0 1 99.895 318.429 Tm [(computation.)-306(This)-225(is)-225(certainly)-225(tr)9(ue)-225(for)-225(the)-225(data)-225(allocation)-225(and)-224(assembly)-225(r)18(outines,)]TJ 1 0 0 1 99.895 306.474 Tm [(for)-250(all)-250(the)-250(computational)-250(r)18(outines)-250(and)-250(for)-250(some)-250(of)-250(the)-250(tools)-250(r)18(outines.)]TJ 1.02 0 0 1 114.839 294.519 Tm [(However)-269(ther)17(e)-269(ar)18(e)-270(many)-269(cases)-269(wher)18(e)-270(no)-269(synchr)18(onization,)-276(and)-269(indeed)-269(no)]TJ 1.02 0 0 1 99.895 282.564 Tm [(communication)-282(among)-281(pr)17(ocesses,)-290(is)-282(implied;)-300(for)-282(instance,)-290(all)-282(the)-282(r)18(outines)-282(in)]TJ 1.02 0 0 1 99.895 270.609 Tm [(sec.)]TJ + 0.98 0 0 1 124.802 462.167 Tm [(Build)-206(the)-207(sparse)-206(matrices)-207(and)-206(vectors,)-216(optionally)-207(making)-206(use)-206(in)]TJ/F147 9.9626 Tf 1 0 0 1 396.533 462.167 Tm [(psb_spins)]TJ/F84 9.9626 Tf 1.02 0 0 1 124.802 450.212 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 144.844 450.212 Tm [(psb_geins)]TJ/F84 9.9626 Tf 1.02 0 0 1 194.755 450.212 Tm [(of)-279(the)]TJ/F147 9.9626 Tf 1 0 0 1 223.457 450.212 Tm [(local)]TJ/F84 9.9626 Tf 1.02 0 0 1 252.446 450.212 Tm [(ar)18(gument)-280(specifying)-279(that)-279(the)-279(indices)-279(in)]TJ/F147 9.9626 Tf 1 0 0 1 431.851 450.212 Tm [(ia)]TJ/F84 9.9626 Tf 1.02 0 0 1 442.311 450.212 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 438.257 Tm [(ja)]TJ/F84 9.9626 Tf 12.951 0 Td [(and)]TJ/F147 9.9626 Tf 19.358 0 Td [(irw)]TJ/F84 9.9626 Tf 15.691 0 Td [(,)-250(r)18(espectively)111(,)-250(ar)18(e)-250(alr)18(eady)-250(local)-250(indices.)]TJ/F75 11.9552 Tf -72.907 -29.133 Td [(2.4)-1000(Programming)-250(model)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 390.16 Tm [(The)-266(PSBLAS)-265(librarary)-266(is)-266(based)-265(on)-266(the)-266(Single)-266(Pr)18(ogram)-266(Multiple)-265(Data)-266(\050SPMD\051)]TJ 1.008 0 0 1 99.596 378.205 Tm [(pr)18(ogramming)-250(model:)-310(each)-250(pr)18(ocess)-250(participating)-249(in)-250(the)-250(computation)-249(performs)]TJ 1 0 0 1 99.895 366.25 Tm [(the)-250(same)-250(actions)-250(on)-250(a)-250(chunk)-250(of)-250(data.)-310(Parallelism)-250(is)-250(thus)-250(data-driven.)]TJ 1.019 0 0 1 114.839 354.295 Tm [(Because)-246(of)-246(this)-246(str)8(uctur)17(e,)-246(many)-246(subr)18(outines)-246(coor)18(dinate)-246(their)-246(action)-247(acr)18(oss)]TJ 1.02 0 0 1 99.895 342.34 Tm [(the)-265(various)-264(pr)18(ocesses,)-270(thus)-264(pr)17(oviding)-264(an)-265(implicit)-264(synchr)17(onization)-264(point,)-270(and)]TJ 1.02 0 0 1 99.895 330.384 Tm [(ther)18(efor)17(e)]TJ/F78 9.9626 Tf 1.02 0 0 1 143.363 330.384 Tm [(must)]TJ/F84 9.9626 Tf 1.02 0 0 1 167.293 330.384 Tm [(be)-299(called)-299(simultaneously)-299(by)-298(all)-299(pr)17(ocesses)-299(participat)1(ing)-299(in)-299(the)]TJ 0.98 0 0 1 99.895 318.429 Tm [(computation.)-306(This)-225(is)-225(certainly)-225(tr)9(ue)-225(for)-225(the)-225(data)-225(allocation)-225(and)-224(assembly)-225(r)18(outines,)]TJ 1 0 0 1 99.895 306.474 Tm [(for)-250(all)-250(the)-250(computational)-250(r)18(outines)-250(and)-250(for)-250(some)-250(of)-250(the)-250(tools)-250(r)18(outines.)]TJ 0.995 0 0 1 114.839 294.519 Tm [(However)-251(ther)18(e)-251(ar)18(e)-251(cases)-250(wher)18(e)-251(no)-251(synchr)18(onization,)-251(and)-251(indeed)-251(no)-251(commu-)]TJ 1.006 0 0 1 99.895 282.564 Tm [(nication)-248(among)-249(pr)18(ocesses,)-249(is)-248(implied;)-248(for)-249(instance,)-248(all)-249(the)-248(r)18(outines)-249(in)-248(sec.)]TJ 0 0 1 rg 0 0 1 RG - [-377(3)]TJ + [-249(3)]TJ 0 g 0 G - [-377(ar)17(e)-377(only)-377(acting)-377(on)-378(the)-377(local)-377(data)-377(str)8(uctur)17(es,)-410(and)-377(thus)-377(may)-378(b)1(e)-378(called)]TJ 1.02 0 0 1 99.895 258.653 Tm [(independently)109(.)-657(The)-362(most)-363(important)-363(case)-362(is)-363(that)-363(of)-362(the)-363(coef)18(\002cient)-363(insertion)]TJ 0.98 0 0 1 99.895 246.698 Tm [(r)18(outines:)-296(since)-215(the)-215(number)-216(of)-215(coef)19(\002)-1(cients)-215(in)-215(the)-215(sparse)-216(and)-215(dense)-215(matrices)-215(varies)]TJ 0.996 0 0 1 99.895 234.743 Tm [(among)-252(the)-251(pr)18(ocessors,)-252(and)-252(since)-252(the)-251(user)-252(is)-252(fr)18(ee)-251(to)-252(choose)-252(an)-251(arbitrary)-252(or)18(der)-252(in)]TJ 1 0 0 1 99.895 222.788 Tm [(builiding)-250(the)-250(matrix)-250(entries,)-250(these)-250(r)18(outines)-250(cannot)-250(imply)-250(a)-250(synchr)18(onization.)]TJ 14.944 -11.955 Td [(Thr)18(oughout)-250(this)-250(user)-74('s)-250(guide)-250(each)-250(subr)18(outine)-250(will)-250(be)-250(clearly)-250(indicated)-250(as:)]TJ + [-248(ar)18(e)]TJ 1 0 0 1 99.895 270.609 Tm [(only)-251(acting)-251(on)-251(the)-250(local)-251(data)-251(str)8(uctur)18(es,)-251(and)-251(thus)-251(may)-251(be)-250(called)-251(independently)111(.)]TJ 1.02 0 0 1 99.587 258.653 Tm [(The)-251(most)-251(important)-251(case)-251(is)-251(that)-251(of)-251(the)-251(coef)18(\002cient)-251(insertion)-251(r)18(outines:)-316(since)-251(the)]TJ 1.01 0 0 1 99.895 246.698 Tm [(number)-246(of)-247(coef)18(\002cients)-246(in)-246(the)-247(sparse)-246(and)-246(dense)-247(matrices)-246(varies)-246(among)-246(the)-247(pr)18(o-)]TJ 1.013 0 0 1 99.895 234.743 Tm [(cessors,)-248(and)-247(since)-247(the)-248(user)-247(is)-248(fr)18(ee)-247(to)-248(choose)-247(an)-248(arbitrary)-247(or)18(der)-248(in)-247(builiding)-247(the)]TJ 1 0 0 1 99.895 222.788 Tm [(matrix)-250(entries,)-250(these)-250(r)18(outines)-250(cannot)-250(imply)-250(a)-250(synchr)18(onization.)]TJ 14.944 -11.955 Td [(Thr)18(oughout)-250(this)-250(user)-74('s)-250(guide)-250(each)-250(subr)18(outine)-250(will)-250(be)-250(clearly)-250(indicated)-250(as:)]TJ 0 g 0 G /F75 9.9626 Tf -14.944 -19.926 Td [(Synchronous:)]TJ 0 g 0 G @@ -5851,15 +5860,15 @@ ET endstream endobj -1015 0 obj +1016 0 obj << -/Length 8766 +/Length 8791 >> stream 0 g 0 G 0 g 0 G BT -/F75 14.3462 Tf 150.705 705.784 Td [(3)-1000(Data)-250(Structures)-250(and)-250(Classes)]TJ/F84 9.9626 Tf 1.015 0 0 1 150.705 682.693 Tm [(In)-246(this)-246(chapter)-246(we)-247(illustrate)-246(the)-246(data)-246(str)8(uctur)18(es)-246(used)-247(for)-246(de\002nition)-246(of)-246(r)18(outines)]TJ 1.02 0 0 1 150.705 670.737 Tm [(interfaces.)-430(They)-287(include)-287(data)-287(str)8(uctur)18(es)-287(for)-287(sparse)-287(matrices,)-298(communication)]TJ 1 0 0 1 150.705 658.782 Tm [(descriptors)-250(and)-250(pr)18(econditioners.)]TJ 0.999 0 0 1 165.649 646.626 Tm [(All)-251(the)-251(data)-252(types)-251(and)-251(the)-251(basic)-251(subr)18(outine)-252(interfaces)-251(r)18(elated)-251(to)-251(descriptors)]TJ 1.02 0 0 1 150.705 634.671 Tm [(and)-296(sparse)-297(matrices)-296(ar)17(e)-296(de\002ned)-297(in)-296(the)-297(module)]TJ/F145 9.9626 Tf 1 0 0 1 364.369 634.671 Tm [(psb_base_mod)]TJ/F84 9.9626 Tf 1.02 0 0 1 427.133 634.671 Tm [(;)-322(this)-297(will)-296(have)]TJ 1.02 0 0 1 150.705 622.716 Tm [(to)-335(be)-335(included)-335(by)-335(every)-335(user)-336(subr)18(outine)-335(that)-335(makes)-335(use)-335(of)-335(the)-336(lib)1(rary)108(.)-574(The)]TJ 1 0 0 1 150.406 610.76 Tm [(pr)18(econditioners)-250(ar)18(e)-250(de\002ned)-250(in)-250(the)-250(module)]TJ/F145 9.9626 Tf 187.993 0 Td [(psb_prec_mod)]TJ/F84 9.9626 Tf 1.02 0 0 1 165.649 598.604 Tm [(Integer)73(,)-362(r)17(eal)-338(and)-339(complex)-338(data)-339(types)-338(ar)17(e)-338(parametrized)-339(with)-338(a)-339(kind)-338(type)]TJ 1 0 0 1 150.705 586.649 Tm [(de\002ned)-250(in)-250(the)-250(library)-250(as)-250(follows:)]TJ +/F75 14.3462 Tf 150.705 705.784 Td [(3)-1000(Data)-250(Structures)-250(and)-250(Classes)]TJ/F84 9.9626 Tf 1.015 0 0 1 150.705 682.693 Tm [(In)-246(this)-246(chapter)-246(we)-247(illustrate)-246(the)-246(data)-246(str)8(uctur)18(es)-246(used)-247(for)-246(de\002nition)-246(of)-246(r)18(outines)]TJ 1.02 0 0 1 150.705 670.737 Tm [(interfaces.)-430(They)-287(include)-287(data)-287(str)8(uctur)18(es)-287(for)-287(sparse)-287(matrices,)-298(communication)]TJ 1 0 0 1 150.705 658.782 Tm [(descriptors)-250(and)-250(pr)18(econditioners.)]TJ 0.999 0 0 1 165.649 646.626 Tm [(All)-251(the)-251(data)-252(types)-251(and)-251(the)-251(basic)-251(subr)18(outine)-252(interfaces)-251(r)18(elated)-251(to)-251(descriptors)]TJ 1.02 0 0 1 150.705 634.671 Tm [(and)-296(sparse)-297(matrices)-296(ar)17(e)-296(de\002ned)-297(in)-296(the)-297(module)]TJ/F147 9.9626 Tf 1 0 0 1 364.369 634.671 Tm [(psb_base_mod)]TJ/F84 9.9626 Tf 1.02 0 0 1 427.133 634.671 Tm [(;)-322(this)-297(will)-296(have)]TJ 1.02 0 0 1 150.705 622.716 Tm [(to)-335(be)-335(included)-335(by)-335(every)-335(user)-336(subr)18(outine)-335(that)-335(makes)-335(use)-335(of)-335(the)-336(lib)1(rary)108(.)-574(The)]TJ 1 0 0 1 150.406 610.76 Tm [(pr)18(econditioners)-250(ar)18(e)-250(de\002ned)-250(in)-250(the)-250(module)]TJ/F147 9.9626 Tf 187.993 0 Td [(psb_prec_mod)]TJ/F84 9.9626 Tf 1.02 0 0 1 165.649 598.604 Tm [(Integer)73(,)-362(r)17(eal)-338(and)-339(complex)-338(data)-339(types)-338(ar)17(e)-338(parametrized)-339(with)-338(a)-339(kind)-338(type)]TJ 1 0 0 1 150.705 586.649 Tm [(de\002ned)-250(in)-250(the)-250(library)-250(as)-250(follows:)]TJ 0 g 0 G /F75 9.9626 Tf 0 -20.528 Td [(psb)]TJ ET @@ -5878,7 +5887,7 @@ Q BT /F84 9.9626 Tf 1.02 0 0 1 196.055 566.121 Tm [(Kind)-361(parameter)-362(for)-361(short)-362(pr)18(ecision)-362(r)18(eal)-362(and)-361(complex)-362(data;)-419(corr)17(e-)]TJ 1 0 0 1 175.611 554.166 Tm [(sponds)-250(to)-250(a)]TJ 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG -/F145 9.9626 Tf 52.902 0 Td [(REAL)]TJ +/F147 9.9626 Tf 52.902 0 Td [(REAL)]TJ 0 g 0 G /F84 9.9626 Tf 23.412 0 Td [(declaration)-250(and)-250(is)-250(normally)-250(4)-250(bytes;)]TJ 0 g 0 G @@ -5899,7 +5908,7 @@ Q BT /F84 9.9626 Tf 1.02 0 0 1 197.718 533.436 Tm [(Kind)-376(parameter)-375(for)-376(long)-376(pr)18(ecision)-375(r)17(eal)-375(and)-376(complex)-376(data;)-441(corr)18(e-)]TJ 1 0 0 1 175.611 521.481 Tm [(sponds)-250(to)-250(a)]TJ 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG -/F145 9.9626 Tf 52.902 0 Td [(DOUBLE)-525(PRECISION)]TJ +/F147 9.9626 Tf 52.902 0 Td [(DOUBLE)-525(PRECISION)]TJ 0 g 0 G /F84 9.9626 Tf 86.176 0 Td [(declaration)-250(and)-250(is)-250(normally)-250(8)-250(bytes;)]TJ 0 g 0 G @@ -5935,7 +5944,7 @@ q Q 0 g 0 G BT -/F84 9.9626 Tf 1.02 0 0 1 196.613 480.022 Tm [(Kind)-311(parameter)-312(for)-311(8-bytes)-311(integer)-311(data,)-328(as)-312(is)-311(always)-311(used)-312(by)-311(the)]TJ/F145 9.9626 Tf 1 0 0 1 175.611 468.067 Tm [(sizeof)]TJ/F84 9.9626 Tf 33.873 0 Td [(methods;)]TJ +/F84 9.9626 Tf 0.983 0 0 1 196.613 480.022 Tm [(Kind)-255(parameter)-256(for)-255(8-bytes)-255(integer)-256(data,)-255(as)-256(is)-255(always)-256(r)19(eturned)-256(by)-255(the)]TJ/F147 9.9626 Tf 1 0 0 1 175.611 468.067 Tm [(sizeof)]TJ/F84 9.9626 Tf 33.873 0 Td [(methods;)]TJ 0 g 0 G /F75 9.9626 Tf -58.779 -20.73 Td [(psb)]TJ ET @@ -5969,25 +5978,25 @@ q Q 0 g 0 G BT -/F84 9.9626 Tf 1.02 0 0 1 194.949 414.653 Tm [(Kind)-266(parameter)-266(for)-266(\223global\224)-266(integer)-266(indices)-266(and)-266(data;)-277(with)-266(default)]TJ 1 0 0 1 175.611 402.698 Tm [(build)-250(options)-250(this)-250(is)-250(an)-250(8)-250(bytes)-250(integer;)]TJ 1.017 0 0 1 150.396 382.169 Tm [(The)-246(integer)-246(kinds)-246(for)-246(local)-246(and)-246(global)-246(indices)-246(can)-246(be)-246(chosen)-246(at)-246(con\002gur)18(e)-246(time)]TJ 1.02 0 0 1 150.705 370.214 Tm [(to)-273(hold)-273(4)-273(or)-273(8)-273(bytes,)-280(with)-273(the)-273(global)-273(indices)-273(at)-273(least)-273(as)-273(lar)18(ge)-273(as)-273(the)-273(local)-273(ones.)]TJ 1.002 0 0 1 150.396 358.259 Tm [(T)92(ogether)-249(with)-249(the)-250(classes)-249(attributes)-249(we)-249(also)-249(discuss)-249(their)-249(methods.)-310(Most)-249(meth-)]TJ 1.016 0 0 1 150.705 346.304 Tm [(ods)-245(detailed)-245(her)18(e)-245(only)-245(act)-245(on)-245(the)-244(local)-245(variable,)-245(i.e.)-305(their)-245(action)-245(is)-245(pur)18(ely)-245(local)]TJ 1.02 0 0 1 150.705 334.349 Tm [(and)-346(asynchr)18(onous)-346(unless)-346(otherwise)-346(stated.)-607(The)-346(list)-346(of)-346(methods)-346(her)17(e)-346(is)-346(not)]TJ 1.006 0 0 1 150.705 322.393 Tm [(completely)-247(exhaustive;)-248(many)-248(methods,)-247(especially)-248(those)-247(that)-248(alt)1(er)-248(the)-247(contents)]TJ 0.984 0 0 1 150.705 310.438 Tm [(of)-253(the)-254(various)-253(objects,)-253(ar)18(e)-253(usually)-254(not)-253(needed)-253(by)-254(the)-253(end-user)75(,)-253(and)-254(ther)19(efor)18(e)-253(ar)18(e)]TJ 1 0 0 1 150.705 298.483 Tm [(described)-250(in)-250(the)-250(developer)-74('s)-250(documentation.)]TJ/F75 11.9552 Tf 0 -30.277 Td [(3.1)-1000(Descriptor)-250(data)-250(structure)]TJ/F84 9.9626 Tf 1.02 0 0 1 150.316 248.853 Tm [(All)-387(the)-386(general)-387(matrix)-387(informations)-386(and)-387(elements)-387(to)-387(be)-386(exchanged)-387(among)]TJ 1.02 0 0 1 150.406 236.897 Tm [(pr)18(ocesses)-247(ar)18(e)-247(stor)18(ed)-247(within)-246(a)-247(data)-246(str)7(uctur)18(e)-246(of)-247(the)-247(type)]TJ/F145 9.9626 Tf 1 0 0 1 397.584 236.897 Tm [(psb)]TJ +/F84 9.9626 Tf 1.02 0 0 1 194.949 414.653 Tm [(Kind)-266(parameter)-266(for)-266(\223global\224)-266(integer)-266(indices)-266(and)-266(data;)-277(with)-266(default)]TJ 1 0 0 1 175.611 402.698 Tm [(build)-250(options)-250(this)-250(is)-250(an)-250(8)-250(bytes)-250(integer;)]TJ 1.017 0 0 1 150.396 382.169 Tm [(The)-246(integer)-246(kinds)-246(for)-246(local)-246(and)-246(global)-246(indices)-246(can)-246(be)-246(chosen)-246(at)-246(con\002gur)18(e)-246(time)]TJ 1.02 0 0 1 150.705 370.214 Tm [(to)-273(hold)-273(4)-273(or)-273(8)-273(bytes,)-280(with)-273(the)-273(global)-273(indices)-273(at)-273(least)-273(as)-273(lar)18(ge)-273(as)-273(the)-273(local)-273(ones.)]TJ 1.002 0 0 1 150.396 358.259 Tm [(T)92(ogether)-249(with)-249(the)-250(classes)-249(attributes)-249(we)-249(also)-249(discuss)-249(their)-249(methods.)-310(Most)-249(meth-)]TJ 1.016 0 0 1 150.705 346.304 Tm [(ods)-245(detailed)-245(her)18(e)-245(only)-245(act)-245(on)-245(the)-244(local)-245(variable,)-245(i.e.)-305(their)-245(action)-245(is)-245(pur)18(ely)-245(local)]TJ 1.02 0 0 1 150.705 334.349 Tm [(and)-346(asynchr)18(onous)-346(unless)-346(otherwise)-346(stated.)-607(The)-346(list)-346(of)-346(methods)-346(her)17(e)-346(is)-346(not)]TJ 1.006 0 0 1 150.705 322.393 Tm [(completely)-247(exhaustive;)-248(many)-248(methods,)-247(especially)-248(those)-247(that)-248(alt)1(er)-248(the)-247(contents)]TJ 0.984 0 0 1 150.705 310.438 Tm [(of)-253(the)-254(various)-253(objects,)-253(ar)18(e)-253(usually)-254(not)-253(needed)-253(by)-254(the)-253(end-user)75(,)-253(and)-254(ther)19(efor)18(e)-253(ar)18(e)]TJ 1 0 0 1 150.705 298.483 Tm [(described)-250(in)-250(the)-250(developer)-74('s)-250(documentation.)]TJ/F75 11.9552 Tf 0 -30.277 Td [(3.1)-1000(Descriptor)-250(data)-250(structure)]TJ/F84 9.9626 Tf 1.02 0 0 1 150.316 248.853 Tm [(All)-361(the)-360(general)-361(matrix)-361(informatio)1(n)-361(and)-361(the)-360(identi\002cation)-361(of)-361(elements)-360(to)-361(be)]TJ 1.02 0 0 1 150.705 236.897 Tm [(exchanged)-377(among)-377(pr)17(ocesses)-377(ar)18(e)-377(stor)17(ed)-377(within)-377(a)-377(data)-378(str)8(uctur)18(e)-377(of)-377(the)-378(type)]TJ/F147 9.9626 Tf 1 0 0 1 150.705 224.942 Tm [(psb)]TJ ET q -1 0 0 1 413.902 237.097 cm +1 0 0 1 167.023 225.142 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 417.041 236.897 Td [(desc)]TJ +/F147 9.9626 Tf 170.162 224.942 Td [(desc)]TJ ET q -1 0 0 1 438.59 237.097 cm +1 0 0 1 191.711 225.142 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 441.728 236.897 Td [(type)]TJ/F84 9.9626 Tf 1.02 0 0 1 462.649 236.897 Tm [(.)-308(Every)]TJ 0.98 0 0 1 150.705 224.942 Tm [(str)8(uctur)19(e)-237(of)-237(this)-237(type)-237(is)-238(as)1(sociated)-237(with)-238(a)-237(discr)19(etization)-237(pattern)-237(and)-237(enables)-237(data)]TJ 0.997 0 0 1 150.705 212.987 Tm [(communications)-252(and)-252(other)-253(operations)-252(that)-252(ar)18(e)-252(necessary)-253(for)-252(implementing)-252(the)]TJ 1 0 0 1 150.426 201.032 Tm [(various)-250(algorithms)-250(of)-250(inter)18(est)-250(to)-250(us.)]TJ 1.007 0 0 1 165.649 188.876 Tm [(The)-249(data)-248(str)8(uctur)17(e)-248(itself)]TJ/F145 9.9626 Tf 1 0 0 1 273.186 188.876 Tm [(psb_desc_type)]TJ/F84 9.9626 Tf 1.007 0 0 1 343.676 188.876 Tm [(can)-249(be)-248(tr)17(eated)-248(as)-249(an)-249(opaque)-248(object)]TJ 1.02 0 0 1 150.705 176.921 Tm [(handled)-278(via)-279(the)-278(tools)-278(r)17(outines)-278(of)-278(Sec.)]TJ +/F147 9.9626 Tf 194.849 224.942 Td [(type)]TJ/F84 9.9626 Tf 1.02 0 0 1 215.77 224.942 Tm [(.)-658(Every)-363(str)8(uctur)18(e)-363(of)-363(this)-363(type)-363(is)-363(associated)-363(with)-363(a)-363(discr)17(etiza-)]TJ 1.02 0 0 1 150.705 212.987 Tm [(tion)-279(pat)1(tern)-279(and)-279(enables)-278(data)-279(communications)-278(and)-279(other)-278(operations)-279(that)-278(ar)17(e)]TJ 1 0 0 1 150.705 201.032 Tm [(necessary)-250(for)-250(implementing)-250(the)-250(various)-250(algorithms)-250(of)-250(inter)18(est)-250(to)-250(us.)]TJ 1.007 0 0 1 165.649 188.876 Tm [(The)-249(data)-248(str)8(uctur)17(e)-248(itself)]TJ/F147 9.9626 Tf 1 0 0 1 273.186 188.876 Tm [(psb_desc_type)]TJ/F84 9.9626 Tf 1.007 0 0 1 343.676 188.876 Tm [(can)-249(be)-248(tr)17(eated)-248(as)-249(an)-249(opaque)-248(object)]TJ 1.02 0 0 1 150.705 176.921 Tm [(handled)-278(via)-279(the)-278(tools)-278(r)17(outines)-278(of)-278(Sec.)]TJ 0 0 1 rg 0 0 1 RG [-279(6)]TJ 0 g 0 G - [-278(or)-279(t)1(he)-279(query)-278(r)17(outines)-278(detailed)-278(below;)]TJ 1 0 0 1 150.705 164.965 Tm [(nevertheless)-250(we)-250(include)-250(her)18(e)-250(a)-250(description)-250(for)-250(the)-250(curious)-250(r)18(eader)74(.)]TJ 0.99 0 0 1 165.649 152.809 Tm [(First)-252(we)-252(describe)-252(the)]TJ/F145 9.9626 Tf 1 0 0 1 258.128 152.809 Tm [(psb_indx_map)]TJ/F84 9.9626 Tf 0.99 0 0 1 323.379 152.809 Tm [(type.)-313(This)-252(is)-252(a)-252(data)-252(str)8(uctur)18(e)-252(that)-252(keeps)]TJ 1 0 0 1 150.705 140.854 Tm [(track)-250(of)-250(a)-250(certain)-250(number)-250(of)-250(basic)-250(issues)-250(such)-250(as:)]TJ + [-278(or)-279(t)1(he)-279(query)-278(r)17(outines)-278(detailed)-278(below;)]TJ 1 0 0 1 150.705 164.965 Tm [(nevertheless)-250(we)-250(include)-250(her)18(e)-250(a)-250(description)-250(for)-250(the)-250(curious)-250(r)18(eader)74(.)]TJ 0.99 0 0 1 165.649 152.809 Tm [(First)-252(we)-252(describe)-252(the)]TJ/F147 9.9626 Tf 1 0 0 1 258.128 152.809 Tm [(psb_indx_map)]TJ/F84 9.9626 Tf 0.99 0 0 1 323.379 152.809 Tm [(type.)-313(This)-252(is)-252(a)-252(data)-252(str)8(uctur)18(e)-252(that)-252(keeps)]TJ 1 0 0 1 150.705 140.854 Tm [(track)-250(of)-250(a)-250(certain)-250(number)-250(of)-250(basic)-250(issues)-250(such)-250(as:)]TJ 0 g 0 G 13.888 -20.528 Td [(\225)]TJ 0 g 0 G @@ -5999,7 +6008,7 @@ ET endstream endobj -1023 0 obj +1024 0 obj << /Length 6419 >> @@ -6126,7 +6135,7 @@ ET endstream endobj -1034 0 obj +1035 0 obj << /Length 7288 >> @@ -6213,7 +6222,7 @@ Q BT /F75 9.9626 Tf 172.553 453.472 Td [(elem)]TJ 0 g 0 G -/F84 9.9626 Tf 0.995 0 0 1 199.282 453.472 Tm [(A)-252(list)-251(of)-252(all)-252(boundary)-251(points,)-252(i.e.)-313(points)-251(that)-252(have)-252(a)-251(connection)-252(with)]TJ 1 0 0 1 175.611 441.517 Tm [(other)-250(pr)18(ocesses.)]TJ 1.02 0 0 1 150.396 420.462 Tm [(The)-350(Fortran)-350(2003)-350(declaration)-350(for)]TJ/F145 9.9626 Tf 1 0 0 1 302.443 420.462 Tm [(psb_desc_type)]TJ/F84 9.9626 Tf 1.02 0 0 1 373.993 420.462 Tm [(str)8(uctur)18(es)-350(is)-350(as)-350(follows:)-514(A)]TJ +/F84 9.9626 Tf 0.995 0 0 1 199.282 453.472 Tm [(A)-252(list)-251(of)-252(all)-252(boundary)-251(points,)-252(i.e.)-313(points)-251(that)-252(have)-252(a)-251(connection)-252(with)]TJ 1 0 0 1 175.611 441.517 Tm [(other)-250(pr)18(ocesses.)]TJ 1.02 0 0 1 150.396 420.462 Tm [(The)-350(Fortran)-350(2003)-350(declaration)-350(for)]TJ/F147 9.9626 Tf 1 0 0 1 302.443 420.462 Tm [(psb_desc_type)]TJ/F84 9.9626 Tf 1.02 0 0 1 373.993 420.462 Tm [(str)8(uctur)18(es)-350(is)-350(as)-350(follows:)-514(A)]TJ 0 g 0 G 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG @@ -6226,7 +6235,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 153.694 388.902 Td [(type)]TJ +/F235 8.9664 Tf 153.694 388.902 Td [(type)]TJ 0 g 0 G [-525(psb_desc_type)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -6365,7 +6374,7 @@ ET endstream endobj -1050 0 obj +1051 0 obj << /Length 5149 >> @@ -6390,7 +6399,7 @@ BT /F75 9.9626 Tf 172.373 687.129 Td [(rows)-250(\227)-250(Get)-250(number)-250(of)-250(local)-250(rows)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -72.478 -19 Td [(nr)-525(=)-525(desc%get_local_rows\050\051)]TJ +/F147 9.9626 Tf -72.478 -19 Td [(nr)-525(=)-525(desc%get_local_rows\050\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.974 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6412,7 +6421,7 @@ BT 0 0 1 rg 0 0 1 RG [-211(1)]TJ 0 g 0 G - [(,)-220(it)-211(is)-211(equal)-211(to)]TJ/F190 10.3811 Tf 1 0 0 1 339.88 528.314 Tm [(j)-24(I)]TJ/F78 7.5716 Tf 8.943 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.876 1.96 Td [(j)]TJ/F192 10.3811 Tf 4.667 0 Td [(+)]TJ/F190 10.3811 Tf 9.858 0 Td [(j)-24(B)]TJ/F78 7.5716 Tf 10.109 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F84 9.9626 Tf 0.98 0 0 1 382.212 528.314 Tm [(.)-302(The)-211(r)19(eturned)]TJ 1 0 0 1 124.523 516.359 Tm [(value)-250(is)-250(speci\002c)-250(to)-250(the)-250(calling)-250(pr)18(ocess.)]TJ/F75 9.9626 Tf -24.628 -27.247 Td [(3.1.3)-1000(get)]TJ + [(,)-220(it)-211(is)-211(equal)-211(to)]TJ/F195 10.3811 Tf 1 0 0 1 339.88 528.314 Tm [(j)-24(I)]TJ/F78 7.5716 Tf 8.943 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.876 1.96 Td [(j)]TJ/F197 10.3811 Tf 4.667 0 Td [(+)]TJ/F195 10.3811 Tf 9.858 0 Td [(j)-24(B)]TJ/F78 7.5716 Tf 10.109 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F84 9.9626 Tf 0.98 0 0 1 382.212 528.314 Tm [(.)-302(The)-211(r)19(eturned)]TJ 1 0 0 1 124.523 516.359 Tm [(value)-250(is)-250(speci\002c)-250(to)-250(the)-250(calling)-250(pr)18(ocess.)]TJ/F75 9.9626 Tf -24.628 -27.247 Td [(3.1.3)-1000(get)]TJ ET q 1 0 0 1 144.219 489.311 cm @@ -6429,7 +6438,7 @@ BT /F75 9.9626 Tf 172.373 489.112 Td [(cols)-250(\227)-250(Get)-250(number)-250(of)-250(local)-250(cols)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -72.478 -19 Td [(nc)-525(=)-525(desc%get_local_cols\050\051)]TJ +/F147 9.9626 Tf -72.478 -19 Td [(nc)-525(=)-525(desc%get_local_cols\050\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.974 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6451,7 +6460,7 @@ BT 0 0 1 rg 0 0 1 RG [-256(1)]TJ 0 g 0 G - [(,)-256(it)]TJ 1.017 0 0 1 124.802 318.342 Tm [(is)-246(equal)-245(to)]TJ/F190 10.3811 Tf 1 0 0 1 173.122 318.342 Tm [(j)-24(I)]TJ/F78 7.5716 Tf 8.943 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F192 10.3811 Tf 5.063 0 Td [(+)]TJ/F190 10.3811 Tf 10.254 0 Td [(j)-24(B)]TJ/F78 7.5716 Tf 10.109 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F192 10.3811 Tf 5.064 0 Td [(+)]TJ/F190 10.3811 Tf 10.253 0 Td [(j)-24(H)]TJ/F78 7.5716 Tf 12.052 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F84 9.9626 Tf 1.017 0 0 1 246.489 318.342 Tm [(.)-305(The)-245(r)17(eturned)-245(value)-246(is)-245(speci\002c)-246(to)-245(the)-246(calling)]TJ 1 0 0 1 124.503 306.387 Tm [(pr)18(ocess.)]TJ/F75 9.9626 Tf -24.608 -27.247 Td [(3.1.4)-1000(get)]TJ + [(,)-256(it)]TJ 1.017 0 0 1 124.802 318.342 Tm [(is)-246(equal)-245(to)]TJ/F195 10.3811 Tf 1 0 0 1 173.122 318.342 Tm [(j)-24(I)]TJ/F78 7.5716 Tf 8.943 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F197 10.3811 Tf 5.063 0 Td [(+)]TJ/F195 10.3811 Tf 10.254 0 Td [(j)-24(B)]TJ/F78 7.5716 Tf 10.109 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F197 10.3811 Tf 5.064 0 Td [(+)]TJ/F195 10.3811 Tf 10.253 0 Td [(j)-24(H)]TJ/F78 7.5716 Tf 12.052 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F84 9.9626 Tf 1.017 0 0 1 246.489 318.342 Tm [(.)-305(The)-245(r)17(eturned)-245(value)-246(is)-245(speci\002c)-246(to)-245(the)-246(calling)]TJ 1 0 0 1 124.503 306.387 Tm [(pr)18(ocess.)]TJ/F75 9.9626 Tf -24.608 -27.247 Td [(3.1.4)-1000(get)]TJ ET q 1 0 0 1 144.219 279.339 cm @@ -6468,7 +6477,7 @@ BT /F75 9.9626 Tf 179.576 279.14 Td [(rows)-250(\227)-250(Get)-250(number)-250(of)-250(global)-250(rows)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -79.681 -19 Td [(nr)-525(=)-525(desc%get_global_rows\050\051)]TJ +/F147 9.9626 Tf -79.681 -19 Td [(nr)-525(=)-525(desc%get_global_rows\050\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.974 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6494,7 +6503,7 @@ ET endstream endobj -1055 0 obj +1056 0 obj << /Length 4489 >> @@ -6519,7 +6528,7 @@ BT /F75 9.9626 Tf 230.386 706.129 Td [(cols)-250(\227)-250(Get)-250(number)-250(of)-250(global)-250(cols)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -79.681 -18.974 Td [(nr)-525(=)-525(desc%get_global_cols\050\051)]TJ +/F147 9.9626 Tf -79.681 -18.974 Td [(nr)-525(=)-525(desc%get_global_cols\050\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.935 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6554,7 +6563,7 @@ BT /F75 9.9626 Tf 230.386 520.408 Td [(indices)-250(\227)-250(Get)-250(vector)-250(of)-250(global)-250(indices)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -79.681 -18.974 Td [(myidx)-525(=)-525(desc%get_global_indices\050[owned]\051)]TJ +/F147 9.9626 Tf -79.681 -18.974 Td [(myidx)-525(=)-525(desc%get_global_indices\050[owned]\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.934 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6569,22 +6578,22 @@ BT 0 g 0 G /F75 9.9626 Tf -90.978 -31.902 Td [(owned)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 186.68 383.793 Tm [(Choose)-281(if)-282(you)-281(only)-282(want)-281(owned)-281(indices)-282(\050)]TJ/F145 9.9626 Tf 1 0 0 1 372.731 383.793 Tm [(owned)]TJ +/F84 9.9626 Tf 1.02 0 0 1 186.68 383.793 Tm [(Choose)-281(if)-282(you)-281(only)-282(want)-281(owned)-281(indices)-282(\050)]TJ/F147 9.9626 Tf 1 0 0 1 372.731 383.793 Tm [(owned)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G - [(.true.)]TJ/F84 9.9626 Tf 1.02 0 0 1 435.495 383.793 Tm [(\051)-281(or)-282(also)-281(halo)]TJ 1 0 0 1 175.611 371.838 Tm [(indices)-250(\050)]TJ/F145 9.9626 Tf 36.912 0 Td [(owned)]TJ + [(.true.)]TJ/F84 9.9626 Tf 1.02 0 0 1 435.495 383.793 Tm [(\051)-281(or)-282(also)-281(halo)]TJ 1 0 0 1 175.611 371.838 Tm [(indices)-250(\050)]TJ/F147 9.9626 Tf 36.912 0 Td [(owned)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G - [(.false.)]TJ/F84 9.9626 Tf 67.994 0 Td [(\051.)-310(Scope:)]TJ/F75 9.9626 Tf 40.328 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -167.121 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(;)-250(default:)]TJ/F145 9.9626 Tf 41.873 0 Td [(.true.)]TJ/F84 9.9626 Tf 31.382 0 Td [(.)]TJ + [(.false.)]TJ/F84 9.9626 Tf 67.994 0 Td [(\051.)-310(Scope:)]TJ/F75 9.9626 Tf 40.328 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -167.121 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(;)-250(default:)]TJ/F147 9.9626 Tf 41.873 0 Td [(.true.)]TJ/F84 9.9626 Tf 31.382 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -163.127 -33.89 Td [(On)-250(Return)]TJ 0 g 0 G 0 g 0 G 0 -19.947 Td [(Function)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 1.011 0 0 1 223.173 306.046 Tm [(The)-248(global)-249(indi)1(ces,)-249(r)18(eturned)-248(as)-249(an)-248(allocatable)-248(integer)-249(array)-248(of)]TJ 1 0 0 1 175.611 294.091 Tm [(kind)]TJ/F145 9.9626 Tf 22.815 0 Td [(psb_lpk_)]TJ/F84 9.9626 Tf 44.333 0 Td [(and)-250(rank)-250(1.)]TJ/F75 9.9626 Tf -92.054 -27.171 Td [(3.1.7)-1000(get)]TJ +/F84 9.9626 Tf 1.011 0 0 1 223.173 306.046 Tm [(The)-248(global)-249(indi)1(ces,)-249(r)18(eturned)-248(as)-249(an)-248(allocatable)-248(integer)-249(array)-248(of)]TJ 1 0 0 1 175.611 294.091 Tm [(kind)]TJ/F147 9.9626 Tf 22.815 0 Td [(psb_lpk_)]TJ/F84 9.9626 Tf 44.333 0 Td [(and)-250(rank)-250(1.)]TJ/F75 9.9626 Tf -92.054 -27.171 Td [(3.1.7)-1000(get)]TJ ET q 1 0 0 1 195.029 267.119 cm @@ -6594,7 +6603,7 @@ BT /F75 9.9626 Tf 198.017 266.92 Td [(context)-250(\227)-250(Get)-250(communication)-250(context)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -47.312 -18.975 Td [(ctxt)-525(=)-525(desc%get_context\050\051)]TJ +/F147 9.9626 Tf -47.312 -18.975 Td [(ctxt)-525(=)-525(desc%get_context\050\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.934 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6620,7 +6629,7 @@ ET endstream endobj -1059 0 obj +1060 0 obj << /Length 5019 >> @@ -6631,7 +6640,7 @@ BT /F75 9.9626 Tf 99.895 706.129 Td [(3.1.8)-1000(Clone)-250(\227)-250(clone)-250(current)-250(object)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 0 -19.289 Td [(call)-1050(desc%clone\050descout,info\051)]TJ +/F147 9.9626 Tf 0 -19.289 Td [(call)-1050(desc%clone\050descout,info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -22.422 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6656,7 +6665,7 @@ BT /F84 9.9626 Tf 23.801 0 Td [(Return)-250(code.)]TJ/F75 9.9626 Tf -23.801 -28.097 Td [(3.1.9)-1000(CNV)-250(\227)-250(convert)-250(internal)-250(storage)-250(format)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 0 -19.289 Td [(call)-1050(desc%cnv\050mold\051)]TJ +/F147 9.9626 Tf 0 -19.289 Td [(call)-1050(desc%cnv\050mold\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -22.422 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6671,35 +6680,35 @@ BT 0 g 0 G /F75 9.9626 Tf -77.918 -32.553 Td [(mold)]TJ 0 g 0 G -/F84 9.9626 Tf 28.782 0 Td [(the)-250(desir)18(ed)-250(integer)-250(storage)-250(format.)]TJ -3.875 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ 0.98 0 0 1 124.802 356.277 Tm [(Speci\002ed)-212(as:)-295(a)-212(object)-212(of)-212(type)-213(der)1(ived)-213(fr)19(om)-212(\050integer\051)]TJ/F145 9.9626 Tf 1 0 0 1 344.16 356.277 Tm [(psb)]TJ +/F84 9.9626 Tf 28.782 0 Td [(the)-250(desir)18(ed)-250(integer)-250(storage)-250(format.)]TJ -3.875 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ 0.98 0 0 1 124.802 356.277 Tm [(Speci\002ed)-212(as:)-295(a)-212(object)-212(of)-212(type)-213(der)1(ived)-213(fr)19(om)-212(\050integer\051)]TJ/F147 9.9626 Tf 1 0 0 1 344.16 356.277 Tm [(psb)]TJ ET q 1 0 0 1 360.479 356.476 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.617 356.277 Td [(T)]TJ +/F147 9.9626 Tf 363.617 356.277 Td [(T)]TJ ET q 1 0 0 1 369.475 356.476 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 372.613 356.277 Td [(base)]TJ +/F147 9.9626 Tf 372.613 356.277 Td [(base)]TJ ET q 1 0 0 1 394.162 356.476 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.301 356.277 Td [(vect)]TJ +/F147 9.9626 Tf 397.301 356.277 Td [(vect)]TJ ET q 1 0 0 1 418.849 356.476 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 421.988 356.277 Td [(type)]TJ/F84 9.9626 Tf 0.98 0 0 1 442.909 356.277 Tm [(.)]TJ 0.98 0 0 1 99.587 333.687 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 118.361 333.687 Tm [(mold)]TJ/F84 9.9626 Tf 0.98 0 0 1 141.713 333.687 Tm [(ar)18(guments)-249(may)-248(be)-249(employed)-249(to)-249(interface)-249(with)-249(special)-249(devices,)-250(such)-249(as)]TJ 1 0 0 1 99.895 321.732 Tm [(GPUs)-250(and)-250(other)-250(accelerators.)]TJ/F75 9.9626 Tf 0 -28.096 Td [(3.1.10)]TJ 0.98 0 0 1 134.765 293.636 Tm [(psb)]TJ +/F147 9.9626 Tf 421.988 356.277 Td [(type)]TJ/F84 9.9626 Tf 0.98 0 0 1 442.909 356.277 Tm [(.)]TJ 0.98 0 0 1 99.587 333.687 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 118.361 333.687 Tm [(mold)]TJ/F84 9.9626 Tf 0.98 0 0 1 141.713 333.687 Tm [(ar)18(guments)-249(may)-248(be)-249(employed)-249(to)-249(interface)-249(with)-249(special)-249(devices,)-250(such)-249(as)]TJ 1 0 0 1 99.895 321.732 Tm [(GPUs)-250(and)-250(other)-250(accelerators.)]TJ/F75 9.9626 Tf 0 -28.096 Td [(3.1.10)]TJ 0.98 0 0 1 134.765 293.636 Tm [(psb)]TJ ET q 1 0 0 1 151.628 293.835 cm @@ -6730,7 +6739,7 @@ BT /F75 9.9626 Tf 0.98 0 0 1 210.386 293.636 Tm [(threshold)-207(\227)-206(Get)-207(threshold)-207(for)-207(index)-207(mapping)-206(switch)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 1 0 0 1 99.895 274.346 Tm [(ith)-525(=)-525(psb_cd_get_hash_threshold\050\051)]TJ +/F147 9.9626 Tf 1 0 0 1 99.895 274.346 Tm [(ith)-525(=)-525(psb_cd_get_hash_threshold\050\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -22.421 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6772,7 +6781,7 @@ BT /F75 9.9626 Tf 0.98 0 0 1 209.292 182.634 Tm [(threshold)-254(\227)-255(Set)-254(threshold)-255(for)-254(index)-255(mapping)-254(switch)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 1 0 0 1 99.895 163.345 Tm [(call)-525(psb_cd_set_hash_threshold\050ith\051)]TJ +/F147 9.9626 Tf 1 0 0 1 99.895 163.345 Tm [(call)-525(psb_cd_set_hash_threshold\050ith\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -22.422 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6787,7 +6796,7 @@ ET endstream endobj -1064 0 obj +1065 0 obj << /Length 5826 >> @@ -6798,7 +6807,7 @@ stream BT /F75 9.9626 Tf 150.705 706.129 Td [(ith)]TJ 0 g 0 G -/F84 9.9626 Tf 17.703 0 Td [(the)-250(new)-250(thr)18(eshold)-250(for)-250(communication)-250(descriptors.)]TJ 7.203 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -66.072 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)-250(gr)18(eater)-250(than)-250(zer)18(o.)]TJ 1.02 0 0 1 150.396 634.849 Tm [(This)-247(thr)17(eshold)-247(guides)-247(the)-248(library)-247(into)-247(using)-248(a)-247(list)-248(based)-247(or)-247(a)-248(hash-table)-247(based)]TJ 1.02 0 0 1 150.705 622.893 Tm [(descriptor)-277(for)-276(global)-277(to)-277(local)-276(index)-277(conversion;)-292(if)-277(the)-277(size)-276(of)-277(the)-277(gl)1(obal)-277(index)]TJ 1.02 0 0 1 150.705 610.938 Tm [(space)-351(is)-351(below)-351(this)-351(thr)18(eshold,)-377(a)-351(list)-351(based)-351(str)8(uctur)17(e)-351(is)-351(used,)-377(if)-351(it)-351(is)-351(above)-351(a)]TJ 0.986 0 0 1 150.705 598.983 Tm [(hash-table)-252(based)-252(str)8(uctur)18(e)-252(is)-253(used.)-314(Note:)-313(the)-253(thr)19(eshold)-253(value)-252(is)-252(only)-252(queried)-253(by)]TJ 1.02 0 0 1 150.705 587.028 Tm [(the)-259(library)-259(at)-259(the)-260(time)-259(a)-259(call)-259(to)]TJ/F145 9.9626 Tf 1 0 0 1 288.208 587.028 Tm [(psb_cdall)]TJ/F84 9.9626 Tf 1.02 0 0 1 337.915 587.028 Tm [(is)-259(executed,)-263(ther)18(efor)17(e)-259(changing)-259(the)]TJ 1.017 0 0 1 150.705 575.073 Tm [(thr)18(eshold)-245(has)-244(no)-244(ef)18(fect)-244(on)-245(communication)-244(descriptors)-244(that)-245(have)-244(alr)18(eady)-244(been)]TJ 1 0 0 1 150.705 563.118 Tm [(initialized.)-310(Mor)18(eover)-250(the)-250(thr)18(eshold)-250(must)-250(have)-250(the)-250(same)-250(value)-250(on)-250(all)-250(pr)18(ocesses.)]TJ/F75 9.9626 Tf 0 -29.334 Td [(3.1.12)-1000(get)]TJ +/F84 9.9626 Tf 17.703 0 Td [(the)-250(new)-250(thr)18(eshold)-250(for)-250(communication)-250(descriptors.)]TJ 7.203 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -66.072 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)-250(gr)18(eater)-250(than)-250(zer)18(o.)]TJ 1.02 0 0 1 150.396 634.849 Tm [(This)-247(thr)17(eshold)-247(guides)-247(the)-248(library)-247(into)-247(using)-248(a)-247(list)-248(based)-247(or)-247(a)-248(hash-table)-247(based)]TJ 1.02 0 0 1 150.705 622.893 Tm [(descriptor)-277(for)-276(global)-277(to)-277(local)-276(index)-277(conversion;)-292(if)-277(the)-277(size)-276(of)-277(the)-277(gl)1(obal)-277(index)]TJ 1.02 0 0 1 150.705 610.938 Tm [(space)-351(is)-351(below)-351(this)-351(thr)18(eshold,)-377(a)-351(list)-351(based)-351(str)8(uctur)17(e)-351(is)-351(used,)-377(if)-351(it)-351(is)-351(above)-351(a)]TJ 0.986 0 0 1 150.705 598.983 Tm [(hash-table)-252(based)-252(str)8(uctur)18(e)-252(is)-253(used.)-314(Note:)-313(the)-253(thr)19(eshold)-253(value)-252(is)-252(only)-252(queried)-253(by)]TJ 1.02 0 0 1 150.705 587.028 Tm [(the)-259(library)-259(at)-259(the)-260(time)-259(a)-259(call)-259(to)]TJ/F147 9.9626 Tf 1 0 0 1 288.208 587.028 Tm [(psb_cdall)]TJ/F84 9.9626 Tf 1.02 0 0 1 337.915 587.028 Tm [(is)-259(executed,)-263(ther)18(efor)17(e)-259(changing)-259(the)]TJ 1.017 0 0 1 150.705 575.073 Tm [(thr)18(eshold)-245(has)-244(no)-244(ef)18(fect)-244(on)-245(communication)-244(descriptors)-244(that)-245(have)-244(alr)18(eady)-244(been)]TJ 1 0 0 1 150.705 563.118 Tm [(initialized.)-310(Mor)18(eover)-250(the)-250(thr)18(eshold)-250(must)-250(have)-250(the)-250(same)-250(value)-250(on)-250(all)-250(pr)18(ocesses.)]TJ/F75 9.9626 Tf 0 -29.334 Td [(3.1.12)-1000(get)]TJ ET q 1 0 0 1 200.01 533.983 cm @@ -6815,7 +6824,7 @@ BT /F75 9.9626 Tf 212.672 533.784 Td [(adjcncy)-250(\227)-250(Get)-250(process)-250(adjacency)-250(list)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -61.967 -19.711 Td [(list)-525(=)-1050(desc%get_p_adjcncy\050\051)]TJ +/F147 9.9626 Tf -61.967 -19.711 Td [(list)-525(=)-1050(desc%get_p_adjcncy\050\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -23.074 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6843,7 +6852,7 @@ BT /F75 9.9626 Tf 211.557 406.776 Td [(adjcncy)-250(\227)-250(Set)-250(process)-250(adjacency)-250(list)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -60.852 -19.711 Td [(call)-525(desc%set_p_adjcncy\050list\051)]TJ +/F147 9.9626 Tf -60.852 -19.711 Td [(call)-525(desc%set_p_adjcncy\050list\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -23.074 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6854,7 +6863,7 @@ BT 0 g 0 G 0 -21.467 Td [(list)]TJ 0 g 0 G -/F84 9.9626 Tf 19.357 0 Td [(the)-250(list)-250(of)-250(adjacent)-250(pr)18(ocesses.)]TJ 5.549 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(one-dimensional)-250(array)-250(of)-250(integers)-250(of)-250(kind)]TJ/F145 9.9626 Tf 250.21 0 Td [(psb_ipk_)]TJ/F84 9.9626 Tf 41.842 0 Td [(.)]TJ 1.02 0 0 1 150.705 249.777 Tm [(Note:)-521(this)-354(method)-353(can)-354(be)-353(called)-354(after)-354(a)-353(call)-354(to)]TJ/F145 9.9626 Tf 1 0 0 1 367.056 249.777 Tm [(psb_cdall)]TJ/F84 9.9626 Tf 1.02 0 0 1 417.722 249.777 Tm [(and)-354(befor)18(e)-354(a)-353(call)]TJ 1.02 0 0 1 150.705 237.822 Tm [(to)]TJ/F145 9.9626 Tf 1 0 0 1 162.313 237.822 Tm [(psb_cdasb)]TJ/F84 9.9626 Tf 1.02 0 0 1 209.387 237.822 Tm [(.)-380(The)-270(user)-270(is)-271(specifying)-270(her)17(e)-270(some)-270(knowledge)-271(about)-270(which)-270(pr)17(o-)]TJ 0.986 0 0 1 150.705 225.866 Tm [(cesses)-255(ar)19(e)-255(topological)-255(neighbours)-254(of)-255(the)-254(curr)18(ent)-255(pr)18(oce)1(ss.)-318(The)-255(availability)-254(of)-255(this)]TJ 1 0 0 1 150.705 213.911 Tm [(information)-250(may)-250(speed)-250(up)-250(the)-250(execution)-250(of)-250(the)-250(assembly)-250(call)]TJ/F145 9.9626 Tf 269.655 0 Td [(psb_cdasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(.)]TJ/F75 9.9626 Tf -316.728 -29.333 Td [(3.1.14)-1000(fnd)]TJ +/F84 9.9626 Tf 19.357 0 Td [(the)-250(list)-250(of)-250(adjacent)-250(pr)18(ocesses.)]TJ 5.549 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(one-dimensional)-250(array)-250(of)-250(integers)-250(of)-250(kind)]TJ/F147 9.9626 Tf 250.21 0 Td [(psb_ipk_)]TJ/F84 9.9626 Tf 41.842 0 Td [(.)]TJ 1.02 0 0 1 150.705 249.777 Tm [(Note:)-521(this)-354(method)-353(can)-354(be)-353(called)-354(after)-354(a)-353(call)-354(to)]TJ/F147 9.9626 Tf 1 0 0 1 367.056 249.777 Tm [(psb_cdall)]TJ/F84 9.9626 Tf 1.02 0 0 1 417.722 249.777 Tm [(and)-354(befor)18(e)-354(a)-353(call)]TJ 1.02 0 0 1 150.705 237.822 Tm [(to)]TJ/F147 9.9626 Tf 1 0 0 1 162.313 237.822 Tm [(psb_cdasb)]TJ/F84 9.9626 Tf 1.02 0 0 1 209.387 237.822 Tm [(.)-380(The)-270(user)-270(is)-271(specifying)-270(her)17(e)-270(some)-270(knowledge)-271(about)-270(which)-270(pr)17(o-)]TJ 0.986 0 0 1 150.705 225.866 Tm [(cesses)-255(ar)19(e)-255(topological)-255(neighbours)-254(of)-255(the)-254(curr)18(ent)-255(pr)18(oce)1(ss.)-318(The)-255(availability)-254(of)-255(this)]TJ 1 0 0 1 150.705 213.911 Tm [(information)-250(may)-250(speed)-250(up)-250(the)-250(execution)-250(of)-250(the)-250(assembly)-250(call)]TJ/F147 9.9626 Tf 269.655 0 Td [(psb_cdasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(.)]TJ/F75 9.9626 Tf -316.728 -29.333 Td [(3.1.14)-1000(fnd)]TJ ET q 1 0 0 1 202.221 184.777 cm @@ -6864,7 +6873,7 @@ BT /F75 9.9626 Tf 205.21 184.578 Td [(owner)-250(\227)-250(Find)-250(the)-250(owner)-250(process)-250(of)-250(a)-250(set)-250(of)-250(indices)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -54.505 -19.711 Td [(call)-525(desc%fnd_owner\050idx,iprc,info\051)]TJ +/F147 9.9626 Tf -54.505 -19.711 Td [(call)-525(desc%fnd_owner\050idx,iprc,info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -23.074 Td [(T)90(ype:)]TJ 0 g 0 G @@ -6879,7 +6888,7 @@ ET endstream endobj -1071 0 obj +1072 0 obj << /Length 8300 >> @@ -6890,14 +6899,14 @@ stream BT /F75 9.9626 Tf 99.895 706.129 Td [(idx)]TJ 0 g 0 G -/F84 9.9626 Tf 19.368 0 Td [(the)-250(list)-250(of)-250(global)-250(indices)-250(for)-250(which)-250(we)-250(need)-250(the)-250(owning)-250(pr)18(ocesses.)]TJ 5.539 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(one-dimensional)-250(array)-250(of)-250(integers)-250(of)-250(kind)]TJ/F145 9.9626 Tf 250.209 0 Td [(psb_lpk_)]TJ/F84 9.9626 Tf 41.843 0 Td [(.)]TJ +/F84 9.9626 Tf 19.368 0 Td [(the)-250(list)-250(of)-250(global)-250(indices)-250(for)-250(which)-250(we)-250(need)-250(the)-250(owning)-250(pr)18(ocesses.)]TJ 5.539 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(one-dimensional)-250(array)-250(of)-250(integers)-250(of)-250(kind)]TJ/F147 9.9626 Tf 250.209 0 Td [(psb_lpk_)]TJ/F84 9.9626 Tf 41.843 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -316.959 -20.539 Td [(On)-250(Return)]TJ 0 g 0 G 0 g 0 G 0 -20.54 Td [(iprc)]TJ 0 g 0 G -/F84 9.9626 Tf 22.685 0 Td [(the)-250(list)-250(of)-250(pr)18(ocesses)-250(owning)-250(the)-250(indices)-250(in)]TJ/F145 9.9626 Tf 184.994 0 Td [(idx)]TJ/F84 9.9626 Tf 15.691 0 Td [(.)]TJ -198.463 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 569.408 Tm [(Speci\002ed)-345(as:)-504(an)-345(allocatable)-345(one-dimensional)-345(array)-345(of)-345(integers)-346(of)-345(kind)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 557.453 Tm [(psb_ipk_)]TJ/F84 9.9626 Tf 41.843 0 Td [(.)]TJ 0.98 0 0 1 99.895 534.921 Tm [(Note:)-304(this)-231(method)-231(may)-231(or)-230(may)-231(not)-231(actually)-231(r)19(equir)18(e)-231(communications,)-235(depending)]TJ 0.98 0 0 1 99.895 522.966 Tm [(on)-217(the)-216(exact)-217(internal)-217(data)-217(storage;)-229(given)-217(that)-216(the)-217(choice)-217(of)-217(st)1(orage)-217(may)-217(be)-217(alter)19(ed)]TJ 0.98 0 0 1 99.895 511.011 Tm [(by)-250(r)8(untime)-250(parameters,)-251(it)-249(is)-250(necessary)-250(for)-250(safety)-250(that)-250(this)-250(method)-250(is)-249(called)-250(by)-250(all)]TJ 1 0 0 1 99.596 499.056 Tm [(pr)18(ocesses.)]TJ/F75 9.9626 Tf 0.299 -28.015 Td [(3.1.15)-1000(Named)-250(Constants)]TJ +/F84 9.9626 Tf 22.685 0 Td [(the)-250(list)-250(of)-250(pr)18(ocesses)-250(owning)-250(the)-250(indices)-250(in)]TJ/F147 9.9626 Tf 184.994 0 Td [(idx)]TJ/F84 9.9626 Tf 15.691 0 Td [(.)]TJ -198.463 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 569.408 Tm [(Speci\002ed)-345(as:)-504(an)-345(allocatable)-345(one-dimensional)-345(array)-345(of)-345(integers)-346(of)-345(kind)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 557.453 Tm [(psb_ipk_)]TJ/F84 9.9626 Tf 41.843 0 Td [(.)]TJ 0.98 0 0 1 99.895 534.921 Tm [(Note:)-304(this)-231(method)-231(may)-231(or)-230(may)-231(not)-231(actually)-231(r)19(equir)18(e)-231(communications,)-235(depending)]TJ 0.98 0 0 1 99.895 522.966 Tm [(on)-217(the)-216(exact)-217(internal)-217(data)-217(storage;)-229(given)-217(that)-216(the)-217(choice)-217(of)-217(st)1(orage)-217(may)-217(be)-217(alter)19(ed)]TJ 0.98 0 0 1 99.895 511.011 Tm [(by)-250(r)8(untime)-250(parameters,)-251(it)-249(is)-250(necessary)-250(for)-250(safety)-250(that)-250(this)-250(method)-250(is)-249(called)-250(by)-250(all)]TJ 1 0 0 1 99.596 499.056 Tm [(pr)18(ocesses.)]TJ/F75 9.9626 Tf 0.299 -28.015 Td [(3.1.15)-1000(Named)-250(Constants)]TJ 0 g 0 G 0 -19.261 Td [(psb)]TJ ET @@ -7023,7 +7032,7 @@ q Q 0 g 0 G BT -/F84 9.9626 Tf 179.835 328.543 Td [(Exchange)-250(data)-250(based)-250(on)-250(the)]TJ/F145 9.9626 Tf 124.92 0 Td [(halo_index)]TJ/F84 9.9626 Tf 54.795 0 Td [(list;)]TJ +/F84 9.9626 Tf 179.835 328.543 Td [(Exchange)-250(data)-250(based)-250(on)-250(the)]TJ/F147 9.9626 Tf 124.92 0 Td [(halo_index)]TJ/F84 9.9626 Tf 54.795 0 Td [(list;)]TJ 0 g 0 G /F75 9.9626 Tf -259.655 -20.54 Td [(psb)]TJ ET @@ -7047,7 +7056,7 @@ q Q 0 g 0 G BT -/F84 9.9626 Tf 173.19 308.003 Td [(Exchange)-250(data)-250(based)-250(on)-250(the)]TJ/F145 9.9626 Tf 124.92 0 Td [(ext_index)]TJ/F84 9.9626 Tf 49.564 0 Td [(list;)]TJ +/F84 9.9626 Tf 173.19 308.003 Td [(Exchange)-250(data)-250(based)-250(on)-250(the)]TJ/F147 9.9626 Tf 124.92 0 Td [(ext_index)]TJ/F84 9.9626 Tf 49.564 0 Td [(list;)]TJ 0 g 0 G /F75 9.9626 Tf -247.779 -20.539 Td [(psb)]TJ ET @@ -7071,7 +7080,7 @@ q Q 0 g 0 G BT -/F84 9.9626 Tf 174.864 287.464 Td [(Exchange)-250(data)-250(based)-250(on)-250(the)]TJ/F145 9.9626 Tf 124.92 0 Td [(ovrlap_index)]TJ/F84 9.9626 Tf 65.255 0 Td [(list;)]TJ +/F84 9.9626 Tf 174.864 287.464 Td [(Exchange)-250(data)-250(based)-250(on)-250(the)]TJ/F147 9.9626 Tf 124.92 0 Td [(ovrlap_index)]TJ/F84 9.9626 Tf 65.255 0 Td [(list;)]TJ 0 g 0 G /F75 9.9626 Tf -265.144 -20.54 Td [(psb)]TJ ET @@ -7095,21 +7104,21 @@ q Q 0 g 0 G BT -/F84 9.9626 Tf 179.845 266.924 Td [(Exchange)-250(data)-250(based)-250(on)-250(the)]TJ/F145 9.9626 Tf 124.92 0 Td [(ovr_mst_idx)]TJ/F84 9.9626 Tf 60.025 0 Td [(list;)]TJ/F75 11.9552 Tf -264.895 -30.006 Td [(3.2)-1000(Sparse)-250(Matrix)-250(class)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 217.656 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 119.097 217.656 Tm [(psb)]TJ +/F84 9.9626 Tf 179.845 266.924 Td [(Exchange)-250(data)-250(based)-250(on)-250(the)]TJ/F147 9.9626 Tf 124.92 0 Td [(ovr_mst_idx)]TJ/F84 9.9626 Tf 60.025 0 Td [(list;)]TJ/F75 11.9552 Tf -264.895 -30.006 Td [(3.2)-1000(Sparse)-250(Matrix)-250(class)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 217.656 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 119.097 217.656 Tm [(psb)]TJ ET q 1 0 0 1 135.416 217.855 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 138.554 217.656 Td [(Tspmat)]TJ +/F147 9.9626 Tf 138.554 217.656 Td [(Tspmat)]TJ ET q 1 0 0 1 170.564 217.855 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 173.702 217.656 Td [(type)]TJ/F84 9.9626 Tf 1.02 0 0 1 197.123 217.656 Tm [(class)-246(contains)-246(all)-246(information)-246(about)-246(the)-246(local)-246(portion)-246(of)]TJ 0.98 0 0 1 99.895 205.701 Tm [(the)-252(sparse)-253(matrix)-252(and)-252(its)-253(st)1(orage)-253(mode.)-315(Its)-252(design)-253(is)-252(based)-252(on)-253(the)-252(ST)76(A)75(TE)-252(design)]TJ 0.98 0 0 1 99.596 193.746 Tm [(pattern)-251([)]TJ +/F147 9.9626 Tf 173.702 217.656 Td [(type)]TJ/F84 9.9626 Tf 1.02 0 0 1 197.123 217.656 Tm [(class)-246(contains)-246(all)-246(information)-246(about)-246(the)-246(local)-246(portion)-246(of)]TJ 0.98 0 0 1 99.895 205.701 Tm [(the)-252(sparse)-253(matrix)-252(and)-252(its)-253(st)1(orage)-253(mode.)-315(Its)-252(design)-253(is)-252(based)-252(on)-253(the)-252(ST)76(A)75(TE)-252(design)]TJ 0.98 0 0 1 99.596 193.746 Tm [(pattern)-251([)]TJ 1 0 0 rg 1 0 0 RG 1 0 0 1 136.63 193.746 Tm [(13)]TJ 0 g 0 G @@ -7121,7 +7130,7 @@ BT 0 0 1 rg 0 0 1 RG [-251(2)]TJ 0 g 0 G - [-251(wher)18(e)]TJ/F145 9.9626 Tf 1 0 0 1 438.638 193.746 Tm [(T)]TJ/F84 9.9626 Tf -338.743 -11.955 Td [(is)-250(a)-250(placeholder)-250(for)-250(the)-250(data)-250(type)-250(and)-250(pr)18(ecision)-250(variants)]TJ + [-251(wher)18(e)]TJ/F147 9.9626 Tf 1 0 0 1 438.638 193.746 Tm [(T)]TJ/F84 9.9626 Tf -338.743 -11.955 Td [(is)-250(a)-250(placeholder)-250(for)-250(the)-250(data)-250(type)-250(and)-250(pr)18(ecision)-250(variants)]TJ 0 g 0 G /F75 9.9626 Tf 0 -20.386 Td [(S)]TJ 0 g 0 G @@ -7141,39 +7150,39 @@ ET endstream endobj -979 0 obj +980 0 obj << /Type /ObjStm /N 100 -/First 926 -/Length 9242 ->> -stream -966 0 982 121 965 255 984 404 985 461 986 518 987 575 988 632 989 689 990 746 -991 803 992 860 993 917 994 974 995 1031 996 1088 997 1145 998 1202 999 1259 981 1316 -1003 1412 980 1558 1001 1710 1005 1858 31 1916 1006 1972 1007 2030 1008 2086 1009 2143 1010 2201 -1011 2259 35 2317 1002 2373 1014 2495 1012 2633 1016 2781 39 2840 43 2897 1017 2954 1013 3013 -1022 3108 1018 3264 1019 3411 1020 3564 1024 3717 1025 3775 1026 3833 1027 3891 1028 3949 1029 4007 -1021 4065 1033 4146 1030 4293 1031 4446 1035 4599 1036 4658 1037 4717 1038 4776 1039 4835 1040 4894 -1041 4953 1042 5012 1043 5071 1045 5130 1032 5189 1049 5299 1046 5447 1047 5595 1051 5742 47 5800 -51 5856 55 5912 59 5968 1048 6024 1054 6160 1056 6278 63 6337 67 6394 71 6451 1053 6508 -1058 6603 1060 6721 75 6779 79 6835 1061 6891 83 6949 87 7003 1057 7059 1063 7154 1065 7272 -91 7331 95 7388 99 7445 1062 7502 1070 7597 1066 7754 1067 7911 1068 8062 1072 8201 103 8259 -% 966 0 obj +/First 927 +/Length 9244 +>> +stream +967 0 983 121 966 255 985 404 986 461 987 518 988 575 989 632 990 689 991 746 +992 803 993 860 994 917 995 974 996 1031 997 1088 998 1145 999 1202 1000 1259 982 1317 +1004 1413 981 1559 1002 1711 1006 1859 31 1917 1007 1973 1008 2031 1009 2087 1010 2144 1011 2202 +1012 2260 35 2318 1003 2374 1015 2496 1013 2634 1017 2782 39 2841 43 2898 1018 2955 1014 3014 +1023 3109 1019 3265 1020 3412 1021 3565 1025 3718 1026 3776 1027 3834 1028 3892 1029 3950 1030 4008 +1022 4066 1034 4147 1031 4294 1032 4447 1036 4600 1037 4659 1038 4718 1039 4777 1040 4836 1041 4895 +1042 4954 1043 5013 1044 5072 1046 5131 1033 5190 1050 5300 1047 5448 1048 5596 1052 5743 47 5801 +51 5857 55 5913 59 5969 1049 6025 1055 6161 1057 6279 63 6338 67 6395 71 6452 1054 6509 +1059 6604 1061 6722 75 6780 79 6836 1062 6892 83 6950 87 7004 1058 7060 1064 7155 1066 7273 +91 7332 95 7389 99 7446 1063 7503 1071 7598 1067 7755 1068 7912 1069 8063 1073 8202 103 8260 +% 967 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F145 940 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F147 941 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 982 0 obj +% 983 0 obj << /Type /Page -/Contents 983 0 R -/Resources 981 0 R +/Contents 984 0 R +/Resources 982 0 R /MediaBox [0 0 595.276 841.89] -/Parent 978 0 R -/Annots [ 965 0 R ] +/Parent 979 0 R +/Annots [ 966 0 R ] >> -% 965 0 obj +% 966 0 obj << /Type /Annot /Subtype /Link @@ -7181,85 +7190,85 @@ stream /Rect [284.193 690.964 290.469 703.958] /A << /S /GoTo /D (Hfootnote.3) >> >> -% 984 0 obj -<< -/D [982 0 R /XYZ 149.705 753.953 null] ->> % 985 0 obj << -/D [982 0 R /XYZ 150.705 716.092 null] +/D [983 0 R /XYZ 149.705 753.953 null] >> % 986 0 obj << -/D [982 0 R /XYZ 150.705 688.869 null] +/D [983 0 R /XYZ 150.705 716.092 null] >> % 987 0 obj << -/D [982 0 R /XYZ 150.705 619.713 null] +/D [983 0 R /XYZ 150.705 688.869 null] >> % 988 0 obj << -/D [982 0 R /XYZ 150.705 601.577 null] +/D [983 0 R /XYZ 150.705 619.713 null] >> % 989 0 obj << -/D [982 0 R /XYZ 150.705 583.441 null] +/D [983 0 R /XYZ 150.705 601.577 null] >> % 990 0 obj << -/D [982 0 R /XYZ 150.705 553.945 null] +/D [983 0 R /XYZ 150.705 583.441 null] >> % 991 0 obj << -/D [982 0 R /XYZ 150.705 535.213 null] +/D [983 0 R /XYZ 150.705 553.945 null] >> % 992 0 obj << -/D [982 0 R /XYZ 150.705 505.717 null] +/D [983 0 R /XYZ 150.705 535.213 null] >> % 993 0 obj << -/D [982 0 R /XYZ 150.705 484.993 null] +/D [983 0 R /XYZ 150.705 505.717 null] >> % 994 0 obj << -/D [982 0 R /XYZ 150.705 460.161 null] +/D [983 0 R /XYZ 150.705 484.993 null] >> % 995 0 obj << -/D [982 0 R /XYZ 150.705 433.375 null] +/D [983 0 R /XYZ 150.705 460.161 null] >> % 996 0 obj << -/D [982 0 R /XYZ 150.705 419.224 null] +/D [983 0 R /XYZ 150.705 433.375 null] >> % 997 0 obj << -/D [982 0 R /XYZ 150.705 405.145 null] +/D [983 0 R /XYZ 150.705 419.224 null] >> % 998 0 obj << -/D [982 0 R /XYZ 150.705 378.966 null] +/D [983 0 R /XYZ 150.705 405.145 null] >> % 999 0 obj << -/D [982 0 R /XYZ 165.051 139.255 null] +/D [983 0 R /XYZ 150.705 378.966 null] >> -% 981 0 obj +% 1000 0 obj << -/Font << /F84 687 0 R /F145 940 0 R /F215 1000 0 R >> +/D [983 0 R /XYZ 165.051 139.255 null] +>> +% 982 0 obj +<< +/Font << /F84 687 0 R /F147 941 0 R /F220 1001 0 R >> /ProcSet [ /PDF /Text ] >> -% 1003 0 obj +% 1004 0 obj << /Type /Page -/Contents 1004 0 R -/Resources 1002 0 R +/Contents 1005 0 R +/Resources 1003 0 R /MediaBox [0 0 595.276 841.89] -/Parent 978 0 R -/Annots [ 980 0 R 1001 0 R ] +/Parent 979 0 R +/Annots [ 981 0 R 1002 0 R ] >> -% 980 0 obj +% 981 0 obj << /Type /Annot /Subtype /Link @@ -7267,65 +7276,65 @@ stream /Rect [218.838 674.054 233.284 683.464] /A << /S /GoTo /D (subsection.2.3) >> >> -% 1001 0 obj +% 1002 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [118.961 266.803 126.034 278.862] +/Rect [421.517 278.758 428.521 290.818] /A << /S /GoTo /D (section.3) >> >> -% 1005 0 obj +% 1006 0 obj << -/D [1003 0 R /XYZ 98.895 753.953 null] +/D [1004 0 R /XYZ 98.895 753.953 null] >> % 31 0 obj << -/D [1003 0 R /XYZ 99.895 716.092 null] ->> -% 1006 0 obj -<< -/D [1003 0 R /XYZ 99.895 671.065 null] +/D [1004 0 R /XYZ 99.895 716.092 null] >> % 1007 0 obj << -/D [1003 0 R /XYZ 99.895 648.1 null] +/D [1004 0 R /XYZ 99.895 671.065 null] >> % 1008 0 obj << -/D [1003 0 R /XYZ 99.895 573.59 null] +/D [1004 0 R /XYZ 99.895 648.1 null] >> % 1009 0 obj << -/D [1003 0 R /XYZ 99.895 527.104 null] +/D [1004 0 R /XYZ 99.895 573.59 null] >> % 1010 0 obj << -/D [1003 0 R /XYZ 99.895 495.819 null] +/D [1004 0 R /XYZ 99.895 527.104 null] >> % 1011 0 obj << -/D [1003 0 R /XYZ 99.895 475.298 null] +/D [1004 0 R /XYZ 99.895 495.819 null] +>> +% 1012 0 obj +<< +/D [1004 0 R /XYZ 99.895 475.298 null] >> % 35 0 obj << -/D [1003 0 R /XYZ 99.895 420.262 null] +/D [1004 0 R /XYZ 99.895 420.262 null] >> -% 1002 0 obj +% 1003 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1014 0 obj +% 1015 0 obj << /Type /Page -/Contents 1015 0 R -/Resources 1013 0 R +/Contents 1016 0 R +/Resources 1014 0 R /MediaBox [0 0 595.276 841.89] -/Parent 978 0 R -/Annots [ 1012 0 R ] +/Parent 979 0 R +/Annots [ 1013 0 R ] >> -% 1012 0 obj +% 1013 0 obj << /Type /Annot /Subtype /Link @@ -7333,37 +7342,37 @@ stream /Rect [319.267 173.115 326.341 185.175] /A << /S /GoTo /D (section.6) >> >> -% 1016 0 obj +% 1017 0 obj << -/D [1014 0 R /XYZ 149.705 753.953 null] +/D [1015 0 R /XYZ 149.705 753.953 null] >> % 39 0 obj << -/D [1014 0 R /XYZ 150.705 716.092 null] +/D [1015 0 R /XYZ 150.705 716.092 null] >> % 43 0 obj << -/D [1014 0 R /XYZ 150.705 279.545 null] +/D [1015 0 R /XYZ 150.705 279.545 null] >> -% 1017 0 obj +% 1018 0 obj << -/D [1014 0 R /XYZ 397.584 236.897 null] +/D [1015 0 R /XYZ 150.705 224.942 null] >> -% 1013 0 obj +% 1014 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1022 0 obj +% 1023 0 obj << /Type /Page -/Contents 1023 0 R -/Resources 1021 0 R +/Contents 1024 0 R +/Resources 1022 0 R /MediaBox [0 0 595.276 841.89] -/Parent 978 0 R -/Annots [ 1018 0 R 1019 0 R 1020 0 R ] +/Parent 979 0 R +/Annots [ 1019 0 R 1020 0 R 1021 0 R ] >> -% 1018 0 obj +% 1019 0 obj << /Type /Annot /Subtype /Link @@ -7371,7 +7380,7 @@ stream /Rect [399.906 399.338 406.88 411.398] /A << /S /GoTo /D (section.6) >> >> -% 1019 0 obj +% 1020 0 obj << /Type /Annot /Subtype /Link @@ -7379,7 +7388,7 @@ stream /Rect [304.177 193.202 318.623 205.262] /A << /S /GoTo /D (subsection.3.3) >> >> -% 1020 0 obj +% 1021 0 obj << /Type /Annot /Subtype /Link @@ -7387,45 +7396,45 @@ stream /Rect [304.177 148.883 318.623 160.943] /A << /S /GoTo /D (subsection.3.3) >> >> -% 1024 0 obj -<< -/D [1022 0 R /XYZ 98.895 753.953 null] ->> % 1025 0 obj << -/D [1022 0 R /XYZ 99.895 293.402 null] +/D [1023 0 R /XYZ 98.895 753.953 null] >> % 1026 0 obj << -/D [1022 0 R /XYZ 99.895 278.496 null] +/D [1023 0 R /XYZ 99.895 293.402 null] >> % 1027 0 obj << -/D [1022 0 R /XYZ 99.895 261.039 null] +/D [1023 0 R /XYZ 99.895 278.496 null] >> % 1028 0 obj << -/D [1022 0 R /XYZ 99.895 244.857 null] +/D [1023 0 R /XYZ 99.895 261.039 null] >> % 1029 0 obj << -/D [1022 0 R /XYZ 99.895 228.675 null] +/D [1023 0 R /XYZ 99.895 244.857 null] >> -% 1021 0 obj +% 1030 0 obj +<< +/D [1023 0 R /XYZ 99.895 228.675 null] +>> +% 1022 0 obj << /Font << /F84 687 0 R /F75 685 0 R >> /ProcSet [ /PDF /Text ] >> -% 1033 0 obj +% 1034 0 obj << /Type /Page -/Contents 1034 0 R -/Resources 1032 0 R +/Contents 1035 0 R +/Resources 1033 0 R /MediaBox [0 0 595.276 841.89] -/Parent 978 0 R -/Annots [ 1030 0 R 1031 0 R ] +/Parent 979 0 R +/Annots [ 1031 0 R 1032 0 R ] >> -% 1030 0 obj +% 1031 0 obj << /Type /Annot /Subtype /Link @@ -7433,7 +7442,7 @@ stream /Rect [354.987 614.119 369.432 626.179] /A << /S /GoTo /D (subsection.3.3) >> >> -% 1031 0 obj +% 1032 0 obj << /Type /Annot /Subtype /Link @@ -7441,61 +7450,61 @@ stream /Rect [354.987 568.778 369.432 580.837] /A << /S /GoTo /D (subsection.3.3) >> >> -% 1035 0 obj -<< -/D [1033 0 R /XYZ 149.705 753.953 null] ->> % 1036 0 obj << -/D [1033 0 R /XYZ 150.705 716.092 null] +/D [1034 0 R /XYZ 149.705 753.953 null] >> % 1037 0 obj << -/D [1033 0 R /XYZ 150.705 702.226 null] +/D [1034 0 R /XYZ 150.705 716.092 null] >> % 1038 0 obj << -/D [1033 0 R /XYZ 150.705 684.257 null] +/D [1034 0 R /XYZ 150.705 702.226 null] >> % 1039 0 obj << -/D [1033 0 R /XYZ 150.705 667.564 null] +/D [1034 0 R /XYZ 150.705 684.257 null] >> % 1040 0 obj << -/D [1033 0 R /XYZ 150.705 650.871 null] +/D [1034 0 R /XYZ 150.705 667.564 null] >> % 1041 0 obj << -/D [1033 0 R /XYZ 150.705 541.236 null] +/D [1034 0 R /XYZ 150.705 650.871 null] >> % 1042 0 obj << -/D [1033 0 R /XYZ 150.705 524.542 null] +/D [1034 0 R /XYZ 150.705 541.236 null] >> % 1043 0 obj << -/D [1033 0 R /XYZ 150.705 507.849 null] +/D [1034 0 R /XYZ 150.705 524.542 null] >> -% 1045 0 obj +% 1044 0 obj << -/D [1033 0 R /XYZ 150.705 288.977 null] +/D [1034 0 R /XYZ 150.705 507.849 null] >> -% 1032 0 obj +% 1046 0 obj +<< +/D [1034 0 R /XYZ 150.705 288.977 null] +>> +% 1033 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F147 941 0 R /F235 1045 0 R >> /ProcSet [ /PDF /Text ] >> -% 1049 0 obj +% 1050 0 obj << /Type /Page -/Contents 1050 0 R -/Resources 1048 0 R +/Contents 1051 0 R +/Resources 1049 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1052 0 R -/Annots [ 1046 0 R 1047 0 R ] +/Parent 1053 0 R +/Annots [ 1047 0 R 1048 0 R ] >> -% 1046 0 obj +% 1047 0 obj << /Type /Annot /Subtype /Link @@ -7503,7 +7512,7 @@ stream /Rect [275.775 524.509 282.649 537.101] /A << /S /GoTo /D (section.1) >> >> -% 1047 0 obj +% 1048 0 obj << /Type /Annot /Subtype /Link @@ -7511,136 +7520,136 @@ stream /Rect [426.76 326.492 433.634 338.552] /A << /S /GoTo /D (section.1) >> >> -% 1051 0 obj +% 1052 0 obj << -/D [1049 0 R /XYZ 98.895 753.953 null] +/D [1050 0 R /XYZ 98.895 753.953 null] >> % 47 0 obj << -/D [1049 0 R /XYZ 99.895 716.092 null] +/D [1050 0 R /XYZ 99.895 716.092 null] >> % 51 0 obj << -/D [1049 0 R /XYZ 99.895 696.532 null] +/D [1050 0 R /XYZ 99.895 696.532 null] >> % 55 0 obj << -/D [1049 0 R /XYZ 99.895 498.276 null] +/D [1050 0 R /XYZ 99.895 498.276 null] >> % 59 0 obj << -/D [1049 0 R /XYZ 99.895 288.305 null] +/D [1050 0 R /XYZ 99.895 288.305 null] >> -% 1048 0 obj +% 1049 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F78 686 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F195 942 0 R /F78 686 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1054 0 obj +% 1055 0 obj << /Type /Page -/Contents 1055 0 R -/Resources 1053 0 R +/Contents 1056 0 R +/Resources 1054 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1052 0 R +/Parent 1053 0 R >> -% 1056 0 obj +% 1057 0 obj << -/D [1054 0 R /XYZ 149.705 753.953 null] +/D [1055 0 R /XYZ 149.705 753.953 null] >> % 63 0 obj << -/D [1054 0 R /XYZ 150.705 716.092 null] +/D [1055 0 R /XYZ 150.705 716.092 null] >> % 67 0 obj << -/D [1054 0 R /XYZ 150.705 529.559 null] +/D [1055 0 R /XYZ 150.705 529.559 null] >> % 71 0 obj << -/D [1054 0 R /XYZ 150.705 276.666 null] +/D [1055 0 R /XYZ 150.705 276.666 null] >> -% 1053 0 obj +% 1054 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1058 0 obj +% 1059 0 obj << /Type /Page -/Contents 1059 0 R -/Resources 1057 0 R +/Contents 1060 0 R +/Resources 1058 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1052 0 R +/Parent 1053 0 R >> -% 1060 0 obj +% 1061 0 obj << -/D [1058 0 R /XYZ 98.895 753.953 null] +/D [1059 0 R /XYZ 98.895 753.953 null] >> % 75 0 obj << -/D [1058 0 R /XYZ 99.895 716.092 null] +/D [1059 0 R /XYZ 99.895 716.092 null] >> % 79 0 obj << -/D [1058 0 R /XYZ 99.895 519.544 null] +/D [1059 0 R /XYZ 99.895 519.544 null] >> -% 1061 0 obj +% 1062 0 obj << -/D [1058 0 R /XYZ 344.16 356.277 null] +/D [1059 0 R /XYZ 344.16 356.277 null] >> % 83 0 obj << -/D [1058 0 R /XYZ 99.895 305.6 null] +/D [1059 0 R /XYZ 99.895 305.6 null] >> % 87 0 obj << -/D [1058 0 R /XYZ 99.895 194.578 null] +/D [1059 0 R /XYZ 99.895 194.578 null] >> -% 1057 0 obj +% 1058 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1063 0 obj +% 1064 0 obj << /Type /Page -/Contents 1064 0 R -/Resources 1062 0 R +/Contents 1065 0 R +/Resources 1063 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1052 0 R +/Parent 1053 0 R >> -% 1065 0 obj +% 1066 0 obj << -/D [1063 0 R /XYZ 149.705 753.953 null] +/D [1064 0 R /XYZ 149.705 753.953 null] >> % 91 0 obj << -/D [1063 0 R /XYZ 150.705 543.315 null] +/D [1064 0 R /XYZ 150.705 543.315 null] >> % 95 0 obj << -/D [1063 0 R /XYZ 150.705 416.307 null] +/D [1064 0 R /XYZ 150.705 416.307 null] >> % 99 0 obj << -/D [1063 0 R /XYZ 150.705 194.109 null] +/D [1064 0 R /XYZ 150.705 194.109 null] >> -% 1062 0 obj +% 1063 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1070 0 obj +% 1071 0 obj << /Type /Page -/Contents 1071 0 R -/Resources 1069 0 R +/Contents 1072 0 R +/Resources 1070 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1052 0 R -/Annots [ 1066 0 R 1067 0 R 1068 0 R ] +/Parent 1053 0 R +/Annots [ 1067 0 R 1068 0 R 1069 0 R ] >> -% 1066 0 obj +% 1067 0 obj << /Type /Annot /Subtype /Link @@ -7648,7 +7657,7 @@ stream /Rect [135.634 192.59 147.589 201.696] /A << /S /GoTo /D (cite.DesignPatterns) >> >> -% 1067 0 obj +% 1068 0 obj << /Type /Annot /Subtype /Link @@ -7656,7 +7665,7 @@ stream /Rect [214.484 192.69 226.439 201.696] /A << /S /GoTo /D (cite.Sparse03) >> >> -% 1068 0 obj +% 1069 0 obj << /Type /Annot /Subtype /Link @@ -7664,18 +7673,18 @@ stream /Rect [401 189.94 407.874 202] /A << /S /GoTo /D (listing.2) >> >> -% 1072 0 obj +% 1073 0 obj << -/D [1070 0 R /XYZ 98.895 753.953 null] +/D [1071 0 R /XYZ 98.895 753.953 null] >> % 103 0 obj << -/D [1070 0 R /XYZ 99.895 480.341 null] +/D [1071 0 R /XYZ 99.895 480.341 null] >> endstream endobj -1079 0 obj +1080 0 obj << /Length 8179 >> @@ -7690,35 +7699,35 @@ BT 0 g 0 G /F75 9.9626 Tf -11.626 -18.188 Td [(LS,LD,LC,LZ)]TJ 0 g 0 G -/F84 9.9626 Tf 0.994 0 0 1 215.731 687.941 Tm [(Same)-250(numeric)-251(type)-250(as)-251(above,)-251(but)-250(with)]TJ/F145 9.9626 Tf 1 0 0 1 385.185 687.941 Tm [(psb_lpk_)]TJ/F84 9.9626 Tf 0.994 0 0 1 429.509 687.941 Tm [(integer)-250(indices.)]TJ 0.98 0 0 1 150.396 671.491 Tm [(The)-194(actual)-194(data)-194(is)-193(contained)-194(in)-194(the)-194(polymorphic)-194(component)]TJ/F145 9.9626 Tf 1 0 0 1 405.031 671.491 Tm [(a%a)]TJ/F84 9.9626 Tf 0.98 0 0 1 422.615 671.491 Tm [(of)-194(type)]TJ/F145 9.9626 Tf 1 0 0 1 454.138 671.491 Tm [(psb)]TJ +/F84 9.9626 Tf 0.994 0 0 1 215.731 687.941 Tm [(Same)-250(numeric)-251(type)-250(as)-251(above,)-251(but)-250(with)]TJ/F147 9.9626 Tf 1 0 0 1 385.185 687.941 Tm [(psb_lpk_)]TJ/F84 9.9626 Tf 0.994 0 0 1 429.509 687.941 Tm [(integer)-250(indices.)]TJ 0.98 0 0 1 150.396 671.491 Tm [(The)-194(actual)-194(data)-194(is)-193(contained)-194(in)-194(the)-194(polymorphic)-194(component)]TJ/F147 9.9626 Tf 1 0 0 1 405.031 671.491 Tm [(a%a)]TJ/F84 9.9626 Tf 0.98 0 0 1 422.615 671.491 Tm [(of)-194(type)]TJ/F147 9.9626 Tf 1 0 0 1 454.138 671.491 Tm [(psb)]TJ ET q 1 0 0 1 470.457 671.69 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 473.595 671.491 Td [(T)]TJ +/F147 9.9626 Tf 473.595 671.491 Td [(T)]TJ ET q 1 0 0 1 479.453 671.69 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 482.591 671.491 Td [(base)]TJ +/F147 9.9626 Tf 482.591 671.491 Td [(base)]TJ ET q 1 0 0 1 504.14 671.69 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 507.278 671.491 Td [(sparse)]TJ +/F147 9.9626 Tf 507.278 671.491 Td [(sparse)]TJ ET q 1 0 0 1 539.288 671.69 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 542.426 671.491 Td [(mat)]TJ/F84 9.9626 Tf 0.98 0 0 1 558.117 671.491 Tm [(;)]TJ 1.02 0 0 1 150.705 659.535 Tm [(its)-247(speci\002c)-247(layout)-247(can)-247(be)-247(chosen)-247(dynamically)-247(among)-247(the)-247(pr)18(ede\002ned)-247(types,)-247(or)]TJ 1.02 0 0 1 150.705 647.58 Tm [(an)-252(entir)18(ely)-252(new)-251(storage)-252(layout)-252(can)-252(be)-251(implemented)-252(and)-252(passed)-251(to)-252(the)-252(library)]TJ 0.993 0 0 1 150.705 635.625 Tm [(at)-251(r)8(untime)-252(via)-251(the)]TJ/F145 9.9626 Tf 1 0 0 1 231.087 635.625 Tm [(psb_spasb)]TJ/F84 9.9626 Tf 0.993 0 0 1 280.647 635.625 Tm [(r)18(outine.)-312(The)-251(following)-252(very)-251(common)-251(formats)-252(ar)19(e)]TJ +/F147 9.9626 Tf 542.426 671.491 Td [(mat)]TJ/F84 9.9626 Tf 0.98 0 0 1 558.117 671.491 Tm [(;)]TJ 1.02 0 0 1 150.705 659.535 Tm [(its)-247(speci\002c)-247(layout)-247(can)-247(be)-247(chosen)-247(dynamically)-247(among)-247(the)-247(pr)18(ede\002ned)-247(types,)-247(or)]TJ 1.02 0 0 1 150.705 647.58 Tm [(an)-252(entir)18(ely)-252(new)-251(storage)-252(layout)-252(can)-252(be)-251(implemented)-252(and)-252(passed)-251(to)-252(the)-252(library)]TJ 0.993 0 0 1 150.705 635.625 Tm [(at)-251(r)8(untime)-252(via)-251(the)]TJ/F147 9.9626 Tf 1 0 0 1 231.087 635.625 Tm [(psb_spasb)]TJ/F84 9.9626 Tf 0.993 0 0 1 280.647 635.625 Tm [(r)18(outine.)-312(The)-251(following)-252(very)-251(common)-251(formats)-252(ar)19(e)]TJ 0 g 0 G 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG @@ -7733,7 +7742,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 163.108 605.96 Td [(type)]TJ +/F235 8.9664 Tf 163.108 605.96 Td [(type)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G @@ -7889,7 +7898,7 @@ BT /F75 9.9626 Tf 198.017 252.912 Td [(nrows)-250(\227)-250(Get)-250(number)-250(of)-250(rows)-250(in)-250(a)-250(sparse)-250(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -47.312 -18.964 Td [(nr)-525(=)-525(a%get_nrows\050\051)]TJ +/F147 9.9626 Tf -47.312 -18.964 Td [(nr)-525(=)-525(a%get_nrows\050\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -17.574 Td [(T)90(ype:)]TJ 0 g 0 G @@ -7907,7 +7916,7 @@ BT 0 g 0 G 0 -18.187 Td [(Function)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 72.468 0 Td [(The)-250(number)-250(of)-250(r)18(ows)-250(of)-250(sparse)-250(matrix)]TJ/F145 9.9626 Tf 165.298 0 Td [(a)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ +/F84 9.9626 Tf 72.468 0 Td [(The)-250(number)-250(of)-250(r)18(ows)-250(of)-250(sparse)-250(matrix)]TJ/F147 9.9626 Tf 165.298 0 Td [(a)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ 0 g 0 G -76.122 -29.888 Td [(18)]TJ 0 g 0 G @@ -7915,7 +7924,7 @@ ET endstream endobj -1084 0 obj +1085 0 obj << /Length 4012 >> @@ -7933,7 +7942,7 @@ BT /F75 9.9626 Tf 147.208 706.129 Td [(ncols)-250(\227)-250(Get)-250(number)-250(of)-250(columns)-250(in)-250(a)-250(sparse)-250(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -47.313 -19.023 Td [(nc)-525(=)-525(a%get_ncols\050\051)]TJ +/F147 9.9626 Tf -47.313 -19.023 Td [(nc)-525(=)-525(a%get_ncols\050\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -22.01 Td [(T)90(ype:)]TJ 0 g 0 G @@ -7951,7 +7960,7 @@ BT 0 g 0 G 0 -20.048 Td [(Function)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 72.468 0 Td [(The)-250(number)-250(of)-250(columns)-250(of)-250(sparse)-250(matrix)]TJ/F145 9.9626 Tf 181.159 0 Td [(a)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ/F75 9.9626 Tf -258.857 -27.315 Td [(3.2.4)-1000(get)]TJ +/F84 9.9626 Tf 72.468 0 Td [(The)-250(number)-250(of)-250(columns)-250(of)-250(sparse)-250(matrix)]TJ/F147 9.9626 Tf 181.159 0 Td [(a)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ/F75 9.9626 Tf -258.857 -27.315 Td [(3.2.4)-1000(get)]TJ ET q 1 0 0 1 144.219 531.915 cm @@ -7961,7 +7970,7 @@ BT /F75 9.9626 Tf 147.208 531.716 Td [(nnzeros)-250(\227)-250(Get)-250(number)-250(of)-250(nonzero)-250(elements)-250(in)-250(a)-250(sparse)-250(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -47.313 -19.024 Td [(nz)-525(=)-525(a%get_nnzeros\050\051)]TJ +/F147 9.9626 Tf -47.313 -19.024 Td [(nz)-525(=)-525(a%get_nnzeros\050\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -22.01 Td [(T)90(ype:)]TJ 0 g 0 G @@ -7979,11 +7988,11 @@ BT 0 g 0 G 0 -20.048 Td [(Function)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 72.468 0 Td [(The)-250(number)-250(of)-250(nonzer)18(o)-250(elements)-250(stor)18(ed)-250(in)-250(sparse)-250(matrix)]TJ/F145 9.9626 Tf 251.285 0 Td [(a)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ/F75 9.9626 Tf -328.983 -22.041 Td [(Notes)]TJ +/F84 9.9626 Tf 72.468 0 Td [(The)-250(number)-250(of)-250(nonzer)18(o)-250(elements)-250(stor)18(ed)-250(in)-250(sparse)-250(matrix)]TJ/F147 9.9626 Tf 251.285 0 Td [(a)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ/F75 9.9626 Tf -328.983 -22.041 Td [(Notes)]TJ 0 g 0 G /F84 9.9626 Tf 12.454 -20.017 Td [(1.)]TJ 0 g 0 G - 1.02 0 0 1 124.493 342.56 Tm [(The)-348(function)-348(value)-348(is)-348(speci\002c)-348(to)-347(the)-348(storage)-348(format)-348(of)-348(matrix)]TJ/F145 9.9626 Tf 1 0 0 1 408.08 342.56 Tm [(a)]TJ/F84 9.9626 Tf 1.02 0 0 1 413.311 342.56 Tm [(;)-399(some)]TJ 1.02 0 0 1 124.802 330.604 Tm [(storage)-281(formats)-282(employ)-281(padding,)-290(thus)-282(the)-281(r)18(eturned)-282(value)-281(for)-281(the)-282(same)]TJ 1 0 0 1 124.802 318.649 Tm [(matrix)-250(may)-250(be)-250(dif)18(fer)18(ent)-250(for)-250(dif)18(fer)18(ent)-250(storage)-250(choices.)]TJ/F75 9.9626 Tf -24.907 -27.315 Td [(3.2.5)]TJ 1.02 0 0 1 129.783 291.334 Tm [(get)]TJ + 1.02 0 0 1 124.493 342.56 Tm [(The)-348(function)-348(value)-348(is)-348(speci\002c)-348(to)-347(the)-348(storage)-348(format)-348(of)-348(matrix)]TJ/F147 9.9626 Tf 1 0 0 1 408.08 342.56 Tm [(a)]TJ/F84 9.9626 Tf 1.02 0 0 1 413.311 342.56 Tm [(;)-399(some)]TJ 1.02 0 0 1 124.802 330.604 Tm [(storage)-281(formats)-282(employ)-281(padding,)-290(thus)-282(the)-281(r)18(eturned)-282(value)-281(for)-281(the)-282(same)]TJ 1 0 0 1 124.802 318.649 Tm [(matrix)-250(may)-250(be)-250(dif)18(fer)18(ent)-250(for)-250(dif)18(fer)18(ent)-250(storage)-250(choices.)]TJ/F75 9.9626 Tf -24.907 -27.315 Td [(3.2.5)]TJ 1.02 0 0 1 129.783 291.334 Tm [(get)]TJ ET q 1 0 0 1 144.496 291.533 cm @@ -7993,7 +8002,7 @@ BT /F75 9.9626 Tf 1.02 0 0 1 147.485 291.334 Tm [(size)-337(\227)-336(Get)-337(maximum)-336(number)-337(of)-336(nonzero)-337(elements)-336(in)-337(a)-336(sparse)]TJ 1 0 0 1 129.783 279.379 Tm [(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -29.888 -19.024 Td [(maxnz)-525(=)-525(a%get_size\050\051)]TJ +/F147 9.9626 Tf -29.888 -19.024 Td [(maxnz)-525(=)-525(a%get_size\050\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -22.01 Td [(T)90(ype:)]TJ 0 g 0 G @@ -8011,7 +8020,7 @@ BT 0 g 0 G 0 -20.048 Td [(Function)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 0.99 0 0 1 172.363 132.281 Tm [(The)-254(maximum)-254(number)-254(of)-253(nonzer)18(o)-254(elements)-254(that)-254(can)-254(be)-253(stor)18(ed)]TJ 1 0 0 1 124.802 120.326 Tm [(in)-250(sparse)-250(matrix)]TJ/F145 9.9626 Tf 73.294 0 Td [(a)]TJ/F84 9.9626 Tf 7.721 0 Td [(using)-250(its)-250(curr)18(ent)-250(memory)-250(allocation.)]TJ +/F84 9.9626 Tf 0.99 0 0 1 172.363 132.281 Tm [(The)-254(maximum)-254(number)-254(of)-253(nonzer)18(o)-254(elements)-254(that)-254(can)-254(be)-253(stor)18(ed)]TJ 1 0 0 1 124.802 120.326 Tm [(in)-250(sparse)-250(matrix)]TJ/F147 9.9626 Tf 73.294 0 Td [(a)]TJ/F84 9.9626 Tf 7.721 0 Td [(using)-250(its)-250(curr)18(ent)-250(memory)-250(allocation.)]TJ 0 g 0 G 60.953 -29.888 Td [(19)]TJ 0 g 0 G @@ -8019,7 +8028,7 @@ ET endstream endobj -1090 0 obj +1091 0 obj << /Length 4548 >> @@ -8030,7 +8039,7 @@ BT /F75 9.9626 Tf 150.705 706.129 Td [(3.2.6)-1000(sizeof)-250(\227)-250(Get)-250(memory)-250(occupation)-250(in)-250(bytes)-250(of)-250(a)-250(sparse)-250(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 0 -20.135 Td [(memory_size)-525(=)-525(a%sizeof\050\051)]TJ +/F147 9.9626 Tf 0 -20.135 Td [(memory_size)-525(=)-525(a%sizeof\050\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -23.732 Td [(T)90(ype:)]TJ 0 g 0 G @@ -8057,7 +8066,7 @@ Q BT /F75 9.9626 Tf 198.017 517.011 Td [(fmt)-250(\227)-250(Short)-250(description)-250(of)-250(the)-250(dynamic)-250(type)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -47.574 -20.135 Td [(write)]TJ +/F147 9.9626 Tf -47.574 -20.135 Td [(write)]TJ 0 g 0 G [(\050)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -8090,9 +8099,9 @@ BT 0 g 0 G /F84 9.9626 Tf 1.006 0 0 1 223.093 357.869 Tm [(A)-249(short)-249(string)-249(describing)-249(the)-249(dynamic)-248(type)-249(of)-249(the)-249(matrix.)-310(Pr)18(e-)]TJ 1 0 0 1 175.611 345.914 Tm [(de\002ned)-250(values)-250(include)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 102.415 0 Td [(NULL)]TJ +/F147 9.9626 Tf 102.415 0 Td [(NULL)]TJ 0 g 0 G -/F84 9.9626 Tf 20.921 0 Td [(,)]TJ/F145 9.9626 Tf 4.982 0 Td [(COO)]TJ/F84 9.9626 Tf 15.691 0 Td [(,)]TJ/F145 9.9626 Tf 4.981 0 Td [(CSR)]TJ/F84 9.9626 Tf 18.182 0 Td [(and)]TJ/F145 9.9626 Tf 19.357 0 Td [(CSC)]TJ/F84 9.9626 Tf 15.691 0 Td [(.)]TJ/F75 9.9626 Tf -227.126 -30.581 Td [(3.2.8)-1000(is)]TJ +/F84 9.9626 Tf 20.921 0 Td [(,)]TJ/F147 9.9626 Tf 4.982 0 Td [(COO)]TJ/F84 9.9626 Tf 15.691 0 Td [(,)]TJ/F147 9.9626 Tf 4.981 0 Td [(CSR)]TJ/F84 9.9626 Tf 18.182 0 Td [(and)]TJ/F147 9.9626 Tf 19.357 0 Td [(CSC)]TJ/F84 9.9626 Tf 15.691 0 Td [(.)]TJ/F75 9.9626 Tf -227.126 -30.581 Td [(3.2.8)-1000(is)]TJ ET q 1 0 0 1 188.931 315.533 cm @@ -8115,7 +8124,7 @@ Q BT /F75 9.9626 Tf 258.291 315.333 Td [(asb)-250(\227)-250(Status)-250(check)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -107.586 -20.135 Td [(if)]TJ +/F147 9.9626 Tf -107.586 -20.135 Td [(if)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G @@ -8166,7 +8175,7 @@ BT 0 g 0 G /F84 9.9626 Tf 0.995 0 0 1 223.093 132.281 Tm [(A)]TJ 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG -/F145 9.9626 Tf 1 0 0 1 233.29 132.281 Tm [(logical)]TJ +/F147 9.9626 Tf 1 0 0 1 233.29 132.281 Tm [(logical)]TJ 0 g 0 G /F84 9.9626 Tf 0.995 0 0 1 272.387 132.281 Tm [(value)-251(indicating)-250(whether)-251(the)-250(matrix)-251(is)-251(in)-250(the)-251(Build,)]TJ 1 0 0 1 175.611 120.326 Tm [(Update)-250(or)-250(Assembled)-250(state,)-250(r)18(espectively)111(.)]TJ 0 g 0 G @@ -8176,7 +8185,7 @@ ET endstream endobj -1094 0 obj +1095 0 obj << /Length 6058 >> @@ -8214,7 +8223,7 @@ Q BT /F75 9.9626 Tf 277.488 706.129 Td [(unit)-250(\227)-250(Format)-250(check)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -177.593 -19.573 Td [(if)]TJ +/F147 9.9626 Tf -177.593 -19.573 Td [(if)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G @@ -8276,11 +8285,11 @@ BT 0 g 0 G /F84 9.9626 Tf 0.982 0 0 1 172.283 517.51 Tm [(A)]TJ 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG -/F145 9.9626 Tf 1 0 0 1 182.393 517.51 Tm [(logical)]TJ +/F147 9.9626 Tf 1 0 0 1 182.393 517.51 Tm [(logical)]TJ 0 g 0 G -/F84 9.9626 Tf 0.982 0 0 1 221.503 517.51 Tm [(value)-255(indicating)-256(whether)-255(the)-255(matrix)-255(is)-256(triangular;)-255(if)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 505.555 Tm [(is_triangle\050\051)]TJ/F84 9.9626 Tf 70.478 0 Td [(r)18(eturns)]TJ/F145 9.9626 Tf 34.224 0 Td [(.true.)]TJ/F84 9.9626 Tf 33.865 0 Td [(check)-249(also)-250(if)-249(it)-249(is)-249(lower)74(,)-250(upper)-249(and)-249(with)-249(a)]TJ -138.567 -11.955 Td [(unit)-250(\050i.e.)-310(assumed\051)-250(diagonal.)]TJ/F75 9.9626 Tf -24.907 -28.929 Td [(3.2.10)-1000(cscnv)-250(\227)-250(Convert)-250(to)-250(a)-250(dif)18(ferent)-250(storage)-250(format)]TJ +/F84 9.9626 Tf 0.982 0 0 1 221.503 517.51 Tm [(value)-255(indicating)-256(whether)-255(the)-255(matrix)-255(is)-256(triangular;)-255(if)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 505.555 Tm [(is_triangle\050\051)]TJ/F84 9.9626 Tf 70.478 0 Td [(r)18(eturns)]TJ/F147 9.9626 Tf 34.224 0 Td [(.true.)]TJ/F84 9.9626 Tf 33.865 0 Td [(check)-249(also)-250(if)-249(it)-249(is)-249(lower)74(,)-250(upper)-249(and)-249(with)-249(a)]TJ -138.567 -11.955 Td [(unit)-250(\050i.e.)-310(assumed\051)-250(diagonal.)]TJ/F75 9.9626 Tf -24.907 -28.929 Td [(3.2.10)-1000(cscnv)-250(\227)-250(Convert)-250(to)-250(a)-250(dif)18(ferent)-250(storage)-250(format)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 0 -19.573 Td [(call)]TJ +/F147 9.9626 Tf 0 -19.573 Td [(call)]TJ 0 g 0 G [-1050(a%cscnv\050b,info)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -8327,7 +8336,7 @@ BT 0 g 0 G 0 -21.183 Td [(a)]TJ 0 g 0 G -/F84 9.9626 Tf 9.963 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.555 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ +/F84 9.9626 Tf 9.963 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.555 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -77.918 -33.138 Td [(type)]TJ 0 g 0 G @@ -8337,7 +8346,7 @@ BT 0 g 0 G /F84 9.9626 Tf 0.994 0 0 1 128.677 277.73 Tm [(a)-251(variable)-251(of)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 1 0 0 1 185.176 277.73 Tm [(class)]TJ +/F147 9.9626 Tf 1 0 0 1 185.176 277.73 Tm [(class)]TJ 0 g 0 G [(\050psb_T_base_sparse_mat\051)]TJ/F84 9.9626 Tf 0.994 0 0 1 334.109 277.73 Tm [(r)18(equesting)-251(a)-250(new)-251(format.)]TJ 1 0 0 1 124.493 265.775 Tm [(T)90(ype:)-310(optional.)]TJ 0 g 0 G @@ -8350,11 +8359,11 @@ BT 0 g 0 G 0 -21.183 Td [(b,a)]TJ 0 g 0 G -/F84 9.9626 Tf 18.152 0 Td [(A)-250(copy)-250(of)]TJ/F145 9.9626 Tf 45.37 0 Td [(a)]TJ/F84 9.9626 Tf 7.721 0 Td [(with)-250(a)-250(new)-250(storage)-250(format.)]TJ -46.725 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ +/F84 9.9626 Tf 18.152 0 Td [(A)-250(copy)-250(of)]TJ/F147 9.9626 Tf 45.37 0 Td [(a)]TJ/F84 9.9626 Tf 7.721 0 Td [(with)-250(a)-250(new)-250(storage)-250(format.)]TJ -46.725 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -184.596 -21.183 Td [(info)]TJ 0 g 0 G -/F84 9.9626 Tf 23.801 0 Td [(Return)-250(code.)]TJ 0.98 0 0 1 99.587 132.281 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 118.361 132.281 Tm [(mold)]TJ/F84 9.9626 Tf 0.98 0 0 1 141.713 132.281 Tm [(ar)18(guments)-249(may)-248(be)-249(employed)-249(to)-249(interface)-249(with)-249(special)-249(devices,)-250(such)-249(as)]TJ 1 0 0 1 99.895 120.326 Tm [(GPUs)-250(and)-250(other)-250(accelerators.)]TJ +/F84 9.9626 Tf 23.801 0 Td [(Return)-250(code.)]TJ 0.98 0 0 1 99.587 132.281 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 118.361 132.281 Tm [(mold)]TJ/F84 9.9626 Tf 0.98 0 0 1 141.713 132.281 Tm [(ar)18(guments)-249(may)-248(be)-249(employed)-249(to)-249(interface)-249(with)-249(special)-249(devices,)-250(such)-249(as)]TJ 1 0 0 1 99.895 120.326 Tm [(GPUs)-250(and)-250(other)-250(accelerators.)]TJ 0 g 0 G 166.875 -29.888 Td [(21)]TJ 0 g 0 G @@ -8362,7 +8371,7 @@ ET endstream endobj -1098 0 obj +1099 0 obj << /Length 5075 >> @@ -8374,7 +8383,7 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 20.921 -18.964 Td [(call)]TJ +/F147 9.9626 Tf 20.921 -18.964 Td [(call)]TJ 0 g 0 G [-525(a%csclip\050b,info[,&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -8382,9 +8391,9 @@ BT 15.691 -11.955 Td [(&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G - [-525(imin,imax,jmin,jmax,rscale,cscale]\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 165.649 654.656 Tm [(Returns)-212(the)-213(submatrix)]TJ/F145 9.9626 Tf 1 0 0 1 263.207 654.656 Tm [(A\050imin:imax,jmin:jmax\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 378.274 654.656 Tm [(,)-221(optionally)-212(r)18(escaling)-212(r)18(ow/-)]TJ 1 0 0 1 150.705 642.7 Tm [(col)-250(indices)-250(to)-250(the)-250(range)]TJ + [-525(imin,imax,jmin,jmax,rscale,cscale]\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 165.649 654.656 Tm [(Returns)-212(the)-213(submatrix)]TJ/F147 9.9626 Tf 1 0 0 1 263.207 654.656 Tm [(A\050imin:imax,jmin:jmax\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 378.274 654.656 Tm [(,)-221(optionally)-212(r)18(escaling)-212(r)18(ow/-)]TJ 1 0 0 1 150.705 642.7 Tm [(col)-250(indices)-250(to)-250(the)-250(range)]TJ 0.25 0.63 0.44 rg 0.25 0.63 0.44 RG -/F145 9.9626 Tf 103.849 0 Td [(1)]TJ +/F147 9.9626 Tf 103.849 0 Td [(1)]TJ 0 g 0 G [(:imax)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -8423,7 +8432,7 @@ BT 0 g 0 G 0 -19.38 Td [(a)]TJ 0 g 0 G -/F84 9.9626 Tf 9.962 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.556 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ +/F84 9.9626 Tf 9.962 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.556 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -77.917 -31.335 Td [(imin,imax,jmin,jmax)]TJ 0 g 0 G @@ -8438,7 +8447,7 @@ BT 0 g 0 G 0 -19.38 Td [(b)]TJ 0 g 0 G -/F84 9.9626 Tf 10.68 0 Td [(A)-250(copy)-250(of)-250(a)-250(submatrix)-250(of)]TJ/F145 9.9626 Tf 111.321 0 Td [(a)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ -102.713 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ +/F84 9.9626 Tf 10.68 0 Td [(A)-250(copy)-250(of)-250(a)-250(submatrix)-250(of)]TJ/F147 9.9626 Tf 111.321 0 Td [(a)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ -102.713 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -184.596 -19.38 Td [(info)]TJ 0 g 0 G @@ -8451,7 +8460,7 @@ Q BT /F75 9.9626 Tf 212.951 400.372 Td [(zeros)-250(\227)-250(Eliminate)-250(zero)-250(coef)18(\002cients)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -62.246 -18.964 Td [(call)]TJ +/F147 9.9626 Tf -62.246 -18.964 Td [(call)]TJ 0 g 0 G [-525(a%clean_zeros\050info\051)]TJ/F84 9.9626 Tf 14.944 -11.955 Td [(Eliminates)-250(zer)18(o)-250(coef)18(\002cients)-250(explicitly)-250(stor)18(ed)-250(in)-250(the)-250(input)-250(matrix.)]TJ 0 g 0 G @@ -8464,14 +8473,14 @@ BT 0 g 0 G 0 -19.38 Td [(a)]TJ 0 g 0 G -/F84 9.9626 Tf 9.963 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.555 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ +/F84 9.9626 Tf 9.963 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.555 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -77.917 -32.51 Td [(On)-250(Return)]TJ 0 g 0 G 0 g 0 G 0 -19.379 Td [(a)]TJ 0 g 0 G -/F84 9.9626 Tf 9.654 0 Td [(The)-250(matrix)]TJ/F145 9.9626 Tf 50.659 0 Td [(a)]TJ/F84 9.9626 Tf 7.721 0 Td [(without)-250(zer)18(o)-250(coef)18(\002cients.)]TJ -43.516 -11.956 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ +/F84 9.9626 Tf 9.654 0 Td [(The)-250(matrix)]TJ/F147 9.9626 Tf 50.659 0 Td [(a)]TJ/F84 9.9626 Tf 7.721 0 Td [(without)-250(zer)18(o)-250(coef)18(\002cients.)]TJ -43.516 -11.956 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -184.596 -19.38 Td [(info)]TJ 0 g 0 G @@ -8491,7 +8500,7 @@ ET endstream endobj -1104 0 obj +1105 0 obj << /Length 4701 >> @@ -8508,7 +8517,7 @@ Q BT /F75 9.9626 Tf 152.189 706.129 Td [(diag)-250(\227)-250(Get)-250(main)-250(diagonal)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -52.294 -19.329 Td [(call)]TJ +/F147 9.9626 Tf -52.294 -19.329 Td [(call)]TJ 0 g 0 G [-525(a%get_diag\050d,info\051)]TJ/F84 9.9626 Tf 14.944 -12.144 Td [(Returns)-250(a)-250(copy)-250(of)-250(the)-250(main)-250(diagonal.)]TJ 0 g 0 G @@ -8521,7 +8530,7 @@ BT 0 g 0 G 0 -20.679 Td [(a)]TJ 0 g 0 G -/F84 9.9626 Tf 9.963 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.555 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ +/F84 9.9626 Tf 9.963 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.555 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -77.918 -34.627 Td [(On)-250(Return)]TJ 0 g 0 G @@ -8541,9 +8550,9 @@ Q BT /F75 9.9626 Tf 155.497 472.745 Td [(diag)-250(\227)-250(Cut)-250(out)-250(main)-250(diagonal)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -55.602 -19.329 Td [(call)]TJ +/F147 9.9626 Tf -55.602 -19.329 Td [(call)]TJ 0 g 0 G - [-525(a%clip_diag\050b,info\051)]TJ/F84 9.9626 Tf 14.944 -12.144 Td [(Returns)-250(a)-250(copy)-250(of)]TJ/F145 9.9626 Tf 79.73 0 Td [(a)]TJ/F84 9.9626 Tf 7.721 0 Td [(without)-250(the)-250(main)-250(diagonal.)]TJ + [-525(a%clip_diag\050b,info\051)]TJ/F84 9.9626 Tf 14.944 -12.144 Td [(Returns)-250(a)-250(copy)-250(of)]TJ/F147 9.9626 Tf 79.73 0 Td [(a)]TJ/F84 9.9626 Tf 7.721 0 Td [(without)-250(the)-250(main)-250(diagonal.)]TJ 0 g 0 G /F75 9.9626 Tf -102.395 -20.49 Td [(T)90(ype:)]TJ 0 g 0 G @@ -8554,14 +8563,14 @@ BT 0 g 0 G 0 -20.679 Td [(a)]TJ 0 g 0 G -/F84 9.9626 Tf 9.963 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.555 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ +/F84 9.9626 Tf 9.963 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.555 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -77.918 -34.627 Td [(On)-250(Return)]TJ 0 g 0 G 0 g 0 G 0 -20.679 Td [(b)]TJ 0 g 0 G -/F84 9.9626 Tf 10.68 0 Td [(A)-250(copy)-250(of)]TJ/F145 9.9626 Tf 45.37 0 Td [(a)]TJ/F84 9.9626 Tf 7.721 0 Td [(without)-250(the)-250(main)-250(diagonal.)]TJ -39.253 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ +/F84 9.9626 Tf 10.68 0 Td [(A)-250(copy)-250(of)]TJ/F147 9.9626 Tf 45.37 0 Td [(a)]TJ/F84 9.9626 Tf 7.721 0 Td [(without)-250(the)-250(main)-250(diagonal.)]TJ -39.253 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -184.596 -20.679 Td [(info)]TJ 0 g 0 G @@ -8569,7 +8578,7 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 20.922 -19.329 Td [(call)]TJ +/F147 9.9626 Tf 20.922 -19.329 Td [(call)]TJ 0 g 0 G [-525(a%tril\050l,info[,&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -8577,9 +8586,9 @@ BT 15.691 -11.955 Td [(&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G - [-525(diag,imin,imax,jmin,jmax,rscale,cscale,u]\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 114.839 185.405 Tm [(Returns)-266(the)-266(lower)-266(triangular)-266(part)-266(of)-266(submatrix)]TJ/F145 9.9626 Tf 1 0 0 1 327.244 185.405 Tm [(A\050imin:imax,jmin:jmax\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 442.311 185.405 Tm [(,)]TJ 0.98 0 0 1 99.895 173.45 Tm [(optionally)-194(r)19(escaling)-194(r)18(ow/col)-194(indices)-194(to)-194(the)-193(range)]TJ + [-525(diag,imin,imax,jmin,jmax,rscale,cscale,u]\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 114.839 185.405 Tm [(Returns)-266(the)-266(lower)-266(triangular)-266(part)-266(of)-266(submatrix)]TJ/F147 9.9626 Tf 1 0 0 1 327.244 185.405 Tm [(A\050imin:imax,jmin:jmax\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 442.311 185.405 Tm [(,)]TJ 0.98 0 0 1 99.895 173.45 Tm [(optionally)-194(r)19(escaling)-194(r)18(ow/col)-194(indices)-194(to)-194(the)-193(range)]TJ 0.25 0.63 0.44 rg 0.25 0.63 0.44 RG -/F145 9.9626 Tf 1 0 0 1 308.511 173.45 Tm [(1)]TJ +/F147 9.9626 Tf 1 0 0 1 308.511 173.45 Tm [(1)]TJ 0 g 0 G [(:imax)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -8622,7 +8631,7 @@ ET endstream endobj -1108 0 obj +1109 0 obj << /Length 6535 >> @@ -8633,18 +8642,18 @@ stream BT /F75 9.9626 Tf 150.705 706.129 Td [(a)]TJ 0 g 0 G -/F84 9.9626 Tf 9.962 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.556 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ +/F84 9.9626 Tf 9.962 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.556 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -77.917 -30.706 Td [(diag)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 175.611 651.513 Tm [(Include)-258(diagonals)-258(up)-258(to)-258(this)-258(one;)]TJ/F145 9.9626 Tf 1 0 0 1 325.586 651.513 Tm [(diag)]TJ +/F84 9.9626 Tf 1.02 0 0 1 175.611 651.513 Tm [(Include)-258(diagonals)-258(up)-258(to)-258(this)-258(one;)]TJ/F147 9.9626 Tf 1 0 0 1 325.586 651.513 Tm [(diag)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G 0.25 0.63 0.44 rg 0.25 0.63 0.44 RG [(1)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 359.59 651.513 Tm [(means)-258(the)-258(\002rst)-258(super)18(diagonal,)]TJ/F145 9.9626 Tf 1 0 0 1 175.611 639.558 Tm [(diag)]TJ +/F84 9.9626 Tf 1.02 0 0 1 359.59 651.513 Tm [(means)-258(the)-258(\002rst)-258(super)18(diagonal,)]TJ/F147 9.9626 Tf 1 0 0 1 175.611 639.558 Tm [(diag)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=-)]TJ 0 g 0 G @@ -8666,11 +8675,11 @@ BT 0 g 0 G 0 -18.75 Td [(l)]TJ 0 g 0 G -/F84 9.9626 Tf 7.91 0 Td [(A)-250(copy)-250(of)-250(the)-250(lower)-250(triangle)-250(of)]TJ/F145 9.9626 Tf 137.333 0 Td [(a)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ -125.956 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ +/F84 9.9626 Tf 7.91 0 Td [(A)-250(copy)-250(of)-250(the)-250(lower)-250(triangle)-250(of)]TJ/F147 9.9626 Tf 137.333 0 Td [(a)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ -125.956 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -184.596 -18.75 Td [(u)]TJ 0 g 0 G -/F84 9.9626 Tf 10.74 0 Td [(\050optional\051)-250(A)-250(copy)-250(of)-250(the)-250(upper)-250(triangle)-250(of)]TJ/F145 9.9626 Tf 184.485 0 Td [(a)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ -175.938 -11.956 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ +/F84 9.9626 Tf 10.74 0 Td [(\050optional\051)-250(A)-250(copy)-250(of)-250(the)-250(upper)-250(triangle)-250(of)]TJ/F147 9.9626 Tf 184.485 0 Td [(a)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ -175.938 -11.956 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -184.596 -18.749 Td [(info)]TJ 0 g 0 G @@ -8678,7 +8687,7 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 20.921 -18.964 Td [(call)]TJ +/F147 9.9626 Tf 20.921 -18.964 Td [(call)]TJ 0 g 0 G [-525(a%triu\050u,info[,&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -8686,9 +8695,9 @@ BT 15.691 -11.955 Td [(&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G - [-525(diag,imin,imax,jmin,jmax,rscale,cscale,l]\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 165.649 414.476 Tm [(Returns)-247(the)-247(upper)-247(triangular)-246(part)-247(of)-247(submatrix)]TJ/F145 9.9626 Tf 1 0 0 1 378.053 414.476 Tm [(A\050imin:imax,jmin:jmax\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 493.121 414.476 Tm [(,)]TJ 0.98 0 0 1 150.705 402.521 Tm [(optionally)-194(r)19(escaling)-194(r)18(ow/col)-194(indices)-194(to)-193(the)-194(range)]TJ + [-525(diag,imin,imax,jmin,jmax,rscale,cscale,l]\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 165.649 414.476 Tm [(Returns)-247(the)-247(upper)-247(triangular)-246(part)-247(of)-247(submatrix)]TJ/F147 9.9626 Tf 1 0 0 1 378.053 414.476 Tm [(A\050imin:imax,jmin:jmax\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 493.121 414.476 Tm [(,)]TJ 0.98 0 0 1 150.705 402.521 Tm [(optionally)-194(r)19(escaling)-194(r)18(ow/col)-194(indices)-194(to)-193(the)-194(range)]TJ 0.25 0.63 0.44 rg 0.25 0.63 0.44 RG -/F145 9.9626 Tf 1 0 0 1 359.321 402.521 Tm [(1)]TJ +/F147 9.9626 Tf 1 0 0 1 359.321 402.521 Tm [(1)]TJ 0 g 0 G [(:imax)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -8727,18 +8736,18 @@ BT 0 g 0 G 0 -18.75 Td [(a)]TJ 0 g 0 G -/F84 9.9626 Tf 9.962 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.556 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ +/F84 9.9626 Tf 9.962 0 Td [(the)-250(sparse)-250(matrix.)]TJ 14.556 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ -159.689 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -77.917 -30.706 Td [(diag)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 175.611 280.876 Tm [(Include)-258(diagonals)-258(up)-258(to)-258(this)-258(one;)]TJ/F145 9.9626 Tf 1 0 0 1 325.586 280.876 Tm [(diag)]TJ +/F84 9.9626 Tf 1.02 0 0 1 175.611 280.876 Tm [(Include)-258(diagonals)-258(up)-258(to)-258(this)-258(one;)]TJ/F147 9.9626 Tf 1 0 0 1 325.586 280.876 Tm [(diag)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G 0.25 0.63 0.44 rg 0.25 0.63 0.44 RG [(1)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 359.59 280.876 Tm [(means)-258(the)-258(\002rst)-258(super)18(diagonal,)]TJ/F145 9.9626 Tf 1 0 0 1 175.611 268.92 Tm [(diag)]TJ +/F84 9.9626 Tf 1.02 0 0 1 359.59 280.876 Tm [(means)-258(the)-258(\002rst)-258(super)18(diagonal,)]TJ/F147 9.9626 Tf 1 0 0 1 175.611 268.92 Tm [(diag)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=-)]TJ 0 g 0 G @@ -8760,11 +8769,11 @@ BT 0 g 0 G 0 -18.75 Td [(u)]TJ 0 g 0 G -/F84 9.9626 Tf 10.68 0 Td [(A)-250(copy)-250(of)-250(the)-250(upper)-250(triangle)-250(of)]TJ/F145 9.9626 Tf 138.668 0 Td [(a)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ -130.06 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ +/F84 9.9626 Tf 10.68 0 Td [(A)-250(copy)-250(of)-250(the)-250(upper)-250(triangle)-250(of)]TJ/F147 9.9626 Tf 138.668 0 Td [(a)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ -130.06 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -184.596 -18.75 Td [(l)]TJ 0 g 0 G -/F84 9.9626 Tf 7.97 0 Td [(\050optional\051)-250(A)-250(copy)-250(of)-250(the)-250(lower)-250(triangle)-250(of)]TJ/F145 9.9626 Tf 183.151 0 Td [(a)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ -171.833 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F145 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ +/F84 9.9626 Tf 7.97 0 Td [(\050optional\051)-250(A)-250(copy)-250(of)-250(the)-250(lower)-250(triangle)-250(of)]TJ/F147 9.9626 Tf 183.151 0 Td [(a)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ -171.833 -11.955 Td [(A)-250(variable)-250(of)-250(type)]TJ/F147 9.9626 Tf 81.623 0 Td [(psb_Tspmat_type)]TJ/F84 9.9626 Tf 78.455 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -184.596 -18.75 Td [(info)]TJ 0 g 0 G @@ -8776,7 +8785,7 @@ ET endstream endobj -1114 0 obj +1115 0 obj << /Length 7921 >> @@ -8807,7 +8816,7 @@ Q BT /F75 9.9626 Tf 192 706.129 Td [(default)-250(\227)-250(Set)-250(default)-250(storage)-250(format)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -92.105 -18.964 Td [(call)]TJ +/F147 9.9626 Tf -92.105 -18.964 Td [(call)]TJ 0 g 0 G [-1050(psb_set_mat_default\050a\051)]TJ 0 g 0 G @@ -8822,11 +8831,11 @@ BT 0 g 0 G /F84 9.9626 Tf 0.988 0 0 1 109.858 628.52 Tm [(a)-253(variable)-253(of)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 1 0 0 1 166.078 628.52 Tm [(class)]TJ +/F147 9.9626 Tf 1 0 0 1 166.078 628.52 Tm [(class)]TJ 0 g 0 G [(\050psb_T_base_sparse_mat\051)]TJ/F84 9.9626 Tf 0.988 0 0 1 315.017 628.52 Tm [(r)18(equesting)-253(a)-252(new)-253(default)-253(stor)18(-)]TJ 1 0 0 1 124.802 616.564 Tm [(age)-250(format.)]TJ -0.309 -11.955 Td [(T)90(ype:)-310(r)18(equir)18(ed.)]TJ/F75 9.9626 Tf -24.598 -26.815 Td [(3.2.18)-1000(clone)-250(\227)-250(Clone)-250(current)-250(object)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 0 -18.964 Td [(call)]TJ +/F147 9.9626 Tf 0 -18.964 Td [(call)]TJ 0 g 0 G [-1050(a%clone\050b,info\051)]TJ 0 g 0 G @@ -8994,56 +9003,56 @@ q Q 0 g 0 G BT -/F84 9.9626 Tf 1.02 0 0 1 174.296 263.738 Tm [(Update)-317(strategy)-316(based)-317(on)-317(additional)-317(permutation)-316(data)-317(\050see)]TJ 1 0 0 1 124.802 251.783 Tm [(tools)-250(r)18(outine)-250(description\051.)]TJ/F75 11.9552 Tf -24.907 -28.807 Td [(3.3)-1000(Dense)-250(V)111(ector)-250(Data)-250(Structure)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 204.012 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 119.612 204.012 Tm [(psb)]TJ +/F84 9.9626 Tf 1.02 0 0 1 174.296 263.738 Tm [(Update)-317(strategy)-316(based)-317(on)-317(additional)-317(permutation)-316(data)-317(\050see)]TJ 1 0 0 1 124.802 251.783 Tm [(tools)-250(r)18(outine)-250(description\051.)]TJ/F75 11.9552 Tf -24.907 -28.807 Td [(3.3)-1000(Dense)-250(V)111(ector)-250(Data)-250(Structure)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 204.012 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 119.612 204.012 Tm [(psb)]TJ ET q 1 0 0 1 135.931 204.211 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 139.069 204.012 Td [(T)]TJ +/F147 9.9626 Tf 139.069 204.012 Td [(T)]TJ ET q 1 0 0 1 144.927 204.211 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 148.065 204.012 Td [(vect)]TJ +/F147 9.9626 Tf 148.065 204.012 Td [(vect)]TJ ET q 1 0 0 1 169.614 204.211 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 172.752 204.012 Td [(type)]TJ/F84 9.9626 Tf 1.02 0 0 1 196.689 204.012 Tm [(data)-297(str)8(uctur)18(e)-297(encapsulates)-296(the)-297(dense)-297(vectors)-296(in)-297(a)-297(way)]TJ 0.98 0 0 1 99.895 192.057 Tm [(similar)-231(t)1(o)-231(sparse)-230(matrices,)-236(i.e.)-308(including)-230(a)-231(base)-230(type)]TJ/F145 9.9626 Tf 1 0 0 1 323.065 192.057 Tm [(psb)]TJ +/F147 9.9626 Tf 172.752 204.012 Td [(type)]TJ/F84 9.9626 Tf 1.02 0 0 1 196.689 204.012 Tm [(data)-297(str)8(uctur)18(e)-297(encapsulates)-296(the)-297(dense)-297(vectors)-296(in)-297(a)-297(way)]TJ 0.98 0 0 1 99.895 192.057 Tm [(similar)-231(t)1(o)-231(sparse)-230(matrices,)-236(i.e.)-308(including)-230(a)-231(base)-230(type)]TJ/F147 9.9626 Tf 1 0 0 1 323.065 192.057 Tm [(psb)]TJ ET q 1 0 0 1 339.383 192.256 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 342.522 192.057 Td [(T)]TJ +/F147 9.9626 Tf 342.522 192.057 Td [(T)]TJ ET q 1 0 0 1 348.38 192.256 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 351.518 192.057 Td [(base)]TJ +/F147 9.9626 Tf 351.518 192.057 Td [(base)]TJ ET q 1 0 0 1 373.067 192.256 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 376.205 192.057 Td [(vect)]TJ +/F147 9.9626 Tf 376.205 192.057 Td [(vect)]TJ ET q 1 0 0 1 397.754 192.256 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 400.892 192.057 Td [(type)]TJ/F84 9.9626 Tf 0.98 0 0 1 421.814 192.057 Tm [(.)-308(The)]TJ 1.016 0 0 1 99.895 180.101 Tm [(user)-245(will)-245(not,)-245(in)-245(general,)-245(access)-245(the)-244(vector)-245(components)-245(dir)18(ectly)109(,)-245(but)-245(rather)-245(via)]TJ 0.994 0 0 1 99.895 168.146 Tm [(the)-252(r)18(outines)-252(of)-253(sec.)]TJ +/F147 9.9626 Tf 400.892 192.057 Td [(type)]TJ/F84 9.9626 Tf 0.98 0 0 1 421.814 192.057 Tm [(.)-308(The)]TJ 1.016 0 0 1 99.895 180.101 Tm [(user)-245(will)-245(not,)-245(in)-245(general,)-245(access)-245(the)-244(vector)-245(components)-245(dir)18(ectly)109(,)-245(but)-245(rather)-245(via)]TJ 0.994 0 0 1 99.895 168.146 Tm [(the)-252(r)18(outines)-252(of)-253(sec.)]TJ 0 0 1 rg 0 0 1 RG [-252(6)]TJ 0 g 0 G @@ -9051,7 +9060,7 @@ BT 0 0 1 rg 0 0 1 RG [-266(3)]TJ 0 g 0 G - [-265(wher)18(e)]TJ/F145 9.9626 Tf 1 0 0 1 332.473 132.281 Tm [(T)]TJ/F84 9.9626 Tf 1.02 0 0 1 340.4 132.281 Tm [(is)-265(a)-266(placeholder)-265(for)-265(the)]TJ 1 0 0 1 99.895 120.326 Tm [(data)-250(type)-250(and)-250(pr)18(ecision)-250(variants)]TJ + [-265(wher)18(e)]TJ/F147 9.9626 Tf 1 0 0 1 332.473 132.281 Tm [(T)]TJ/F84 9.9626 Tf 1.02 0 0 1 340.4 132.281 Tm [(is)-265(a)-266(placeholder)-265(for)-265(the)]TJ 1 0 0 1 99.895 120.326 Tm [(data)-250(type)-250(and)-250(pr)18(ecision)-250(variants)]TJ 0 g 0 G 166.875 -29.888 Td [(25)]TJ 0 g 0 G @@ -9059,7 +9068,7 @@ ET endstream endobj -1121 0 obj +1122 0 obj << /Length 5172 >> @@ -9086,7 +9095,7 @@ BT 0 g 0 G /F75 9.9626 Tf -12.174 -20.358 Td [(Z)]TJ 0 g 0 G -/F84 9.9626 Tf 11.626 0 Td [(Double)-250(pr)18(ecision)-250(complex.)]TJ 0.987 0 0 1 150.396 604.444 Tm [(The)-252(actual)-252(data)-252(is)-252(contained)-252(in)-252(the)-253(polymorphic)-252(component)]TJ/F145 9.9626 Tf 1 0 0 1 412.002 604.444 Tm [(v%v)]TJ/F84 9.9626 Tf 0.987 0 0 1 427.693 604.444 Tm [(;)-253(t)1(he)-253(separation)]TJ 1.02 0 0 1 150.705 592.489 Tm [(between)-301(the)-301(application)-301(and)-300(the)-301(actual)-301(data)-301(is)-301(essential)-301(for)-301(cases)-301(wher)18(e)-301(it)-301(is)]TJ 1.02 0 0 1 150.705 580.534 Tm [(necessary)-259(to)-259(link)-260(to)-259(data)-259(storage)-259(made)-259(available)-259(elsewher)17(e)-259(outside)-259(the)-259(dir)17(ect)]TJ 0.995 0 0 1 150.705 568.579 Tm [(contr)18(ol)-250(of)-250(the)-250(compiler/appl)1(ication,)-251(e.g.)-311(data)-250(stor)18(ed)-249(in)-250(a)-250(graphics)-250(accelerator)-74('s)]TJ 1 0 0 1 150.406 556.624 Tm [(private)-250(memory)111(.)]TJ +/F84 9.9626 Tf 11.626 0 Td [(Double)-250(pr)18(ecision)-250(complex.)]TJ 0.987 0 0 1 150.396 604.444 Tm [(The)-252(actual)-252(data)-252(is)-252(contained)-252(in)-252(the)-253(polymorphic)-252(component)]TJ/F147 9.9626 Tf 1 0 0 1 412.002 604.444 Tm [(v%v)]TJ/F84 9.9626 Tf 0.987 0 0 1 427.693 604.444 Tm [(;)-253(t)1(he)-253(separation)]TJ 1.02 0 0 1 150.705 592.489 Tm [(between)-301(the)-301(application)-301(and)-300(the)-301(actual)-301(data)-301(is)-301(essential)-301(for)-301(cases)-301(wher)18(e)-301(it)-301(is)]TJ 1.02 0 0 1 150.705 580.534 Tm [(necessary)-259(to)-259(link)-260(to)-259(data)-259(storage)-259(made)-259(available)-259(elsewher)17(e)-259(outside)-259(the)-259(dir)17(ect)]TJ 0.995 0 0 1 150.705 568.579 Tm [(contr)18(ol)-250(of)-250(the)-250(compiler/appl)1(ication,)-251(e.g.)-311(data)-250(stor)18(ed)-249(in)-250(a)-250(graphics)-250(accelerator)-74('s)]TJ 1 0 0 1 150.406 556.624 Tm [(private)-250(memory)111(.)]TJ 0 g 0 G 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG @@ -9101,7 +9110,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 163.108 525.005 Td [(type)]TJ +/F235 8.9664 Tf 163.108 525.005 Td [(type)]TJ 0 g 0 G [-525(psb_T_base_vect_type)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -9170,7 +9179,7 @@ q []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F75 9.9626 Tf 198.017 358.719 Td [(nrows)-250(\227)-250(Get)-250(number)-250(of)-250(rows)-250(in)-250(a)-250(dense)-250(vector)]TJ/F145 9.9626 Tf -47.312 -19.173 Td [(nr)]TJ +/F75 9.9626 Tf 198.017 358.719 Td [(nrows)-250(\227)-250(Get)-250(number)-250(of)-250(rows)-250(in)-250(a)-250(dense)-250(vector)]TJ/F147 9.9626 Tf -47.312 -19.173 Td [(nr)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -9196,7 +9205,7 @@ BT 0 g 0 G 0 -20.358 Td [(Function)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 72.468 0 Td [(The)-250(number)-250(of)-250(r)18(ows)-250(of)-250(dense)-250(vector)]TJ/F145 9.9626 Tf 161.273 0 Td [(v)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ/F75 9.9626 Tf -238.971 -27.757 Td [(3.3.3)-1000(sizeof)-250(\227)-250(Get)-250(memory)-250(occupation)-250(in)-250(bytes)-250(of)-250(a)-250(dense)-250(vector)]TJ/F145 9.9626 Tf 0 -19.174 Td [(memory_size)]TJ +/F84 9.9626 Tf 72.468 0 Td [(The)-250(number)-250(of)-250(r)18(ows)-250(of)-250(dense)-250(vector)]TJ/F147 9.9626 Tf 161.273 0 Td [(v)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ/F75 9.9626 Tf -238.971 -27.757 Td [(3.3.3)-1000(sizeof)-250(\227)-250(Get)-250(memory)-250(occupation)-250(in)-250(bytes)-250(of)-250(a)-250(dense)-250(vector)]TJ/F147 9.9626 Tf 0 -19.174 Td [(memory_size)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -9219,7 +9228,7 @@ ET endstream endobj -1127 0 obj +1128 0 obj << /Length 3997 >> @@ -9241,7 +9250,7 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 5.231 -20.898 Td [(call)]TJ +/F147 9.9626 Tf 5.231 -20.898 Td [(call)]TJ 0 g 0 G [-1050(v%set\050alpha[,first,last]\051)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -9286,7 +9295,7 @@ BT 0 0 1 rg 0 0 1 RG [-250(1)]TJ 0 g 0 G - [(.)]TJ 1.018 0 0 1 99.895 217.975 Tm [(Note)-246(that)-246(a)-245(call)-246(to)]TJ/F145 9.9626 Tf 1 0 0 1 181.467 217.975 Tm [(v%zero\050\051)]TJ/F84 9.9626 Tf 1.018 0 0 1 225.803 217.975 Tm [(is)-246(pr)18(ovided)-246(as)-246(a)-246(shorth)1(a)-1(n)1(d,)-246(but)-246(is)-246(equivalent)-246(to)-246(a)]TJ 1.02 0 0 1 99.895 206.02 Tm [(call)-293(to)]TJ/F145 9.9626 Tf 1 0 0 1 130.212 206.02 Tm [(v%set\050zero\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 190.721 206.02 Tm [(with)-293(the)]TJ/F145 9.9626 Tf 1 0 0 1 231.423 206.02 Tm [(zero)]TJ/F84 9.9626 Tf 1.02 0 0 1 255.319 206.02 Tm [(constant)-293(having)-292(the)-293(appr)18(opriate)-293(type)-293(and)]TJ 1 0 0 1 99.895 194.064 Tm [(kind.)]TJ + [(.)]TJ 1.018 0 0 1 99.895 217.975 Tm [(Note)-246(that)-246(a)-245(call)-246(to)]TJ/F147 9.9626 Tf 1 0 0 1 181.467 217.975 Tm [(v%zero\050\051)]TJ/F84 9.9626 Tf 1.018 0 0 1 225.803 217.975 Tm [(is)-246(pr)18(ovided)-246(as)-246(a)-246(shorth)1(a)-1(n)1(d,)-246(but)-246(is)-246(equivalent)-246(to)-246(a)]TJ 1.02 0 0 1 99.895 206.02 Tm [(call)-293(to)]TJ/F147 9.9626 Tf 1 0 0 1 130.212 206.02 Tm [(v%set\050zero\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 190.721 206.02 Tm [(with)-293(the)]TJ/F147 9.9626 Tf 1 0 0 1 231.423 206.02 Tm [(zero)]TJ/F84 9.9626 Tf 1.02 0 0 1 255.319 206.02 Tm [(constant)-293(having)-292(the)-293(appr)18(opriate)-293(type)-293(and)]TJ 1 0 0 1 99.895 194.064 Tm [(kind.)]TJ 0 g 0 G /F75 9.9626 Tf 0 -25.91 Td [(On)-250(Return)]TJ 0 g 0 G @@ -9301,7 +9310,7 @@ ET endstream endobj -1134 0 obj +1135 0 obj << /Length 4797 >> @@ -9319,7 +9328,7 @@ BT /F75 9.9626 Tf 198.017 706.129 Td [(vect)-250(\227)-250(Get)-250(a)-250(copy)-250(of)-250(the)-250(vector)-250(contents)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -47.312 -19.66 Td [(extv)-525(=)-525(v%get_vect\050[n]\051)]TJ +/F147 9.9626 Tf -47.312 -19.66 Td [(extv)-525(=)-525(v%get_vect\050[n]\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -22.994 Td [(T)90(ype:)]TJ 0 g 0 G @@ -9344,7 +9353,7 @@ BT /F84 9.9626 Tf 1.02 0 0 1 223.093 495.259 Tm [(An)-283(allocatable)-283(array)-283(holding)-283(a)-282(copy)-283(of)-283(the)-283(dense)-283(vector)-283(con-)]TJ 1.002 0 0 1 175.611 483.304 Tm [(tents.)-310(If)-249(the)-250(ar)18(gument)]TJ/F78 9.9626 Tf 1 0 0 1 273.652 483.304 Tm [(n)]TJ/F84 9.9626 Tf 1.002 0 0 1 281.807 483.304 Tm [(is)-250(speci\002ed,)-249(the)-250(size)-250(of)-249(the)-250(r)18(eturned)-249(array)-250(equals)]TJ 1.02 0 0 1 175.611 471.349 Tm [(the)-299(minimum)-299(between)]TJ/F78 9.9626 Tf 1 0 0 1 281.747 471.349 Tm [(n)]TJ/F84 9.9626 Tf 1.02 0 0 1 290.45 471.349 Tm [(and)-299(the)-299(internal)-299(size)-299(of)-300(the)-299(vector)73(,)-313(or)-299(0)-299(if)]TJ/F78 9.9626 Tf 1 0 0 1 478.447 471.349 Tm [(n)]TJ/F84 9.9626 Tf 1.02 0 0 1 487.15 471.349 Tm [(is)]TJ 0.981 0 0 1 175.611 459.394 Tm [(negative;)-256(otherwise,)-255(the)-255(size)-256(of)-255(the)-255(array)-256(is)-255(the)-255(same)-256(as)-255(the)-255(internal)-256(size)-255(of)]TJ 1 0 0 1 175.611 447.438 Tm [(the)-250(vector)74(.)]TJ/F75 9.9626 Tf -24.906 -29.183 Td [(3.3.6)-1000(clone)-250(\227)-250(Clone)-250(current)-250(object)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 0 -19.659 Td [(call)-1050(x%clone\050y,info\051)]TJ +/F147 9.9626 Tf 0 -19.659 Td [(call)-1050(x%clone\050y,info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -22.995 Td [(T)90(ype:)]TJ 0 g 0 G @@ -9366,25 +9375,25 @@ BT 0 g 0 G /F75 9.9626 Tf -10.132 -21.361 Td [(info)]TJ 0 g 0 G -/F84 9.9626 Tf 23.8 0 Td [(Return)-250(code.)]TJ/F75 11.9552 Tf -23.8 -31.176 Td [(3.4)-1000(Preconditioner)-250(data)-250(structure)]TJ/F84 9.9626 Tf 1.02 0 0 1 150.705 192.416 Tm [(Our)-329(base)-328(library)-329(of)18(fers)-328(support)-329(for)-328(simple)-329(well)-328(known)-329(pr)18(econditioners)-329(like)]TJ 1 0 0 1 150.705 180.46 Tm [(Diagonal)-250(Scaling)-250(or)-250(Block)-250(Jacobi)-250(with)-250(incomplete)-250(factorization)-250(ILU\0500\051.)]TJ 1.02 0 0 1 165.649 168.146 Tm [(A)-258(pr)18(econditioner)-257(is)-258(held)-257(in)-258(the)]TJ/F145 9.9626 Tf 1 0 0 1 305.999 168.146 Tm [(psb)]TJ +/F84 9.9626 Tf 23.8 0 Td [(Return)-250(code.)]TJ/F75 11.9552 Tf -23.8 -31.176 Td [(3.4)-1000(Preconditioner)-250(data)-250(structure)]TJ/F84 9.9626 Tf 1.02 0 0 1 150.705 192.416 Tm [(Our)-329(base)-328(library)-329(of)18(fers)-328(support)-329(for)-328(simple)-329(well)-328(known)-329(pr)18(econditioners)-329(like)]TJ 1 0 0 1 150.705 180.46 Tm [(Diagonal)-250(Scaling)-250(or)-250(Block)-250(Jacobi)-250(with)-250(incomplete)-250(factorization)-250(ILU\0500\051.)]TJ 1.02 0 0 1 165.649 168.146 Tm [(A)-258(pr)18(econditioner)-257(is)-258(held)-257(in)-258(the)]TJ/F147 9.9626 Tf 1 0 0 1 305.999 168.146 Tm [(psb)]TJ ET q 1 0 0 1 322.318 168.346 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 325.456 168.146 Td [(Tprec)]TJ +/F147 9.9626 Tf 325.456 168.146 Td [(Tprec)]TJ ET q 1 0 0 1 352.235 168.346 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 355.374 168.146 Td [(type)]TJ/F84 9.9626 Tf 1.02 0 0 1 378.912 168.146 Tm [(data)-258(str)8(uctur)18(e)-258(r)18(eported)-257(in)]TJ 0.994 0 0 1 150.705 156.191 Tm [(\002gur)18(e)]TJ +/F147 9.9626 Tf 355.374 168.146 Td [(type)]TJ/F84 9.9626 Tf 1.02 0 0 1 378.912 168.146 Tm [(data)-258(str)8(uctur)18(e)-258(r)18(eported)-257(in)]TJ 0.994 0 0 1 150.705 156.191 Tm [(\002gur)18(e)]TJ 0 0 1 rg 0 0 1 RG [-252(4)]TJ 0 g 0 G - [(.)-315(The)]TJ/F145 9.9626 Tf 1 0 0 1 208.773 156.191 Tm [(psb_Tprec_type)]TJ/F84 9.9626 Tf 0.994 0 0 1 284.498 156.191 Tm [(data)-252(type)-253(may)-252(contain)-253(a)-252(simple)-253(pr)18(econditioning)]TJ 1.02 0 0 1 150.705 144.236 Tm [(matrix)-255(with)-254(the)-255(associated)-255(communication)-254(descriptor)72(.)-333(The)-254(internal)-255(pr)18(econdi-)]TJ 1.02 0 0 1 150.705 132.281 Tm [(tioner)-249(is)-250(allocated)-249(appr)17(opriately)-249(with)-250(the)-249(dynamic)-250(type)-249(corr)17(esponding)-249(to)-250(the)]TJ 1 0 0 1 150.705 120.326 Tm [(desir)18(ed)-250(pr)18(econditioner)74(.)]TJ + [(.)-315(The)]TJ/F147 9.9626 Tf 1 0 0 1 208.773 156.191 Tm [(psb_Tprec_type)]TJ/F84 9.9626 Tf 0.994 0 0 1 284.498 156.191 Tm [(data)-252(type)-253(may)-252(contain)-253(a)-252(simple)-253(pr)18(econditioning)]TJ 1.02 0 0 1 150.705 144.236 Tm [(matrix)-255(with)-254(the)-255(associated)-255(communication)-254(descriptor)72(.)-333(The)-254(internal)-255(pr)18(econdi-)]TJ 1.02 0 0 1 150.705 132.281 Tm [(tioner)-249(is)-250(allocated)-249(appr)17(opriately)-249(with)-250(the)-249(dynamic)-250(type)-249(corr)17(esponding)-249(to)-250(the)]TJ 1 0 0 1 150.705 120.326 Tm [(desir)18(ed)-250(pr)18(econditioner)74(.)]TJ 0 g 0 G 166.874 -29.888 Td [(28)]TJ 0 g 0 G @@ -9392,7 +9401,7 @@ ET endstream endobj -1140 0 obj +1141 0 obj << /Length 4357 >> @@ -9412,7 +9421,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 112.299 699.454 Td [(type)]TJ +/F235 8.9664 Tf 112.299 699.454 Td [(type)]TJ 0 g 0 G [-525(psb_Tprec_type)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -9449,46 +9458,46 @@ BT 0 g 0 G [(,)-272(we)-267(have)-266(a)-267(number)-267(of)-267(sorting)-266(utilities;)-278(the)]TJ 1 0 0 1 99.895 572.49 Tm [(heap)-250(sort)-250(is)-250(implemented)-250(in)-250(terms)-250(of)-250(heaps)-250(having)-250(the)-250(following)-250(signatur)18(es:)]TJ 0 g 0 G -/F145 9.9626 Tf 0 -19.925 Td [(psb)]TJ +/F147 9.9626 Tf 0 -19.925 Td [(psb)]TJ ET q 1 0 0 1 116.214 552.764 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 119.352 552.565 Td [(T)]TJ +/F147 9.9626 Tf 119.352 552.565 Td [(T)]TJ ET q 1 0 0 1 125.21 552.764 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 128.348 552.565 Td [(heap)]TJ +/F147 9.9626 Tf 128.348 552.565 Td [(heap)]TJ 0 g 0 G -/F84 9.9626 Tf 1.007 0 0 1 154.251 552.565 Tm [(:)-308(a)-249(heap)-249(containing)-248(elements)-249(of)-248(type)-249(T)74(,)-249(wher)18(e)-248(T)-249(can)-249(be)]TJ/F145 9.9626 Tf 1 0 0 1 396.533 552.565 Tm [(i,s,c,d,z)]TJ/F84 9.9626 Tf -271.731 -11.955 Td [(for)-250(integer)74(,)-250(r)18(eal)-250(and)-250(complex)-250(data;)]TJ +/F84 9.9626 Tf 1.007 0 0 1 154.251 552.565 Tm [(:)-308(a)-249(heap)-249(containing)-248(elements)-249(of)-248(type)-249(T)74(,)-249(wher)18(e)-248(T)-249(can)-249(be)]TJ/F147 9.9626 Tf 1 0 0 1 396.533 552.565 Tm [(i,s,c,d,z)]TJ/F84 9.9626 Tf -271.731 -11.955 Td [(for)-250(integer)74(,)-250(r)18(eal)-250(and)-250(complex)-250(data;)]TJ 0 g 0 G -/F145 9.9626 Tf -24.907 -19.925 Td [(psb)]TJ +/F147 9.9626 Tf -24.907 -19.925 Td [(psb)]TJ ET q 1 0 0 1 116.214 520.884 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 119.352 520.685 Td [(T)]TJ +/F147 9.9626 Tf 119.352 520.685 Td [(T)]TJ ET q 1 0 0 1 125.21 520.884 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 128.348 520.685 Td [(idx)]TJ +/F147 9.9626 Tf 128.348 520.685 Td [(idx)]TJ ET q 1 0 0 1 144.667 520.884 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 147.805 520.685 Td [(heap)]TJ +/F147 9.9626 Tf 147.805 520.685 Td [(heap)]TJ 0 g 0 G /F84 9.9626 Tf 0.982 0 0 1 173.708 520.685 Tm [(:)-316(a)-255(heap)-255(containing)-255(elements)-255(of)-255(type)-255(T)76(,)-255(as)-255(above,)-255(together)-255(with)]TJ 1 0 0 1 124.802 508.729 Tm [(an)-250(integer)-250(index.)]TJ -24.907 -19.925 Td [(Given)-250(a)-250(heap)-250(object,)-250(the)-250(following)-250(methods)-250(ar)18(e)-250(de\002ned)-250(on)-250(it:)]TJ 0 g 0 G @@ -9529,7 +9538,7 @@ ET endstream endobj -1144 0 obj +1145 0 obj << /Length 159 >> @@ -9545,7 +9554,7 @@ ET endstream endobj -1155 0 obj +1156 0 obj << /Length 7647 >> @@ -9560,11 +9569,11 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 151.016 706.129 Td [(geaxpby)-250(\227)-250(General)-250(Dense)-250(Matrix)-250(Sum)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 686.94 Tm [(This)-302(subr)18(outine)-302(is)-302(an)-301(interface)-302(to)-302(the)-302(computatio)1(nal)-302(kernel)-302(for)-302(dense)-302(matrix)]TJ 1 0 0 1 99.895 674.985 Tm [(sum:)]TJ/F78 9.9626 Tf 143.149 -12.304 Td [(y)]TJ/F190 10.3811 Tf 7.998 0 Td [(\040)]TJ/F147 9.9626 Tf 13.398 0 Td [(a)]TJ/F78 9.9626 Tf 7.615 0 Td [(x)]TJ/F192 10.3811 Tf 7.267 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ +/F75 11.9552 Tf 151.016 706.129 Td [(geaxpby)-250(\227)-250(General)-250(Dense)-250(Matrix)-250(Sum)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 686.94 Tm [(This)-302(subr)18(outine)-302(is)-302(an)-301(interface)-302(to)-302(the)-302(computatio)1(nal)-302(kernel)-302(for)-302(dense)-302(matrix)]TJ 1 0 0 1 99.895 674.985 Tm [(sum:)]TJ/F78 9.9626 Tf 143.149 -12.304 Td [(y)]TJ/F195 10.3811 Tf 7.998 0 Td [(\040)]TJ/F151 9.9626 Tf 13.398 0 Td [(a)]TJ/F78 9.9626 Tf 7.615 0 Td [(x)]TJ/F197 10.3811 Tf 7.267 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -175.406 -18.398 Td [(call)]TJ +/F147 9.9626 Tf -175.406 -18.398 Td [(call)]TJ 0 g 0 G [-525(psb_geaxpby\050alpha,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -9591,7 +9600,7 @@ q []0 d 0 J 0.398 w 0 0 m 189.647 0 l S Q BT -/F78 9.9626 Tf 183.199 621.114 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(,)]TJ/F78 9.9626 Tf 5.106 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(,)]TJ/F147 9.9626 Tf 5.106 0 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(,)]TJ/F147 9.9626 Tf 5.355 0 Td [(b)]TJ/F75 9.9626 Tf 89.358 0 Td [(Subroutine)]TJ +/F78 9.9626 Tf 183.199 621.114 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(,)]TJ/F78 9.9626 Tf 5.106 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(,)]TJ/F151 9.9626 Tf 5.106 0 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(,)]TJ/F151 9.9626 Tf 5.355 0 Td [(b)]TJ/F75 9.9626 Tf 89.358 0 Td [(Subroutine)]TJ ET q 1 0 0 1 176.928 617.328 cm @@ -9647,7 +9656,7 @@ BT 0 g 0 G 0 -20.391 Td [(alpha)]TJ 0 g 0 G -/F84 9.9626 Tf 30.436 0 Td [(the)-250(scalar)]TJ/F147 9.9626 Tf 44.368 0 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(.)]TJ -55.282 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(number)-250(of)-250(the)-250(data)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ +/F84 9.9626 Tf 30.436 0 Td [(the)-250(scalar)]TJ/F151 9.9626 Tf 44.368 0 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(.)]TJ -55.282 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(number)-250(of)-250(the)-250(data)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG [-250(1)]TJ 0 g 0 G @@ -9657,28 +9666,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.614 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -165.875 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 348.869 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-247(an)-248(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 369.545 348.869 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 369.545 348.869 Tm [(psb)]TJ ET q 1 0 0 1 385.864 349.068 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 389.002 348.869 Td [(T)]TJ +/F147 9.9626 Tf 389.002 348.869 Td [(T)]TJ ET q 1 0 0 1 394.86 349.068 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.998 348.869 Td [(vect)]TJ +/F147 9.9626 Tf 397.998 348.869 Td [(vect)]TJ ET q 1 0 0 1 419.547 349.068 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.685 348.869 Td [(type)]TJ +/F147 9.9626 Tf 422.685 348.869 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.02 0 0 1 124.802 336.914 Tm [(containing)-270(numbers)-269(of)-270(type)-270(speci\002ed)-270(in)-269(T)90(able)]TJ 0 0 1 rg 0 0 1 RG @@ -9688,7 +9697,7 @@ BT 0 g 0 G /F75 9.9626 Tf -82.959 -20.39 Td [(beta)]TJ 0 g 0 G -/F84 9.9626 Tf 24.349 0 Td [(the)-250(scalar)]TJ/F147 9.9626 Tf 44.617 0 Td [(b)]TJ/F84 9.9626 Tf 5.524 0 Td [(.)]TJ -49.583 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(number)-250(of)-250(the)-250(data)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ +/F84 9.9626 Tf 24.349 0 Td [(the)-250(scalar)]TJ/F151 9.9626 Tf 44.617 0 Td [(b)]TJ/F84 9.9626 Tf 5.524 0 Td [(.)]TJ -49.583 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(number)-250(of)-250(the)-250(data)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG [-250(1)]TJ 0 g 0 G @@ -9698,28 +9707,28 @@ BT 0 g 0 G /F84 9.9626 Tf 10.521 0 Td [(the)-250(local)-250(portion)-250(of)-250(the)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 191.753 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(.)]TJ -182.473 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ 0.98 0 0 1 124.802 188.537 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-247(an)-248(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 369.545 188.537 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 369.545 188.537 Tm [(psb)]TJ ET q 1 0 0 1 385.864 188.736 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 389.002 188.537 Td [(T)]TJ +/F147 9.9626 Tf 389.002 188.537 Td [(T)]TJ ET q 1 0 0 1 394.86 188.736 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.998 188.537 Td [(vect)]TJ +/F147 9.9626 Tf 397.998 188.537 Td [(vect)]TJ ET q 1 0 0 1 419.547 188.736 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.685 188.537 Td [(type)]TJ +/F147 9.9626 Tf 422.685 188.537 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.014 0 0 1 124.802 176.581 Tm [(containing)-247(numbers)-247(of)-246(the)-247(type)-247(indicated)-247(in)-247(T)91(able)]TJ 0 0 1 rg 0 0 1 RG @@ -9744,7 +9753,7 @@ ET endstream endobj -1163 0 obj +1164 0 obj << /Length 2434 >> @@ -9754,21 +9763,21 @@ stream BT /F84 9.9626 Tf 175.611 706.129 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 324.173 694.373 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 327.311 694.174 Td [(desc)]TJ +/F147 9.9626 Tf 327.311 694.174 Td [(desc)]TJ ET q 1 0 0 1 348.86 694.373 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 351.998 694.174 Td [(type)]TJ +/F147 9.9626 Tf 351.998 694.174 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -9779,28 +9788,28 @@ BT 0 g 0 G /F84 9.9626 Tf 10.52 0 Td [(the)-250(local)-250(portion)-250(of)-250(r)18(esult)-250(submatrix)]TJ/F78 9.9626 Tf 160.68 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(.)]TJ -151.4 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ 0.98 0 0 1 175.611 604.51 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-248(an)-247(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 420.354 604.51 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 420.354 604.51 Tm [(psb)]TJ ET q 1 0 0 1 436.673 604.709 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 439.811 604.51 Td [(T)]TJ +/F147 9.9626 Tf 439.811 604.51 Td [(T)]TJ ET q 1 0 0 1 445.669 604.709 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 448.807 604.51 Td [(vect)]TJ +/F147 9.9626 Tf 448.807 604.51 Td [(vect)]TJ ET q 1 0 0 1 470.356 604.709 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 473.495 604.51 Td [(type)]TJ +/F147 9.9626 Tf 473.495 604.51 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf -297.884 -11.955 Td [(containing)-250(numbers)-250(of)-250(the)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -9818,7 +9827,7 @@ ET endstream endobj -1076 0 obj +1077 0 obj << /Type /ObjStm /N 100 @@ -9826,242 +9835,242 @@ endobj /Length 9737 >> stream -107 0 1073 57 1069 116 1078 211 1080 329 1081 388 1075 447 111 506 115 564 1077 622 -1083 732 1085 850 119 908 123 965 1086 1022 127 1080 1082 1136 1089 1231 1091 1349 131 1408 -135 1466 139 1524 1088 1582 1093 1677 1095 1795 143 1853 147 1910 1092 1967 1097 2062 1099 2180 -151 2239 155 2297 1100 2355 1101 2414 1096 2473 1103 2568 1105 2686 159 2744 163 2801 167 2858 -1102 2915 1107 3010 1109 3128 171 3187 1106 3244 1113 3339 1110 3487 1111 3633 1115 3781 175 3839 -179 3896 183 3952 187 4008 1116 4065 1112 4124 1120 4219 1122 4337 1118 4396 191 4455 195 4513 -199 4571 1119 4629 1126 4739 1123 4887 1124 5033 1128 5178 204 5236 1125 5293 1133 5388 1130 5527 -1135 5675 208 5734 212 5792 216 5849 1136 5907 1132 5966 1139 6074 1131 6213 1141 6359 1137 6417 -220 6475 1138 6532 1143 6642 1145 6760 224 6819 1142 6877 1154 6958 1146 7142 1147 7288 1148 7432 -1149 7578 1150 7724 1151 7868 1156 8013 228 8071 1129 8128 1153 8186 1162 8337 1152 8494 1159 8641 +107 0 1074 57 1070 116 1079 211 1081 329 1082 388 1076 447 111 506 115 564 1078 622 +1084 732 1086 850 119 908 123 965 1087 1022 127 1080 1083 1136 1090 1231 1092 1349 131 1408 +135 1466 139 1524 1089 1582 1094 1677 1096 1795 143 1853 147 1910 1093 1967 1098 2062 1100 2180 +151 2239 155 2297 1101 2355 1102 2414 1097 2473 1104 2568 1106 2686 159 2744 163 2801 167 2858 +1103 2915 1108 3010 1110 3128 171 3187 1107 3244 1114 3339 1111 3487 1112 3633 1116 3781 175 3839 +179 3896 183 3952 187 4008 1117 4065 1113 4124 1121 4219 1123 4337 1119 4396 191 4455 195 4513 +199 4571 1120 4629 1127 4739 1124 4887 1125 5033 1129 5178 204 5236 1126 5293 1134 5388 1131 5527 +1136 5675 208 5734 212 5792 216 5849 1137 5907 1133 5966 1140 6074 1132 6213 1142 6359 1138 6417 +220 6475 1139 6532 1144 6642 1146 6760 224 6819 1143 6877 1155 6958 1147 7142 1148 7288 1149 7432 +1150 7578 1151 7724 1152 7868 1157 8013 228 8071 1130 8128 1154 8186 1163 8337 1153 8494 1160 8641 % 107 0 obj << -/D [1070 0 R /XYZ 99.895 248.209 null] +/D [1071 0 R /XYZ 99.895 248.209 null] >> -% 1073 0 obj +% 1074 0 obj << -/D [1070 0 R /XYZ 119.097 217.656 null] +/D [1071 0 R /XYZ 119.097 217.656 null] >> -% 1069 0 obj +% 1070 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1078 0 obj +% 1079 0 obj << /Type /Page -/Contents 1079 0 R -/Resources 1077 0 R +/Contents 1080 0 R +/Resources 1078 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1052 0 R +/Parent 1053 0 R >> -% 1080 0 obj +% 1081 0 obj << -/D [1078 0 R /XYZ 149.705 753.953 null] +/D [1079 0 R /XYZ 149.705 753.953 null] >> -% 1081 0 obj +% 1082 0 obj << -/D [1078 0 R /XYZ 454.138 671.491 null] +/D [1079 0 R /XYZ 454.138 671.491 null] >> -% 1075 0 obj +% 1076 0 obj << -/D [1078 0 R /XYZ 150.705 571.789 null] +/D [1079 0 R /XYZ 150.705 571.789 null] >> % 111 0 obj << -/D [1078 0 R /XYZ 150.705 281.021 null] +/D [1079 0 R /XYZ 150.705 281.021 null] >> % 115 0 obj << -/D [1078 0 R /XYZ 150.705 262.296 null] +/D [1079 0 R /XYZ 150.705 262.296 null] >> -% 1077 0 obj +% 1078 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F233 1044 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F235 1045 0 R >> /ProcSet [ /PDF /Text ] >> -% 1083 0 obj +% 1084 0 obj << /Type /Page -/Contents 1084 0 R -/Resources 1082 0 R +/Contents 1085 0 R +/Resources 1083 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1087 0 R +/Parent 1088 0 R >> -% 1085 0 obj +% 1086 0 obj << -/D [1083 0 R /XYZ 98.895 753.953 null] +/D [1084 0 R /XYZ 98.895 753.953 null] >> % 119 0 obj << -/D [1083 0 R /XYZ 99.895 716.092 null] +/D [1084 0 R /XYZ 99.895 716.092 null] >> % 123 0 obj << -/D [1083 0 R /XYZ 99.895 540.892 null] +/D [1084 0 R /XYZ 99.895 540.892 null] >> -% 1086 0 obj +% 1087 0 obj << -/D [1083 0 R /XYZ 99.895 358.382 null] +/D [1084 0 R /XYZ 99.895 358.382 null] >> % 127 0 obj << -/D [1083 0 R /XYZ 99.895 300.51 null] +/D [1084 0 R /XYZ 99.895 300.51 null] >> -% 1082 0 obj +% 1083 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1089 0 obj +% 1090 0 obj << /Type /Page -/Contents 1090 0 R -/Resources 1088 0 R +/Contents 1091 0 R +/Resources 1089 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1087 0 R +/Parent 1088 0 R >> -% 1091 0 obj +% 1092 0 obj << -/D [1089 0 R /XYZ 149.705 753.953 null] +/D [1090 0 R /XYZ 149.705 753.953 null] >> % 131 0 obj << -/D [1089 0 R /XYZ 150.705 716.092 null] +/D [1090 0 R /XYZ 150.705 716.092 null] >> % 135 0 obj << -/D [1089 0 R /XYZ 150.705 526.761 null] +/D [1090 0 R /XYZ 150.705 526.761 null] >> % 139 0 obj << -/D [1089 0 R /XYZ 150.705 326.359 null] +/D [1090 0 R /XYZ 150.705 326.359 null] >> -% 1088 0 obj +% 1089 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1093 0 obj +% 1094 0 obj << /Type /Page -/Contents 1094 0 R -/Resources 1092 0 R +/Contents 1095 0 R +/Resources 1093 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1087 0 R +/Parent 1088 0 R >> -% 1095 0 obj +% 1096 0 obj << -/D [1093 0 R /XYZ 98.895 753.953 null] +/D [1094 0 R /XYZ 98.895 753.953 null] >> % 143 0 obj << -/D [1093 0 R /XYZ 99.895 716.092 null] +/D [1094 0 R /XYZ 99.895 716.092 null] >> % 147 0 obj << -/D [1093 0 R /XYZ 99.895 474.131 null] +/D [1094 0 R /XYZ 99.895 474.131 null] >> -% 1092 0 obj +% 1093 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1097 0 obj +% 1098 0 obj << /Type /Page -/Contents 1098 0 R -/Resources 1096 0 R +/Contents 1099 0 R +/Resources 1097 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1087 0 R +/Parent 1088 0 R >> -% 1099 0 obj +% 1100 0 obj << -/D [1097 0 R /XYZ 149.705 753.953 null] +/D [1098 0 R /XYZ 149.705 753.953 null] >> % 151 0 obj << -/D [1097 0 R /XYZ 150.705 716.092 null] +/D [1098 0 R /XYZ 150.705 716.092 null] >> % 155 0 obj << -/D [1097 0 R /XYZ 150.705 412.148 null] +/D [1098 0 R /XYZ 150.705 412.148 null] >> -% 1100 0 obj +% 1101 0 obj << -/D [1097 0 R /XYZ 150.705 179.104 null] +/D [1098 0 R /XYZ 150.705 179.104 null] >> -% 1101 0 obj +% 1102 0 obj << -/D [1097 0 R /XYZ 150.705 145.139 null] +/D [1098 0 R /XYZ 150.705 145.139 null] >> -% 1096 0 obj +% 1097 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1103 0 obj +% 1104 0 obj << /Type /Page -/Contents 1104 0 R -/Resources 1102 0 R +/Contents 1105 0 R +/Resources 1103 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1087 0 R +/Parent 1088 0 R >> -% 1105 0 obj +% 1106 0 obj << -/D [1103 0 R /XYZ 98.895 753.953 null] +/D [1104 0 R /XYZ 98.895 753.953 null] >> % 159 0 obj << -/D [1103 0 R /XYZ 99.895 716.092 null] +/D [1104 0 R /XYZ 99.895 716.092 null] >> % 163 0 obj << -/D [1103 0 R /XYZ 99.895 484.709 null] +/D [1104 0 R /XYZ 99.895 484.709 null] >> % 167 0 obj << -/D [1103 0 R /XYZ 99.895 251.325 null] +/D [1104 0 R /XYZ 99.895 251.325 null] >> -% 1102 0 obj +% 1103 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1107 0 obj +% 1108 0 obj << /Type /Page -/Contents 1108 0 R -/Resources 1106 0 R +/Contents 1109 0 R +/Resources 1107 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1087 0 R +/Parent 1088 0 R >> -% 1109 0 obj +% 1110 0 obj << -/D [1107 0 R /XYZ 149.705 753.953 null] +/D [1108 0 R /XYZ 149.705 753.953 null] >> % 171 0 obj << -/D [1107 0 R /XYZ 150.705 476.15 null] +/D [1108 0 R /XYZ 150.705 476.15 null] >> -% 1106 0 obj +% 1107 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1113 0 obj +% 1114 0 obj << /Type /Page -/Contents 1114 0 R -/Resources 1112 0 R +/Contents 1115 0 R +/Resources 1113 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1117 0 R -/Annots [ 1110 0 R 1111 0 R ] +/Parent 1118 0 R +/Annots [ 1111 0 R 1112 0 R ] >> -% 1110 0 obj +% 1111 0 obj << /Type /Annot /Subtype /Link @@ -10069,7 +10078,7 @@ stream /Rect [183.073 164.341 190.017 176.4] /A << /S /GoTo /D (section.6) >> >> -% 1111 0 obj +% 1112 0 obj << /Type /Annot /Subtype /Link @@ -10077,78 +10086,78 @@ stream /Rect [293.044 128.475 300.117 140.535] /A << /S /GoTo /D (listing.3) >> >> -% 1115 0 obj +% 1116 0 obj << -/D [1113 0 R /XYZ 98.895 753.953 null] +/D [1114 0 R /XYZ 98.895 753.953 null] >> % 175 0 obj << -/D [1113 0 R /XYZ 99.895 716.092 null] +/D [1114 0 R /XYZ 99.895 716.092 null] >> % 179 0 obj << -/D [1113 0 R /XYZ 99.895 586.94 null] +/D [1114 0 R /XYZ 99.895 586.94 null] >> % 183 0 obj << -/D [1113 0 R /XYZ 99.895 402.59 null] +/D [1114 0 R /XYZ 99.895 402.59 null] >> % 187 0 obj << -/D [1113 0 R /XYZ 99.895 234.114 null] +/D [1114 0 R /XYZ 99.895 234.114 null] >> -% 1116 0 obj +% 1117 0 obj << -/D [1113 0 R /XYZ 119.612 204.012 null] +/D [1114 0 R /XYZ 119.612 204.012 null] >> -% 1112 0 obj +% 1113 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1120 0 obj +% 1121 0 obj << /Type /Page -/Contents 1121 0 R -/Resources 1119 0 R +/Contents 1122 0 R +/Resources 1120 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1117 0 R +/Parent 1118 0 R >> -% 1122 0 obj +% 1123 0 obj << -/D [1120 0 R /XYZ 149.705 753.953 null] +/D [1121 0 R /XYZ 149.705 753.953 null] >> -% 1118 0 obj +% 1119 0 obj << -/D [1120 0 R /XYZ 150.705 446.997 null] +/D [1121 0 R /XYZ 150.705 446.997 null] >> % 191 0 obj << -/D [1120 0 R /XYZ 150.705 387.147 null] +/D [1121 0 R /XYZ 150.705 387.147 null] >> % 195 0 obj << -/D [1120 0 R /XYZ 150.705 370.604 null] +/D [1121 0 R /XYZ 150.705 370.604 null] >> % 199 0 obj << -/D [1120 0 R /XYZ 150.705 194.093 null] +/D [1121 0 R /XYZ 150.705 194.093 null] >> -% 1119 0 obj +% 1120 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F233 1044 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F235 1045 0 R >> /ProcSet [ /PDF /Text ] >> -% 1126 0 obj +% 1127 0 obj << /Type /Page -/Contents 1127 0 R -/Resources 1125 0 R +/Contents 1128 0 R +/Resources 1126 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1117 0 R -/Annots [ 1123 0 R 1124 0 R ] +/Parent 1118 0 R +/Annots [ 1124 0 R 1125 0 R ] >> -% 1123 0 obj +% 1124 0 obj << /Type /Annot /Subtype /Link @@ -10156,7 +10165,7 @@ stream /Rect [378.159 383.557 385.133 395.616] /A << /S /GoTo /D (table.1) >> >> -% 1124 0 obj +% 1125 0 obj << /Type /Annot /Subtype /Link @@ -10164,29 +10173,29 @@ stream /Rect [378.159 240.08 385.133 252.139] /A << /S /GoTo /D (table.1) >> >> -% 1128 0 obj +% 1129 0 obj << -/D [1126 0 R /XYZ 98.895 753.953 null] +/D [1127 0 R /XYZ 98.895 753.953 null] >> % 204 0 obj << -/D [1126 0 R /XYZ 99.895 610.712 null] +/D [1127 0 R /XYZ 99.895 610.712 null] >> -% 1125 0 obj +% 1126 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1133 0 obj +% 1134 0 obj << /Type /Page -/Contents 1134 0 R -/Resources 1132 0 R +/Contents 1135 0 R +/Resources 1133 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1117 0 R -/Annots [ 1130 0 R ] +/Parent 1118 0 R +/Annots [ 1131 0 R ] >> -% 1130 0 obj +% 1131 0 obj << /Type /Annot /Subtype /Link @@ -10194,41 +10203,41 @@ stream /Rect [178.153 152.385 185.097 164.445] /A << /S /GoTo /D (listing.4) >> >> -% 1135 0 obj +% 1136 0 obj << -/D [1133 0 R /XYZ 149.705 753.953 null] +/D [1134 0 R /XYZ 149.705 753.953 null] >> % 208 0 obj << -/D [1133 0 R /XYZ 150.705 716.092 null] +/D [1134 0 R /XYZ 150.705 716.092 null] >> % 212 0 obj << -/D [1133 0 R /XYZ 150.705 430.41 null] +/D [1134 0 R /XYZ 150.705 430.41 null] >> % 216 0 obj << -/D [1133 0 R /XYZ 150.705 226.203 null] +/D [1134 0 R /XYZ 150.705 226.203 null] >> -% 1136 0 obj +% 1137 0 obj << -/D [1133 0 R /XYZ 305.999 168.146 null] +/D [1134 0 R /XYZ 305.999 168.146 null] >> -% 1132 0 obj +% 1133 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1139 0 obj +% 1140 0 obj << /Type /Page -/Contents 1140 0 R -/Resources 1138 0 R +/Contents 1141 0 R +/Resources 1139 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1117 0 R -/Annots [ 1131 0 R ] +/Parent 1118 0 R +/Annots [ 1132 0 R ] >> -% 1131 0 obj +% 1132 0 obj << /Type /Annot /Subtype /Link @@ -10236,54 +10245,54 @@ stream /Rect [246.566 580.64 253.64 592.699] /A << /S /GoTo /D (section.6) >> >> -% 1141 0 obj +% 1142 0 obj << -/D [1139 0 R /XYZ 98.895 753.953 null] +/D [1140 0 R /XYZ 98.895 753.953 null] >> -% 1137 0 obj +% 1138 0 obj << -/D [1139 0 R /XYZ 99.895 665.282 null] +/D [1140 0 R /XYZ 99.895 665.282 null] >> % 220 0 obj << -/D [1139 0 R /XYZ 99.895 613.372 null] +/D [1140 0 R /XYZ 99.895 613.372 null] >> -% 1138 0 obj +% 1139 0 obj << -/Font << /F233 1044 0 R /F84 687 0 R /F75 685 0 R /F145 940 0 R >> +/Font << /F235 1045 0 R /F84 687 0 R /F75 685 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1143 0 obj +% 1144 0 obj << /Type /Page -/Contents 1144 0 R -/Resources 1142 0 R +/Contents 1145 0 R +/Resources 1143 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1117 0 R +/Parent 1118 0 R >> -% 1145 0 obj +% 1146 0 obj << -/D [1143 0 R /XYZ 149.705 753.953 null] +/D [1144 0 R /XYZ 149.705 753.953 null] >> % 224 0 obj << -/D [1143 0 R /XYZ 150.705 716.092 null] +/D [1144 0 R /XYZ 150.705 716.092 null] >> -% 1142 0 obj +% 1143 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1154 0 obj +% 1155 0 obj << /Type /Page -/Contents 1155 0 R -/Resources 1153 0 R +/Contents 1156 0 R +/Resources 1154 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1158 0 R -/Annots [ 1146 0 R 1147 0 R 1148 0 R 1149 0 R 1150 0 R 1151 0 R ] +/Parent 1159 0 R +/Annots [ 1147 0 R 1148 0 R 1149 0 R 1150 0 R 1151 0 R 1152 0 R ] >> -% 1146 0 obj +% 1147 0 obj << /Type /Annot /Subtype /Link @@ -10291,7 +10300,7 @@ stream /Rect [378.159 413.274 385.133 425.334] /A << /S /GoTo /D (table.1) >> >> -% 1147 0 obj +% 1148 0 obj << /Type /Annot /Subtype /Link @@ -10299,7 +10308,7 @@ stream /Rect [368.549 345.063 444.603 357.123] /A << /S /GoTo /D (vdata) >> >> -% 1148 0 obj +% 1149 0 obj << /Type /Annot /Subtype /Link @@ -10307,7 +10316,7 @@ stream /Rect [332.133 333.108 339.206 345.168] /A << /S /GoTo /D (table.1) >> >> -% 1149 0 obj +% 1150 0 obj << /Type /Annot /Subtype /Link @@ -10315,7 +10324,7 @@ stream /Rect [378.159 252.942 385.133 265.002] /A << /S /GoTo /D (table.1) >> >> -% 1150 0 obj +% 1151 0 obj << /Type /Annot /Subtype /Link @@ -10323,7 +10332,7 @@ stream /Rect [368.549 184.731 444.603 196.791] /A << /S /GoTo /D (vdata) >> >> -% 1151 0 obj +% 1152 0 obj << /Type /Annot /Subtype /Link @@ -10331,33 +10340,33 @@ stream /Rect [347.816 172.776 354.86 184.835] /A << /S /GoTo /D (table.1) >> >> -% 1156 0 obj +% 1157 0 obj << -/D [1154 0 R /XYZ 98.895 753.953 null] +/D [1155 0 R /XYZ 98.895 753.953 null] >> % 228 0 obj << -/D [1154 0 R /XYZ 99.895 716.092 null] +/D [1155 0 R /XYZ 99.895 716.092 null] >> -% 1129 0 obj +% 1130 0 obj << -/D [1154 0 R /XYZ 99.895 558.947 null] +/D [1155 0 R /XYZ 99.895 558.947 null] >> -% 1153 0 obj +% 1154 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F147 1157 0 R /F192 942 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F151 1158 0 R /F197 943 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1162 0 obj +% 1163 0 obj << /Type /Page -/Contents 1163 0 R -/Resources 1161 0 R +/Contents 1164 0 R +/Resources 1162 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1158 0 R -/Annots [ 1152 0 R 1159 0 R 1160 0 R ] +/Parent 1159 0 R +/Annots [ 1153 0 R 1160 0 R 1161 0 R ] >> -% 1152 0 obj +% 1153 0 obj << /Type /Annot /Subtype /Link @@ -10365,7 +10374,7 @@ stream /Rect [306.858 690.368 373.916 702.428] /A << /S /GoTo /D (descdata) >> >> -% 1159 0 obj +% 1160 0 obj << /Type /Annot /Subtype /Link @@ -10376,7 +10385,7 @@ stream endstream endobj -1173 0 obj +1174 0 obj << /Length 7835 >> @@ -10391,7 +10400,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 151.016 706.129 Td [(gedot)-250(\227)-250(Dot)-250(Product)]TJ/F84 9.9626 Tf -51.429 -18.976 Td [(This)-250(function)-250(computes)-250(dot)-250(pr)18(oduct)-250(between)-250(two)-250(vectors)]TJ/F78 9.9626 Tf 254.646 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.482 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(.)]TJ -286.622 -11.955 Td [(If)]TJ/F78 9.9626 Tf 9.46 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.482 0 Td [(y)]TJ/F84 9.9626 Tf 7.596 0 Td [(ar)18(e)-250(r)18(eal)-250(vectors)-250(it)-250(computes)-250(dot-pr)18(oduct)-250(as:)]TJ/F78 9.9626 Tf 104.718 -23.132 Td [(d)-25(o)-35(t)]TJ/F190 10.3811 Tf 16.336 0 Td [(\040)]TJ/F78 9.9626 Tf 13.567 0 Td [(x)]TJ/F78 7.5716 Tf 5.398 4.115 Td [(T)]TJ/F78 9.9626 Tf 5.526 -4.115 Td [(y)]TJ/F84 9.9626 Tf -189.779 -21.93 Td [(Else)-250(if)]TJ/F78 9.9626 Tf 29.474 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.482 0 Td [(y)]TJ/F84 9.9626 Tf 7.597 0 Td [(ar)18(e)-250(complex)-250(vectors)-250(then)-250(it)-250(computes)-250(dot-pr)18(oduct)-250(as:)]TJ/F78 9.9626 Tf 83.965 -23.132 Td [(d)-25(o)-35(t)]TJ/F190 10.3811 Tf 16.336 0 Td [(\040)]TJ/F78 9.9626 Tf 13.567 0 Td [(x)]TJ/F78 7.5716 Tf 5.587 4.115 Td [(H)]TJ/F78 9.9626 Tf 6.813 -4.115 Td [(y)]TJ/F145 9.9626 Tf -175.573 -21.937 Td [(psb_gedot\050x,)]TJ +/F75 11.9552 Tf 151.016 706.129 Td [(gedot)-250(\227)-250(Dot)-250(Product)]TJ/F84 9.9626 Tf -51.429 -18.976 Td [(This)-250(function)-250(computes)-250(dot)-250(pr)18(oduct)-250(between)-250(two)-250(vectors)]TJ/F78 9.9626 Tf 254.646 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.482 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(.)]TJ -286.622 -11.955 Td [(If)]TJ/F78 9.9626 Tf 9.46 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.482 0 Td [(y)]TJ/F84 9.9626 Tf 7.596 0 Td [(ar)18(e)-250(r)18(eal)-250(vectors)-250(it)-250(computes)-250(dot-pr)18(oduct)-250(as:)]TJ/F78 9.9626 Tf 104.718 -23.132 Td [(d)-25(o)-35(t)]TJ/F195 10.3811 Tf 16.336 0 Td [(\040)]TJ/F78 9.9626 Tf 13.567 0 Td [(x)]TJ/F78 7.5716 Tf 5.398 4.115 Td [(T)]TJ/F78 9.9626 Tf 5.526 -4.115 Td [(y)]TJ/F84 9.9626 Tf -189.779 -21.93 Td [(Else)-250(if)]TJ/F78 9.9626 Tf 29.474 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.482 0 Td [(y)]TJ/F84 9.9626 Tf 7.597 0 Td [(ar)18(e)-250(complex)-250(vectors)-250(then)-250(it)-250(computes)-250(dot-pr)18(oduct)-250(as:)]TJ/F78 9.9626 Tf 83.965 -23.132 Td [(d)-25(o)-35(t)]TJ/F195 10.3811 Tf 16.336 0 Td [(\040)]TJ/F78 9.9626 Tf 13.567 0 Td [(x)]TJ/F78 7.5716 Tf 5.587 4.115 Td [(H)]TJ/F78 9.9626 Tf 6.813 -4.115 Td [(y)]TJ/F147 9.9626 Tf -175.573 -21.937 Td [(psb_gedot\050x,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G [-525(y,)]TJ @@ -10471,28 +10480,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.614 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -165.875 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 359.506 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-247(an)-248(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 369.545 359.506 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 369.545 359.506 Tm [(psb)]TJ ET q 1 0 0 1 385.864 359.705 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 389.002 359.506 Td [(T)]TJ +/F147 9.9626 Tf 389.002 359.506 Td [(T)]TJ ET q 1 0 0 1 394.86 359.705 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.998 359.506 Td [(vect)]TJ +/F147 9.9626 Tf 397.998 359.506 Td [(vect)]TJ ET q 1 0 0 1 419.547 359.705 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.685 359.506 Td [(type)]TJ +/F147 9.9626 Tf 422.685 359.506 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.02 0 0 1 124.802 347.55 Tm [(containing)-270(numbers)-269(of)-270(type)-270(speci\002ed)-270(in)-269(T)90(able)]TJ 0 0 1 rg 0 0 1 RG @@ -10504,28 +10513,28 @@ BT 0 g 0 G /F84 9.9626 Tf 10.521 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.445 0 Td [(y)]TJ/F84 9.9626 Tf 5.105 0 Td [(.)]TJ -166.164 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 267.824 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-247(an)-248(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 369.545 267.824 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 369.545 267.824 Tm [(psb)]TJ ET q 1 0 0 1 385.864 268.023 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 389.002 267.824 Td [(T)]TJ +/F147 9.9626 Tf 389.002 267.824 Td [(T)]TJ ET q 1 0 0 1 394.86 268.023 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.998 267.824 Td [(vect)]TJ +/F147 9.9626 Tf 397.998 267.824 Td [(vect)]TJ ET q 1 0 0 1 419.547 268.023 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.685 267.824 Td [(type)]TJ +/F147 9.9626 Tf 422.685 267.824 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 0.98 0 0 1 124.802 255.869 Tm [(containing)-246(numbers)-247(of)-246(type)-247(speci\002ed)-246(in)-247(T)94(able)]TJ 0 0 1 rg 0 0 1 RG @@ -10544,21 +10553,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 273.363 176.341 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 276.501 176.142 Td [(desc)]TJ +/F147 9.9626 Tf 276.501 176.142 Td [(desc)]TJ ET q 1 0 0 1 298.05 176.341 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 301.189 176.142 Td [(type)]TJ +/F147 9.9626 Tf 301.189 176.142 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -10572,7 +10581,7 @@ ET endstream endobj -1179 0 obj +1180 0 obj << /Length 4448 >> @@ -10580,7 +10589,7 @@ stream 0 g 0 G 0 g 0 G BT -/F84 9.9626 Tf 175.611 706.129 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(scalar)74(.)-310(Default:)]TJ/F145 9.9626 Tf 165.319 0 Td [(global)]TJ +/F84 9.9626 Tf 175.611 706.129 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(scalar)74(.)-310(Default:)]TJ/F147 9.9626 Tf 165.319 0 Td [(global)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G @@ -10591,7 +10600,7 @@ BT 0 g 0 G 0 -19.925 Td [(Function)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 72.777 0 Td [(is)-250(the)-250(dot)-250(pr)18(oduct)-250(of)-250(vectors)]TJ/F78 9.9626 Tf 126.329 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.482 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(.)]TJ 0.98 0 0 1 175.611 630.413 Tm [(Scope:)]TJ/F75 9.9626 Tf 0.98 0 0 1 206.422 630.413 Tm [(global)]TJ/F84 9.9626 Tf 0.98 0 0 1 237.009 630.413 Tm [(unless)-244(the)-244(optional)-244(variable)]TJ/F145 9.9626 Tf 1 0 0 1 358.293 630.413 Tm [(global)]TJ +/F84 9.9626 Tf 72.777 0 Td [(is)-250(the)-250(dot)-250(pr)18(oduct)-250(of)-250(vectors)]TJ/F78 9.9626 Tf 126.329 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.482 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(.)]TJ 0.98 0 0 1 175.611 630.413 Tm [(Scope:)]TJ/F75 9.9626 Tf 0.98 0 0 1 206.422 630.413 Tm [(global)]TJ/F84 9.9626 Tf 0.98 0 0 1 237.009 630.413 Tm [(unless)-244(the)-244(optional)-244(variable)]TJ/F147 9.9626 Tf 1 0 0 1 358.293 630.413 Tm [(global)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G @@ -10610,7 +10619,7 @@ BT 0.98 0 0 1 175.303 496.913 Tm [(The)-201(computation)-200(of)-201(a)-200(global)-201(r)18(esult)-200(r)18(equir)19(es)-201(a)-201(global)-200(communication,)-212(which)]TJ 1.02 0 0 1 175.611 484.958 Tm [(entails)-265(a)-265(signi\002cant)-264(over)17(head.)-363(It)-265(may)-265(be)-264(necessary)-265(and/or)-265(advisable)-265(to)]TJ 0.98 0 0 1 175.611 473.003 Tm [(compute)-256(multiple)-256(dot)-256(pr)18(oducts)-256(at)-256(the)-256(same)-256(time;)-257(in)-256(this)-256(case,)-256(it)-256(is)-256(possible)]TJ 1 0 0 1 175.611 461.048 Tm [(to)-250(impr)18(ove)-250(the)-250(r)8(untime)-250(ef)18(\002ciency)-250(by)-250(using)-250(the)-250(following)-250(scheme:)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G -/F145 9.9626 Tf 52.304 -19.925 Td [(vres\050)]TJ +/F147 9.9626 Tf 52.304 -19.925 Td [(vres\050)]TJ 0.25 0.63 0.44 rg 0.25 0.63 0.44 RG [(1)]TJ 0 g 0 G @@ -10686,7 +10695,7 @@ ET endstream endobj -1190 0 obj +1191 0 obj << /Length 8900 >> @@ -10701,11 +10710,11 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 151.016 706.129 Td [(gedots)-250(\227)-250(Generalized)-250(Dot)-250(Product)]TJ/F84 9.9626 Tf 1.014 0 0 1 99.587 687.165 Tm [(This)-246(subr)17(ou)1(tine)-247(computes)-246(a)-246(series)-247(of)-246(dot)-246(pr)17(oducts)-246(among)-246(the)-247(columns)-246(of)-246(two)]TJ 1 0 0 1 99.895 675.21 Tm [(dense)-250(matrices)]TJ/F78 9.9626 Tf 68.209 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.482 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(:)]TJ/F78 9.9626 Tf 24.806 -13.101 Td [(r)-17(e)-25(s)]TJ/F192 10.3811 Tf 12.294 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F190 10.3811 Tf 7.042 0 Td [(\040)]TJ/F78 9.9626 Tf 13.567 0 Td [(x)]TJ/F192 10.3811 Tf 5.329 0 Td [(\050)]TJ/F84 9.9626 Tf 4.274 0 Td [(:)-13(,)]TJ/F78 9.9626 Tf 6.821 0 Td [(i)]TJ/F192 10.3811 Tf 3.089 0 Td [(\051)]TJ/F78 7.5716 Tf 4.342 4.114 Td [(T)]TJ/F78 9.9626 Tf 5.525 -4.114 Td [(y)]TJ/F192 10.3811 Tf 5.231 0 Td [(\050)]TJ/F84 9.9626 Tf 4.274 0 Td [(:)-12(,)]TJ/F78 9.9626 Tf 6.821 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 99.895 645.233 Tm [(If)-240(the)-240(matrices)-240(ar)19(e)-240(complex,)-243(then)-240(the)-240(usual)-240(c)1(onvention)-240(applies,)-243(i.e.)-311(the)-240(conjugate)]TJ 1.007 0 0 1 99.895 633.278 Tm [(transpose)-249(of)]TJ/F78 9.9626 Tf 1 0 0 1 156.904 633.278 Tm [(x)]TJ/F84 9.9626 Tf 1.007 0 0 1 164.604 633.278 Tm [(is)-249(used.)-309(If)]TJ/F78 9.9626 Tf 1 0 0 1 210.627 633.278 Tm [(x)]TJ/F84 9.9626 Tf 1.007 0 0 1 218.327 633.278 Tm [(and)]TJ/F78 9.9626 Tf 1 0 0 1 237.93 633.278 Tm [(y)]TJ/F84 9.9626 Tf 1.007 0 0 1 245.531 633.278 Tm [(ar)18(e)-249(of)-248(rank)-249(one,)-249(then)]TJ/F78 9.9626 Tf 1 0 0 1 339.231 633.278 Tm [(r)-17(e)-25(s)]TJ/F84 9.9626 Tf 1.007 0 0 1 353.894 633.278 Tm [(is)-249(a)-248(scalar)73(,)-248(else)-249(it)-249(is)-248(a)]TJ 1 0 0 1 99.895 621.323 Tm [(rank)-250(one)-250(array)111(.)]TJ +/F75 11.9552 Tf 151.016 706.129 Td [(gedots)-250(\227)-250(Generalized)-250(Dot)-250(Product)]TJ/F84 9.9626 Tf 1.014 0 0 1 99.587 687.165 Tm [(This)-246(subr)17(ou)1(tine)-247(computes)-246(a)-246(series)-247(of)-246(dot)-246(pr)17(oducts)-246(among)-246(the)-247(columns)-246(of)-246(two)]TJ 1 0 0 1 99.895 675.21 Tm [(dense)-250(matrices)]TJ/F78 9.9626 Tf 68.209 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.482 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(:)]TJ/F78 9.9626 Tf 24.806 -13.101 Td [(r)-17(e)-25(s)]TJ/F197 10.3811 Tf 12.294 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 7.042 0 Td [(\040)]TJ/F78 9.9626 Tf 13.567 0 Td [(x)]TJ/F197 10.3811 Tf 5.329 0 Td [(\050)]TJ/F84 9.9626 Tf 4.274 0 Td [(:)-13(,)]TJ/F78 9.9626 Tf 6.821 0 Td [(i)]TJ/F197 10.3811 Tf 3.089 0 Td [(\051)]TJ/F78 7.5716 Tf 4.342 4.114 Td [(T)]TJ/F78 9.9626 Tf 5.525 -4.114 Td [(y)]TJ/F197 10.3811 Tf 5.231 0 Td [(\050)]TJ/F84 9.9626 Tf 4.274 0 Td [(:)-12(,)]TJ/F78 9.9626 Tf 6.821 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 99.895 645.233 Tm [(If)-240(the)-240(matrices)-240(ar)19(e)-240(complex,)-243(then)-240(the)-240(usual)-240(c)1(onvention)-240(applies,)-243(i.e.)-311(the)-240(conjugate)]TJ 1.007 0 0 1 99.895 633.278 Tm [(transpose)-249(of)]TJ/F78 9.9626 Tf 1 0 0 1 156.904 633.278 Tm [(x)]TJ/F84 9.9626 Tf 1.007 0 0 1 164.604 633.278 Tm [(is)-249(used.)-309(If)]TJ/F78 9.9626 Tf 1 0 0 1 210.627 633.278 Tm [(x)]TJ/F84 9.9626 Tf 1.007 0 0 1 218.327 633.278 Tm [(and)]TJ/F78 9.9626 Tf 1 0 0 1 237.93 633.278 Tm [(y)]TJ/F84 9.9626 Tf 1.007 0 0 1 245.531 633.278 Tm [(ar)18(e)-249(of)-248(rank)-249(one,)-249(then)]TJ/F78 9.9626 Tf 1 0 0 1 339.231 633.278 Tm [(r)-17(e)-25(s)]TJ/F84 9.9626 Tf 1.007 0 0 1 353.894 633.278 Tm [(is)-249(a)-248(scalar)73(,)-248(else)-249(it)-249(is)-248(a)]TJ 1 0 0 1 99.895 621.323 Tm [(rank)-250(one)-250(array)111(.)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 20.175 -11.955 Td [(call)]TJ +/F147 9.9626 Tf 20.175 -11.955 Td [(call)]TJ 0 g 0 G [-525(psb_gedots\050res,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -10787,28 +10796,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.614 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -165.875 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 388.49 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-247(an)-248(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 369.545 388.49 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 369.545 388.49 Tm [(psb)]TJ ET q 1 0 0 1 385.864 388.689 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 389.002 388.49 Td [(T)]TJ +/F147 9.9626 Tf 389.002 388.49 Td [(T)]TJ ET q 1 0 0 1 394.86 388.689 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.998 388.49 Td [(vect)]TJ +/F147 9.9626 Tf 397.998 388.49 Td [(vect)]TJ ET q 1 0 0 1 419.547 388.689 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.685 388.49 Td [(type)]TJ +/F147 9.9626 Tf 422.685 388.49 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.02 0 0 1 124.802 376.535 Tm [(containing)-270(numbers)-269(of)-270(type)-270(speci\002ed)-270(in)-269(T)90(able)]TJ 0 0 1 rg 0 0 1 RG @@ -10820,28 +10829,28 @@ BT 0 g 0 G /F84 9.9626 Tf 10.521 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.445 0 Td [(y)]TJ/F84 9.9626 Tf 5.105 0 Td [(.)]TJ -166.164 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 297.539 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-247(an)-248(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 369.545 297.539 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 369.545 297.539 Tm [(psb)]TJ ET q 1 0 0 1 385.864 297.738 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 389.002 297.539 Td [(T)]TJ +/F147 9.9626 Tf 389.002 297.539 Td [(T)]TJ ET q 1 0 0 1 394.86 297.738 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.998 297.539 Td [(vect)]TJ +/F147 9.9626 Tf 397.998 297.539 Td [(vect)]TJ ET q 1 0 0 1 419.547 297.738 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.685 297.539 Td [(type)]TJ +/F147 9.9626 Tf 422.685 297.539 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 0.98 0 0 1 124.802 285.583 Tm [(containing)-246(numbers)-247(of)-246(type)-247(speci\002ed)-246(in)-247(T)94(able)]TJ 0 0 1 rg 0 0 1 RG @@ -10860,21 +10869,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 273.363 206.786 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 276.501 206.587 Td [(desc)]TJ +/F147 9.9626 Tf 276.501 206.587 Td [(desc)]TJ ET q 1 0 0 1 298.05 206.786 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 301.189 206.587 Td [(type)]TJ +/F147 9.9626 Tf 301.189 206.587 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -10895,7 +10904,7 @@ ET endstream endobj -1195 0 obj +1196 0 obj << /Length 581 >> @@ -10914,7 +10923,7 @@ ET endstream endobj -1202 0 obj +1203 0 obj << /Length 7933 >> @@ -10929,7 +10938,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 151.016 706.129 Td [(normi)-250(\227)-250(In\002nity-Norm)-250(of)-250(V)111(ector)]TJ/F84 9.9626 Tf -51.429 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(in\002nity-norm)-250(of)-250(a)-250(vector)]TJ/F78 9.9626 Tf 233.575 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ -238.473 -11.955 Td [(If)]TJ/F78 9.9626 Tf 9.46 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(r)18(eal)-250(vector)-250(it)-250(computes)-250(in\002nity)-250(norm)-250(as:)]TJ/F78 9.9626 Tf 117.806 -18.736 Td [(a)-25(m)-40(a)-42(x)]TJ/F190 10.3811 Tf 25.761 0 Td [(\040)]TJ/F84 9.9626 Tf 13.273 0 Td [(max)]TJ/F78 7.5716 Tf 8.354 -7.21 Td [(i)]TJ/F190 10.3811 Tf 12.35 7.21 Td [(j)]TJ/F78 9.9626 Tf 3.297 0 Td [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F84 9.9626 Tf -206.02 -23.313 Td [(else)-250(if)]TJ/F78 9.9626 Tf 28.159 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(complex)-250(vector)-250(then)-250(it)-250(computes)-250(the)-250(in\002nity-norm)-250(as:)]TJ/F78 9.9626 Tf 63.42 -18.737 Td [(a)-25(m)-40(a)-42(x)]TJ/F190 10.3811 Tf 25.761 0 Td [(\040)]TJ/F84 9.9626 Tf 13.273 0 Td [(max)]TJ/F78 7.5716 Tf 8.354 -7.21 Td [(i)]TJ/F192 10.3811 Tf 12.35 7.21 Td [(\050)]TJ/F190 10.3811 Tf 4.274 0 Td [(j)]TJ/F78 9.9626 Tf 3.029 0 Td [(r)-17(e)]TJ/F192 10.3811 Tf 8.169 0 Td [(\050)]TJ/F78 9.9626 Tf 4.443 0 Td [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F192 10.3811 Tf 2.875 1.96 Td [(\051)]TJ/F190 10.3811 Tf 4.274 0 Td [(j)]TJ/F192 10.3811 Tf 5.065 0 Td [(+)]TJ/F190 10.3811 Tf 10.256 0 Td [(j)]TJ/F78 9.9626 Tf 3.059 0 Td [(i)-32(m)]TJ/F192 10.3811 Tf 11.088 0 Td [(\050)]TJ/F78 9.9626 Tf 4.443 0 Td [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F192 10.3811 Tf 2.875 1.96 Td [(\051)]TJ/F190 10.3811 Tf 4.274 0 Td [(j)]TJ/F192 10.3811 Tf 3.128 0 Td [(\051)]TJ/F145 9.9626 Tf -225.617 -22.974 Td [(psb_geamax\050x,)]TJ +/F75 11.9552 Tf 151.016 706.129 Td [(normi)-250(\227)-250(In\002nity-Norm)-250(of)-250(V)111(ector)]TJ/F84 9.9626 Tf -51.429 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(in\002nity-norm)-250(of)-250(a)-250(vector)]TJ/F78 9.9626 Tf 233.575 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ -238.473 -11.955 Td [(If)]TJ/F78 9.9626 Tf 9.46 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(r)18(eal)-250(vector)-250(it)-250(computes)-250(in\002nity)-250(norm)-250(as:)]TJ/F78 9.9626 Tf 117.806 -18.736 Td [(a)-25(m)-40(a)-42(x)]TJ/F195 10.3811 Tf 25.761 0 Td [(\040)]TJ/F84 9.9626 Tf 13.273 0 Td [(max)]TJ/F78 7.5716 Tf 8.354 -7.21 Td [(i)]TJ/F195 10.3811 Tf 12.35 7.21 Td [(j)]TJ/F78 9.9626 Tf 3.297 0 Td [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(j)]TJ/F84 9.9626 Tf -206.02 -23.313 Td [(else)-250(if)]TJ/F78 9.9626 Tf 28.159 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(complex)-250(vector)-250(then)-250(it)-250(computes)-250(the)-250(in\002nity-norm)-250(as:)]TJ/F78 9.9626 Tf 63.42 -18.737 Td [(a)-25(m)-40(a)-42(x)]TJ/F195 10.3811 Tf 25.761 0 Td [(\040)]TJ/F84 9.9626 Tf 13.273 0 Td [(max)]TJ/F78 7.5716 Tf 8.354 -7.21 Td [(i)]TJ/F197 10.3811 Tf 12.35 7.21 Td [(\050)]TJ/F195 10.3811 Tf 4.274 0 Td [(j)]TJ/F78 9.9626 Tf 3.029 0 Td [(r)-17(e)]TJ/F197 10.3811 Tf 8.169 0 Td [(\050)]TJ/F78 9.9626 Tf 4.443 0 Td [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F197 10.3811 Tf 2.875 1.96 Td [(\051)]TJ/F195 10.3811 Tf 4.274 0 Td [(j)]TJ/F197 10.3811 Tf 5.065 0 Td [(+)]TJ/F195 10.3811 Tf 10.256 0 Td [(j)]TJ/F78 9.9626 Tf 3.059 0 Td [(i)-32(m)]TJ/F197 10.3811 Tf 11.088 0 Td [(\050)]TJ/F78 9.9626 Tf 4.443 0 Td [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F197 10.3811 Tf 2.875 1.96 Td [(\051)]TJ/F195 10.3811 Tf 4.274 0 Td [(j)]TJ/F197 10.3811 Tf 3.128 0 Td [(\051)]TJ/F147 9.9626 Tf -225.617 -22.974 Td [(psb_geamax\050x,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G [-525(desc_a,)]TJ @@ -11015,28 +11024,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.614 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -165.875 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 362.308 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-247(an)-248(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 369.545 362.308 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 369.545 362.308 Tm [(psb)]TJ ET q 1 0 0 1 385.864 362.508 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 389.002 362.308 Td [(T)]TJ +/F147 9.9626 Tf 389.002 362.308 Td [(T)]TJ ET q 1 0 0 1 394.86 362.508 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.998 362.308 Td [(vect)]TJ +/F147 9.9626 Tf 397.998 362.308 Td [(vect)]TJ ET q 1 0 0 1 419.547 362.508 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.685 362.308 Td [(type)]TJ +/F147 9.9626 Tf 422.685 362.308 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf -297.883 -11.955 Td [(containing)-250(numbers)-250(of)-250(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -11055,27 +11064,27 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 273.363 284.079 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 276.501 283.88 Td [(desc)]TJ +/F147 9.9626 Tf 276.501 283.88 Td [(desc)]TJ ET q 1 0 0 1 298.05 284.079 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 301.189 283.88 Td [(type)]TJ +/F147 9.9626 Tf 301.189 283.88 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -222.215 -18.653 Td [(global)]TJ 0 g 0 G -/F84 9.9626 Tf 0.994 0 0 1 133.659 265.227 Tm [(Speci\002es)-250(whether)-249(the)-250(computation)-250(should)-250(include)-249(the)-250(global)-250(r)18(eduction)]TJ 1 0 0 1 124.802 253.272 Tm [(acr)18(oss)-250(all)-250(pr)18(ocesses.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(scalar)74(.)-310(Default:)]TJ/F145 9.9626 Tf 165.318 0 Td [(global)]TJ +/F84 9.9626 Tf 0.994 0 0 1 133.659 265.227 Tm [(Speci\002es)-250(whether)-249(the)-250(computation)-250(should)-250(include)-249(the)-250(global)-250(r)18(eduction)]TJ 1 0 0 1 124.802 253.272 Tm [(acr)18(oss)-250(all)-250(pr)18(ocesses.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(scalar)74(.)-310(Default:)]TJ/F147 9.9626 Tf 165.318 0 Td [(global)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G @@ -11086,7 +11095,7 @@ BT 0 g 0 G 0 -18.653 Td [(Function)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 72.777 0 Td [(is)-250(the)-250(in\002nity)-250(norm)-250(of)-250(vector)]TJ/F78 9.9626 Tf 128.561 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ 0.98 0 0 1 124.802 144.236 Tm [(Scope:)]TJ/F75 9.9626 Tf 0.98 0 0 1 155.612 144.236 Tm [(global)]TJ/F84 9.9626 Tf 0.98 0 0 1 186.2 144.236 Tm [(unless)-244(the)-244(optional)-244(variab)1(le)]TJ/F145 9.9626 Tf 1 0 0 1 307.484 144.236 Tm [(global)]TJ +/F84 9.9626 Tf 72.777 0 Td [(is)-250(the)-250(in\002nity)-250(norm)-250(of)-250(vector)]TJ/F78 9.9626 Tf 128.561 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ 0.98 0 0 1 124.802 144.236 Tm [(Scope:)]TJ/F75 9.9626 Tf 0.98 0 0 1 155.612 144.236 Tm [(global)]TJ/F84 9.9626 Tf 0.98 0 0 1 186.2 144.236 Tm [(unless)-244(the)-244(optional)-244(variab)1(le)]TJ/F147 9.9626 Tf 1 0 0 1 307.484 144.236 Tm [(global)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G @@ -11098,7 +11107,7 @@ ET endstream endobj -1208 0 obj +1209 0 obj << /Length 3132 >> @@ -11116,7 +11125,7 @@ BT 0.98 0 0 1 175.303 616.465 Tm [(The)-201(computation)-200(of)-201(a)-200(global)-201(r)18(esult)-200(r)18(equir)19(es)-201(a)-201(global)-200(communication,)-212(which)]TJ 1.02 0 0 1 175.611 604.51 Tm [(entails)-265(a)-265(signi\002cant)-264(over)17(head.)-363(It)-265(may)-265(be)-264(necessary)-265(and/or)-265(advisable)-265(to)]TJ 1.02 0 0 1 175.611 592.555 Tm [(compute)-287(multiple)-287(norms)-287(at)-287(the)-287(same)-287(time;)-308(in)-287(thi)1(s)-287(case,)-298(it)-287(is)-287(possible)-287(to)]TJ 1 0 0 1 175.611 580.6 Tm [(impr)18(ove)-250(the)-250(r)8(untime)-250(ef)18(\002ciency)-250(by)-250(using)-250(the)-250(following)-250(scheme:)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G -/F145 9.9626 Tf 52.304 -19.926 Td [(vres\050)]TJ +/F147 9.9626 Tf 52.304 -19.926 Td [(vres\050)]TJ 0.25 0.63 0.44 rg 0.25 0.63 0.44 RG [(1)]TJ 0 g 0 G @@ -11192,7 +11201,7 @@ ET endstream endobj -1216 0 obj +1217 0 obj << /Length 6488 >> @@ -11207,11 +11216,11 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 151.016 706.129 Td [(geamaxs)-250(\227)-250(Generalized)-250(In\002nity)-250(Norm)]TJ/F84 9.9626 Tf 1.003 0 0 1 99.587 687.165 Tm [(This)-250(subr)18(outine)-250(computes)-250(a)-251(seri)1(es)-251(of)-250(in\002nity)-250(norms)-250(on)-250(the)-250(columns)-250(of)-251(a)-250(dense)]TJ 1 0 0 1 99.895 675.21 Tm [(matrix)]TJ/F78 9.9626 Tf 31.786 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(:)]TJ/F78 9.9626 Tf 88.54 -11.955 Td [(r)-17(e)-25(s)]TJ/F192 10.3811 Tf 12.293 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F190 10.3811 Tf 7.041 0 Td [(\040)]TJ/F84 9.9626 Tf 13.273 0 Td [(max)]TJ/F78 7.5716 Tf 7.76 -7.336 Td [(k)]TJ/F190 10.3811 Tf 12.944 7.336 Td [(j)]TJ/F78 9.9626 Tf 3.298 0 Td [(x)]TJ/F192 10.3811 Tf 5.329 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(k)]TJ/F84 9.9626 Tf 4.598 0 Td [(,)]TJ/F78 9.9626 Tf 4.206 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F190 10.3811 Tf 4.274 0 Td [(j)]TJ +/F75 11.9552 Tf 151.016 706.129 Td [(geamaxs)-250(\227)-250(Generalized)-250(In\002nity)-250(Norm)]TJ/F84 9.9626 Tf 1.003 0 0 1 99.587 687.165 Tm [(This)-250(subr)18(outine)-250(computes)-250(a)-251(seri)1(es)-251(of)-250(in\002nity)-250(norms)-250(on)-250(the)-250(columns)-250(of)-251(a)-250(dense)]TJ 1 0 0 1 99.895 675.21 Tm [(matrix)]TJ/F78 9.9626 Tf 31.786 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(:)]TJ/F78 9.9626 Tf 88.54 -11.955 Td [(r)-17(e)-25(s)]TJ/F197 10.3811 Tf 12.293 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 7.041 0 Td [(\040)]TJ/F84 9.9626 Tf 13.273 0 Td [(max)]TJ/F78 7.5716 Tf 7.76 -7.336 Td [(k)]TJ/F195 10.3811 Tf 12.944 7.336 Td [(j)]TJ/F78 9.9626 Tf 3.298 0 Td [(x)]TJ/F197 10.3811 Tf 5.329 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(k)]TJ/F84 9.9626 Tf 4.598 0 Td [(,)]TJ/F78 9.9626 Tf 4.206 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 4.274 0 Td [(j)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -195.027 -22.296 Td [(call)]TJ +/F147 9.9626 Tf -195.027 -22.296 Td [(call)]TJ 0 g 0 G [-525(psb_geamaxs\050res,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -11290,28 +11299,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.614 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -165.875 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 415.5 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-247(an)-248(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 369.545 415.5 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 369.545 415.5 Tm [(psb)]TJ ET q 1 0 0 1 385.864 415.699 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 389.002 415.5 Td [(T)]TJ +/F147 9.9626 Tf 389.002 415.5 Td [(T)]TJ ET q 1 0 0 1 394.86 415.699 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.998 415.5 Td [(vect)]TJ +/F147 9.9626 Tf 397.998 415.5 Td [(vect)]TJ ET q 1 0 0 1 419.547 415.699 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.685 415.5 Td [(type)]TJ +/F147 9.9626 Tf 422.685 415.5 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf -297.883 -11.956 Td [(containing)-250(numbers)-250(of)-250(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -11330,21 +11339,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 273.363 335.998 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 276.501 335.798 Td [(desc)]TJ +/F147 9.9626 Tf 276.501 335.798 Td [(desc)]TJ ET q 1 0 0 1 298.05 335.998 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 301.189 335.798 Td [(type)]TJ +/F147 9.9626 Tf 301.189 335.798 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -11365,7 +11374,7 @@ ET endstream endobj -1224 0 obj +1225 0 obj << /Length 7573 >> @@ -11380,7 +11389,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 201.825 706.129 Td [(norm1)-250(\227)-250(1-Norm)-250(of)-250(V)111(ector)]TJ/F84 9.9626 Tf -51.429 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(1-norm)-250(of)-250(a)-250(vector)]TJ/F78 9.9626 Tf 206.349 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -211.245 -11.955 Td [(If)]TJ/F78 9.9626 Tf 9.459 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(r)18(eal)-250(vector)-250(it)-250(computes)-250(1-norm)-250(as:)]TJ/F78 9.9626 Tf 125.989 -21.269 Td [(a)-25(s)-25(u)-25(m)]TJ/F190 10.3811 Tf 25.353 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 19.006 0 Td [(x)]TJ/F78 7.5716 Tf 5.147 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.876 1.96 Td [(k)]TJ/F84 9.9626 Tf -195.526 -21.269 Td [(else)-250(if)]TJ/F78 9.9626 Tf 28.159 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(complex)-250(vector)-250(then)-250(it)-250(computes)-250(1-norm)-250(as:)]TJ/F78 9.9626 Tf 71.974 -21.269 Td [(a)-25(s)-25(u)-25(m)]TJ/F190 10.3811 Tf 25.353 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 18.737 0 Td [(r)-17(e)]TJ/F192 10.3811 Tf 8.169 0 Td [(\050)]TJ/F78 9.9626 Tf 4.443 0 Td [(x)]TJ/F192 10.3811 Tf 5.33 0 Td [(\051)]TJ/F190 10.3811 Tf 4.274 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.858 Td [(1)]TJ/F192 10.3811 Tf 6.346 1.858 Td [(+)]TJ/F190 10.3811 Tf 10.256 0 Td [(k)]TJ/F78 9.9626 Tf 5.369 0 Td [(i)-32(m)]TJ/F192 10.3811 Tf 11.089 0 Td [(\050)]TJ/F78 9.9626 Tf 4.443 0 Td [(x)]TJ/F192 10.3811 Tf 5.33 0 Td [(\051)]TJ/F190 10.3811 Tf 4.274 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.858 Td [(1)]TJ/F145 9.9626 Tf -216.928 -19.411 Td [(psb_geasum\050x,)]TJ +/F75 11.9552 Tf 201.825 706.129 Td [(norm1)-250(\227)-250(1-Norm)-250(of)-250(V)111(ector)]TJ/F84 9.9626 Tf -51.429 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(1-norm)-250(of)-250(a)-250(vector)]TJ/F78 9.9626 Tf 206.349 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -211.245 -11.955 Td [(If)]TJ/F78 9.9626 Tf 9.459 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(r)18(eal)-250(vector)-250(it)-250(computes)-250(1-norm)-250(as:)]TJ/F78 9.9626 Tf 125.989 -21.269 Td [(a)-25(s)-25(u)-25(m)]TJ/F195 10.3811 Tf 25.353 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 19.006 0 Td [(x)]TJ/F78 7.5716 Tf 5.147 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.876 1.96 Td [(k)]TJ/F84 9.9626 Tf -195.526 -21.269 Td [(else)-250(if)]TJ/F78 9.9626 Tf 28.159 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(complex)-250(vector)-250(then)-250(it)-250(computes)-250(1-norm)-250(as:)]TJ/F78 9.9626 Tf 71.974 -21.269 Td [(a)-25(s)-25(u)-25(m)]TJ/F195 10.3811 Tf 25.353 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 18.737 0 Td [(r)-17(e)]TJ/F197 10.3811 Tf 8.169 0 Td [(\050)]TJ/F78 9.9626 Tf 4.443 0 Td [(x)]TJ/F197 10.3811 Tf 5.33 0 Td [(\051)]TJ/F195 10.3811 Tf 4.274 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.858 Td [(1)]TJ/F197 10.3811 Tf 6.346 1.858 Td [(+)]TJ/F195 10.3811 Tf 10.256 0 Td [(k)]TJ/F78 9.9626 Tf 5.369 0 Td [(i)-32(m)]TJ/F197 10.3811 Tf 11.089 0 Td [(\050)]TJ/F78 9.9626 Tf 4.443 0 Td [(x)]TJ/F197 10.3811 Tf 5.33 0 Td [(\051)]TJ/F195 10.3811 Tf 4.274 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.858 Td [(1)]TJ/F147 9.9626 Tf -216.928 -19.411 Td [(psb_geasum\050x,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G [-525(desc_a,)]TJ @@ -11466,28 +11475,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.614 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -165.875 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 175.611 366.361 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-248(an)-247(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 420.354 366.361 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 420.354 366.361 Tm [(psb)]TJ ET q 1 0 0 1 436.673 366.56 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 439.811 366.361 Td [(T)]TJ +/F147 9.9626 Tf 439.811 366.361 Td [(T)]TJ ET q 1 0 0 1 445.669 366.56 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 448.807 366.361 Td [(vect)]TJ +/F147 9.9626 Tf 448.807 366.361 Td [(vect)]TJ ET q 1 0 0 1 470.356 366.56 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 473.495 366.361 Td [(type)]TJ +/F147 9.9626 Tf 473.495 366.361 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf -297.884 -11.955 Td [(containing)-250(numbers)-250(of)-250(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -11506,27 +11515,27 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 324.173 287.119 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 327.311 286.919 Td [(desc)]TJ +/F147 9.9626 Tf 327.311 286.919 Td [(desc)]TJ ET q 1 0 0 1 348.86 287.119 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 351.998 286.919 Td [(type)]TJ +/F147 9.9626 Tf 351.998 286.919 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -222.214 -19.665 Td [(global)]TJ 0 g 0 G -/F84 9.9626 Tf 0.994 0 0 1 184.468 267.254 Tm [(Speci\002es)-250(whether)-250(t)1(he)-250(computation)-250(should)-250(include)-250(the)-249(global)-250(r)18(eduction)]TJ 1 0 0 1 175.611 255.299 Tm [(acr)18(oss)-250(all)-250(pr)18(ocesses.)]TJ 0 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(scalar)74(.)-310(Default:)]TJ/F145 9.9626 Tf 165.319 0 Td [(global)]TJ +/F84 9.9626 Tf 0.994 0 0 1 184.468 267.254 Tm [(Speci\002es)-250(whether)-250(t)1(he)-250(computation)-250(should)-250(include)-250(the)-249(global)-250(r)18(eduction)]TJ 1 0 0 1 175.611 255.299 Tm [(acr)18(oss)-250(all)-250(pr)18(ocesses.)]TJ 0 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(scalar)74(.)-310(Default:)]TJ/F147 9.9626 Tf 165.319 0 Td [(global)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G @@ -11537,7 +11546,7 @@ BT 0 g 0 G 0 -19.666 Td [(Function)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 72.776 0 Td [(is)-250(the)-250(1-norm)-250(of)-250(vector)]TJ/F78 9.9626 Tf 102.161 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ 0.98 0 0 1 175.611 144.236 Tm [(Scope:)]TJ/F75 9.9626 Tf 0.98 0 0 1 206.422 144.236 Tm [(global)]TJ/F84 9.9626 Tf 0.98 0 0 1 237.009 144.236 Tm [(unless)-244(the)-244(optional)-244(variable)]TJ/F145 9.9626 Tf 1 0 0 1 358.293 144.236 Tm [(global)]TJ +/F84 9.9626 Tf 72.776 0 Td [(is)-250(the)-250(1-norm)-250(of)-250(vector)]TJ/F78 9.9626 Tf 102.161 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ 0.98 0 0 1 175.611 144.236 Tm [(Scope:)]TJ/F75 9.9626 Tf 0.98 0 0 1 206.422 144.236 Tm [(global)]TJ/F84 9.9626 Tf 0.98 0 0 1 237.009 144.236 Tm [(unless)-244(the)-244(optional)-244(variable)]TJ/F147 9.9626 Tf 1 0 0 1 358.293 144.236 Tm [(global)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G @@ -11549,7 +11558,7 @@ ET endstream endobj -1229 0 obj +1230 0 obj << /Length 3138 >> @@ -11567,7 +11576,7 @@ BT 0.98 0 0 1 124.493 616.465 Tm [(The)-201(computation)-200(of)-201(a)-200(global)-201(r)18(esult)-200(r)18(equir)18(es)-200(a)-201(global)-200(communication,)-212(which)]TJ 1.02 0 0 1 124.802 604.51 Tm [(entails)-265(a)-265(signi\002cant)-264(over)17(head.)-363(It)-265(may)-264(be)-265(necessary)-265(and/or)-265(advisable)-265(to)]TJ 1.02 0 0 1 124.802 592.555 Tm [(compute)-287(multiple)-287(norms)-287(at)-287(the)-287(same)-287(time;)-308(in)-286(this)-287(case,)-298(it)-287(is)-287(possible)-287(to)]TJ 1 0 0 1 124.802 580.6 Tm [(impr)18(ove)-250(the)-250(r)8(untime)-250(ef)18(\002ciency)-250(by)-250(using)-250(the)-250(following)-250(scheme:)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G -/F145 9.9626 Tf 20.921 -19.926 Td [(vres\050)]TJ +/F147 9.9626 Tf 20.921 -19.926 Td [(vres\050)]TJ 0.25 0.63 0.44 rg 0.25 0.63 0.44 RG [(1)]TJ 0 g 0 G @@ -11643,7 +11652,7 @@ ET endstream endobj -1237 0 obj +1238 0 obj << /Length 7611 >> @@ -11658,11 +11667,11 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 201.825 706.129 Td [(geasums)-250(\227)-250(Generalized)-250(1-Norm)-250(of)-250(V)111(ector)]TJ/F84 9.9626 Tf 0.988 0 0 1 150.396 685.937 Tm [(This)-253(subr)18(outine)-253(computes)-253(a)-253(series)-253(of)-253(1-norms)-253(on)-253(the)-254(co)1(lumns)-254(of)-253(a)-253(dense)-253(matrix)]TJ/F78 9.9626 Tf 1 0 0 1 150.999 673.982 Tm [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(:)]TJ/F78 9.9626 Tf 120.031 -13.856 Td [(r)-17(e)-25(s)]TJ/F192 10.3811 Tf 12.294 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F190 10.3811 Tf 7.042 0 Td [(\040)]TJ/F84 9.9626 Tf 13.273 0 Td [(max)]TJ/F78 7.5716 Tf 7.759 -7.335 Td [(k)]TJ/F190 10.3811 Tf 12.944 7.335 Td [(j)]TJ/F78 9.9626 Tf 3.298 0 Td [(x)]TJ/F192 10.3811 Tf 5.33 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(k)]TJ/F84 9.9626 Tf 4.598 0 Td [(,)]TJ/F78 9.9626 Tf 4.206 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F190 10.3811 Tf 4.274 0 Td [(j)]TJ/F84 9.9626 Tf -215.511 -24.535 Td [(This)-250(function)-250(computes)-250(the)-250(1-norm)-250(of)-250(a)-250(vector)]TJ/F78 9.9626 Tf 206.349 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -211.245 -11.955 Td [(If)]TJ/F78 9.9626 Tf 9.459 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(r)18(eal)-250(vector)-250(it)-250(computes)-250(1-norm)-250(as:)]TJ/F78 9.9626 Tf 125.227 -23.185 Td [(r)-17(e)-25(s)]TJ/F192 10.3811 Tf 12.294 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F190 10.3811 Tf 7.042 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 19.006 0 Td [(x)]TJ/F78 7.5716 Tf 5.147 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.876 1.96 Td [(k)]TJ/F84 9.9626 Tf -196.039 -23.185 Td [(else)-250(if)]TJ/F78 9.9626 Tf 28.159 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(complex)-250(vector)-250(then)-250(it)-250(computes)-250(1-norm)-250(as:)]TJ/F78 9.9626 Tf 71.212 -23.185 Td [(r)-17(e)-25(s)]TJ/F192 10.3811 Tf 12.294 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F190 10.3811 Tf 7.041 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 18.738 0 Td [(r)-17(e)]TJ/F192 10.3811 Tf 8.169 0 Td [(\050)]TJ/F78 9.9626 Tf 4.443 0 Td [(x)]TJ/F192 10.3811 Tf 5.33 0 Td [(\051)]TJ/F190 10.3811 Tf 4.274 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.858 Td [(1)]TJ/F192 10.3811 Tf 6.346 1.858 Td [(+)]TJ/F190 10.3811 Tf 10.256 0 Td [(k)]TJ/F78 9.9626 Tf 5.369 0 Td [(i)-32(m)]TJ/F192 10.3811 Tf 11.089 0 Td [(\050)]TJ/F78 9.9626 Tf 4.443 0 Td [(x)]TJ/F192 10.3811 Tf 5.33 0 Td [(\051)]TJ/F190 10.3811 Tf 4.274 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.858 Td [(1)]TJ +/F75 11.9552 Tf 201.825 706.129 Td [(geasums)-250(\227)-250(Generalized)-250(1-Norm)-250(of)-250(V)111(ector)]TJ/F84 9.9626 Tf 0.988 0 0 1 150.396 685.937 Tm [(This)-253(subr)18(outine)-253(computes)-253(a)-253(series)-253(of)-253(1-norms)-253(on)-253(the)-254(co)1(lumns)-254(of)-253(a)-253(dense)-253(matrix)]TJ/F78 9.9626 Tf 1 0 0 1 150.999 673.982 Tm [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(:)]TJ/F78 9.9626 Tf 120.031 -13.856 Td [(r)-17(e)-25(s)]TJ/F197 10.3811 Tf 12.294 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 7.042 0 Td [(\040)]TJ/F84 9.9626 Tf 13.273 0 Td [(max)]TJ/F78 7.5716 Tf 7.759 -7.335 Td [(k)]TJ/F195 10.3811 Tf 12.944 7.335 Td [(j)]TJ/F78 9.9626 Tf 3.298 0 Td [(x)]TJ/F197 10.3811 Tf 5.33 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(k)]TJ/F84 9.9626 Tf 4.598 0 Td [(,)]TJ/F78 9.9626 Tf 4.206 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 4.274 0 Td [(j)]TJ/F84 9.9626 Tf -215.511 -24.535 Td [(This)-250(function)-250(computes)-250(the)-250(1-norm)-250(of)-250(a)-250(vector)]TJ/F78 9.9626 Tf 206.349 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -211.245 -11.955 Td [(If)]TJ/F78 9.9626 Tf 9.459 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(r)18(eal)-250(vector)-250(it)-250(computes)-250(1-norm)-250(as:)]TJ/F78 9.9626 Tf 125.227 -23.185 Td [(r)-17(e)-25(s)]TJ/F197 10.3811 Tf 12.294 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 7.042 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 19.006 0 Td [(x)]TJ/F78 7.5716 Tf 5.147 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.876 1.96 Td [(k)]TJ/F84 9.9626 Tf -196.039 -23.185 Td [(else)-250(if)]TJ/F78 9.9626 Tf 28.159 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(complex)-250(vector)-250(then)-250(it)-250(computes)-250(1-norm)-250(as:)]TJ/F78 9.9626 Tf 71.212 -23.185 Td [(r)-17(e)-25(s)]TJ/F197 10.3811 Tf 12.294 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 7.041 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 18.738 0 Td [(r)-17(e)]TJ/F197 10.3811 Tf 8.169 0 Td [(\050)]TJ/F78 9.9626 Tf 4.443 0 Td [(x)]TJ/F197 10.3811 Tf 5.33 0 Td [(\051)]TJ/F195 10.3811 Tf 4.274 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.858 Td [(1)]TJ/F197 10.3811 Tf 6.346 1.858 Td [(+)]TJ/F195 10.3811 Tf 10.256 0 Td [(k)]TJ/F78 9.9626 Tf 5.369 0 Td [(i)-32(m)]TJ/F197 10.3811 Tf 11.089 0 Td [(\050)]TJ/F78 9.9626 Tf 4.443 0 Td [(x)]TJ/F197 10.3811 Tf 5.33 0 Td [(\051)]TJ/F195 10.3811 Tf 4.274 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.858 Td [(1)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -212.211 -21.96 Td [(call)]TJ +/F147 9.9626 Tf -212.211 -21.96 Td [(call)]TJ 0 g 0 G [-525(psb_geasums\050res,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -11741,28 +11750,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.614 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -165.875 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 175.611 295.3 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-248(an)-247(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 420.354 295.3 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 420.354 295.3 Tm [(psb)]TJ ET q 1 0 0 1 436.673 295.5 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 439.811 295.3 Td [(T)]TJ +/F147 9.9626 Tf 439.811 295.3 Td [(T)]TJ ET q 1 0 0 1 445.669 295.5 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 448.807 295.3 Td [(vect)]TJ +/F147 9.9626 Tf 448.807 295.3 Td [(vect)]TJ ET q 1 0 0 1 470.356 295.5 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 473.495 295.3 Td [(type)]TJ +/F147 9.9626 Tf 473.495 295.3 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf -297.884 -11.955 Td [(containing)-250(numbers)-250(of)-250(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -11781,21 +11790,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 324.173 213.264 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 327.311 213.065 Td [(desc)]TJ +/F147 9.9626 Tf 327.311 213.065 Td [(desc)]TJ ET q 1 0 0 1 348.86 213.264 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 351.998 213.065 Td [(type)]TJ +/F147 9.9626 Tf 351.998 213.065 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -11812,7 +11821,7 @@ ET endstream endobj -1242 0 obj +1243 0 obj << /Length 582 >> @@ -11831,7 +11840,7 @@ ET endstream endobj -1250 0 obj +1251 0 obj << /Length 6755 >> @@ -11846,14 +11855,14 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 201.825 706.129 Td [(norm2)-250(\227)-250(2-Norm)-250(of)-250(V)111(ector)]TJ/F84 9.9626 Tf -51.429 -20.076 Td [(This)-250(function)-250(computes)-250(the)-250(2-norm)-250(of)-250(a)-250(vector)]TJ/F78 9.9626 Tf 206.349 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -211.245 -11.955 Td [(If)]TJ/F78 9.9626 Tf 9.459 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(r)18(eal)-250(vector)-250(it)-250(computes)-250(2-norm)-250(as:)]TJ/F78 9.9626 Tf 122.551 -25.46 Td [(n)-15(r)-35(m)]TJ/F84 9.9626 Tf 17.788 0 Td [(2)]TJ/F190 10.3811 Tf 7.873 0 Td [(\040)]TJ 13.398 9.727 Td [(p)]TJ +/F75 11.9552 Tf 201.825 706.129 Td [(norm2)-250(\227)-250(2-Norm)-250(of)-250(V)111(ector)]TJ/F84 9.9626 Tf -51.429 -20.076 Td [(This)-250(function)-250(computes)-250(the)-250(2-norm)-250(of)-250(a)-250(vector)]TJ/F78 9.9626 Tf 206.349 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -211.245 -11.955 Td [(If)]TJ/F78 9.9626 Tf 9.459 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(r)18(eal)-250(vector)-250(it)-250(computes)-250(2-norm)-250(as:)]TJ/F78 9.9626 Tf 122.551 -25.46 Td [(n)-15(r)-35(m)]TJ/F84 9.9626 Tf 17.788 0 Td [(2)]TJ/F195 10.3811 Tf 7.873 0 Td [(\040)]TJ 13.398 9.727 Td [(p)]TJ ET q 1 0 0 1 338.242 658.569 cm []0 d 0 J 0.408 w 0 0 m 16.592 0 l S Q BT -/F78 9.9626 Tf 338.536 648.638 Td [(x)]TJ/F78 7.5716 Tf 5.398 2.88 Td [(T)]TJ/F78 9.9626 Tf 5.695 -2.88 Td [(x)]TJ/F84 9.9626 Tf -198.924 -23.065 Td [(else)-250(if)]TJ/F78 9.9626 Tf 28.159 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(complex)-250(vector)-250(then)-250(it)-250(computes)-250(2-norm)-250(as:)]TJ/F78 9.9626 Tf 103.113 -25.46 Td [(n)-15(r)-35(m)]TJ/F84 9.9626 Tf 17.788 0 Td [(2)]TJ/F190 10.3811 Tf 7.873 0 Td [(\040)]TJ 13.398 9.727 Td [(p)]TJ +/F78 9.9626 Tf 338.536 648.638 Td [(x)]TJ/F78 7.5716 Tf 5.398 2.88 Td [(T)]TJ/F78 9.9626 Tf 5.695 -2.88 Td [(x)]TJ/F84 9.9626 Tf -198.924 -23.065 Td [(else)-250(if)]TJ/F78 9.9626 Tf 28.159 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(a)-250(complex)-250(vector)-250(then)-250(it)-250(computes)-250(2-norm)-250(as:)]TJ/F78 9.9626 Tf 103.113 -25.46 Td [(n)-15(r)-35(m)]TJ/F84 9.9626 Tf 17.788 0 Td [(2)]TJ/F195 10.3811 Tf 7.873 0 Td [(\040)]TJ 13.398 9.727 Td [(p)]TJ ET q 1 0 0 1 337.504 610.044 cm @@ -11916,7 +11925,7 @@ BT /F84 9.9626 Tf 280.768 486.513 Td [(T)92(able)-250(8:)-310(Data)-250(types)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -115.119 -27.631 Td [(psb_genrm2\050x,)]TJ +/F147 9.9626 Tf -115.119 -27.631 Td [(psb_genrm2\050x,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G [-525(desc_a,)]TJ @@ -11947,28 +11956,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.614 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -165.875 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 175.611 318.495 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-248(an)-247(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 420.354 318.495 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 420.354 318.495 Tm [(psb)]TJ ET q 1 0 0 1 436.673 318.695 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 439.811 318.495 Td [(T)]TJ +/F147 9.9626 Tf 439.811 318.495 Td [(T)]TJ ET q 1 0 0 1 445.669 318.695 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 448.807 318.495 Td [(vect)]TJ +/F147 9.9626 Tf 448.807 318.495 Td [(vect)]TJ ET q 1 0 0 1 470.356 318.695 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 473.495 318.495 Td [(type)]TJ +/F147 9.9626 Tf 473.495 318.495 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf -297.884 -11.955 Td [(containing)-250(numbers)-250(of)-250(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -11987,27 +11996,27 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 324.173 236.698 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 327.311 236.499 Td [(desc)]TJ +/F147 9.9626 Tf 327.311 236.499 Td [(desc)]TJ ET q 1 0 0 1 348.86 236.698 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 351.998 236.499 Td [(type)]TJ +/F147 9.9626 Tf 351.998 236.499 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -222.214 -22.221 Td [(global)]TJ 0 g 0 G -/F84 9.9626 Tf 0.994 0 0 1 184.468 214.278 Tm [(Speci\002es)-250(whether)-250(t)1(he)-250(computation)-250(should)-250(include)-250(the)-249(global)-250(r)18(eduction)]TJ 1 0 0 1 175.611 202.322 Tm [(acr)18(oss)-250(all)-250(pr)18(ocesses.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(scalar)74(.)-310(Default:)]TJ/F145 9.9626 Tf 165.319 0 Td [(global)]TJ +/F84 9.9626 Tf 0.994 0 0 1 184.468 214.278 Tm [(Speci\002es)-250(whether)-250(t)1(he)-250(computation)-250(should)-250(include)-250(the)-249(global)-250(r)18(eduction)]TJ 1 0 0 1 175.611 202.322 Tm [(acr)18(oss)-250(all)-250(pr)18(ocesses.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(scalar)74(.)-310(Default:)]TJ/F147 9.9626 Tf 165.319 0 Td [(global)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G @@ -12022,7 +12031,7 @@ ET endstream endobj -1255 0 obj +1256 0 obj << /Length 4510 >> @@ -12033,7 +12042,7 @@ stream BT /F75 9.9626 Tf 99.895 706.129 Td [(Function)-250(V)111(alue)]TJ 0 g 0 G -/F84 9.9626 Tf 73.883 0 Td [(is)-250(the)-250(2-norm)-250(of)-250(vector)]TJ/F78 9.9626 Tf 102.161 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ 0.98 0 0 1 124.802 694.174 Tm [(Scope:)]TJ/F75 9.9626 Tf 0.98 0 0 1 155.612 694.174 Tm [(global)]TJ/F84 9.9626 Tf 0.98 0 0 1 186.2 694.174 Tm [(unless)-244(the)-244(optional)-244(variab)1(le)]TJ/F145 9.9626 Tf 1 0 0 1 307.484 694.174 Tm [(global)]TJ +/F84 9.9626 Tf 73.883 0 Td [(is)-250(the)-250(2-norm)-250(of)-250(vector)]TJ/F78 9.9626 Tf 102.161 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ 0.98 0 0 1 124.802 694.174 Tm [(Scope:)]TJ/F75 9.9626 Tf 0.98 0 0 1 155.612 694.174 Tm [(global)]TJ/F84 9.9626 Tf 0.98 0 0 1 186.2 694.174 Tm [(unless)-244(the)-244(optional)-244(variab)1(le)]TJ/F147 9.9626 Tf 1 0 0 1 307.484 694.174 Tm [(global)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G @@ -12105,7 +12114,7 @@ ET endstream endobj -1268 0 obj +1269 0 obj << /Length 6311 >> @@ -12120,11 +12129,11 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 201.825 706.129 Td [(genrm2s)-250(\227)-250(Generalized)-250(2-Norm)-250(of)-250(V)111(ector)]TJ/F84 9.9626 Tf 0.988 0 0 1 150.396 687.165 Tm [(This)-253(subr)18(outine)-253(computes)-253(a)-253(series)-253(of)-253(2-norms)-253(on)-253(the)-254(co)1(lumns)-254(of)-253(a)-253(dense)-253(matrix)]TJ/F78 9.9626 Tf 1 0 0 1 150.999 675.21 Tm [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(:)]TJ/F78 9.9626 Tf 126.859 -11.955 Td [(r)-17(e)-25(s)]TJ/F192 10.3811 Tf 12.294 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F190 10.3811 Tf 7.041 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 19.007 0 Td [(x)]TJ/F192 10.3811 Tf 5.33 0 Td [(\050)]TJ/F84 9.9626 Tf 4.274 0 Td [(:)-12(,)]TJ/F78 9.9626 Tf 6.821 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F190 10.3811 Tf 4.274 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.744 Td [(2)]TJ +/F75 11.9552 Tf 201.825 706.129 Td [(genrm2s)-250(\227)-250(Generalized)-250(2-Norm)-250(of)-250(V)111(ector)]TJ/F84 9.9626 Tf 0.988 0 0 1 150.396 687.165 Tm [(This)-253(subr)18(outine)-253(computes)-253(a)-253(series)-253(of)-253(2-norms)-253(on)-253(the)-254(co)1(lumns)-254(of)-253(a)-253(dense)-253(matrix)]TJ/F78 9.9626 Tf 1 0 0 1 150.999 675.21 Tm [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(:)]TJ/F78 9.9626 Tf 126.859 -11.955 Td [(r)-17(e)-25(s)]TJ/F197 10.3811 Tf 12.294 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 7.041 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 19.007 0 Td [(x)]TJ/F197 10.3811 Tf 5.33 0 Td [(\050)]TJ/F84 9.9626 Tf 4.274 0 Td [(:)-12(,)]TJ/F78 9.9626 Tf 6.821 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 4.274 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.744 Td [(2)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -186.92 -16.189 Td [(call)]TJ +/F147 9.9626 Tf -186.92 -16.189 Td [(call)]TJ 0 g 0 G [-525(psb_genrm2s\050res,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -12203,28 +12212,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.614 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -165.875 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 175.611 419.863 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-248(an)-247(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 420.354 419.863 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 420.354 419.863 Tm [(psb)]TJ ET q 1 0 0 1 436.673 420.062 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 439.811 419.863 Td [(T)]TJ +/F147 9.9626 Tf 439.811 419.863 Td [(T)]TJ ET q 1 0 0 1 445.669 420.062 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 448.807 419.863 Td [(vect)]TJ +/F147 9.9626 Tf 448.807 419.863 Td [(vect)]TJ ET q 1 0 0 1 470.356 420.062 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 473.495 419.863 Td [(type)]TJ +/F147 9.9626 Tf 473.495 419.863 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf -297.884 -11.956 Td [(containing)-250(numbers)-250(of)-250(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -12243,21 +12252,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 324.173 340.361 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 327.311 340.161 Td [(desc)]TJ +/F147 9.9626 Tf 327.311 340.161 Td [(desc)]TJ ET q 1 0 0 1 348.86 340.361 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 351.998 340.161 Td [(type)]TJ +/F147 9.9626 Tf 351.998 340.161 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -12278,7 +12287,7 @@ ET endstream endobj -1165 0 obj +1166 0 obj << /Type /ObjStm /N 100 @@ -12286,17 +12295,17 @@ endobj /Length 11584 >> stream -1160 0 1164 146 1161 205 1172 313 1166 488 1167 629 1168 775 1169 919 1170 1064 1174 1211 -232 1269 1175 1326 1171 1384 1178 1506 1176 1645 1180 1791 1181 1850 1177 1909 1189 2017 1182 2201 -1183 2345 1184 2491 1185 2635 1186 2780 1187 2927 1191 3070 236 3128 1192 3185 1188 3242 1194 3378 -1196 3496 1193 3555 1201 3636 1197 3793 1198 3937 1199 4083 1203 4230 240 4288 1204 4345 1200 4403 -1207 4539 1209 4657 1210 4716 1206 4774 1215 4869 1211 5026 1212 5170 1213 5316 1217 5463 244 5521 -1218 5578 1214 5636 1223 5772 1219 5929 1220 6073 1221 6216 1225 6363 248 6422 1226 6480 1222 6538 -1228 6674 1230 6792 1231 6850 1227 6907 1236 7002 1232 7159 1233 7303 1234 7449 1238 7596 252 7655 -1239 7713 1235 7772 1241 7908 1243 8026 1240 8084 1249 8165 1245 8322 1246 8465 1247 8611 1251 8758 -256 8817 1252 8875 1248 8933 1254 9055 1256 9173 1257 9231 1258 9289 1259 9347 1260 9406 1261 9465 -1262 9524 1253 9583 1267 9691 1263 9848 1264 9992 1265 10138 1269 10285 260 10344 1270 10402 1266 10461 -% 1160 0 obj +1161 0 1165 146 1162 205 1173 313 1167 488 1168 629 1169 775 1170 919 1171 1064 1175 1211 +232 1269 1176 1326 1172 1384 1179 1506 1177 1645 1181 1791 1182 1850 1178 1909 1190 2017 1183 2201 +1184 2345 1185 2491 1186 2635 1187 2780 1188 2927 1192 3070 236 3128 1193 3185 1189 3242 1195 3378 +1197 3496 1194 3555 1202 3636 1198 3793 1199 3937 1200 4083 1204 4230 240 4288 1205 4345 1201 4403 +1208 4539 1210 4657 1211 4716 1207 4774 1216 4869 1212 5026 1213 5170 1214 5316 1218 5463 244 5521 +1219 5578 1215 5636 1224 5772 1220 5929 1221 6073 1222 6216 1226 6363 248 6422 1227 6480 1223 6538 +1229 6674 1231 6792 1232 6850 1228 6907 1237 7002 1233 7159 1234 7303 1235 7449 1239 7596 252 7655 +1240 7713 1236 7772 1242 7908 1244 8026 1241 8084 1250 8165 1246 8322 1247 8465 1248 8611 1252 8758 +256 8817 1253 8875 1249 8933 1255 9055 1257 9173 1258 9231 1259 9289 1260 9347 1261 9406 1262 9465 +1263 9524 1254 9583 1268 9691 1264 9848 1265 9992 1266 10138 1270 10285 260 10344 1271 10402 1267 10461 +% 1161 0 obj << /Type /Annot /Subtype /Link @@ -12304,25 +12313,25 @@ stream /Rect [395.773 588.749 402.747 600.809] /A << /S /GoTo /D (table.1) >> >> -% 1164 0 obj +% 1165 0 obj << -/D [1162 0 R /XYZ 149.705 753.953 null] +/D [1163 0 R /XYZ 149.705 753.953 null] >> -% 1161 0 obj +% 1162 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F78 686 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F147 941 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1172 0 obj +% 1173 0 obj << /Type /Page -/Contents 1173 0 R -/Resources 1171 0 R +/Contents 1174 0 R +/Resources 1172 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1158 0 R -/Annots [ 1166 0 R 1167 0 R 1168 0 R 1169 0 R 1170 0 R ] +/Parent 1159 0 R +/Annots [ 1167 0 R 1168 0 R 1169 0 R 1170 0 R 1171 0 R ] >> -% 1166 0 obj +% 1167 0 obj << /Type /Annot /Subtype /Link @@ -12330,7 +12339,7 @@ stream /Rect [368.549 355.7 444.603 367.76] /A << /S /GoTo /D (vdata) >> >> -% 1167 0 obj +% 1168 0 obj << /Type /Annot /Subtype /Link @@ -12338,7 +12347,7 @@ stream /Rect [332.133 343.745 339.206 355.804] /A << /S /GoTo /D (table.2) >> >> -% 1168 0 obj +% 1169 0 obj << /Type /Annot /Subtype /Link @@ -12346,7 +12355,7 @@ stream /Rect [368.549 264.018 444.603 276.078] /A << /S /GoTo /D (vdata) >> >> -% 1169 0 obj +% 1170 0 obj << /Type /Annot /Subtype /Link @@ -12354,7 +12363,7 @@ stream /Rect [322.336 252.063 329.21 264.123] /A << /S /GoTo /D (table.2) >> >> -% 1170 0 obj +% 1171 0 obj << /Type /Annot /Subtype /Link @@ -12362,33 +12371,33 @@ stream /Rect [256.048 172.336 323.106 184.396] /A << /S /GoTo /D (descdata) >> >> -% 1174 0 obj +% 1175 0 obj << -/D [1172 0 R /XYZ 98.895 753.953 null] +/D [1173 0 R /XYZ 98.895 753.953 null] >> % 232 0 obj << -/D [1172 0 R /XYZ 99.895 716.092 null] +/D [1173 0 R /XYZ 99.895 716.092 null] >> -% 1175 0 obj +% 1176 0 obj << -/D [1172 0 R /XYZ 99.895 499.951 null] +/D [1173 0 R /XYZ 99.895 499.951 null] >> -% 1171 0 obj +% 1172 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1178 0 obj +% 1179 0 obj << /Type /Page -/Contents 1179 0 R -/Resources 1177 0 R +/Contents 1180 0 R +/Resources 1178 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1158 0 R -/Annots [ 1176 0 R ] +/Parent 1159 0 R +/Annots [ 1177 0 R ] >> -% 1176 0 obj +% 1177 0 obj << /Type /Annot /Subtype /Link @@ -12396,29 +12405,29 @@ stream /Rect [428.968 602.697 435.942 614.756] /A << /S /GoTo /D (table.2) >> >> -% 1180 0 obj +% 1181 0 obj << -/D [1178 0 R /XYZ 149.705 753.953 null] +/D [1179 0 R /XYZ 149.705 753.953 null] >> -% 1181 0 obj +% 1182 0 obj << -/D [1178 0 R /XYZ 150.705 512.639 null] +/D [1179 0 R /XYZ 150.705 512.639 null] >> -% 1177 0 obj +% 1178 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F78 686 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F147 941 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1189 0 obj +% 1190 0 obj << /Type /Page -/Contents 1190 0 R -/Resources 1188 0 R +/Contents 1191 0 R +/Resources 1189 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1158 0 R -/Annots [ 1182 0 R 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R ] +/Parent 1159 0 R +/Annots [ 1183 0 R 1184 0 R 1185 0 R 1186 0 R 1187 0 R 1188 0 R ] >> -% 1182 0 obj +% 1183 0 obj << /Type /Annot /Subtype /Link @@ -12426,7 +12435,7 @@ stream /Rect [368.549 384.684 444.603 396.744] /A << /S /GoTo /D (vdata) >> >> -% 1183 0 obj +% 1184 0 obj << /Type /Annot /Subtype /Link @@ -12434,7 +12443,7 @@ stream /Rect [332.133 372.729 339.206 384.789] /A << /S /GoTo /D (table.3) >> >> -% 1184 0 obj +% 1185 0 obj << /Type /Annot /Subtype /Link @@ -12442,7 +12451,7 @@ stream /Rect [368.549 293.733 444.603 305.793] /A << /S /GoTo /D (vdata) >> >> -% 1185 0 obj +% 1186 0 obj << /Type /Annot /Subtype /Link @@ -12450,7 +12459,7 @@ stream /Rect [322.336 281.778 329.21 293.837] /A << /S /GoTo /D (table.3) >> >> -% 1186 0 obj +% 1187 0 obj << /Type /Annot /Subtype /Link @@ -12458,7 +12467,7 @@ stream /Rect [256.048 202.781 323.106 214.841] /A << /S /GoTo /D (descdata) >> >> -% 1187 0 obj +% 1188 0 obj << /Type /Annot /Subtype /Link @@ -12466,50 +12475,50 @@ stream /Rect [149.34 119.17 156.313 128.58] /A << /S /GoTo /D (table.2) >> >> -% 1191 0 obj +% 1192 0 obj << -/D [1189 0 R /XYZ 98.895 753.953 null] +/D [1190 0 R /XYZ 98.895 753.953 null] >> % 236 0 obj << -/D [1189 0 R /XYZ 99.895 716.092 null] +/D [1190 0 R /XYZ 99.895 716.092 null] >> -% 1192 0 obj +% 1193 0 obj << -/D [1189 0 R /XYZ 99.895 524.97 null] +/D [1190 0 R /XYZ 99.895 524.97 null] >> -% 1188 0 obj +% 1189 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1194 0 obj +% 1195 0 obj << /Type /Page -/Contents 1195 0 R -/Resources 1193 0 R +/Contents 1196 0 R +/Resources 1194 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1158 0 R +/Parent 1159 0 R >> -% 1196 0 obj +% 1197 0 obj << -/D [1194 0 R /XYZ 149.705 753.953 null] +/D [1195 0 R /XYZ 149.705 753.953 null] >> -% 1193 0 obj +% 1194 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1201 0 obj +% 1202 0 obj << /Type /Page -/Contents 1202 0 R -/Resources 1200 0 R +/Contents 1203 0 R +/Resources 1201 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1205 0 R -/Annots [ 1197 0 R 1198 0 R 1199 0 R ] +/Parent 1206 0 R +/Annots [ 1198 0 R 1199 0 R 1200 0 R ] >> -% 1197 0 obj +% 1198 0 obj << /Type /Annot /Subtype /Link @@ -12517,7 +12526,7 @@ stream /Rect [368.549 358.503 444.603 370.562] /A << /S /GoTo /D (vdata) >> >> -% 1198 0 obj +% 1199 0 obj << /Type /Annot /Subtype /Link @@ -12525,7 +12534,7 @@ stream /Rect [326.652 346.547 333.626 358.607] /A << /S /GoTo /D (table.4) >> >> -% 1199 0 obj +% 1200 0 obj << /Type /Annot /Subtype /Link @@ -12533,54 +12542,54 @@ stream /Rect [256.048 280.074 323.106 292.134] /A << /S /GoTo /D (descdata) >> >> -% 1203 0 obj +% 1204 0 obj << -/D [1201 0 R /XYZ 98.895 753.953 null] +/D [1202 0 R /XYZ 98.895 753.953 null] >> % 240 0 obj << -/D [1201 0 R /XYZ 99.895 716.092 null] +/D [1202 0 R /XYZ 99.895 716.092 null] >> -% 1204 0 obj +% 1205 0 obj << -/D [1201 0 R /XYZ 99.895 495.665 null] +/D [1202 0 R /XYZ 99.895 495.665 null] >> -% 1200 0 obj +% 1201 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F192 942 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F197 943 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1207 0 obj +% 1208 0 obj << /Type /Page -/Contents 1208 0 R -/Resources 1206 0 R +/Contents 1209 0 R +/Resources 1207 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1205 0 R +/Parent 1206 0 R >> -% 1209 0 obj +% 1210 0 obj << -/D [1207 0 R /XYZ 149.705 753.953 null] +/D [1208 0 R /XYZ 149.705 753.953 null] >> -% 1210 0 obj +% 1211 0 obj << -/D [1207 0 R /XYZ 150.705 632.19 null] +/D [1208 0 R /XYZ 150.705 632.19 null] >> -% 1206 0 obj +% 1207 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1215 0 obj +% 1216 0 obj << /Type /Page -/Contents 1216 0 R -/Resources 1214 0 R +/Contents 1217 0 R +/Resources 1215 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1205 0 R -/Annots [ 1211 0 R 1212 0 R 1213 0 R ] +/Parent 1206 0 R +/Annots [ 1212 0 R 1213 0 R 1214 0 R ] >> -% 1211 0 obj +% 1212 0 obj << /Type /Annot /Subtype /Link @@ -12588,7 +12597,7 @@ stream /Rect [368.549 411.694 444.603 423.754] /A << /S /GoTo /D (vdata) >> >> -% 1212 0 obj +% 1213 0 obj << /Type /Annot /Subtype /Link @@ -12596,7 +12605,7 @@ stream /Rect [326.652 399.739 333.626 411.798] /A << /S /GoTo /D (table.5) >> >> -% 1213 0 obj +% 1214 0 obj << /Type /Annot /Subtype /Link @@ -12604,33 +12613,33 @@ stream /Rect [256.048 331.993 323.106 344.052] /A << /S /GoTo /D (descdata) >> >> -% 1217 0 obj +% 1218 0 obj << -/D [1215 0 R /XYZ 98.895 753.953 null] +/D [1216 0 R /XYZ 98.895 753.953 null] >> % 244 0 obj << -/D [1215 0 R /XYZ 99.895 716.092 null] +/D [1216 0 R /XYZ 99.895 716.092 null] >> -% 1218 0 obj +% 1219 0 obj << -/D [1215 0 R /XYZ 99.895 555.856 null] +/D [1216 0 R /XYZ 99.895 555.856 null] >> -% 1214 0 obj +% 1215 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1223 0 obj +% 1224 0 obj << /Type /Page -/Contents 1224 0 R -/Resources 1222 0 R +/Contents 1225 0 R +/Resources 1223 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1205 0 R -/Annots [ 1219 0 R 1220 0 R 1221 0 R ] +/Parent 1206 0 R +/Annots [ 1220 0 R 1221 0 R 1222 0 R ] >> -% 1219 0 obj +% 1220 0 obj << /Type /Annot /Subtype /Link @@ -12638,7 +12647,7 @@ stream /Rect [419.358 362.555 495.412 374.615] /A << /S /GoTo /D (vdata) >> >> -% 1220 0 obj +% 1221 0 obj << /Type /Annot /Subtype /Link @@ -12646,7 +12655,7 @@ stream /Rect [377.462 350.6 384.436 362.66] /A << /S /GoTo /D (table.6) >> >> -% 1221 0 obj +% 1222 0 obj << /Type /Annot /Subtype /Link @@ -12654,54 +12663,54 @@ stream /Rect [306.858 283.114 373.916 295.173] /A << /S /GoTo /D (descdata) >> >> -% 1225 0 obj +% 1226 0 obj << -/D [1223 0 R /XYZ 149.705 753.953 null] +/D [1224 0 R /XYZ 149.705 753.953 null] >> % 248 0 obj << -/D [1223 0 R /XYZ 150.705 716.092 null] +/D [1224 0 R /XYZ 150.705 716.092 null] >> -% 1226 0 obj +% 1227 0 obj << -/D [1223 0 R /XYZ 150.705 505.29 null] +/D [1224 0 R /XYZ 150.705 505.29 null] >> -% 1222 0 obj +% 1223 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F192 942 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F197 943 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1228 0 obj +% 1229 0 obj << /Type /Page -/Contents 1229 0 R -/Resources 1227 0 R +/Contents 1230 0 R +/Resources 1228 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1205 0 R +/Parent 1206 0 R >> -% 1230 0 obj +% 1231 0 obj << -/D [1228 0 R /XYZ 98.895 753.953 null] +/D [1229 0 R /XYZ 98.895 753.953 null] >> -% 1231 0 obj +% 1232 0 obj << -/D [1228 0 R /XYZ 99.895 632.19 null] +/D [1229 0 R /XYZ 99.895 632.19 null] >> -% 1227 0 obj +% 1228 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1236 0 obj +% 1237 0 obj << /Type /Page -/Contents 1237 0 R -/Resources 1235 0 R +/Contents 1238 0 R +/Resources 1236 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1205 0 R -/Annots [ 1232 0 R 1233 0 R 1234 0 R ] +/Parent 1206 0 R +/Annots [ 1233 0 R 1234 0 R 1235 0 R ] >> -% 1232 0 obj +% 1233 0 obj << /Type /Annot /Subtype /Link @@ -12709,7 +12718,7 @@ stream /Rect [419.358 291.495 495.412 303.554] /A << /S /GoTo /D (vdata) >> >> -% 1233 0 obj +% 1234 0 obj << /Type /Annot /Subtype /Link @@ -12717,7 +12726,7 @@ stream /Rect [377.462 279.539 384.436 291.599] /A << /S /GoTo /D (table.7) >> >> -% 1234 0 obj +% 1235 0 obj << /Type /Annot /Subtype /Link @@ -12725,50 +12734,50 @@ stream /Rect [306.858 209.259 373.916 221.319] /A << /S /GoTo /D (descdata) >> >> -% 1238 0 obj +% 1239 0 obj << -/D [1236 0 R /XYZ 149.705 753.953 null] +/D [1237 0 R /XYZ 149.705 753.953 null] >> % 252 0 obj << -/D [1236 0 R /XYZ 150.705 716.092 null] +/D [1237 0 R /XYZ 150.705 716.092 null] >> -% 1239 0 obj +% 1240 0 obj << -/D [1236 0 R /XYZ 150.705 443.893 null] +/D [1237 0 R /XYZ 150.705 443.893 null] >> -% 1235 0 obj +% 1236 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1241 0 obj +% 1242 0 obj << /Type /Page -/Contents 1242 0 R -/Resources 1240 0 R +/Contents 1243 0 R +/Resources 1241 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1244 0 R +/Parent 1245 0 R >> -% 1243 0 obj +% 1244 0 obj << -/D [1241 0 R /XYZ 98.895 753.953 null] +/D [1242 0 R /XYZ 98.895 753.953 null] >> -% 1240 0 obj +% 1241 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1249 0 obj +% 1250 0 obj << /Type /Page -/Contents 1250 0 R -/Resources 1248 0 R +/Contents 1251 0 R +/Resources 1249 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1244 0 R -/Annots [ 1245 0 R 1246 0 R 1247 0 R ] +/Parent 1245 0 R +/Annots [ 1246 0 R 1247 0 R 1248 0 R ] >> -% 1245 0 obj +% 1246 0 obj << /Type /Annot /Subtype /Link @@ -12776,7 +12785,7 @@ stream /Rect [419.358 314.69 495.412 326.749] /A << /S /GoTo /D (vdata) >> >> -% 1246 0 obj +% 1247 0 obj << /Type /Annot /Subtype /Link @@ -12784,7 +12793,7 @@ stream /Rect [377.462 302.734 384.436 314.794] /A << /S /GoTo /D (table.8) >> >> -% 1247 0 obj +% 1248 0 obj << /Type /Annot /Subtype /Link @@ -12792,74 +12801,74 @@ stream /Rect [306.858 232.693 373.916 244.753] /A << /S /GoTo /D (descdata) >> >> -% 1251 0 obj +% 1252 0 obj << -/D [1249 0 R /XYZ 149.705 753.953 null] +/D [1250 0 R /XYZ 149.705 753.953 null] >> % 256 0 obj << -/D [1249 0 R /XYZ 150.705 716.092 null] +/D [1250 0 R /XYZ 150.705 716.092 null] >> -% 1252 0 obj +% 1253 0 obj << -/D [1249 0 R /XYZ 150.705 504.73 null] +/D [1250 0 R /XYZ 150.705 504.73 null] >> -% 1248 0 obj +% 1249 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1254 0 obj +% 1255 0 obj << /Type /Page -/Contents 1255 0 R -/Resources 1253 0 R +/Contents 1256 0 R +/Resources 1254 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1244 0 R ->> -% 1256 0 obj -<< -/D [1254 0 R /XYZ 98.895 753.953 null] +/Parent 1245 0 R >> % 1257 0 obj << -/D [1254 0 R /XYZ 99.895 564.444 null] +/D [1255 0 R /XYZ 98.895 753.953 null] >> % 1258 0 obj << -/D [1254 0 R /XYZ 99.895 504.067 null] +/D [1255 0 R /XYZ 99.895 564.444 null] >> % 1259 0 obj << -/D [1254 0 R /XYZ 124.802 506.876 null] +/D [1255 0 R /XYZ 99.895 504.067 null] >> % 1260 0 obj << -/D [1254 0 R /XYZ 124.802 494.921 null] +/D [1255 0 R /XYZ 124.802 506.876 null] >> % 1261 0 obj << -/D [1254 0 R /XYZ 124.802 482.966 null] +/D [1255 0 R /XYZ 124.802 494.921 null] >> % 1262 0 obj << -/D [1254 0 R /XYZ 124.802 471.011 null] +/D [1255 0 R /XYZ 124.802 482.966 null] >> -% 1253 0 obj +% 1263 0 obj +<< +/D [1255 0 R /XYZ 124.802 471.011 null] +>> +% 1254 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1267 0 obj +% 1268 0 obj << /Type /Page -/Contents 1268 0 R -/Resources 1266 0 R +/Contents 1269 0 R +/Resources 1267 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1244 0 R -/Annots [ 1263 0 R 1264 0 R 1265 0 R ] +/Parent 1245 0 R +/Annots [ 1264 0 R 1265 0 R 1266 0 R ] >> -% 1263 0 obj +% 1264 0 obj << /Type /Annot /Subtype /Link @@ -12867,7 +12876,7 @@ stream /Rect [419.358 416.057 495.412 428.117] /A << /S /GoTo /D (vdata) >> >> -% 1264 0 obj +% 1265 0 obj << /Type /Annot /Subtype /Link @@ -12875,7 +12884,7 @@ stream /Rect [377.462 404.102 384.436 416.161] /A << /S /GoTo /D (table.9) >> >> -% 1265 0 obj +% 1266 0 obj << /Type /Annot /Subtype /Link @@ -12883,27 +12892,27 @@ stream /Rect [306.858 336.356 373.916 348.415] /A << /S /GoTo /D (descdata) >> >> -% 1269 0 obj +% 1270 0 obj << -/D [1267 0 R /XYZ 149.705 753.953 null] +/D [1268 0 R /XYZ 149.705 753.953 null] >> % 260 0 obj << -/D [1267 0 R /XYZ 150.705 716.092 null] +/D [1268 0 R /XYZ 150.705 716.092 null] >> -% 1270 0 obj +% 1271 0 obj << -/D [1267 0 R /XYZ 150.705 560.219 null] +/D [1268 0 R /XYZ 150.705 560.219 null] >> -% 1266 0 obj +% 1267 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> endstream endobj -1275 0 obj +1276 0 obj << /Length 5396 >> @@ -12918,7 +12927,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 156.993 706.129 Td [(norm1)-250(\227)-250(1-Norm)-250(of)-250(Sparse)-250(Matrix)]TJ/F84 9.9626 Tf -57.406 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(1-norm)-250(of)-250(a)-250(matrix)]TJ/F78 9.9626 Tf 208.231 0 Td [(A)]TJ/F84 9.9626 Tf 7.318 0 Td [(:)]TJ/F78 9.9626 Tf -74.342 -33.873 Td [(n)-15(r)-35(m)]TJ/F84 9.9626 Tf 17.789 0 Td [(1)]TJ/F190 10.3811 Tf 7.873 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 19.335 0 Td [(A)]TJ/F190 10.3811 Tf 7.442 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.858 Td [(1)]TJ/F84 9.9626 Tf -199.071 -20.06 Td [(wher)18(e:)]TJ +/F75 11.9552 Tf 156.993 706.129 Td [(norm1)-250(\227)-250(1-Norm)-250(of)-250(Sparse)-250(Matrix)]TJ/F84 9.9626 Tf -57.406 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(1-norm)-250(of)-250(a)-250(matrix)]TJ/F78 9.9626 Tf 208.231 0 Td [(A)]TJ/F84 9.9626 Tf 7.318 0 Td [(:)]TJ/F78 9.9626 Tf -74.342 -33.873 Td [(n)-15(r)-35(m)]TJ/F84 9.9626 Tf 17.789 0 Td [(1)]TJ/F195 10.3811 Tf 7.873 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 19.335 0 Td [(A)]TJ/F195 10.3811 Tf 7.442 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.858 Td [(1)]TJ/F84 9.9626 Tf -199.071 -20.06 Td [(wher)18(e:)]TJ 0 g 0 G /F78 9.9626 Tf 1.041 -19.925 Td [(A)]TJ 0 g 0 G @@ -12980,7 +12989,7 @@ BT 0 g 0 G 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -127.572 -33.873 Td [(psb_spnrm1\050A,)-525(desc_a,)-525(info\051)]TJ 0 -11.955 Td [(psb_norm1\050A,)-525(desc_a,)-525(info\051)]TJ +/F147 9.9626 Tf -127.572 -33.873 Td [(psb_spnrm1\050A,)-525(desc_a,)-525(info\051)]TJ 0 -11.955 Td [(psb_norm1\050A,)-525(desc_a,)-525(info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -12993,21 +13002,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(the)-250(global)-250(sparse)-250(matrix)]TJ/F78 9.9626 Tf 194.722 0 Td [(A)]TJ/F84 9.9626 Tf 7.318 0 Td [(.)]TJ -187.096 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 273.363 344.346 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 276.501 344.147 Td [(Tspmat)]TJ +/F147 9.9626 Tf 276.501 344.147 Td [(Tspmat)]TJ ET q 1 0 0 1 308.511 344.346 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 311.649 344.147 Td [(type)]TJ +/F147 9.9626 Tf 311.649 344.147 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -13022,21 +13031,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 273.363 276.6 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 276.501 276.401 Td [(desc)]TJ +/F147 9.9626 Tf 276.501 276.401 Td [(desc)]TJ ET q 1 0 0 1 298.05 276.6 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 301.189 276.401 Td [(type)]TJ +/F147 9.9626 Tf 301.189 276.401 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -13057,7 +13066,7 @@ ET endstream endobj -1283 0 obj +1284 0 obj << /Length 5410 >> @@ -13072,7 +13081,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 207.803 706.129 Td [(normi)-250(\227)-250(In\002nity)-250(Norm)-250(of)-250(Sparse)-250(Matrix)]TJ/F84 9.9626 Tf -57.407 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(in\002nity-norm)-250(of)-250(a)-250(matrix)]TJ/F78 9.9626 Tf 235.459 0 Td [(A)]TJ/F84 9.9626 Tf 7.318 0 Td [(:)]TJ/F78 9.9626 Tf -102.019 -33.873 Td [(n)-15(r)-35(m)-18(i)]TJ/F190 10.3811 Tf 23.699 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 19.335 0 Td [(A)]TJ/F190 10.3811 Tf 7.442 0 Td [(k)]TJ/F243 7.5716 Tf 5.41 -1.494 Td [(\245)]TJ/F84 9.9626 Tf -196.754 -20.424 Td [(wher)18(e:)]TJ +/F75 11.9552 Tf 207.803 706.129 Td [(normi)-250(\227)-250(In\002nity)-250(Norm)-250(of)-250(Sparse)-250(Matrix)]TJ/F84 9.9626 Tf -57.407 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(in\002nity-norm)-250(of)-250(a)-250(matrix)]TJ/F78 9.9626 Tf 235.459 0 Td [(A)]TJ/F84 9.9626 Tf 7.318 0 Td [(:)]TJ/F78 9.9626 Tf -102.019 -33.873 Td [(n)-15(r)-35(m)-18(i)]TJ/F195 10.3811 Tf 23.699 0 Td [(\040)-291(k)]TJ/F78 9.9626 Tf 19.335 0 Td [(A)]TJ/F195 10.3811 Tf 7.442 0 Td [(k)]TJ/F241 7.5716 Tf 5.41 -1.494 Td [(\245)]TJ/F84 9.9626 Tf -196.754 -20.424 Td [(wher)18(e:)]TJ 0 g 0 G /F78 9.9626 Tf 1.042 -19.925 Td [(A)]TJ 0 g 0 G @@ -13134,7 +13143,7 @@ BT 0 g 0 G 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -127.572 -33.873 Td [(psb_spnrmi\050A,)-525(desc_a,)-525(info\051)]TJ 0 -11.955 Td [(psb_normi\050A,)-525(desc_a,)-525(info\051)]TJ +/F147 9.9626 Tf -127.572 -33.873 Td [(psb_spnrmi\050A,)-525(desc_a,)-525(info\051)]TJ 0 -11.955 Td [(psb_normi\050A,)-525(desc_a,)-525(info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -13147,21 +13156,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(the)-250(global)-250(sparse)-250(matrix)]TJ/F78 9.9626 Tf 194.722 0 Td [(A)]TJ/F84 9.9626 Tf 7.317 0 Td [(.)]TJ -187.095 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.242 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.242 0 Td [(psb)]TJ ET q 1 0 0 1 324.173 344.346 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 327.311 344.147 Td [(Tspmat)]TJ +/F147 9.9626 Tf 327.311 344.147 Td [(Tspmat)]TJ ET q 1 0 0 1 359.321 344.346 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 362.459 344.147 Td [(type)]TJ +/F147 9.9626 Tf 362.459 344.147 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -13176,21 +13185,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 324.173 276.6 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 327.311 276.401 Td [(desc)]TJ +/F147 9.9626 Tf 327.311 276.401 Td [(desc)]TJ ET q 1 0 0 1 348.86 276.6 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 351.998 276.401 Td [(type)]TJ +/F147 9.9626 Tf 351.998 276.401 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -13211,7 +13220,7 @@ ET endstream endobj -1294 0 obj +1295 0 obj << /Length 8068 >> @@ -13226,15 +13235,15 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 156.993 706.129 Td [(spmm)-250(\227)-250(Sparse)-250(Matrix)-250(by)-250(Dense)-250(Matrix)-250(Product)]TJ/F84 9.9626 Tf -57.406 -19.303 Td [(This)-250(subr)18(outine)-250(computes)-250(the)-250(Sparse)-250(Matrix)-250(by)-250(Dense)-250(Matrix)-250(Pr)18(oduct:)]TJ/F78 9.9626 Tf 140.456 -24.611 Td [(y)]TJ/F190 10.3811 Tf 7.998 0 Td [(\040)]TJ/F147 9.9626 Tf 13.397 0 Td [(a)]TJ/F78 9.9626 Tf 6.008 0 Td [(A)-42(x)]TJ/F192 10.3811 Tf 14.878 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ +/F75 11.9552 Tf 156.993 706.129 Td [(spmm)-250(\227)-250(Sparse)-250(Matrix)-250(by)-250(Dense)-250(Matrix)-250(Product)]TJ/F84 9.9626 Tf -57.406 -19.303 Td [(This)-250(subr)18(outine)-250(computes)-250(the)-250(Sparse)-250(Matrix)-250(by)-250(Dense)-250(Matrix)-250(Pr)18(oduct:)]TJ/F78 9.9626 Tf 140.456 -24.611 Td [(y)]TJ/F195 10.3811 Tf 7.998 0 Td [(\040)]TJ/F151 9.9626 Tf 13.397 0 Td [(a)]TJ/F78 9.9626 Tf 6.008 0 Td [(A)-42(x)]TJ/F197 10.3811 Tf 14.878 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ 0 g 0 G /F84 9.9626 Tf 134.508 0 Td [(\0501\051)]TJ 0 g 0 G -/F78 9.9626 Tf -195.74 -20.13 Td [(y)]TJ/F190 10.3811 Tf 7.998 0 Td [(\040)]TJ/F147 9.9626 Tf 13.397 0 Td [(a)]TJ/F78 9.9626 Tf 6.008 0 Td [(A)]TJ/F78 7.5716 Tf 7.51 4.115 Td [(T)]TJ/F78 9.9626 Tf 5.695 -4.115 Td [(x)]TJ/F192 10.3811 Tf 7.267 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ +/F78 9.9626 Tf -195.74 -20.13 Td [(y)]TJ/F195 10.3811 Tf 7.998 0 Td [(\040)]TJ/F151 9.9626 Tf 13.397 0 Td [(a)]TJ/F78 9.9626 Tf 6.008 0 Td [(A)]TJ/F78 7.5716 Tf 7.51 4.115 Td [(T)]TJ/F78 9.9626 Tf 5.695 -4.115 Td [(x)]TJ/F197 10.3811 Tf 7.267 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ 0 g 0 G /F84 9.9626 Tf 131.711 0 Td [(\0502\051)]TJ 0 g 0 G -/F78 9.9626 Tf -196.478 -20.129 Td [(y)]TJ/F190 10.3811 Tf 7.997 0 Td [(\040)]TJ/F147 9.9626 Tf 13.398 0 Td [(a)]TJ/F78 9.9626 Tf 6.007 0 Td [(A)]TJ/F78 7.5716 Tf 7.7 4.114 Td [(H)]TJ/F78 9.9626 Tf 6.982 -4.114 Td [(x)]TJ/F192 10.3811 Tf 7.267 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ +/F78 9.9626 Tf -196.478 -20.129 Td [(y)]TJ/F195 10.3811 Tf 7.997 0 Td [(\040)]TJ/F151 9.9626 Tf 13.398 0 Td [(a)]TJ/F78 9.9626 Tf 6.007 0 Td [(A)]TJ/F78 7.5716 Tf 7.7 4.114 Td [(H)]TJ/F78 9.9626 Tf 6.982 -4.114 Td [(x)]TJ/F197 10.3811 Tf 7.267 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ 0 g 0 G /F84 9.9626 Tf 130.973 0 Td [(\0503\051)]TJ 0 g 0 G @@ -13260,7 +13269,7 @@ q []0 d 0 J 0.398 w 0 0 m 184.337 0 l S Q BT -/F78 9.9626 Tf 186.183 509.418 Td [(A)]TJ/F84 9.9626 Tf 7.317 0 Td [(,)]TJ/F78 9.9626 Tf 5.275 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(,)]TJ/F78 9.9626 Tf 5.106 0 Td [(y)]TJ/F84 9.9626 Tf 5.105 0 Td [(,)]TJ/F147 9.9626 Tf 5.106 0 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(,)]TJ/F147 9.9626 Tf 5.355 0 Td [(b)]TJ/F75 9.9626 Tf 76.437 0 Td [(Subroutine)]TJ +/F78 9.9626 Tf 186.183 509.418 Td [(A)]TJ/F84 9.9626 Tf 7.317 0 Td [(,)]TJ/F78 9.9626 Tf 5.275 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(,)]TJ/F78 9.9626 Tf 5.106 0 Td [(y)]TJ/F84 9.9626 Tf 5.105 0 Td [(,)]TJ/F151 9.9626 Tf 5.106 0 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(,)]TJ/F151 9.9626 Tf 5.355 0 Td [(b)]TJ/F75 9.9626 Tf 76.437 0 Td [(Subroutine)]TJ ET q 1 0 0 1 179.582 505.633 cm @@ -13309,7 +13318,7 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -107.397 -24.261 Td [(call)]TJ +/F147 9.9626 Tf -107.397 -24.261 Td [(call)]TJ 0 g 0 G [-525(psb_spmm\050alpha,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -13367,7 +13376,7 @@ BT 0 g 0 G 0 -20.626 Td [(alpha)]TJ 0 g 0 G -/F84 9.9626 Tf 30.436 0 Td [(the)-250(scalar)]TJ/F147 9.9626 Tf 44.368 0 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(.)]TJ -55.282 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(number)-250(of)-250(the)-250(data)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ +/F84 9.9626 Tf 30.436 0 Td [(the)-250(scalar)]TJ/F151 9.9626 Tf 44.368 0 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(.)]TJ -55.282 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(number)-250(of)-250(the)-250(data)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG [-250(12)]TJ 0 g 0 G @@ -13377,21 +13386,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(the)-250(sparse)-250(matrix)]TJ/F78 9.9626 Tf 164.964 0 Td [(A)]TJ/F84 9.9626 Tf 7.318 0 Td [(.)]TJ -157.338 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 273.363 212.882 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 276.501 212.682 Td [(Tspmat)]TJ +/F147 9.9626 Tf 276.501 212.682 Td [(Tspmat)]TJ ET q 1 0 0 1 308.511 212.882 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 311.649 212.682 Td [(type)]TJ +/F147 9.9626 Tf 311.649 212.682 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -13399,28 +13408,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.614 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -165.875 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 144.236 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-247(an)-248(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 369.545 144.236 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 369.545 144.236 Tm [(psb)]TJ ET q 1 0 0 1 385.864 144.435 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 389.002 144.236 Td [(T)]TJ +/F147 9.9626 Tf 389.002 144.236 Td [(T)]TJ ET q 1 0 0 1 394.86 144.435 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.998 144.236 Td [(vect)]TJ +/F147 9.9626 Tf 397.998 144.236 Td [(vect)]TJ ET q 1 0 0 1 419.547 144.435 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.685 144.236 Td [(type)]TJ +/F147 9.9626 Tf 422.685 144.236 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.015 0 0 1 124.802 132.281 Tm [(containing)-247(numbers)-246(of)-247(type)-247(speci\002ed)-246(in)-247(T)91(able)]TJ 0 0 1 rg 0 0 1 RG @@ -13434,7 +13443,7 @@ ET endstream endobj -1310 0 obj +1311 0 obj << /Length 6709 >> @@ -13445,7 +13454,7 @@ stream BT /F75 9.9626 Tf 150.705 706.129 Td [(beta)]TJ 0 g 0 G -/F84 9.9626 Tf 24.348 0 Td [(the)-250(scalar)]TJ/F147 9.9626 Tf 44.618 0 Td [(b)]TJ/F84 9.9626 Tf 5.524 0 Td [(.)]TJ -49.584 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(number)-250(of)-250(the)-250(data)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ +/F84 9.9626 Tf 24.348 0 Td [(the)-250(scalar)]TJ/F151 9.9626 Tf 44.618 0 Td [(b)]TJ/F84 9.9626 Tf 5.524 0 Td [(.)]TJ -49.584 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(number)-250(of)-250(the)-250(data)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG [-250(12)]TJ 0 g 0 G @@ -13455,28 +13464,28 @@ BT 0 g 0 G /F84 9.9626 Tf 10.52 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.445 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(.)]TJ -166.165 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ 0.98 0 0 1 175.611 591.891 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-248(an)-247(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 420.354 591.891 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 420.354 591.891 Tm [(psb)]TJ ET q 1 0 0 1 436.673 592.09 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 439.811 591.891 Td [(T)]TJ +/F147 9.9626 Tf 439.811 591.891 Td [(T)]TJ ET q 1 0 0 1 445.669 592.09 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 448.807 591.891 Td [(vect)]TJ +/F147 9.9626 Tf 448.807 591.891 Td [(vect)]TJ ET q 1 0 0 1 470.356 592.09 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 473.495 591.891 Td [(type)]TJ +/F147 9.9626 Tf 473.495 591.891 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.016 0 0 1 175.611 579.935 Tm [(containing)-246(numbers)-247(of)-246(type)-247(speci\002ed)-246(in)-246(T)90(able)]TJ 0 0 1 rg 0 0 1 RG @@ -13495,21 +13504,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 324.173 501.762 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 327.311 501.563 Td [(desc)]TJ +/F147 9.9626 Tf 327.311 501.563 Td [(desc)]TJ ET q 1 0 0 1 348.86 501.762 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 351.998 501.563 Td [(type)]TJ +/F147 9.9626 Tf 351.998 501.563 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -13537,7 +13546,7 @@ BT 0 0 1 rg 0 0 1 RG [-250(3)]TJ 0 g 0 G - -45.878 -18.597 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F78 9.9626 Tf 38.64 0 Td [(t)-15(r)-50(a)-25(n)-25(s)]TJ/F192 10.3811 Tf 25.193 0 Td [(=)]TJ/F78 9.9626 Tf 11.435 0 Td [(N)]TJ/F84 9.9626 Tf -75.268 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(character)-250(variable.)]TJ + -45.878 -18.597 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F78 9.9626 Tf 38.64 0 Td [(t)-15(r)-50(a)-25(n)-25(s)]TJ/F197 10.3811 Tf 25.193 0 Td [(=)]TJ/F78 9.9626 Tf 11.435 0 Td [(N)]TJ/F84 9.9626 Tf -75.268 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(character)-250(variable.)]TJ 0 g 0 G /F75 9.9626 Tf -24.906 -18.596 Td [(work)]TJ 0 g 0 G @@ -13564,7 +13573,7 @@ ET endstream endobj -1316 0 obj +1317 0 obj << /Length 8135 >> @@ -13579,7 +13588,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 156.993 706.129 Td [(spsm)-250(\227)-250(T)111(riangular)-250(System)-250(Solve)]TJ/F84 9.9626 Tf -57.406 -19.83 Td [(This)-250(subr)18(outine)-250(computes)-250(the)-250(T)90(riangular)-250(System)-250(Solve:)]TJ/F78 9.9626 Tf 123.033 -35.213 Td [(y)]TJ/F190 10.3811 Tf 15.193 0 Td [(\040)]TJ/F147 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.639 0 Td [(T)]TJ/F190 7.8896 Tf 6.546 4.115 Td [(\000)]TJ/F84 7.5716 Tf 6.227 0 Td [(1)]TJ/F78 9.9626 Tf 4.578 -4.115 Td [(x)]TJ/F192 10.3811 Tf 7.267 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ -82.196 -16.139 Td [(y)]TJ/F190 10.3811 Tf 15.193 0 Td [(\040)]TJ/F147 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.709 0 Td [(D)-48(T)]TJ/F190 7.8896 Tf 14.774 4.114 Td [(\000)]TJ/F84 7.5716 Tf 6.228 0 Td [(1)]TJ/F78 9.9626 Tf 4.578 -4.114 Td [(x)]TJ/F192 10.3811 Tf 7.267 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ -90.495 -16.139 Td [(y)]TJ/F190 10.3811 Tf 15.193 0 Td [(\040)]TJ/F147 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.639 0 Td [(T)]TJ/F190 7.8896 Tf 6.546 4.114 Td [(\000)]TJ/F84 7.5716 Tf 6.227 0 Td [(1)]TJ/F78 9.9626 Tf 4.608 -4.114 Td [(D)-52(x)]TJ/F192 10.3811 Tf 15.536 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ -90.495 -16.09 Td [(y)]TJ/F190 10.3811 Tf 15.193 0 Td [(\040)]TJ/F147 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.639 0 Td [(T)]TJ/F190 7.8896 Tf 6.546 4.114 Td [(\000)]TJ/F78 7.5716 Tf 6.42 0 Td [(T)]TJ/F78 9.9626 Tf 5.695 -4.114 Td [(x)]TJ/F192 10.3811 Tf 7.267 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ -83.506 -16.09 Td [(y)]TJ/F190 10.3811 Tf 15.193 0 Td [(\040)]TJ/F147 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.709 0 Td [(D)-48(T)]TJ/F190 7.8896 Tf 14.774 4.114 Td [(\000)]TJ/F78 7.5716 Tf 6.421 0 Td [(T)]TJ/F78 9.9626 Tf 5.695 -4.114 Td [(x)]TJ/F192 10.3811 Tf 7.267 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.648 0 Td [(y)]TJ -91.804 -16.09 Td [(y)]TJ/F190 10.3811 Tf 15.193 0 Td [(\040)]TJ/F147 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.639 0 Td [(T)]TJ/F190 7.8896 Tf 6.546 4.114 Td [(\000)]TJ/F78 7.5716 Tf 6.42 0 Td [(T)]TJ/F78 9.9626 Tf 5.725 -4.114 Td [(D)-52(x)]TJ/F192 10.3811 Tf 15.536 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.648 0 Td [(y)]TJ -91.804 -16.091 Td [(y)]TJ/F190 10.3811 Tf 15.193 0 Td [(\040)]TJ/F147 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.639 0 Td [(T)]TJ/F190 7.8896 Tf 6.546 4.115 Td [(\000)]TJ/F78 7.5716 Tf 6.609 0 Td [(H)]TJ/F78 9.9626 Tf 6.982 -4.115 Td [(x)]TJ/F192 10.3811 Tf 7.267 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ -84.982 -16.09 Td [(y)]TJ/F190 10.3811 Tf 15.193 0 Td [(\040)]TJ/F147 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.709 0 Td [(D)-48(T)]TJ/F190 7.8896 Tf 14.774 4.115 Td [(\000)]TJ/F78 7.5716 Tf 6.61 0 Td [(H)]TJ/F78 9.9626 Tf 6.982 -4.115 Td [(x)]TJ/F192 10.3811 Tf 7.267 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ -93.281 -16.09 Td [(y)]TJ/F190 10.3811 Tf 15.193 0 Td [(\040)]TJ/F147 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.639 0 Td [(T)]TJ/F190 7.8896 Tf 6.545 4.115 Td [(\000)]TJ/F78 7.5716 Tf 6.61 0 Td [(H)]TJ/F78 9.9626 Tf 7.012 -4.115 Td [(D)-52(x)]TJ/F192 10.3811 Tf 15.536 0 Td [(+)]TJ/F147 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ/F84 9.9626 Tf -201.062 -38.202 Td [(wher)18(e:)]TJ +/F75 11.9552 Tf 156.993 706.129 Td [(spsm)-250(\227)-250(T)111(riangular)-250(System)-250(Solve)]TJ/F84 9.9626 Tf -57.406 -19.83 Td [(This)-250(subr)18(outine)-250(computes)-250(the)-250(T)90(riangular)-250(System)-250(Solve:)]TJ/F78 9.9626 Tf 123.033 -35.213 Td [(y)]TJ/F195 10.3811 Tf 15.193 0 Td [(\040)]TJ/F151 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.639 0 Td [(T)]TJ/F195 7.8896 Tf 6.546 4.115 Td [(\000)]TJ/F84 7.5716 Tf 6.227 0 Td [(1)]TJ/F78 9.9626 Tf 4.578 -4.115 Td [(x)]TJ/F197 10.3811 Tf 7.267 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ -82.196 -16.139 Td [(y)]TJ/F195 10.3811 Tf 15.193 0 Td [(\040)]TJ/F151 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.709 0 Td [(D)-48(T)]TJ/F195 7.8896 Tf 14.774 4.114 Td [(\000)]TJ/F84 7.5716 Tf 6.228 0 Td [(1)]TJ/F78 9.9626 Tf 4.578 -4.114 Td [(x)]TJ/F197 10.3811 Tf 7.267 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ -90.495 -16.139 Td [(y)]TJ/F195 10.3811 Tf 15.193 0 Td [(\040)]TJ/F151 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.639 0 Td [(T)]TJ/F195 7.8896 Tf 6.546 4.114 Td [(\000)]TJ/F84 7.5716 Tf 6.227 0 Td [(1)]TJ/F78 9.9626 Tf 4.608 -4.114 Td [(D)-52(x)]TJ/F197 10.3811 Tf 15.536 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ -90.495 -16.09 Td [(y)]TJ/F195 10.3811 Tf 15.193 0 Td [(\040)]TJ/F151 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.639 0 Td [(T)]TJ/F195 7.8896 Tf 6.546 4.114 Td [(\000)]TJ/F78 7.5716 Tf 6.42 0 Td [(T)]TJ/F78 9.9626 Tf 5.695 -4.114 Td [(x)]TJ/F197 10.3811 Tf 7.267 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ -83.506 -16.09 Td [(y)]TJ/F195 10.3811 Tf 15.193 0 Td [(\040)]TJ/F151 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.709 0 Td [(D)-48(T)]TJ/F195 7.8896 Tf 14.774 4.114 Td [(\000)]TJ/F78 7.5716 Tf 6.421 0 Td [(T)]TJ/F78 9.9626 Tf 5.695 -4.114 Td [(x)]TJ/F197 10.3811 Tf 7.267 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.648 0 Td [(y)]TJ -91.804 -16.09 Td [(y)]TJ/F195 10.3811 Tf 15.193 0 Td [(\040)]TJ/F151 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.639 0 Td [(T)]TJ/F195 7.8896 Tf 6.546 4.114 Td [(\000)]TJ/F78 7.5716 Tf 6.42 0 Td [(T)]TJ/F78 9.9626 Tf 5.725 -4.114 Td [(D)-52(x)]TJ/F197 10.3811 Tf 15.536 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.648 0 Td [(y)]TJ -91.804 -16.091 Td [(y)]TJ/F195 10.3811 Tf 15.193 0 Td [(\040)]TJ/F151 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.639 0 Td [(T)]TJ/F195 7.8896 Tf 6.546 4.115 Td [(\000)]TJ/F78 7.5716 Tf 6.609 0 Td [(H)]TJ/F78 9.9626 Tf 6.982 -4.115 Td [(x)]TJ/F197 10.3811 Tf 7.267 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ -84.982 -16.09 Td [(y)]TJ/F195 10.3811 Tf 15.193 0 Td [(\040)]TJ/F151 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.709 0 Td [(D)-48(T)]TJ/F195 7.8896 Tf 14.774 4.115 Td [(\000)]TJ/F78 7.5716 Tf 6.61 0 Td [(H)]TJ/F78 9.9626 Tf 6.982 -4.115 Td [(x)]TJ/F197 10.3811 Tf 7.267 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ -93.281 -16.09 Td [(y)]TJ/F195 10.3811 Tf 15.193 0 Td [(\040)]TJ/F151 9.9626 Tf 20.592 0 Td [(a)]TJ/F78 9.9626 Tf 5.639 0 Td [(T)]TJ/F195 7.8896 Tf 6.545 4.115 Td [(\000)]TJ/F78 7.5716 Tf 6.61 0 Td [(H)]TJ/F78 9.9626 Tf 7.012 -4.115 Td [(D)-52(x)]TJ/F197 10.3811 Tf 15.536 0 Td [(+)]TJ/F151 9.9626 Tf 10.505 0 Td [(b)]TJ/F78 9.9626 Tf 5.649 0 Td [(y)]TJ/F84 9.9626 Tf -201.062 -38.202 Td [(wher)18(e:)]TJ 0 g 0 G /F78 9.9626 Tf -14.65 -21.265 Td [(x)]TJ 0 g 0 G @@ -13599,7 +13608,7 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 6.895 -21.266 Td [(call)]TJ +/F147 9.9626 Tf 6.895 -21.266 Td [(call)]TJ 0 g 0 G [-525(psb_spsm\050alpha,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -13668,7 +13677,7 @@ q []0 d 0 J 0.398 w 0 0 m 184.337 0 l S Q BT -/F78 9.9626 Tf 185.814 330.871 Td [(T)]TJ/F84 9.9626 Tf 6.451 0 Td [(,)]TJ/F78 9.9626 Tf 5.275 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(,)]TJ/F78 9.9626 Tf 5.106 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(,)]TJ/F78 9.9626 Tf 5.305 0 Td [(D)]TJ/F84 9.9626 Tf 7.975 0 Td [(,)]TJ/F147 9.9626 Tf 5.106 0 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(,)]TJ/F147 9.9626 Tf 5.355 0 Td [(b)]TJ/F75 9.9626 Tf 64.392 0 Td [(Subroutine)]TJ +/F78 9.9626 Tf 185.814 330.871 Td [(T)]TJ/F84 9.9626 Tf 6.451 0 Td [(,)]TJ/F78 9.9626 Tf 5.275 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(,)]TJ/F78 9.9626 Tf 5.106 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(,)]TJ/F78 9.9626 Tf 5.305 0 Td [(D)]TJ/F84 9.9626 Tf 7.975 0 Td [(,)]TJ/F151 9.9626 Tf 5.106 0 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(,)]TJ/F151 9.9626 Tf 5.355 0 Td [(b)]TJ/F75 9.9626 Tf 64.392 0 Td [(Subroutine)]TJ ET q 1 0 0 1 179.582 327.085 cm @@ -13724,7 +13733,7 @@ BT 0 g 0 G 0 -21.713 Td [(alpha)]TJ 0 g 0 G -/F84 9.9626 Tf 30.436 0 Td [(the)-250(scalar)]TJ/F147 9.9626 Tf 44.368 0 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(.)]TJ -55.282 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(number)-250(of)-250(the)-250(data)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ +/F84 9.9626 Tf 30.436 0 Td [(the)-250(scalar)]TJ/F151 9.9626 Tf 44.368 0 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(.)]TJ -55.282 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(number)-250(of)-250(the)-250(data)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG [-250(13)]TJ 0 g 0 G @@ -13736,7 +13745,7 @@ ET endstream endobj -1327 0 obj +1328 0 obj << /Length 7465 >> @@ -13757,28 +13766,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.615 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -165.876 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ 0.98 0 0 1 175.611 589.838 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-248(an)-247(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 420.354 589.838 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 420.354 589.838 Tm [(psb)]TJ ET q 1 0 0 1 436.673 590.037 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 439.811 589.838 Td [(T)]TJ +/F147 9.9626 Tf 439.811 589.838 Td [(T)]TJ ET q 1 0 0 1 445.669 590.037 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 448.807 589.838 Td [(vect)]TJ +/F147 9.9626 Tf 448.807 589.838 Td [(vect)]TJ ET q 1 0 0 1 470.356 590.037 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 473.495 589.838 Td [(type)]TJ +/F147 9.9626 Tf 473.495 589.838 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.015 0 0 1 175.611 577.883 Tm [(containing)-247(numbers)-246(of)-247(type)-247(speci\002ed)-246(in)-247(T)90(able)]TJ 0 0 1 rg 0 0 1 RG @@ -13788,7 +13797,7 @@ BT 0 g 0 G /F75 9.9626 Tf -82.958 -20.649 Td [(beta)]TJ 0 g 0 G -/F84 9.9626 Tf 24.348 0 Td [(the)-250(scalar)]TJ/F147 9.9626 Tf 44.618 0 Td [(b)]TJ/F84 9.9626 Tf 5.524 0 Td [(.)]TJ -49.584 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(number)-250(of)-250(the)-250(data)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ +/F84 9.9626 Tf 24.348 0 Td [(the)-250(scalar)]TJ/F151 9.9626 Tf 44.618 0 Td [(b)]TJ/F84 9.9626 Tf 5.524 0 Td [(.)]TJ -49.584 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(number)-250(of)-250(the)-250(data)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG [-250(13)]TJ 0 g 0 G @@ -13798,28 +13807,28 @@ BT 0 g 0 G /F84 9.9626 Tf 10.52 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 175.445 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(.)]TJ -166.165 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ 0.98 0 0 1 175.611 428.986 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-248(an)-247(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 420.354 428.986 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 420.354 428.986 Tm [(psb)]TJ ET q 1 0 0 1 436.673 429.186 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 439.811 428.986 Td [(T)]TJ +/F147 9.9626 Tf 439.811 428.986 Td [(T)]TJ ET q 1 0 0 1 445.669 429.186 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 448.807 428.986 Td [(vect)]TJ +/F147 9.9626 Tf 448.807 428.986 Td [(vect)]TJ ET q 1 0 0 1 470.356 429.186 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 473.495 428.986 Td [(type)]TJ +/F147 9.9626 Tf 473.495 428.986 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.016 0 0 1 175.611 417.031 Tm [(containing)-246(numbers)-247(of)-246(type)-247(speci\002ed)-246(in)-246(T)90(able)]TJ 0 0 1 rg 0 0 1 RG @@ -13838,21 +13847,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 324.173 336.805 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 327.311 336.605 Td [(desc)]TJ +/F147 9.9626 Tf 327.311 336.605 Td [(desc)]TJ ET q 1 0 0 1 348.86 336.805 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 351.998 336.605 Td [(type)]TJ +/F147 9.9626 Tf 351.998 336.605 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -13870,7 +13879,7 @@ BT 0 g 0 G /F75 9.9626 Tf -50.869 -16.302 Td [(trans)-250(=)-250('C')]TJ 0 g 0 G -/F84 9.9626 Tf 51.417 0 Td [(the)-250(operation)-250(is)-250(with)-250(conjugate)-250(transposed)-250(matrix.)]TJ -51.417 -20.65 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Default:)]TJ/F78 9.9626 Tf 38.64 0 Td [(t)-15(r)-50(a)-25(n)-25(s)]TJ/F192 10.3811 Tf 25.193 0 Td [(=)]TJ/F78 9.9626 Tf 11.435 0 Td [(N)]TJ/F84 9.9626 Tf -75.268 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(character)-250(variable.)]TJ +/F84 9.9626 Tf 51.417 0 Td [(the)-250(operation)-250(is)-250(with)-250(conjugate)-250(transposed)-250(matrix.)]TJ -51.417 -20.65 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Default:)]TJ/F78 9.9626 Tf 38.64 0 Td [(t)-15(r)-50(a)-25(n)-25(s)]TJ/F197 10.3811 Tf 25.193 0 Td [(=)]TJ/F78 9.9626 Tf 11.435 0 Td [(N)]TJ/F84 9.9626 Tf -75.268 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(character)-250(variable.)]TJ 0 g 0 G /F75 9.9626 Tf -24.906 -20.65 Td [(unitd)]TJ 0 g 0 G @@ -13894,7 +13903,7 @@ ET endstream endobj -1333 0 obj +1334 0 obj << /Length 4640 >> @@ -13902,14 +13911,14 @@ stream 0 g 0 G 0 g 0 G BT -/F84 9.9626 Tf 124.802 706.129 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Default:)]TJ/F78 9.9626 Tf 38.64 0 Td [(u)-25(n)-18(i)-32(t)-25(d)]TJ/F192 10.3811 Tf 26.159 0 Td [(=)]TJ/F78 9.9626 Tf 10.927 0 Td [(U)]TJ/F84 9.9626 Tf -75.726 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(character)-250(variable.)]TJ +/F84 9.9626 Tf 124.802 706.129 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Default:)]TJ/F78 9.9626 Tf 38.64 0 Td [(u)-25(n)-18(i)-32(t)-25(d)]TJ/F197 10.3811 Tf 26.159 0 Td [(=)]TJ/F78 9.9626 Tf 10.927 0 Td [(U)]TJ/F84 9.9626 Tf -75.726 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(character)-250(variable.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -19.925 Td [(choice)]TJ 0 g 0 G /F84 9.9626 Tf 33.754 0 Td [(speci\002es)-250(the)-250(update)-250(of)-250(overlap)-250(elements)-250(to)-250(be)-250(performed)-250(on)-250(exit:)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -3.866 -19.925 Td [(psb_none_)]TJ +/F147 9.9626 Tf -3.866 -19.925 Td [(psb_none_)]TJ 0 g 0 G 0 g 0 G 0 -15.941 Td [(psb_sum_)]TJ @@ -13918,11 +13927,11 @@ BT 0 -15.94 Td [(psb_avg_)]TJ 0 g 0 G 0 g 0 G - 0 -15.94 Td [(psb_square_root_)]TJ/F84 9.9626 Tf -4.981 -19.925 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F145 9.9626 Tf 38.515 0 Td [(psb_avg_)]TJ/F84 9.9626 Tf -38.515 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(variable.)]TJ + 0 -15.94 Td [(psb_square_root_)]TJ/F84 9.9626 Tf -4.981 -19.925 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F147 9.9626 Tf 38.515 0 Td [(psb_avg_)]TJ/F84 9.9626 Tf -38.515 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(variable.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -19.925 Td [(diag)]TJ 0 g 0 G -/F84 9.9626 Tf 24.907 0 Td [(the)-250(diagonal)-250(scaling)-250(matrix.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F78 9.9626 Tf 38.64 0 Td [(d)-18(i)-47(a)-47(g)]TJ/F192 10.3811 Tf 18.52 0 Td [(\050)]TJ/F84 9.9626 Tf 4.149 0 Td [(1)]TJ/F192 10.3811 Tf 5.106 0 Td [(\051)-289(=)]TJ/F84 9.9626 Tf 18.003 0 Td [(1)]TJ/F192 10.3811 Tf 5.106 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)-25(o)-35(s)-25(c)-40(a)-25(l)-48(i)-32(n)-47(g)]TJ/F192 10.3811 Tf 41.384 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 124.802 423.19 Tm [(Speci\002ed)-253(as:)-316(a)-253(rank)-254(one)-253(array)-254(containing)-253(numbers)-253(of)-254(the)-253(type)-254(indicated)-253(in)]TJ 1 0 0 1 124.493 411.235 Tm [(T)92(able)]TJ +/F84 9.9626 Tf 24.907 0 Td [(the)-250(diagonal)-250(scaling)-250(matrix.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F78 9.9626 Tf 38.64 0 Td [(d)-18(i)-47(a)-47(g)]TJ/F197 10.3811 Tf 18.52 0 Td [(\050)]TJ/F84 9.9626 Tf 4.149 0 Td [(1)]TJ/F197 10.3811 Tf 5.106 0 Td [(\051)-289(=)]TJ/F84 9.9626 Tf 18.003 0 Td [(1)]TJ/F197 10.3811 Tf 5.106 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)-25(o)-35(s)-25(c)-40(a)-25(l)-48(i)-32(n)-47(g)]TJ/F197 10.3811 Tf 41.384 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 124.802 423.19 Tm [(Speci\002ed)-253(as:)-316(a)-253(rank)-254(one)-253(array)-254(containing)-253(numbers)-253(of)-254(the)-253(type)-254(indicated)-253(in)]TJ 1 0 0 1 124.493 411.235 Tm [(T)92(able)]TJ 0 0 1 rg 0 0 1 RG [-250(13)]TJ 0 g 0 G @@ -13953,9 +13962,9 @@ ET endstream endobj -1344 0 obj +1345 0 obj << -/Length 7721 +/Length 7818 >> stream 0 g 0 G @@ -13968,7 +13977,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 207.803 706.129 Td [(gemlt)-250(\227)-250(Entrywise)-250(Product)]TJ/F84 9.9626 Tf -57.407 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(entrywise)-250(pr)18(oduct)-250(between)-250(two)-250(vectors)]TJ/F78 9.9626 Tf 299.677 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.482 0 Td [(y)]TJ -187.61 -21.112 Td [(d)-25(o)-35(t)]TJ/F190 10.3811 Tf 16.337 0 Td [(\040)]TJ/F78 9.9626 Tf 13.566 0 Td [(x)]TJ/F192 10.3811 Tf 5.33 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F78 9.9626 Tf 4.274 0 Td [(y)]TJ/F192 10.3811 Tf 5.23 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.089 0 Td [(\051)]TJ/F84 9.9626 Tf 4.149 0 Td [(.)]TJ/F145 9.9626 Tf -187.464 -21.111 Td [(psb_gemlt\050x,)]TJ +/F75 11.9552 Tf 207.803 706.129 Td [(gemlt)-250(\227)-250(Entrywise)-250(Product)]TJ/F84 9.9626 Tf -57.407 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(entrywise)-250(pr)18(oduct)-250(between)-250(two)-250(vectors)]TJ/F78 9.9626 Tf 299.677 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.482 0 Td [(y)]TJ -189.224 -21.112 Td [(y)]TJ/F197 10.3811 Tf 5.231 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 7.042 0 Td [(\040)]TJ/F78 9.9626 Tf 13.566 0 Td [(x)]TJ/F197 10.3811 Tf 5.33 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F78 9.9626 Tf 4.274 0 Td [(y)]TJ/F197 10.3811 Tf 5.23 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.089 0 Td [(\051)]TJ/F84 9.9626 Tf 4.149 0 Td [(.)]TJ/F147 9.9626 Tf -189.078 -21.111 Td [(psb_gemlt\050x,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G [-525(y,)]TJ @@ -14045,28 +14054,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(vector)]TJ/F78 9.9626 Tf 174.059 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ -164.321 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 175.611 421.578 Tm [(Speci\002ed)-306(as:)-425(an)-306(object)-306(of)-306(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 314.513 421.578 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 314.513 421.578 Tm [(psb)]TJ ET q 1 0 0 1 330.831 421.777 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 333.969 421.578 Td [(T)]TJ +/F147 9.9626 Tf 333.969 421.578 Td [(T)]TJ ET q 1 0 0 1 339.827 421.777 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 342.966 421.578 Td [(vect)]TJ +/F147 9.9626 Tf 342.966 421.578 Td [(vect)]TJ ET q 1 0 0 1 364.515 421.777 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 367.653 421.578 Td [(type)]TJ +/F147 9.9626 Tf 367.653 421.578 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.02 0 0 1 391.683 421.578 Tm [(containing)-306(numbers)-306(of)]TJ 1 0 0 1 175.611 409.623 Tm [(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -14078,28 +14087,28 @@ BT 0 g 0 G /F84 9.9626 Tf 10.52 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(vector)]TJ/F78 9.9626 Tf 173.891 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(.)]TJ -164.611 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ 1.02 0 0 1 175.611 342.199 Tm [(Speci\002ed)-306(as:)-425(an)-306(object)-306(of)-306(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 314.513 342.199 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 314.513 342.199 Tm [(psb)]TJ ET q 1 0 0 1 330.831 342.398 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 333.969 342.199 Td [(T)]TJ +/F147 9.9626 Tf 333.969 342.199 Td [(T)]TJ ET q 1 0 0 1 339.827 342.398 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 342.966 342.199 Td [(vect)]TJ +/F147 9.9626 Tf 342.966 342.199 Td [(vect)]TJ ET q 1 0 0 1 364.515 342.398 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 367.653 342.199 Td [(type)]TJ +/F147 9.9626 Tf 367.653 342.199 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.02 0 0 1 391.683 342.199 Tm [(containing)-306(numbers)-306(of)]TJ 1 0 0 1 175.611 330.244 Tm [(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -14118,21 +14127,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 324.173 263.02 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 327.311 262.82 Td [(desc)]TJ +/F147 9.9626 Tf 327.311 262.82 Td [(desc)]TJ ET q 1 0 0 1 348.86 263.02 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 351.998 262.82 Td [(type)]TJ +/F147 9.9626 Tf 351.998 262.82 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -14143,28 +14152,28 @@ BT 0 g 0 G /F84 9.9626 Tf 10.52 0 Td [(the)-250(local)-250(portion)-250(of)-250(r)18(esult)-250(submatrix)]TJ/F78 9.9626 Tf 160.68 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(.)]TJ -151.4 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ 0.98 0 0 1 175.611 175.794 Tm [(Speci\002ed)-240(as:)-309(an)-240(object)-240(of)-240(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 304.709 175.794 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 304.709 175.794 Tm [(psb)]TJ ET q 1 0 0 1 321.027 175.993 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 324.166 175.794 Td [(T)]TJ +/F147 9.9626 Tf 324.166 175.794 Td [(T)]TJ ET q 1 0 0 1 330.023 175.993 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 333.162 175.794 Td [(vect)]TJ +/F147 9.9626 Tf 333.162 175.794 Td [(vect)]TJ ET q 1 0 0 1 354.711 175.993 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 357.849 175.794 Td [(type)]TJ +/F147 9.9626 Tf 357.849 175.794 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 0.98 0 0 1 381.113 175.794 Tm [(containing)-240(numbers)-240(of)-240(the)]TJ 1 0 0 1 175.611 163.839 Tm [(type)-250(indicated)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -14182,7 +14191,7 @@ ET endstream endobj -1349 0 obj +1350 0 obj << /Length 312 >> @@ -14198,9 +14207,9 @@ ET endstream endobj -1361 0 obj +1362 0 obj << -/Length 7700 +/Length 7795 >> stream 0 g 0 G @@ -14213,7 +14222,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 207.803 706.129 Td [(gediv)-250(\227)-250(Entrywise)-250(Division)]TJ/F84 9.9626 Tf -57.407 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(entrywise)-250(division)-250(between)-250(two)-250(vectors)]TJ/F78 9.9626 Tf 300.604 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.481 0 Td [(y)]TJ/F84 9.9626 Tf -188.038 -21.112 Td [(/)]TJ/F190 10.3811 Tf 9.054 0 Td [(\040)]TJ/F78 9.9626 Tf 13.567 0 Td [(x)]TJ/F192 10.3811 Tf 5.33 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 4.274 0 Td [(/)]TJ/F78 9.9626 Tf 6.287 0 Td [(y)]TJ/F192 10.3811 Tf 5.23 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.089 0 Td [(\051)]TJ/F84 9.9626 Tf 4.149 0 Td [(.)]TJ/F145 9.9626 Tf -186.966 -21.111 Td [(psb_gediv\050x,)]TJ +/F75 11.9552 Tf 207.803 706.129 Td [(gediv)-250(\227)-250(Entrywise)-250(Division)]TJ/F84 9.9626 Tf -57.407 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(entrywise)-250(division)-250(between)-250(two)-250(vectors)]TJ/F78 9.9626 Tf 300.604 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)]TJ/F78 9.9626 Tf 19.481 0 Td [(y)]TJ -193.293 -21.112 Td [(y)]TJ/F197 10.3811 Tf 5.231 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 7.041 0 Td [(\040)]TJ/F78 9.9626 Tf 13.567 0 Td [(x)]TJ/F197 10.3811 Tf 5.33 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.089 0 Td [(\051)]TJ/F84 9.9626 Tf 4.274 0 Td [(/)]TJ/F78 9.9626 Tf 6.286 0 Td [(y)]TJ/F197 10.3811 Tf 5.23 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 4.149 0 Td [(.)]TJ/F147 9.9626 Tf -192.221 -21.111 Td [(psb_gediv\050x,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G [-525(y,)]TJ @@ -14293,28 +14302,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(vector)]TJ/F78 9.9626 Tf 174.059 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ -164.321 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 175.611 421.578 Tm [(Speci\002ed)-306(as:)-425(an)-306(object)-306(of)-306(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 314.513 421.578 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 314.513 421.578 Tm [(psb)]TJ ET q 1 0 0 1 330.831 421.777 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 333.969 421.578 Td [(T)]TJ +/F147 9.9626 Tf 333.969 421.578 Td [(T)]TJ ET q 1 0 0 1 339.827 421.777 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 342.966 421.578 Td [(vect)]TJ +/F147 9.9626 Tf 342.966 421.578 Td [(vect)]TJ ET q 1 0 0 1 364.515 421.777 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 367.653 421.578 Td [(type)]TJ +/F147 9.9626 Tf 367.653 421.578 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.02 0 0 1 391.683 421.578 Tm [(containing)-306(numbers)-306(of)]TJ 1 0 0 1 175.611 409.623 Tm [(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -14326,28 +14335,28 @@ BT 0 g 0 G /F84 9.9626 Tf 10.52 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(vector)]TJ/F78 9.9626 Tf 173.891 0 Td [(y)]TJ/F84 9.9626 Tf 5.106 0 Td [(.)]TJ -164.611 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ 1.02 0 0 1 175.611 342.199 Tm [(Speci\002ed)-306(as:)-425(an)-306(object)-306(of)-306(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 314.513 342.199 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 314.513 342.199 Tm [(psb)]TJ ET q 1 0 0 1 330.831 342.398 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 333.969 342.199 Td [(T)]TJ +/F147 9.9626 Tf 333.969 342.199 Td [(T)]TJ ET q 1 0 0 1 339.827 342.398 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 342.966 342.199 Td [(vect)]TJ +/F147 9.9626 Tf 342.966 342.199 Td [(vect)]TJ ET q 1 0 0 1 364.515 342.398 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 367.653 342.199 Td [(type)]TJ +/F147 9.9626 Tf 367.653 342.199 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.02 0 0 1 391.683 342.199 Tm [(containing)-306(numbers)-306(of)]TJ 1 0 0 1 175.611 330.244 Tm [(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -14366,27 +14375,27 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 324.173 263.02 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 327.311 262.82 Td [(desc)]TJ +/F147 9.9626 Tf 327.311 262.82 Td [(desc)]TJ ET q 1 0 0 1 348.86 263.02 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 351.998 262.82 Td [(type)]TJ +/F147 9.9626 Tf 351.998 262.82 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -222.214 -19.602 Td [(\003ag)]TJ 0 g 0 G -/F84 9.9626 Tf 0.994 0 0 1 172.294 243.218 Tm [(check)-252(if)-252(any)-252(of)-251(the)]TJ/F78 9.9626 Tf 1 0 0 1 254.535 243.218 Tm [(y)]TJ/F192 10.3811 Tf 5.231 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)-290(=)]TJ/F84 9.9626 Tf 0.994 0 0 1 285.074 243.218 Tm [(0,)-252(and)-252(in)-252(case)-252(r)19(eturns)-252(err)18(or)-252(halting)-252(the)-252(computa-)]TJ 1 0 0 1 175.611 231.262 Tm [(tion.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 40.677 0 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -108.662 -11.955 Td [(Speci\002ed)-250(as:)-310(the)-250(logical)-250(value)]TJ/F145 9.9626 Tf 132.133 0 Td [(flag)]TJ +/F84 9.9626 Tf 0.994 0 0 1 172.294 243.218 Tm [(check)-252(if)-252(any)-252(of)-251(the)]TJ/F78 9.9626 Tf 1 0 0 1 254.535 243.218 Tm [(y)]TJ/F197 10.3811 Tf 5.231 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)-290(=)]TJ/F84 9.9626 Tf 0.994 0 0 1 285.074 243.218 Tm [(0,)-252(and)-252(in)-252(case)-252(r)19(eturns)-252(err)18(or)-252(halting)-252(the)-252(computa-)]TJ 1 0 0 1 175.611 231.262 Tm [(tion.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 40.677 0 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -108.662 -11.955 Td [(Speci\002ed)-250(as:)-310(the)-250(logical)-250(value)]TJ/F147 9.9626 Tf 132.133 0 Td [(flag)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G @@ -14405,7 +14414,7 @@ ET endstream endobj -1366 0 obj +1367 0 obj << /Length 1343 >> @@ -14415,28 +14424,28 @@ stream BT /F84 9.9626 Tf 0.98 0 0 1 124.802 706.129 Tm [(Speci\002ed)-240(as:)-309(an)-240(object)-240(of)-240(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 253.899 706.129 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 253.899 706.129 Tm [(psb)]TJ ET q 1 0 0 1 270.218 706.328 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 273.356 706.129 Td [(T)]TJ +/F147 9.9626 Tf 273.356 706.129 Td [(T)]TJ ET q 1 0 0 1 279.214 706.328 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 282.352 706.129 Td [(vect)]TJ +/F147 9.9626 Tf 282.352 706.129 Td [(vect)]TJ ET q 1 0 0 1 303.901 706.328 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 307.039 706.129 Td [(type)]TJ +/F147 9.9626 Tf 307.039 706.129 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 0.98 0 0 1 330.304 706.129 Tm [(containing)-240(numbers)-240(of)-240(the)]TJ 1 0 0 1 124.802 694.174 Tm [(type)-250(indicated)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -14454,9 +14463,9 @@ ET endstream endobj -1375 0 obj +1376 0 obj << -/Length 7612 +/Length 7704 >> stream 0 g 0 G @@ -14469,7 +14478,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 207.803 706.129 Td [(geinv)-250(\227)-250(Entrywise)-250(Inversion)]TJ/F84 9.9626 Tf -57.407 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(entrywise)-250(inverse)-250(of)-250(a)-250(vector)]TJ/F78 9.9626 Tf 252.096 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)-250(puts)-250(it)-250(into)]TJ/F78 9.9626 Tf 69.952 0 Td [(y)]TJ/F84 9.9626 Tf -184.093 -18.334 Td [(/)]TJ/F190 10.3811 Tf 9.054 0 Td [(\040)]TJ/F84 9.9626 Tf 13.273 0 Td [(1)-12(/)]TJ/F78 9.9626 Tf 11.562 0 Td [(x)]TJ/F192 10.3811 Tf 5.329 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 4.149 0 Td [(.)]TJ/F145 9.9626 Tf -181.058 -18.334 Td [(psb_geinv\050x,)]TJ +/F75 11.9552 Tf 207.803 706.129 Td [(geinv)-250(\227)-250(Entrywise)-250(Inversion)]TJ/F84 9.9626 Tf -57.407 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(entrywise)-250(inverse)-250(of)-250(a)-250(vector)]TJ/F78 9.9626 Tf 252.096 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(and)-250(puts)-250(it)-250(into)]TJ/F78 9.9626 Tf 69.952 0 Td [(y)]TJ -189.348 -18.334 Td [(y)]TJ/F197 10.3811 Tf 5.23 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 7.041 0 Td [(\040)]TJ/F84 9.9626 Tf 13.273 0 Td [(1)-13(/)]TJ/F78 9.9626 Tf 11.562 0 Td [(x)]TJ/F197 10.3811 Tf 5.33 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 4.15 0 Td [(.)]TJ/F147 9.9626 Tf -186.314 -18.334 Td [(psb_geinv\050x,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G [-525(y,)]TJ @@ -14549,28 +14558,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(dense)-250(vector)]TJ/F78 9.9626 Tf 174.059 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ -164.321 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 175.611 434.356 Tm [(Speci\002ed)-306(as:)-425(an)-306(object)-306(of)-306(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 314.513 434.356 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 314.513 434.356 Tm [(psb)]TJ ET q 1 0 0 1 330.831 434.555 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 333.969 434.356 Td [(T)]TJ +/F147 9.9626 Tf 333.969 434.356 Td [(T)]TJ ET q 1 0 0 1 339.827 434.555 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 342.966 434.356 Td [(vect)]TJ +/F147 9.9626 Tf 342.966 434.356 Td [(vect)]TJ ET q 1 0 0 1 364.515 434.555 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 367.653 434.356 Td [(type)]TJ +/F147 9.9626 Tf 367.653 434.356 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.02 0 0 1 391.683 434.356 Tm [(containing)-306(numbers)-306(of)]TJ 1 0 0 1 175.611 422.401 Tm [(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -14589,27 +14598,27 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 132.243 0 Td [(psb)]TJ +/F147 9.9626 Tf 132.243 0 Td [(psb)]TJ ET q 1 0 0 1 324.173 356.288 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 327.311 356.088 Td [(desc)]TJ +/F147 9.9626 Tf 327.311 356.088 Td [(desc)]TJ ET q 1 0 0 1 348.86 356.288 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 351.998 356.088 Td [(type)]TJ +/F147 9.9626 Tf 351.998 356.088 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -222.214 -18.491 Td [(\003ag)]TJ 0 g 0 G -/F84 9.9626 Tf 0.993 0 0 1 172.294 337.597 Tm [(check)-252(if)-252(any)-252(of)-252(the)]TJ/F78 9.9626 Tf 1 0 0 1 254.633 337.597 Tm [(x)]TJ/F192 10.3811 Tf 5.329 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)-290(=)]TJ/F84 9.9626 Tf 0.993 0 0 1 285.269 337.597 Tm [(0,)-252(and)-252(in)-252(case)-252(r)18(eturns)-252(err)18(or)-252(halting)-252(the)-252(computa-)]TJ 1 0 0 1 175.611 325.642 Tm [(tion.)]TJ 0 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 40.677 0 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -108.662 -11.955 Td [(Speci\002ed)-250(as:)-310(the)-250(logical)-250(value)]TJ/F145 9.9626 Tf 132.133 0 Td [(flag)]TJ +/F84 9.9626 Tf 0.993 0 0 1 172.294 337.597 Tm [(check)-252(if)-252(any)-252(of)-252(the)]TJ/F78 9.9626 Tf 1 0 0 1 254.633 337.597 Tm [(x)]TJ/F197 10.3811 Tf 5.329 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)-290(=)]TJ/F84 9.9626 Tf 0.993 0 0 1 285.269 337.597 Tm [(0,)-252(and)-252(in)-252(case)-252(r)18(eturns)-252(err)18(or)-252(halting)-252(the)-252(computa-)]TJ 1 0 0 1 175.611 325.642 Tm [(tion.)]TJ 0 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 40.677 0 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -108.662 -11.955 Td [(Speci\002ed)-250(as:)-310(the)-250(logical)-250(value)]TJ/F147 9.9626 Tf 132.133 0 Td [(flag)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=)]TJ 0 g 0 G @@ -14622,28 +14631,28 @@ BT 0 g 0 G /F84 9.9626 Tf 10.52 0 Td [(the)-250(local)-250(portion)-250(of)-250(r)18(esult)-250(submatrix)]TJ/F78 9.9626 Tf 160.85 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -151.669 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ 0.98 0 0 1 175.611 204.972 Tm [(Speci\002ed)-240(as:)-309(an)-240(object)-240(of)-240(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 304.709 204.972 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 304.709 204.972 Tm [(psb)]TJ ET q 1 0 0 1 321.027 205.171 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 324.166 204.972 Td [(T)]TJ +/F147 9.9626 Tf 324.166 204.972 Td [(T)]TJ ET q 1 0 0 1 330.023 205.171 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 333.162 204.972 Td [(vect)]TJ +/F147 9.9626 Tf 333.162 204.972 Td [(vect)]TJ ET q 1 0 0 1 354.711 205.171 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 357.849 204.972 Td [(type)]TJ +/F147 9.9626 Tf 357.849 204.972 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 0.98 0 0 1 381.113 204.972 Tm [(containing)-240(numbers)-240(of)-240(the)]TJ 1 0 0 1 175.611 193.017 Tm [(type)-250(indicated)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -14661,7 +14670,7 @@ ET endstream endobj -1381 0 obj +1382 0 obj << /Length 655 >> @@ -14681,7 +14690,7 @@ ET endstream endobj -1278 0 obj +1279 0 obj << /Type /ObjStm /N 100 @@ -14689,26 +14698,26 @@ endobj /Length 13026 >> stream -1274 0 1271 148 1272 293 1276 440 264 498 1277 555 1273 612 1282 734 1279 882 1280 1027 -1284 1174 268 1233 1286 1291 1281 1349 1293 1486 1287 1652 1288 1799 1289 1944 1290 2086 1295 2233 -272 2291 1296 2348 1297 2406 1298 2465 1299 2524 1292 2582 1309 2733 1291 2935 1301 3082 1302 3226 -1303 3372 1304 3519 1305 3670 1306 3821 1307 3972 1311 4119 1308 4178 1315 4315 1312 4454 1317 4599 -276 4657 1318 4714 1314 4772 1326 4923 1313 5116 1319 5264 1320 5408 1321 5555 1322 5702 1323 5845 -1324 5992 1328 6137 1325 6196 1332 6333 1329 6481 1330 6627 1334 6773 1331 6831 1343 6953 1335 7146 -1336 7289 1337 7434 1338 7577 1339 7722 1340 7869 1341 8013 1345 8160 280 8219 1346 8277 1342 8336 -1348 8472 1350 8590 1347 8648 1360 8729 1352 8904 1353 9047 1354 9192 1355 9335 1356 9480 1362 9627 -284 9686 1363 9744 1359 9803 1365 9939 1357 10087 1358 10231 1367 10378 1364 10436 1374 10531 1368 10706 -1369 10847 1370 10992 1371 11139 1372 11283 1376 11430 288 11489 1377 11547 1373 11606 1380 11742 1378 11881 -% 1274 0 obj +1275 0 1272 148 1273 293 1277 440 264 498 1278 555 1274 612 1283 734 1280 882 1281 1027 +1285 1174 268 1233 1287 1291 1282 1349 1294 1486 1288 1652 1289 1799 1290 1944 1291 2086 1296 2233 +272 2291 1297 2348 1298 2406 1299 2465 1300 2524 1293 2582 1310 2733 1292 2935 1302 3082 1303 3226 +1304 3372 1305 3519 1306 3670 1307 3821 1308 3972 1312 4119 1309 4178 1316 4315 1313 4454 1318 4599 +276 4657 1319 4714 1315 4772 1327 4923 1314 5116 1320 5264 1321 5408 1322 5555 1323 5702 1324 5845 +1325 5992 1329 6137 1326 6196 1333 6333 1330 6481 1331 6627 1335 6773 1332 6831 1344 6953 1336 7146 +1337 7289 1338 7434 1339 7577 1340 7722 1341 7869 1342 8013 1346 8160 280 8219 1347 8277 1343 8336 +1349 8472 1351 8590 1348 8648 1361 8729 1353 8904 1354 9047 1355 9192 1356 9335 1357 9480 1363 9627 +284 9686 1364 9744 1360 9803 1366 9939 1358 10087 1359 10231 1368 10378 1365 10436 1375 10531 1369 10706 +1370 10847 1371 10992 1372 11139 1373 11283 1377 11430 288 11489 1378 11547 1374 11606 1381 11742 1379 11881 +% 1275 0 obj << /Type /Page -/Contents 1275 0 R -/Resources 1273 0 R +/Contents 1276 0 R +/Resources 1274 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1244 0 R -/Annots [ 1271 0 R 1272 0 R ] +/Parent 1245 0 R +/Annots [ 1272 0 R 1273 0 R ] >> -% 1271 0 obj +% 1272 0 obj << /Type /Annot /Subtype /Link @@ -14716,7 +14725,7 @@ stream /Rect [256.048 340.341 333.567 352.401] /A << /S /GoTo /D (spdata) >> >> -% 1272 0 obj +% 1273 0 obj << /Type /Annot /Subtype /Link @@ -14724,33 +14733,33 @@ stream /Rect [256.048 272.595 323.106 284.655] /A << /S /GoTo /D (descdata) >> >> -% 1276 0 obj +% 1277 0 obj << -/D [1274 0 R /XYZ 98.895 753.953 null] +/D [1275 0 R /XYZ 98.895 753.953 null] >> % 264 0 obj << -/D [1274 0 R /XYZ 99.895 716.092 null] +/D [1275 0 R /XYZ 99.895 716.092 null] >> -% 1277 0 obj +% 1278 0 obj << -/D [1274 0 R /XYZ 99.895 517.78 null] +/D [1275 0 R /XYZ 99.895 517.78 null] >> -% 1273 0 obj +% 1274 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1282 0 obj +% 1283 0 obj << /Type /Page -/Contents 1283 0 R -/Resources 1281 0 R +/Contents 1284 0 R +/Resources 1282 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1244 0 R -/Annots [ 1279 0 R 1280 0 R ] +/Parent 1245 0 R +/Annots [ 1280 0 R 1281 0 R ] >> -% 1279 0 obj +% 1280 0 obj << /Type /Annot /Subtype /Link @@ -14758,7 +14767,7 @@ stream /Rect [306.858 340.341 384.376 352.401] /A << /S /GoTo /D (spdata) >> >> -% 1280 0 obj +% 1281 0 obj << /Type /Annot /Subtype /Link @@ -14766,33 +14775,33 @@ stream /Rect [306.858 272.595 373.916 284.655] /A << /S /GoTo /D (descdata) >> >> -% 1284 0 obj +% 1285 0 obj << -/D [1282 0 R /XYZ 149.705 753.953 null] +/D [1283 0 R /XYZ 149.705 753.953 null] >> % 268 0 obj << -/D [1282 0 R /XYZ 150.705 716.092 null] +/D [1283 0 R /XYZ 150.705 716.092 null] >> -% 1286 0 obj +% 1287 0 obj << -/D [1282 0 R /XYZ 150.705 517.78 null] +/D [1283 0 R /XYZ 150.705 517.78 null] >> -% 1281 0 obj +% 1282 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F243 1285 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F241 1286 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1293 0 obj +% 1294 0 obj << /Type /Page -/Contents 1294 0 R -/Resources 1292 0 R +/Contents 1295 0 R +/Resources 1293 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1300 0 R -/Annots [ 1287 0 R 1288 0 R 1289 0 R 1290 0 R ] +/Parent 1301 0 R +/Annots [ 1288 0 R 1289 0 R 1290 0 R 1291 0 R ] >> -% 1287 0 obj +% 1288 0 obj << /Type /Annot /Subtype /Link @@ -14800,7 +14809,7 @@ stream /Rect [378.159 277.323 390.114 289.383] /A << /S /GoTo /D (table.12) >> >> -% 1288 0 obj +% 1289 0 obj << /Type /Annot /Subtype /Link @@ -14808,7 +14817,7 @@ stream /Rect [256.048 208.877 333.567 220.936] /A << /S /GoTo /D (spdata) >> >> -% 1289 0 obj +% 1290 0 obj << /Type /Annot /Subtype /Link @@ -14816,7 +14825,7 @@ stream /Rect [368.549 140.43 444.603 152.49] /A << /S /GoTo /D (vdata) >> >> -% 1290 0 obj +% 1291 0 obj << /Type /Annot /Subtype /Link @@ -14824,45 +14833,45 @@ stream /Rect [329.477 128.475 341.581 140.535] /A << /S /GoTo /D (table.12) >> >> -% 1295 0 obj +% 1296 0 obj << -/D [1293 0 R /XYZ 98.895 753.953 null] +/D [1294 0 R /XYZ 98.895 753.953 null] >> % 272 0 obj << -/D [1293 0 R /XYZ 99.895 716.092 null] ->> -% 1296 0 obj -<< -/D [1293 0 R /XYZ 239.918 674.17 null] +/D [1294 0 R /XYZ 99.895 716.092 null] >> % 1297 0 obj << -/D [1293 0 R /XYZ 237.121 654.041 null] +/D [1294 0 R /XYZ 239.918 674.17 null] >> % 1298 0 obj << -/D [1293 0 R /XYZ 236.383 633.911 null] +/D [1294 0 R /XYZ 237.121 654.041 null] >> % 1299 0 obj << -/D [1293 0 R /XYZ 99.895 447.252 null] +/D [1294 0 R /XYZ 236.383 633.911 null] >> -% 1292 0 obj +% 1300 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F147 1157 0 R /F192 942 0 R /F145 940 0 R >> +/D [1294 0 R /XYZ 99.895 447.252 null] +>> +% 1293 0 obj +<< +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F151 1158 0 R /F197 943 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1309 0 obj +% 1310 0 obj << /Type /Page -/Contents 1310 0 R -/Resources 1308 0 R +/Contents 1311 0 R +/Resources 1309 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1300 0 R -/Annots [ 1291 0 R 1301 0 R 1302 0 R 1303 0 R 1304 0 R 1305 0 R 1306 0 R 1307 0 R ] +/Parent 1301 0 R +/Annots [ 1292 0 R 1302 0 R 1303 0 R 1304 0 R 1305 0 R 1306 0 R 1307 0 R 1308 0 R ] >> -% 1291 0 obj +% 1292 0 obj << /Type /Annot /Subtype /Link @@ -14870,7 +14879,7 @@ stream /Rect [428.968 654.503 440.924 666.562] /A << /S /GoTo /D (table.12) >> >> -% 1301 0 obj +% 1302 0 obj << /Type /Annot /Subtype /Link @@ -14878,7 +14887,7 @@ stream /Rect [419.358 588.085 495.412 600.145] /A << /S /GoTo /D (vdata) >> >> -% 1302 0 obj +% 1303 0 obj << /Type /Annot /Subtype /Link @@ -14886,7 +14895,7 @@ stream /Rect [380.469 576.13 392.583 588.189] /A << /S /GoTo /D (table.12) >> >> -% 1303 0 obj +% 1304 0 obj << /Type /Annot /Subtype /Link @@ -14894,7 +14903,7 @@ stream /Rect [306.858 497.757 373.916 509.817] /A << /S /GoTo /D (descdata) >> >> -% 1304 0 obj +% 1305 0 obj << /Type /Annot /Subtype /Link @@ -14902,7 +14911,7 @@ stream /Rect [388.949 460.563 395.923 472.623] /A << /S /GoTo /D (equation.4.1) >> >> -% 1305 0 obj +% 1306 0 obj << /Type /Annot /Subtype /Link @@ -14910,7 +14919,7 @@ stream /Rect [387.295 445.951 394.269 458.011] /A << /S /GoTo /D (equation.4.2) >> >> -% 1306 0 obj +% 1307 0 obj << /Type /Annot /Subtype /Link @@ -14918,7 +14927,7 @@ stream /Rect [387.843 431.339 394.817 443.399] /A << /S /GoTo /D (equation.4.3) >> >> -% 1307 0 obj +% 1308 0 obj << /Type /Annot /Subtype /Link @@ -14926,25 +14935,25 @@ stream /Rect [253.329 189.579 265.284 201.639] /A << /S /GoTo /D (table.12) >> >> -% 1311 0 obj +% 1312 0 obj << -/D [1309 0 R /XYZ 149.705 753.953 null] +/D [1310 0 R /XYZ 149.705 753.953 null] >> -% 1308 0 obj +% 1309 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F147 1157 0 R /F78 686 0 R /F145 940 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F151 1158 0 R /F78 686 0 R /F147 941 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1315 0 obj +% 1316 0 obj << /Type /Page -/Contents 1316 0 R -/Resources 1314 0 R +/Contents 1317 0 R +/Resources 1315 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1300 0 R -/Annots [ 1312 0 R ] +/Parent 1301 0 R +/Annots [ 1313 0 R ] >> -% 1312 0 obj +% 1313 0 obj << /Type /Annot /Subtype /Link @@ -14952,33 +14961,33 @@ stream /Rect [378.159 116.52 390.114 128.58] /A << /S /GoTo /D (table.13) >> >> -% 1317 0 obj +% 1318 0 obj << -/D [1315 0 R /XYZ 98.895 753.953 null] +/D [1316 0 R /XYZ 98.895 753.953 null] >> % 276 0 obj << -/D [1315 0 R /XYZ 99.895 716.092 null] +/D [1316 0 R /XYZ 99.895 716.092 null] >> -% 1318 0 obj +% 1319 0 obj << -/D [1315 0 R /XYZ 99.895 268.704 null] +/D [1316 0 R /XYZ 99.895 268.704 null] >> -% 1314 0 obj +% 1315 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F147 1157 0 R /F192 942 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F151 1158 0 R /F197 943 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1326 0 obj +% 1327 0 obj << /Type /Page -/Contents 1327 0 R -/Resources 1325 0 R +/Contents 1328 0 R +/Resources 1326 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1300 0 R -/Annots [ 1313 0 R 1319 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R ] +/Parent 1301 0 R +/Annots [ 1314 0 R 1320 0 R 1321 0 R 1322 0 R 1323 0 R 1324 0 R 1325 0 R ] >> -% 1313 0 obj +% 1314 0 obj << /Type /Annot /Subtype /Link @@ -14986,7 +14995,7 @@ stream /Rect [355.953 654.503 362.927 666.562] /A << /S /GoTo /D (section.3) >> >> -% 1319 0 obj +% 1320 0 obj << /Type /Annot /Subtype /Link @@ -14994,7 +15003,7 @@ stream /Rect [419.358 586.032 495.412 598.092] /A << /S /GoTo /D (vdata) >> >> -% 1320 0 obj +% 1321 0 obj << /Type /Annot /Subtype /Link @@ -15002,7 +15011,7 @@ stream /Rect [380.286 574.077 392.391 586.136] /A << /S /GoTo /D (table.13) >> >> -% 1321 0 obj +% 1322 0 obj << /Type /Annot /Subtype /Link @@ -15010,7 +15019,7 @@ stream /Rect [428.968 493.651 440.924 505.711] /A << /S /GoTo /D (table.13) >> >> -% 1322 0 obj +% 1323 0 obj << /Type /Annot /Subtype /Link @@ -15018,7 +15027,7 @@ stream /Rect [419.358 425.181 495.412 437.24] /A << /S /GoTo /D (vdata) >> >> -% 1323 0 obj +% 1324 0 obj << /Type /Annot /Subtype /Link @@ -15026,7 +15035,7 @@ stream /Rect [380.469 413.225 392.583 425.285] /A << /S /GoTo /D (table.13) >> >> -% 1324 0 obj +% 1325 0 obj << /Type /Annot /Subtype /Link @@ -15034,25 +15043,25 @@ stream /Rect [306.858 332.8 373.916 344.859] /A << /S /GoTo /D (descdata) >> >> -% 1328 0 obj +% 1329 0 obj << -/D [1326 0 R /XYZ 149.705 753.953 null] +/D [1327 0 R /XYZ 149.705 753.953 null] >> -% 1325 0 obj +% 1326 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F145 940 0 R /F147 1157 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F147 941 0 R /F151 1158 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1332 0 obj +% 1333 0 obj << /Type /Page -/Contents 1333 0 R -/Resources 1331 0 R +/Contents 1334 0 R +/Resources 1332 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1300 0 R -/Annots [ 1329 0 R 1330 0 R ] +/Parent 1301 0 R +/Annots [ 1330 0 R 1331 0 R ] >> -% 1329 0 obj +% 1330 0 obj << /Type /Annot /Subtype /Link @@ -15060,7 +15069,7 @@ stream /Rect [149.34 410.079 161.295 419.489] /A << /S /GoTo /D (table.13) >> >> -% 1330 0 obj +% 1331 0 obj << /Type /Annot /Subtype /Link @@ -15068,25 +15077,25 @@ stream /Rect [202.52 228.102 214.475 240.161] /A << /S /GoTo /D (table.13) >> >> -% 1334 0 obj +% 1335 0 obj << -/D [1332 0 R /XYZ 98.895 753.953 null] +/D [1333 0 R /XYZ 98.895 753.953 null] >> -% 1331 0 obj +% 1332 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F78 686 0 R /F192 942 0 R /F145 940 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F78 686 0 R /F197 943 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1343 0 obj +% 1344 0 obj << /Type /Page -/Contents 1344 0 R -/Resources 1342 0 R +/Contents 1345 0 R +/Resources 1343 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1300 0 R -/Annots [ 1335 0 R 1336 0 R 1337 0 R 1338 0 R 1339 0 R 1340 0 R 1341 0 R ] +/Parent 1301 0 R +/Annots [ 1336 0 R 1337 0 R 1338 0 R 1339 0 R 1340 0 R 1341 0 R 1342 0 R ] >> -% 1335 0 obj +% 1336 0 obj << /Type /Annot /Subtype /Link @@ -15094,7 +15103,7 @@ stream /Rect [313.516 417.772 389.57 429.832] /A << /S /GoTo /D (vdata) >> >> -% 1336 0 obj +% 1337 0 obj << /Type /Annot /Subtype /Link @@ -15102,7 +15111,7 @@ stream /Rect [275.366 405.817 282.34 417.877] /A << /S /GoTo /D (table.2) >> >> -% 1337 0 obj +% 1338 0 obj << /Type /Annot /Subtype /Link @@ -15110,7 +15119,7 @@ stream /Rect [313.516 338.393 389.57 350.453] /A << /S /GoTo /D (vdata) >> >> -% 1338 0 obj +% 1339 0 obj << /Type /Annot /Subtype /Link @@ -15118,7 +15127,7 @@ stream /Rect [275.366 326.438 282.34 338.498] /A << /S /GoTo /D (table.2) >> >> -% 1339 0 obj +% 1340 0 obj << /Type /Annot /Subtype /Link @@ -15126,7 +15135,7 @@ stream /Rect [306.858 259.015 373.916 271.074] /A << /S /GoTo /D (descdata) >> >> -% 1340 0 obj +% 1341 0 obj << /Type /Annot /Subtype /Link @@ -15134,7 +15143,7 @@ stream /Rect [303.712 171.988 379.767 184.048] /A << /S /GoTo /D (vdata) >> >> -% 1341 0 obj +% 1342 0 obj << /Type /Annot /Subtype /Link @@ -15142,50 +15151,50 @@ stream /Rect [277.368 160.033 289.324 172.093] /A << /S /GoTo /D (table.14) >> >> -% 1345 0 obj +% 1346 0 obj << -/D [1343 0 R /XYZ 149.705 753.953 null] +/D [1344 0 R /XYZ 149.705 753.953 null] >> % 280 0 obj << -/D [1343 0 R /XYZ 150.705 716.092 null] +/D [1344 0 R /XYZ 150.705 716.092 null] >> -% 1346 0 obj +% 1347 0 obj << -/D [1343 0 R /XYZ 150.705 560.161 null] +/D [1344 0 R /XYZ 150.705 560.161 null] >> -% 1342 0 obj +% 1343 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F192 942 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1348 0 obj +% 1349 0 obj << /Type /Page -/Contents 1349 0 R -/Resources 1347 0 R +/Contents 1350 0 R +/Resources 1348 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1351 0 R +/Parent 1352 0 R >> -% 1350 0 obj +% 1351 0 obj << -/D [1348 0 R /XYZ 98.895 753.953 null] +/D [1349 0 R /XYZ 98.895 753.953 null] >> -% 1347 0 obj +% 1348 0 obj << /Font << /F84 687 0 R /F75 685 0 R >> /ProcSet [ /PDF /Text ] >> -% 1360 0 obj +% 1361 0 obj << /Type /Page -/Contents 1361 0 R -/Resources 1359 0 R +/Contents 1362 0 R +/Resources 1360 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1351 0 R -/Annots [ 1352 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R ] +/Parent 1352 0 R +/Annots [ 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R ] >> -% 1352 0 obj +% 1353 0 obj << /Type /Annot /Subtype /Link @@ -15193,7 +15202,7 @@ stream /Rect [313.516 417.772 389.57 429.832] /A << /S /GoTo /D (vdata) >> >> -% 1353 0 obj +% 1354 0 obj << /Type /Annot /Subtype /Link @@ -15201,7 +15210,7 @@ stream /Rect [275.366 405.817 282.34 417.877] /A << /S /GoTo /D (table.2) >> >> -% 1354 0 obj +% 1355 0 obj << /Type /Annot /Subtype /Link @@ -15209,7 +15218,7 @@ stream /Rect [313.516 338.393 389.57 350.453] /A << /S /GoTo /D (vdata) >> >> -% 1355 0 obj +% 1356 0 obj << /Type /Annot /Subtype /Link @@ -15217,7 +15226,7 @@ stream /Rect [275.366 326.438 282.34 338.498] /A << /S /GoTo /D (table.2) >> >> -% 1356 0 obj +% 1357 0 obj << /Type /Annot /Subtype /Link @@ -15225,33 +15234,33 @@ stream /Rect [306.858 259.015 373.916 271.074] /A << /S /GoTo /D (descdata) >> >> -% 1362 0 obj +% 1363 0 obj << -/D [1360 0 R /XYZ 149.705 753.953 null] +/D [1361 0 R /XYZ 149.705 753.953 null] >> % 284 0 obj << -/D [1360 0 R /XYZ 150.705 716.092 null] +/D [1361 0 R /XYZ 150.705 716.092 null] >> -% 1363 0 obj +% 1364 0 obj << -/D [1360 0 R /XYZ 150.705 560.161 null] +/D [1361 0 R /XYZ 150.705 560.161 null] >> -% 1359 0 obj +% 1360 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F192 942 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1365 0 obj +% 1366 0 obj << /Type /Page -/Contents 1366 0 R -/Resources 1364 0 R +/Contents 1367 0 R +/Resources 1365 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1351 0 R -/Annots [ 1357 0 R 1358 0 R ] +/Parent 1352 0 R +/Annots [ 1358 0 R 1359 0 R ] >> -% 1357 0 obj +% 1358 0 obj << /Type /Annot /Subtype /Link @@ -15259,7 +15268,7 @@ stream /Rect [252.903 702.323 328.957 714.383] /A << /S /GoTo /D (vdata) >> >> -% 1358 0 obj +% 1359 0 obj << /Type /Annot /Subtype /Link @@ -15267,25 +15276,25 @@ stream /Rect [226.559 690.368 238.514 702.428] /A << /S /GoTo /D (table.14) >> >> -% 1367 0 obj +% 1368 0 obj << -/D [1365 0 R /XYZ 98.895 753.953 null] +/D [1366 0 R /XYZ 98.895 753.953 null] >> -% 1364 0 obj +% 1365 0 obj << -/Font << /F84 687 0 R /F145 940 0 R /F75 685 0 R >> +/Font << /F84 687 0 R /F147 941 0 R /F75 685 0 R >> /ProcSet [ /PDF /Text ] >> -% 1374 0 obj +% 1375 0 obj << /Type /Page -/Contents 1375 0 R -/Resources 1373 0 R +/Contents 1376 0 R +/Resources 1374 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1351 0 R -/Annots [ 1368 0 R 1369 0 R 1370 0 R 1371 0 R 1372 0 R ] +/Parent 1352 0 R +/Annots [ 1369 0 R 1370 0 R 1371 0 R 1372 0 R 1373 0 R ] >> -% 1368 0 obj +% 1369 0 obj << /Type /Annot /Subtype /Link @@ -15293,7 +15302,7 @@ stream /Rect [313.516 430.55 389.57 442.61] /A << /S /GoTo /D (vdata) >> >> -% 1369 0 obj +% 1370 0 obj << /Type /Annot /Subtype /Link @@ -15301,7 +15310,7 @@ stream /Rect [275.366 418.595 282.34 430.655] /A << /S /GoTo /D (table.2) >> >> -% 1370 0 obj +% 1371 0 obj << /Type /Annot /Subtype /Link @@ -15309,7 +15318,7 @@ stream /Rect [306.858 352.283 373.916 364.342] /A << /S /GoTo /D (descdata) >> >> -% 1371 0 obj +% 1372 0 obj << /Type /Annot /Subtype /Link @@ -15317,7 +15326,7 @@ stream /Rect [303.712 201.166 379.767 213.226] /A << /S /GoTo /D (vdata) >> >> -% 1372 0 obj +% 1373 0 obj << /Type /Annot /Subtype /Link @@ -15325,33 +15334,33 @@ stream /Rect [277.368 189.211 289.324 201.271] /A << /S /GoTo /D (table.16) >> >> -% 1376 0 obj +% 1377 0 obj << -/D [1374 0 R /XYZ 149.705 753.953 null] +/D [1375 0 R /XYZ 149.705 753.953 null] >> % 288 0 obj << -/D [1374 0 R /XYZ 150.705 716.092 null] +/D [1375 0 R /XYZ 150.705 716.092 null] >> -% 1377 0 obj +% 1378 0 obj << -/D [1374 0 R /XYZ 150.705 566.828 null] +/D [1375 0 R /XYZ 150.705 566.828 null] >> -% 1373 0 obj +% 1374 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F192 942 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1380 0 obj +% 1381 0 obj << /Type /Page -/Contents 1381 0 R -/Resources 1379 0 R +/Contents 1382 0 R +/Resources 1380 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1351 0 R -/Annots [ 1378 0 R ] +/Parent 1352 0 R +/Annots [ 1379 0 R ] >> -% 1378 0 obj +% 1379 0 obj << /Type /Annot /Subtype /Link @@ -15362,7 +15371,7 @@ stream endstream endobj -1390 0 obj +1391 0 obj << /Length 6834 >> @@ -15377,7 +15386,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 201.825 706.129 Td [(halo)-250(\227)-250(Halo)-250(Data)-250(Communication)]TJ/F84 9.9626 Tf -51.429 -19.15 Td [(These)-250(subr)18(outines)-250(gathers)-250(the)-250(values)-250(of)-250(the)-250(halo)-250(elements:)]TJ/F78 9.9626 Tf 158.877 -25.014 Td [(x)]TJ/F190 10.3811 Tf 8.097 0 Td [(\040)]TJ/F78 9.9626 Tf 13.567 0 Td [(x)]TJ/F84 9.9626 Tf -180.651 -22.11 Td [(wher)18(e:)]TJ +/F75 11.9552 Tf 201.825 706.129 Td [(halo)-250(\227)-250(Halo)-250(Data)-250(Communication)]TJ/F84 9.9626 Tf -51.429 -19.15 Td [(These)-250(subr)18(outines)-250(gathers)-250(the)-250(values)-250(of)-250(the)-250(halo)-250(elements:)]TJ/F78 9.9626 Tf 158.877 -25.014 Td [(x)]TJ/F195 10.3811 Tf 8.097 0 Td [(\040)]TJ/F78 9.9626 Tf 13.567 0 Td [(x)]TJ/F84 9.9626 Tf -180.651 -22.11 Td [(wher)18(e:)]TJ 0 g 0 G /F78 9.9626 Tf 0.713 -20.212 Td [(x)]TJ 0 g 0 G @@ -15391,7 +15400,7 @@ q []0 d 0 J 0.398 w 0 0 m 184.337 0 l S Q BT -/F147 9.9626 Tf 236.494 587.758 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(,)]TJ/F78 9.9626 Tf 5.275 0 Td [(x)]TJ/F75 9.9626 Tf 110.131 0 Td [(Subroutine)]TJ +/F151 9.9626 Tf 236.494 587.758 Td [(a)]TJ/F84 9.9626 Tf 5.385 0 Td [(,)]TJ/F78 9.9626 Tf 5.275 0 Td [(x)]TJ/F75 9.9626 Tf 110.131 0 Td [(Subroutine)]TJ ET q 1 0 0 1 230.392 583.972 cm @@ -15445,7 +15454,7 @@ BT 0 g 0 G 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -127.572 -24.102 Td [(call)]TJ +/F147 9.9626 Tf -127.572 -24.102 Td [(call)]TJ 0 g 0 G [-525(psb_halo\050x,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -15485,28 +15494,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 89.687 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -79.948 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ 0.98 0 0 1 175.611 348.623 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-248(an)-247(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 420.354 348.623 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 420.354 348.623 Tm [(psb)]TJ ET q 1 0 0 1 436.673 348.823 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 439.811 348.623 Td [(T)]TJ +/F147 9.9626 Tf 439.811 348.623 Td [(T)]TJ ET q 1 0 0 1 445.669 348.823 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 448.807 348.623 Td [(vect)]TJ +/F147 9.9626 Tf 448.807 348.623 Td [(vect)]TJ ET q 1 0 0 1 470.356 348.823 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 473.495 348.623 Td [(type)]TJ +/F147 9.9626 Tf 473.495 348.623 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf -297.884 -11.955 Td [(containing)-250(numbers)-250(of)-250(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -15525,21 +15534,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 268.738 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 268.539 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 268.539 Td [(desc)]TJ ET q 1 0 0 1 384.755 268.738 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 268.539 Td [(type)]TJ +/F147 9.9626 Tf 387.893 268.539 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -15549,7 +15558,7 @@ BT 0 g 0 G /F75 9.9626 Tf -248.566 -20.309 Td [(data)]TJ 0 g 0 G -/F84 9.9626 Tf 24.349 0 Td [(index)-250(list)-250(selector)74(.)]TJ 0.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 0.98 0 0 1 175.611 144.236 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)75(.)-296(V)94(alues:)]TJ/F145 9.9626 Tf 1 0 0 1 309.544 144.236 Tm [(psb_comm_halo_)]TJ/F84 9.9626 Tf 0.98 0 0 1 382.769 144.236 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 385.21 144.236 Tm [(psb_comm_mov_)]TJ/F84 9.9626 Tf 0.98 0 0 1 453.204 144.236 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 457.658 144.236 Tm [(psb_comm_ext_)]TJ/F84 9.9626 Tf 0.98 0 0 1 525.652 144.236 Tm [(,)]TJ 0.98 0 0 1 175.611 132.281 Tm [(default:)]TJ/F145 9.9626 Tf 1 0 0 1 211.658 132.281 Tm [(psb_comm_halo_)]TJ/F84 9.9626 Tf 0.98 0 0 1 284.883 132.281 Tm [(.)-305(Chooses)-220(the)-221(index)-221(list)-220(on)-221(which)-220(to)-221(base)-221(the)-220(data)]TJ 1 0 0 1 175.611 120.326 Tm [(exchange.)]TJ +/F84 9.9626 Tf 24.349 0 Td [(index)-250(list)-250(selector)74(.)]TJ 0.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 0.98 0 0 1 175.611 144.236 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)75(.)-296(V)94(alues:)]TJ/F147 9.9626 Tf 1 0 0 1 309.544 144.236 Tm [(psb_comm_halo_)]TJ/F84 9.9626 Tf 0.98 0 0 1 382.769 144.236 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 385.21 144.236 Tm [(psb_comm_mov_)]TJ/F84 9.9626 Tf 0.98 0 0 1 453.204 144.236 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 457.658 144.236 Tm [(psb_comm_ext_)]TJ/F84 9.9626 Tf 0.98 0 0 1 525.652 144.236 Tm [(,)]TJ 0.98 0 0 1 175.611 132.281 Tm [(default:)]TJ/F147 9.9626 Tf 1 0 0 1 211.658 132.281 Tm [(psb_comm_halo_)]TJ/F84 9.9626 Tf 0.98 0 0 1 284.883 132.281 Tm [(.)-305(Chooses)-220(the)-221(index)-221(list)-220(on)-221(which)-220(to)-221(base)-221(the)-220(data)]TJ 1 0 0 1 175.611 120.326 Tm [(exchange.)]TJ 0 g 0 G 141.968 -29.888 Td [(60)]TJ 0 g 0 G @@ -15557,7 +15566,7 @@ ET endstream endobj -1397 0 obj +1398 0 obj << /Length 3211 >> @@ -15602,7 +15611,7 @@ BT 0 0 1 rg 0 0 1 RG [-276(3)]TJ 0 g 0 G - [(,)-283(parti-)]TJ 0.989 0 0 1 99.895 268.66 Tm [(tioned)-252(among)-253(two)-252(pr)18(ocesses)-252(as)-252(shown)-252(by)-253(the)-252(dashed)-252(line;)-252(the)-253(data)-252(distribution)]TJ 1.02 0 0 1 99.895 256.705 Tm [(is)-298(such)-299(that)-298(each)-298(pr)18(ocess)-299(will)-298(own)-298(32)-299(entries)-298(in)-298(the)-298(index)-299(space,)-311(with)-298(a)-299(halo)]TJ 1.02 0 0 1 99.895 244.75 Tm [(made)-312(of)-312(8)-312(entries)-312(placed)-312(at)-312(local)-312(indices)-312(33)-312(thr)17(ough)-312(40.)-504(If)-312(pr)17(ocess)-312(0)-312(assigns)]TJ 1.018 0 0 1 99.895 232.795 Tm [(an)-245(initial)-245(value)-246(of)-245(1)-245(to)-245(its)-245(entries)-246(i)1(n)-246(the)]TJ/F78 9.9626 Tf 1 0 0 1 273.331 232.795 Tm [(x)]TJ/F84 9.9626 Tf 1.018 0 0 1 281.023 232.795 Tm [(vector)73(,)-246(and)-245(pr)18(ocess)-245(1)-245(assigns)-246(a)-245(value)]TJ 1.02 0 0 1 99.895 220.84 Tm [(of)-277(2,)-285(then)-277(after)-277(a)-276(call)-277(to)]TJ/F145 9.9626 Tf 1 0 0 1 206.342 220.84 Tm [(psb_halo)]TJ/F84 9.9626 Tf 1.02 0 0 1 250.999 220.84 Tm [(the)-277(contents)-277(of)-277(the)-277(l)1(ocal)-277(vectors)-277(will)-277(be)-277(the)]TJ 1 0 0 1 99.895 208.885 Tm [(following:)]TJ + [(,)-283(parti-)]TJ 0.989 0 0 1 99.895 268.66 Tm [(tioned)-252(among)-253(two)-252(pr)18(ocesses)-252(as)-252(shown)-252(by)-253(the)-252(dashed)-252(line;)-252(the)-253(data)-252(distribution)]TJ 1.02 0 0 1 99.895 256.705 Tm [(is)-298(such)-299(that)-298(each)-298(pr)18(ocess)-299(will)-298(own)-298(32)-299(entries)-298(in)-298(the)-298(index)-299(space,)-311(with)-298(a)-299(halo)]TJ 1.02 0 0 1 99.895 244.75 Tm [(made)-312(of)-312(8)-312(entries)-312(placed)-312(at)-312(local)-312(indices)-312(33)-312(thr)17(ough)-312(40.)-504(If)-312(pr)17(ocess)-312(0)-312(assigns)]TJ 1.018 0 0 1 99.895 232.795 Tm [(an)-245(initial)-245(value)-246(of)-245(1)-245(to)-245(its)-245(entries)-246(i)1(n)-246(the)]TJ/F78 9.9626 Tf 1 0 0 1 273.331 232.795 Tm [(x)]TJ/F84 9.9626 Tf 1.018 0 0 1 281.023 232.795 Tm [(vector)73(,)-246(and)-245(pr)18(ocess)-245(1)-245(assigns)-246(a)-245(value)]TJ 1.02 0 0 1 99.895 220.84 Tm [(of)-277(2,)-285(then)-277(after)-277(a)-276(call)-277(to)]TJ/F147 9.9626 Tf 1 0 0 1 206.342 220.84 Tm [(psb_halo)]TJ/F84 9.9626 Tf 1.02 0 0 1 250.999 220.84 Tm [(the)-277(contents)-277(of)-277(the)-277(l)1(ocal)-277(vectors)-277(will)-277(be)-277(the)]TJ 1 0 0 1 99.895 208.885 Tm [(following:)]TJ 0 g 0 G 166.875 -118.447 Td [(61)]TJ 0 g 0 G @@ -15610,20 +15619,20 @@ ET endstream endobj -1393 0 obj +1394 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/try8x8.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 1401 0 R +/PTEX.InfoDict 1402 0 R /BBox [0 0 498 439] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 1402 0 R ->>/Font << /R8 1403 0 R/R10 1404 0 R>> +/R7 1403 0 R +>>/Font << /R8 1404 0 R/R10 1405 0 R>> >> /Length 3349 /Filter /FlateDecode @@ -15635,7 +15644,7 @@ U1 6ɖOWbzSE 0ˮΨxܳ>PU|h>^yԎX<Af\dy׎X<v4U3ڱz?Tjm~/[}:~<ωק/ߟvvݾkeo]{??~Cޟ#aYaX)'Wk3{ο*{ endstream endobj -1407 0 obj +1408 0 obj << /Filter /FlateDecode /Subtype /Type1C @@ -15694,7 +15703,7 @@ r ^Ƀ]W$g]Q y%Nԭ UOC\un_~C *%4vܢ%‰كl0^2F~ 996=/ `/v pć0e4:G*,-%| 4Ttuu$5ۇ+J\fo[qC +E'l>h,@[hZBAMr eJ}xsi@B`_)y`mqGz۽bM| tZ) ŽuNcpMSWo3r#]a5Ϳ+Wy{?q*>;^Z9 yƇŒp'\h"ղkpxتTR)oǤp!UK͝Q,K endstream endobj -1408 0 obj +1409 0 obj << /Filter /FlateDecode /Subtype /Type1C @@ -15767,7 +15776,7 @@ k OWk'T_Pi줮$1R(l?弣 endstream endobj -1411 0 obj +1412 0 obj << /Length 3049 >> @@ -15787,7 +15796,7 @@ ET endstream endobj -1418 0 obj +1419 0 obj << /Length 7845 >> @@ -15802,7 +15811,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 151.016 706.129 Td [(ovrl)-250(\227)-250(Overlap)-250(Update)]TJ/F84 9.9626 Tf -51.429 -18.964 Td [(These)-250(subr)18(outines)-250(applies)-250(an)-250(overlap)-250(operator)-250(to)-250(the)-250(input)-250(vector:)]TJ/F78 9.9626 Tf 154.826 -23.824 Td [(x)]TJ/F190 10.3811 Tf 8.098 0 Td [(\040)]TJ/F78 9.9626 Tf 13.497 0 Td [(Q)-42(x)]TJ/F84 9.9626 Tf -176.531 -21.014 Td [(wher)18(e:)]TJ +/F75 11.9552 Tf 151.016 706.129 Td [(ovrl)-250(\227)-250(Overlap)-250(Update)]TJ/F84 9.9626 Tf -51.429 -18.964 Td [(These)-250(subr)18(outines)-250(applies)-250(an)-250(overlap)-250(operator)-250(to)-250(the)-250(input)-250(vector:)]TJ/F78 9.9626 Tf 154.826 -23.824 Td [(x)]TJ/F195 10.3811 Tf 8.098 0 Td [(\040)]TJ/F78 9.9626 Tf 13.497 0 Td [(Q)-42(x)]TJ/F84 9.9626 Tf -176.531 -21.014 Td [(wher)18(e:)]TJ 0 g 0 G /F78 9.9626 Tf 0.712 -19.203 Td [(x)]TJ 0 g 0 G @@ -15867,7 +15876,7 @@ BT 0 g 0 G 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -127.572 -23.549 Td [(call)]TJ +/F147 9.9626 Tf -127.572 -23.549 Td [(call)]TJ 0 g 0 G [-525(psb_ovrl\050x,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -15912,28 +15921,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(global)-250(dense)-250(matrix)]TJ/F78 9.9626 Tf 89.688 0 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -79.949 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ 0.98 0 0 1 124.802 349.291 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-247(an)-248(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 369.545 349.291 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 369.545 349.291 Tm [(psb)]TJ ET q 1 0 0 1 385.864 349.49 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 389.002 349.291 Td [(T)]TJ +/F147 9.9626 Tf 389.002 349.291 Td [(T)]TJ ET q 1 0 0 1 394.86 349.49 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.998 349.291 Td [(vect)]TJ +/F147 9.9626 Tf 397.998 349.291 Td [(vect)]TJ ET q 1 0 0 1 419.547 349.49 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.685 349.291 Td [(type)]TJ +/F147 9.9626 Tf 422.685 349.291 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf -297.883 -11.955 Td [(containing)-250(numbers)-250(of)-250(type)-250(speci\002ed)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -15952,21 +15961,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 270.151 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 269.951 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 269.951 Td [(desc)]TJ ET q 1 0 0 1 333.945 270.151 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 269.951 Td [(type)]TJ +/F147 9.9626 Tf 337.084 269.951 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -16030,7 +16039,7 @@ q []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 196.338 144.236 Td [(t)-25(y)-80(p)-25(e)]TJ/F192 10.3811 Tf 21.467 0 Td [(=)]TJ/F78 9.9626 Tf 11.634 0 Td [(p)-25(s)-25(b)]TJ +/F78 9.9626 Tf 196.338 144.236 Td [(t)-25(y)-80(p)-25(e)]TJ/F197 10.3811 Tf 21.467 0 Td [(=)]TJ/F78 9.9626 Tf 11.634 0 Td [(p)-25(s)-25(b)]TJ ET q 1 0 0 1 244.129 144.435 cm @@ -16052,7 +16061,7 @@ ET endstream endobj -1427 0 obj +1428 0 obj << /Length 5934 >> @@ -16098,7 +16107,7 @@ BT 0 0 1 rg 0 0 1 RG [-266(3)]TJ 0 g 0 G - [(;)-276(the)-266(data)-267(distributi)1(on)-267(is)-266(such)]TJ 1.009 0 0 1 150.705 293.676 Tm [(that)-247(each)-247(pr)18(ocess)-247(will)-247(own)-247(40)-247(entries)-247(in)-247(the)-247(index)-247(space,)-247(with)-247(an)-247(overlap)-247(of)-247(16)]TJ 1 0 0 1 150.705 281.72 Tm [(entries)-250(placed)-251(at)-250(local)-251(indices)-250(25)-251(thr)18(ough)-250(40;)-251(the)-251(halo)-250(will)-251(r)8(un)-250(fr)18(om)-251(local)-250(index)]TJ 0.993 0 0 1 150.705 269.765 Tm [(41)-252(thr)18(ough)-252(local)-252(index)-252(48..)-313(If)-253(pr)19(ocess)-253(0)-252(assigns)-252(an)-252(initial)-252(value)-252(of)-252(1)-252(to)-252(its)-252(entries)]TJ 1.006 0 0 1 150.705 257.81 Tm [(in)-248(the)]TJ/F78 9.9626 Tf 1 0 0 1 178.629 257.81 Tm [(x)]TJ/F84 9.9626 Tf 1.006 0 0 1 186.324 257.81 Tm [(vector)74(,)-249(and)-248(pr)18(ocess)-249(1)-248(assigns)-249(a)-248(value)-248(of)-249(2,)-248(then)-249(after)-248(a)-249(call)-248(to)]TJ/F145 9.9626 Tf 1 0 0 1 452.573 257.81 Tm [(psb_ovrl)]TJ/F84 9.9626 Tf 1.006 0 0 1 150.286 245.855 Tm [(with)]TJ/F145 9.9626 Tf 1 0 0 1 173.159 245.855 Tm [(psb_avg_)]TJ/F84 9.9626 Tf 1.006 0 0 1 217.499 245.855 Tm [(and)-249(a)-249(call)-250(to)]TJ/F145 9.9626 Tf 1 0 0 1 273.502 245.855 Tm [(psb_halo_)]TJ/F84 9.9626 Tf 1.006 0 0 1 323.072 245.855 Tm [(the)-249(contents)-249(of)-250(t)1(he)-250(local)-249(vectors)-249(will)-249(be)]TJ 1 0 0 1 150.705 233.9 Tm [(the)-250(following)-250(\050showing)-250(a)-250(transition)-250(among)-250(the)-250(two)-250(subdomains\051)]TJ + [(;)-276(the)-266(data)-267(distributi)1(on)-267(is)-266(such)]TJ 1.009 0 0 1 150.705 293.676 Tm [(that)-247(each)-247(pr)18(ocess)-247(will)-247(own)-247(40)-247(entries)-247(in)-247(the)-247(index)-247(space,)-247(with)-247(an)-247(overlap)-247(of)-247(16)]TJ 1 0 0 1 150.705 281.72 Tm [(entries)-250(placed)-251(at)-250(local)-251(indices)-250(25)-251(thr)18(ough)-250(40;)-251(the)-251(halo)-250(will)-251(r)8(un)-250(fr)18(om)-251(local)-250(index)]TJ 0.993 0 0 1 150.705 269.765 Tm [(41)-252(thr)18(ough)-252(local)-252(index)-252(48..)-313(If)-253(pr)19(ocess)-253(0)-252(assigns)-252(an)-252(initial)-252(value)-252(of)-252(1)-252(to)-252(its)-252(entries)]TJ 1.006 0 0 1 150.705 257.81 Tm [(in)-248(the)]TJ/F78 9.9626 Tf 1 0 0 1 178.629 257.81 Tm [(x)]TJ/F84 9.9626 Tf 1.006 0 0 1 186.324 257.81 Tm [(vector)74(,)-249(and)-248(pr)18(ocess)-249(1)-248(assigns)-249(a)-248(value)-248(of)-249(2,)-248(then)-249(after)-248(a)-249(call)-248(to)]TJ/F147 9.9626 Tf 1 0 0 1 452.573 257.81 Tm [(psb_ovrl)]TJ/F84 9.9626 Tf 1.006 0 0 1 150.286 245.855 Tm [(with)]TJ/F147 9.9626 Tf 1 0 0 1 173.159 245.855 Tm [(psb_avg_)]TJ/F84 9.9626 Tf 1.006 0 0 1 217.499 245.855 Tm [(and)-249(a)-249(call)-250(to)]TJ/F147 9.9626 Tf 1 0 0 1 273.502 245.855 Tm [(psb_halo_)]TJ/F84 9.9626 Tf 1.006 0 0 1 323.072 245.855 Tm [(the)-249(contents)-249(of)-250(t)1(he)-250(local)-249(vectors)-249(will)-249(be)]TJ 1 0 0 1 150.705 233.9 Tm [(the)-250(following)-250(\050showing)-250(a)-250(transition)-250(among)-250(the)-250(two)-250(subdomains\051)]TJ 0 g 0 G 166.874 -143.462 Td [(64)]TJ 0 g 0 G @@ -16106,7 +16115,7 @@ ET endstream endobj -1435 0 obj +1436 0 obj << /Length 3551 >> @@ -16126,7 +16135,7 @@ ET endstream endobj -1439 0 obj +1440 0 obj << /Length 321 >> @@ -16157,20 +16166,20 @@ ET endstream endobj -1422 0 obj +1423 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/try8x8_ov.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 1441 0 R +/PTEX.InfoDict 1442 0 R /BBox [0 0 516 439] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 1442 0 R ->>/Font << /R8 1443 0 R/R10 1444 0 R>> +/R7 1443 0 R +>>/Font << /R8 1444 0 R/R10 1445 0 R>> >> /Length 3413 /Filter /FlateDecode @@ -16184,7 +16193,7 @@ x > 7z3mW=򙿪Ok*#_e}0h;ׇĂUmxPyPp}gZz43cL̵1Y][Vέ5x]Oh5E_ZSYdUZR6Tl4^l]M׵6Nɋ&%ě)?'Q:V\ֆU n|œzC+wum_kC*\b[=?' G_ߙ8"*1L̵1Y=Ƣzځm,uZMuTYaU&[:ZGv_P=-F5louY*oX<M+7uys6cn:|oœԱzS7>Zj?|b+T|oœ}Ա2/P=P[1`z:b$>6uMWֆ}qwf-G>7u|M#_e^z䫬Zaꦓ9X?񶎏x0z~DDE]ׅaX!>do֫\̕w-/Iv!o'ȟ`[G. endstream endobj -1447 0 obj +1448 0 obj << /Filter /FlateDecode /Subtype /Type1C @@ -16243,7 +16252,7 @@ r ^Ƀ]W$g]Q y%Nԭ UOC\un_~C *%4vܢ%‰كl0^2F~ 996=/ `/v pć0e4:G*,-%| 4Ttuu$5ۇ+J\fo[qC +E'l>h,@[hZBAMr eJ}xsi@B`_)y`mqGz۽bM| tZ) ŽuNcpMSWo3r#]a5Ϳ+Wy{?q*>;^Z9 yƇŒp'\h"ղkpxتTR)oǤp!UK͝Q,K endstream endobj -1448 0 obj +1449 0 obj << /Filter /FlateDecode /Subtype /Type1C @@ -16316,7 +16325,7 @@ k OWk'T_Pi줮$1R(l?弣 endstream endobj -1454 0 obj +1455 0 obj << /Length 8610 >> @@ -16338,14 +16347,14 @@ q []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 241.994 649.268 Td [(x)]TJ/F190 10.3811 Tf 8.097 0 Td [(\040)]TJ/F78 9.9626 Tf 13.397 0 Td [(c)-25(o)-35(l)-55(l)-55(e)-25(c)-25(t)]TJ/F192 10.3811 Tf 27.706 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(l)-55(o)-35(c)]TJ +/F78 9.9626 Tf 241.994 649.268 Td [(x)]TJ/F195 10.3811 Tf 8.097 0 Td [(\040)]TJ/F78 9.9626 Tf 13.397 0 Td [(c)-25(o)-35(l)-55(l)-55(e)-25(c)-25(t)]TJ/F197 10.3811 Tf 27.706 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(l)-55(o)-35(c)]TJ ET q 1 0 0 1 308.334 649.467 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 311.617 649.268 Td [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F192 10.3811 Tf 2.875 1.96 Td [(\051)]TJ/F84 9.9626 Tf -220.163 -22.41 Td [(wher)18(e:)]TJ +/F78 9.9626 Tf 311.617 649.268 Td [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F197 10.3811 Tf 2.875 1.96 Td [(\051)]TJ/F84 9.9626 Tf -220.163 -22.41 Td [(wher)18(e:)]TJ 0 g 0 G /F78 9.9626 Tf 0.762 -20.664 Td [(g)-25(l)-55(o)-35(b)]TJ ET @@ -16442,7 +16451,7 @@ BT 0 g 0 G 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -127.572 -27.052 Td [(call)]TJ +/F147 9.9626 Tf -127.572 -27.052 Td [(call)]TJ 0 g 0 G [-525(psb_gather\050glob_x,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -16499,28 +16508,28 @@ Q BT /F78 9.9626 Tf 324.326 350.427 Td [(x)]TJ/F84 9.9626 Tf 5.205 0 Td [(.)]TJ -204.729 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 302.606 Tm [(Speci\002ed)-247(as:)-313(a)-247(rank)-247(one)-247(or)-248(two)-247(array)-247(or)-247(an)-248(object)-247(of)-247(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 369.545 302.606 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 369.545 302.606 Tm [(psb)]TJ ET q 1 0 0 1 385.864 302.805 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 389.002 302.606 Td [(T)]TJ +/F147 9.9626 Tf 389.002 302.606 Td [(T)]TJ ET q 1 0 0 1 394.86 302.805 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.998 302.606 Td [(vect)]TJ +/F147 9.9626 Tf 397.998 302.606 Td [(vect)]TJ ET q 1 0 0 1 419.547 302.805 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.685 302.606 Td [(type)]TJ +/F147 9.9626 Tf 422.685 302.606 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf -297.883 -11.955 Td [(indicated)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -16539,27 +16548,27 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 222.12 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 221.921 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 221.921 Td [(desc)]TJ ET q 1 0 0 1 333.945 222.12 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 221.921 Td [(type)]TJ +/F147 9.9626 Tf 337.084 221.921 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -258.11 -20.91 Td [(root)]TJ 0 g 0 G -/F84 9.9626 Tf 1.004 0 0 1 122.839 201.011 Tm [(The)-248(pr)18(ocess)-248(that)-248(holds)-248(the)-248(global)-248(copy)111(.)-308(If)]TJ/F78 9.9626 Tf 1 0 0 1 305.722 201.011 Tm [(r)-17(o)-35(o)-35(t)]TJ/F192 10.3811 Tf 19.923 0 Td [(=)]TJ/F190 10.3811 Tf 11.086 0 Td [(\000)]TJ/F84 9.9626 Tf 1.004 0 0 1 344.925 201.011 Tm [(1)-248(all)-248(the)-248(pr)18(ocesses)-248(will)]TJ 1 0 0 1 124.802 189.056 Tm [(have)-250(a)-250(copy)-250(of)-250(the)-250(global)-250(vector)74(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(variable)]TJ/F190 10.3811 Tf 142.419 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F190 10.3811 Tf 7.873 0 Td [(\024)]TJ/F78 9.9626 Tf 10.987 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F190 10.3811 Tf 19.923 0 Td [(\024)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)]TJ/F190 10.3811 Tf 43.889 0 Td [(\000)]TJ/F84 9.9626 Tf 8.195 0 Td [(1.)]TJ +/F84 9.9626 Tf 1.004 0 0 1 122.839 201.011 Tm [(The)-248(pr)18(ocess)-248(that)-248(holds)-248(the)-248(global)-248(copy)111(.)-308(If)]TJ/F78 9.9626 Tf 1 0 0 1 305.722 201.011 Tm [(r)-17(o)-35(o)-35(t)]TJ/F197 10.3811 Tf 19.923 0 Td [(=)]TJ/F195 10.3811 Tf 11.086 0 Td [(\000)]TJ/F84 9.9626 Tf 1.004 0 0 1 344.925 201.011 Tm [(1)-248(all)-248(the)-248(pr)18(ocesses)-248(will)]TJ 1 0 0 1 124.802 189.056 Tm [(have)-250(a)-250(copy)-250(of)-250(the)-250(global)-250(vector)74(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(variable)]TJ/F195 10.3811 Tf 142.419 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F195 10.3811 Tf 7.873 0 Td [(\024)]TJ/F78 9.9626 Tf 10.987 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F195 10.3811 Tf 19.923 0 Td [(\024)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)]TJ/F195 10.3811 Tf 43.889 0 Td [(\000)]TJ/F84 9.9626 Tf 8.195 0 Td [(1.)]TJ 0 g 0 G /F75 9.9626 Tf -301.108 -20.909 Td [(On)-250(Return)]TJ 0 g 0 G @@ -16570,7 +16579,7 @@ ET endstream endobj -1460 0 obj +1461 0 obj << /Length 1417 >> @@ -16590,7 +16599,7 @@ BT 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(array)-250(wher)18(e)-250(the)-250(local)-250(parts)-250(must)-250(be)-250(gather)18(ed.)]TJ -8.817 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.745 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(or)-250(two)-250(array)-250(with)-250(the)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 202.459 0 Td [(ALLOCATABLE)]TJ +/F147 9.9626 Tf 202.459 0 Td [(ALLOCATABLE)]TJ 0 g 0 G /F84 9.9626 Tf 60.025 0 Td [(attribute.)]TJ 0 g 0 G @@ -16604,7 +16613,7 @@ ET endstream endobj -1466 0 obj +1467 0 obj << /Length 7629 >> @@ -16626,14 +16635,14 @@ q []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 235.523 646.918 Td [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F190 10.3811 Tf 5.642 1.96 Td [(\040)]TJ/F78 9.9626 Tf 13.397 0 Td [(s)-25(c)-40(a)-25(t)-25(t)-25(e)-15(r)]TJ/F192 10.3811 Tf 28.633 0 Td [(\050)]TJ/F78 9.9626 Tf 4.493 0 Td [(g)-25(l)-55(o)-35(b)]TJ +/F78 9.9626 Tf 235.523 646.918 Td [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F195 10.3811 Tf 5.642 1.96 Td [(\040)]TJ/F78 9.9626 Tf 13.397 0 Td [(s)-25(c)-40(a)-25(t)-25(t)-25(e)-15(r)]TJ/F197 10.3811 Tf 28.633 0 Td [(\050)]TJ/F78 9.9626 Tf 4.493 0 Td [(g)-25(l)-55(o)-35(b)]TJ ET q 1 0 0 1 311.49 647.117 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 314.773 646.918 Td [(x)]TJ/F192 10.3811 Tf 5.33 0 Td [(\051)]TJ/F84 9.9626 Tf -220.626 -23.362 Td [(wher)18(e:)]TJ +/F78 9.9626 Tf 314.773 646.918 Td [(x)]TJ/F197 10.3811 Tf 5.33 0 Td [(\051)]TJ/F84 9.9626 Tf -220.626 -23.362 Td [(wher)18(e:)]TJ 0 g 0 G /F78 9.9626 Tf 0.762 -22.091 Td [(g)-25(l)-55(o)-35(b)]TJ ET @@ -16730,7 +16739,7 @@ BT 0 g 0 G 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -112.628 -28.004 Td [(call)]TJ +/F147 9.9626 Tf -112.628 -28.004 Td [(call)]TJ 0 g 0 G [-525(psb_scatter\050glob_x,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -16778,27 +16787,27 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 215.069 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 214.87 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 214.87 Td [(desc)]TJ ET q 1 0 0 1 333.945 215.069 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 214.87 Td [(type)]TJ +/F147 9.9626 Tf 337.084 214.87 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -258.11 -22.813 Td [(root)]TJ 0 g 0 G -/F84 9.9626 Tf 0.987 0 0 1 122.839 192.057 Tm [(The)-253(pr)18(ocess)-254(that)-253(holds)-254(the)-253(global)-254(copy)113(.)-315(If)]TJ/F78 9.9626 Tf 1 0 0 1 303.049 192.057 Tm [(r)-17(o)-35(o)-35(t)]TJ/F192 10.3811 Tf 19.927 0 Td [(=)]TJ/F190 10.3811 Tf 11.09 0 Td [(\000)]TJ/F84 9.9626 Tf 0.987 0 0 1 342.26 192.057 Tm [(1)-253(all)-254(the)-253(pr)18(ocesses)-254(have)]TJ 1 0 0 1 124.802 180.101 Tm [(a)-250(copy)-250(of)-250(the)-250(global)-250(vector)74(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.015 0 0 1 124.802 132.281 Tm [(Speci\002ed)-246(as:)-305(an)-246(integer)-246(variable)]TJ/F190 10.3811 Tf 1 0 0 1 269.144 132.281 Tm [(\000)]TJ/F84 9.9626 Tf 1.015 0 0 1 277.338 132.281 Tm [(1)]TJ/F190 10.3811 Tf 1 0 0 1 285.286 132.281 Tm [(\024)]TJ/F78 9.9626 Tf 10.987 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F190 10.3811 Tf 19.922 0 Td [(\024)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.501 0 Td [(\000)]TJ/F84 9.9626 Tf 1.015 0 0 1 350.91 132.281 Tm [(1,)-246(default)]TJ/F145 9.9626 Tf 1 0 0 1 395.251 132.281 Tm [(psb_root_)]TJ/F84 9.9626 Tf 1.015 0 0 1 442.324 132.281 Tm [(,)]TJ 1 0 0 1 124.802 120.326 Tm [(i.e.)-310(pr)18(ocess)-250(0.)]TJ +/F84 9.9626 Tf 0.987 0 0 1 122.839 192.057 Tm [(The)-253(pr)18(ocess)-254(that)-253(holds)-254(the)-253(global)-254(copy)113(.)-315(If)]TJ/F78 9.9626 Tf 1 0 0 1 303.049 192.057 Tm [(r)-17(o)-35(o)-35(t)]TJ/F197 10.3811 Tf 19.927 0 Td [(=)]TJ/F195 10.3811 Tf 11.09 0 Td [(\000)]TJ/F84 9.9626 Tf 0.987 0 0 1 342.26 192.057 Tm [(1)-253(all)-254(the)-253(pr)18(ocesses)-254(have)]TJ 1 0 0 1 124.802 180.101 Tm [(a)-250(copy)-250(of)-250(the)-250(global)-250(vector)74(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.015 0 0 1 124.802 132.281 Tm [(Speci\002ed)-246(as:)-305(an)-246(integer)-246(variable)]TJ/F195 10.3811 Tf 1 0 0 1 269.144 132.281 Tm [(\000)]TJ/F84 9.9626 Tf 1.015 0 0 1 277.338 132.281 Tm [(1)]TJ/F195 10.3811 Tf 1 0 0 1 285.286 132.281 Tm [(\024)]TJ/F78 9.9626 Tf 10.987 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F195 10.3811 Tf 19.922 0 Td [(\024)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.501 0 Td [(\000)]TJ/F84 9.9626 Tf 1.015 0 0 1 350.91 132.281 Tm [(1,)-246(default)]TJ/F147 9.9626 Tf 1 0 0 1 395.251 132.281 Tm [(psb_root_)]TJ/F84 9.9626 Tf 1.015 0 0 1 442.324 132.281 Tm [(,)]TJ 1 0 0 1 124.802 120.326 Tm [(i.e.)-310(pr)18(ocess)-250(0.)]TJ 0 g 0 G 141.968 -29.888 Td [(69)]TJ 0 g 0 G @@ -16806,7 +16815,7 @@ ET endstream endobj -1473 0 obj +1474 0 obj << /Length 4073 >> @@ -16817,35 +16826,35 @@ stream BT /F75 9.9626 Tf 150.705 706.129 Td [(mold)]TJ 0 g 0 G -/F84 9.9626 Tf 28.473 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(vector)-250(storage.)]TJ -3.567 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ 0.987 0 0 1 175.611 658.308 Tm [(Speci\002ed)-254(as:)-315(an)-254(object)-254(of)-254(a)-254(class)-254(derived)-254(fr)18(om)]TJ/F145 9.9626 Tf 1 0 0 1 374.749 658.308 Tm [(psb)]TJ +/F84 9.9626 Tf 28.473 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(vector)-250(storage.)]TJ -3.567 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ 0.987 0 0 1 175.611 658.308 Tm [(Speci\002ed)-254(as:)-315(an)-254(object)-254(of)-254(a)-254(class)-254(derived)-254(fr)18(om)]TJ/F147 9.9626 Tf 1 0 0 1 374.749 658.308 Tm [(psb)]TJ ET q 1 0 0 1 391.068 658.507 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 394.206 658.308 Td [(T)]TJ +/F147 9.9626 Tf 394.206 658.308 Td [(T)]TJ ET q 1 0 0 1 400.064 658.507 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 403.202 658.308 Td [(base)]TJ +/F147 9.9626 Tf 403.202 658.308 Td [(base)]TJ ET q 1 0 0 1 424.751 658.507 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 427.89 658.308 Td [(vect)]TJ +/F147 9.9626 Tf 427.89 658.308 Td [(vect)]TJ ET q 1 0 0 1 449.439 658.507 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 452.577 658.308 Td [(type)]TJ/F84 9.9626 Tf 0.987 0 0 1 473.498 658.308 Tm [(;)-254(this)]TJ 1 0 0 1 175.611 646.353 Tm [(is)-250(only)-250(allowed)-250(when)-250(loc)]TJ +/F147 9.9626 Tf 452.577 658.308 Td [(type)]TJ/F84 9.9626 Tf 0.987 0 0 1 473.498 658.308 Tm [(;)-254(this)]TJ 1 0 0 1 175.611 646.353 Tm [(is)-250(only)-250(allowed)-250(when)-250(loc)]TJ ET q 1 0 0 1 285.797 646.552 cm @@ -16854,28 +16863,28 @@ Q BT /F84 9.9626 Tf 288.786 646.353 Td [(x)-250(is)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 50.53 0 Td [(psb)]TJ +/F147 9.9626 Tf 50.53 0 Td [(psb)]TJ ET q 1 0 0 1 355.634 646.552 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 358.773 646.353 Td [(T)]TJ +/F147 9.9626 Tf 358.773 646.353 Td [(T)]TJ ET q 1 0 0 1 364.63 646.552 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 367.769 646.353 Td [(vect)]TJ +/F147 9.9626 Tf 367.769 646.353 Td [(vect)]TJ ET q 1 0 0 1 389.318 646.552 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 392.456 646.353 Td [(type)]TJ +/F147 9.9626 Tf 392.456 646.353 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -16900,28 +16909,28 @@ Q BT /F78 9.9626 Tf 375.135 606.502 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ -204.73 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ 0.985 0 0 1 175.611 558.682 Tm [(Speci\002ed)-253(as:)-315(a)-253(rank)-253(one)-253(or)-253(two)-254(ALLOCA)76(T)75(ABLE)-254(array)-253(or)-253(an)-253(object)-253(of)-253(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 175.611 546.727 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 175.611 546.727 Tm [(psb)]TJ ET q 1 0 0 1 191.93 546.926 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 195.068 546.727 Td [(T)]TJ +/F147 9.9626 Tf 195.068 546.727 Td [(T)]TJ ET q 1 0 0 1 200.926 546.926 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 204.065 546.727 Td [(vect)]TJ +/F147 9.9626 Tf 204.065 546.727 Td [(vect)]TJ ET q 1 0 0 1 225.613 546.926 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 228.752 546.727 Td [(type)]TJ +/F147 9.9626 Tf 228.752 546.727 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 23.412 0 Td [(containing)-250(numbers)-250(of)-250(the)-250(type)-250(indicated)-250(in)-250(T)92(able)]TJ 0 0 1 rg 0 0 1 RG @@ -16939,7 +16948,7 @@ ET endstream endobj -1477 0 obj +1478 0 obj << /Length 6702 >> @@ -16957,7 +16966,7 @@ BT /F75 11.9552 Tf 151.016 681.348 Td [(cdall)-250(\227)-250(Allocates)-250(a)-250(communication)-250(descriptor)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -51.121 -18.964 Td [(call)-525(psb_cdall\050icontxt,)-525(desc_a,)-525(info,mg=mg,parts=parts\051)]TJ 0 -11.955 Td [(call)-525(psb_cdall\050icontxt,)-525(desc_a,)-525(info,vg=vg,[mg=mg,flag=flag]\051)]TJ 0 -11.955 Td [(call)-525(psb_cdall\050icontxt,)-525(desc_a,)-525(info,vl=vl,[nl=nl,globalcheck=.false.,lidx=lidx]\051)]TJ 0 -11.955 Td [(call)-525(psb_cdall\050icontxt,)-525(desc_a,)-525(info,nl=nl\051)]TJ 0 -11.956 Td [(call)-525(psb_cdall\050icontxt,)-525(desc_a,)-525(info,mg=mg,repl=.true.\051)]TJ/F84 9.9626 Tf 0.986 0 0 1 114.839 594.792 Tm [(This)-254(subr)19(outine)-254(initializes)-254(the)-253(communication)-254(descriptor)-253(associated)-254(with)-254(an)]TJ 1.018 0 0 1 99.895 582.836 Tm [(index)-245(space.)-305(One)-245(of)-245(the)-245(optional)-245(ar)17(guments)]TJ/F145 9.9626 Tf 1 0 0 1 297.448 582.836 Tm [(parts)]TJ/F84 9.9626 Tf 1.018 0 0 1 323.599 582.836 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 328.623 582.836 Tm [(vg)]TJ/F84 9.9626 Tf 1.018 0 0 1 339.083 582.836 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 344.106 582.836 Tm [(vl)]TJ/F84 9.9626 Tf 1.018 0 0 1 354.567 582.836 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 359.59 582.836 Tm [(nl)]TJ/F84 9.9626 Tf 1.018 0 0 1 372.538 582.836 Tm [(or)]TJ/F145 9.9626 Tf 1 0 0 1 384.568 582.836 Tm [(repl)]TJ/F84 9.9626 Tf 1.018 0 0 1 407.976 582.836 Tm [(must)-245(be)]TJ 1 0 0 1 99.895 570.881 Tm [(speci\002ed,)-250(ther)18(eby)-250(choosing)-250(the)-250(speci\002c)-250(initialization)-250(strategy)111(.)]TJ +/F147 9.9626 Tf -51.121 -18.964 Td [(call)-525(psb_cdall\050icontxt,)-525(desc_a,)-525(info,mg=mg,parts=parts\051)]TJ 0 -11.955 Td [(call)-525(psb_cdall\050icontxt,)-525(desc_a,)-525(info,vg=vg,[mg=mg,flag=flag]\051)]TJ 0 -11.955 Td [(call)-525(psb_cdall\050icontxt,)-525(desc_a,)-525(info,vl=vl,[nl=nl,globalcheck=.false.,lidx=lidx]\051)]TJ 0 -11.955 Td [(call)-525(psb_cdall\050icontxt,)-525(desc_a,)-525(info,nl=nl\051)]TJ 0 -11.956 Td [(call)-525(psb_cdall\050icontxt,)-525(desc_a,)-525(info,mg=mg,repl=.true.\051)]TJ/F84 9.9626 Tf 0.986 0 0 1 114.839 594.792 Tm [(This)-254(subr)19(outine)-254(initializes)-254(the)-253(communication)-254(descriptor)-253(associated)-254(with)-254(an)]TJ 1.018 0 0 1 99.895 582.836 Tm [(index)-245(space.)-305(One)-245(of)-245(the)-245(optional)-245(ar)17(guments)]TJ/F147 9.9626 Tf 1 0 0 1 297.448 582.836 Tm [(parts)]TJ/F84 9.9626 Tf 1.018 0 0 1 323.599 582.836 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 328.623 582.836 Tm [(vg)]TJ/F84 9.9626 Tf 1.018 0 0 1 339.083 582.836 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 344.106 582.836 Tm [(vl)]TJ/F84 9.9626 Tf 1.018 0 0 1 354.567 582.836 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 359.59 582.836 Tm [(nl)]TJ/F84 9.9626 Tf 1.018 0 0 1 372.538 582.836 Tm [(or)]TJ/F147 9.9626 Tf 1 0 0 1 384.568 582.836 Tm [(repl)]TJ/F84 9.9626 Tf 1.018 0 0 1 407.976 582.836 Tm [(must)-245(be)]TJ 1 0 0 1 99.895 570.881 Tm [(speci\002ed,)-250(ther)18(eby)-250(choosing)-250(the)-250(speci\002c)-250(initialization)-250(strategy)111(.)]TJ 0 g 0 G /F75 9.9626 Tf 0 -18.208 Td [(On)-250(Entry)]TJ 0 g 0 G @@ -16972,7 +16981,7 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -19.066 Td [(vg)]TJ 0 g 0 G -/F84 9.9626 Tf 16.06 0 Td [(Data)-250(allocation:)-310(each)-250(index)]TJ/F78 9.9626 Tf 121.707 0 Td [(i)]TJ/F190 10.3811 Tf 5.856 0 Td [(2)-290(f)]TJ/F84 9.9626 Tf 15.245 0 Td [(1)-179(.)-192(.)-192(.)]TJ/F78 9.9626 Tf 19.967 0 Td [(m)-47(g)]TJ/F190 10.3811 Tf 13.449 0 Td [(g)]TJ/F84 9.9626 Tf 7.806 0 Td [(is)-250(allocated)-250(to)-250(pr)18(ocess)]TJ/F78 9.9626 Tf 98.455 0 Td [(v)-47(g)]TJ/F192 10.3811 Tf 10.679 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 4.149 0 Td [(.)]TJ -295.759 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -57.434 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)111(.)]TJ +/F84 9.9626 Tf 16.06 0 Td [(Data)-250(allocation:)-310(each)-250(index)]TJ/F78 9.9626 Tf 121.707 0 Td [(i)]TJ/F195 10.3811 Tf 5.856 0 Td [(2)-290(f)]TJ/F84 9.9626 Tf 15.245 0 Td [(1)-179(.)-192(.)-192(.)]TJ/F78 9.9626 Tf 19.967 0 Td [(m)-47(g)]TJ/F195 10.3811 Tf 13.449 0 Td [(g)]TJ/F84 9.9626 Tf 7.806 0 Td [(is)-250(allocated)-250(to)-250(pr)18(ocess)]TJ/F78 9.9626 Tf 98.455 0 Td [(v)-47(g)]TJ/F197 10.3811 Tf 10.679 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 4.149 0 Td [(.)]TJ -295.759 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -57.434 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)111(.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -19.067 Td [(\003ag)]TJ 0 g 0 G @@ -16980,7 +16989,7 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -19.067 Td [(mg)]TJ 0 g 0 G -/F84 9.9626 Tf 19.377 0 Td [(the)-250(\050global\051)-250(number)-250(of)-250(r)18(ows)-250(of)-250(the)-250(pr)18(oblem.)]TJ 5.53 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -57.434 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.014 0 0 1 124.802 266.056 Tm [(Speci\002ed)-246(as:)-305(an)-246(integer)-246(value.)-305(It)-246(is)-246(r)18(equir)17(ed)-245(if)]TJ/F145 9.9626 Tf 1 0 0 1 328.848 266.056 Tm [(parts)]TJ/F84 9.9626 Tf 1.014 0 0 1 357.483 266.056 Tm [(or)]TJ/F145 9.9626 Tf 1 0 0 1 369.473 266.056 Tm [(repl)]TJ/F84 9.9626 Tf 1.014 0 0 1 392.878 266.056 Tm [(is)-246(speci\002ed,)]TJ 1 0 0 1 124.802 254.101 Tm [(it)-250(is)-250(optional)-250(if)]TJ/F145 9.9626 Tf 66.141 0 Td [(vg)]TJ/F84 9.9626 Tf 12.951 0 Td [(is)-250(speci\002ed.)]TJ +/F84 9.9626 Tf 19.377 0 Td [(the)-250(\050global\051)-250(number)-250(of)-250(r)18(ows)-250(of)-250(the)-250(pr)18(oblem.)]TJ 5.53 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -57.434 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.014 0 0 1 124.802 266.056 Tm [(Speci\002ed)-246(as:)-305(an)-246(integer)-246(value.)-305(It)-246(is)-246(r)18(equir)17(ed)-245(if)]TJ/F147 9.9626 Tf 1 0 0 1 328.848 266.056 Tm [(parts)]TJ/F84 9.9626 Tf 1.014 0 0 1 357.483 266.056 Tm [(or)]TJ/F147 9.9626 Tf 1 0 0 1 369.473 266.056 Tm [(repl)]TJ/F84 9.9626 Tf 1.014 0 0 1 392.878 266.056 Tm [(is)-246(speci\002ed,)]TJ 1 0 0 1 124.802 254.101 Tm [(it)-250(is)-250(optional)-250(if)]TJ/F147 9.9626 Tf 66.141 0 Td [(vg)]TJ/F84 9.9626 Tf 12.951 0 Td [(is)-250(speci\002ed.)]TJ 0 g 0 G /F75 9.9626 Tf -103.999 -19.067 Td [(parts)]TJ 0 g 0 G @@ -16988,7 +16997,7 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -19.067 Td [(vl)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 113.733 180.101 Tm [(Data)-254(allocation:)-322(the)-255(set)-254(of)-254(global)-254(indices)]TJ/F78 9.9626 Tf 1 0 0 1 295.435 180.101 Tm [(v)-25(l)]TJ/F192 10.3811 Tf 8.548 0 Td [(\050)]TJ/F84 9.9626 Tf 1.02 0 0 1 308.132 180.101 Tm [(1)]TJ 1 0 0 1 316.277 180.101 Tm [(:)]TJ/F78 9.9626 Tf 5.679 0 Td [(n)-25(l)]TJ/F192 10.3811 Tf 9.106 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 337.795 180.101 Tm [(belonging)-254(to)-254(the)-255(calling)]TJ 1 0 0 1 124.503 168.146 Tm [(pr)18(ocess.)]TJ 0.299 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)111(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 113.733 180.101 Tm [(Data)-254(allocation:)-322(the)-255(set)-254(of)-254(global)-254(indices)]TJ/F78 9.9626 Tf 1 0 0 1 295.435 180.101 Tm [(v)-25(l)]TJ/F197 10.3811 Tf 8.548 0 Td [(\050)]TJ/F84 9.9626 Tf 1.02 0 0 1 308.132 180.101 Tm [(1)]TJ 1 0 0 1 316.277 180.101 Tm [(:)]TJ/F78 9.9626 Tf 5.679 0 Td [(n)-25(l)]TJ/F197 10.3811 Tf 9.106 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 337.795 180.101 Tm [(belonging)-254(to)-254(the)-255(calling)]TJ 1 0 0 1 124.503 168.146 Tm [(pr)18(ocess.)]TJ 0.299 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)111(.)]TJ 0 g 0 G 141.968 -29.888 Td [(71)]TJ 0 g 0 G @@ -16996,7 +17005,7 @@ ET endstream endobj -1482 0 obj +1483 0 obj << /Length 6818 >> @@ -17007,19 +17016,19 @@ stream BT /F75 9.9626 Tf 150.705 706.129 Td [(nl)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 165.091 706.129 Tm [(Data)-391(allocation:)-596(in)-391(a)-391(generalized)-391(block-r)17(ow)-391(distribution)-391(the)-391(number)-391(of)]TJ 1 0 0 1 175.611 694.174 Tm [(indices)-250(belonging)-250(to)-250(the)-250(curr)18(ent)-250(pr)18(ocess.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(May)-250(be)-250(speci\002ed)-250(together)-250(with)]TJ/F145 9.9626 Tf 272.944 0 Td [(vl)]TJ/F84 9.9626 Tf 10.46 0 Td [(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 165.091 706.129 Tm [(Data)-391(allocation:)-596(in)-391(a)-391(generalized)-391(block-r)17(ow)-391(distribution)-391(the)-391(number)-391(of)]TJ 1 0 0 1 175.611 694.174 Tm [(indices)-250(belonging)-250(to)-250(the)-250(curr)18(ent)-250(pr)18(ocess.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(May)-250(be)-250(speci\002ed)-250(together)-250(with)]TJ/F147 9.9626 Tf 272.944 0 Td [(vl)]TJ/F84 9.9626 Tf 10.46 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -308.31 -20.135 Td [(repl)]TJ 0 g 0 G -/F84 9.9626 Tf 1.018 0 0 1 173.948 626.218 Tm [(Data)-246(allocation:)-306(build)-246(a)-247(r)18(eplicated)-246(index)-246(space)-247(\050i.e.)-306(all)-246(pr)17(ocesses)-246(own)-246(all)]TJ 1 0 0 1 175.611 614.263 Tm [(indices\051.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -57.434 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(the)-250(logical)-250(value)]TJ/F145 9.9626 Tf 132.133 0 Td [(.true.)]TJ +/F84 9.9626 Tf 1.018 0 0 1 173.948 626.218 Tm [(Data)-246(allocation:)-306(build)-246(a)-247(r)18(eplicated)-246(index)-246(space)-247(\050i.e.)-306(all)-246(pr)17(ocesses)-246(own)-246(all)]TJ 1 0 0 1 175.611 614.263 Tm [(indices\051.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -57.434 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(the)-250(logical)-250(value)]TJ/F147 9.9626 Tf 132.133 0 Td [(.true.)]TJ 0 g 0 G /F75 9.9626 Tf -157.039 -20.135 Td [(globalcheck)]TJ 0 g 0 G -/F84 9.9626 Tf 59.765 0 Td [(Data)-250(allocation:)-310(do)-250(global)-250(checks)-250(on)-250(the)-250(local)-250(index)-250(lists)]TJ/F145 9.9626 Tf 247.788 0 Td [(vl)]TJ/F84 9.9626 Tf -282.647 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -57.434 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(value,)-250(default:)]TJ/F145 9.9626 Tf 162.678 0 Td [(.false.)]TJ +/F84 9.9626 Tf 59.765 0 Td [(Data)-250(allocation:)-310(do)-250(global)-250(checks)-250(on)-250(the)-250(local)-250(index)-250(lists)]TJ/F147 9.9626 Tf 247.788 0 Td [(vl)]TJ/F84 9.9626 Tf -282.647 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -57.434 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(value,)-250(default:)]TJ/F147 9.9626 Tf 162.678 0 Td [(.false.)]TJ 0 g 0 G /F75 9.9626 Tf -187.584 -20.135 Td [(lidx)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 173.39 478.351 Tm [(Data)-273(allocation:)-361(the)-274(set)-273(of)-274(local)-273(indices)]TJ/F78 9.9626 Tf 1 0 0 1 349.9 478.351 Tm [(l)-48(i)-32(d)-42(x)]TJ/F192 10.3811 Tf 17.066 0 Td [(\050)]TJ/F84 9.9626 Tf 1.02 0 0 1 371.116 478.351 Tm [(1)]TJ 1 0 0 1 379.623 478.351 Tm [(:)]TJ/F78 9.9626 Tf 6.042 0 Td [(n)-25(l)]TJ/F192 10.3811 Tf 9.106 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 401.699 478.351 Tm [(to)-274(be)-273(assigned)-274(to)-273(the)]TJ 1 0 0 1 175.611 466.396 Tm [(global)-250(indices)]TJ/F78 9.9626 Tf 63.477 0 Td [(v)-25(l)]TJ/F84 9.9626 Tf 8.423 0 Td [(.)]TJ -71.9 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)111(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 173.39 478.351 Tm [(Data)-273(allocation:)-361(the)-274(set)-273(of)-274(local)-273(indices)]TJ/F78 9.9626 Tf 1 0 0 1 349.9 478.351 Tm [(l)-48(i)-32(d)-42(x)]TJ/F197 10.3811 Tf 17.066 0 Td [(\050)]TJ/F84 9.9626 Tf 1.02 0 0 1 371.116 478.351 Tm [(1)]TJ 1 0 0 1 379.623 478.351 Tm [(:)]TJ/F78 9.9626 Tf 6.042 0 Td [(n)-25(l)]TJ/F197 10.3811 Tf 9.106 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 401.699 478.351 Tm [(to)-274(be)-273(assigned)-274(to)-273(the)]TJ 1 0 0 1 175.611 466.396 Tm [(global)-250(indices)]TJ/F78 9.9626 Tf 63.477 0 Td [(v)-25(l)]TJ/F84 9.9626 Tf 8.423 0 Td [(.)]TJ -71.9 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)111(.)]TJ 0 g 0 G /F75 9.9626 Tf -24.906 -22.128 Td [(On)-250(Return)]TJ 0 g 0 G @@ -17035,21 +17044,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.744 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.137 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.137 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 328.692 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 328.492 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 328.492 Td [(desc)]TJ ET q 1 0 0 1 384.755 328.692 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 328.492 Td [(type)]TJ +/F147 9.9626 Tf 387.893 328.492 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -17059,14 +17068,14 @@ BT 0 g 0 G /F84 9.9626 Tf 12.453 -20.082 Td [(1.)]TJ 0 g 0 G - 0.98 0 0 1 175.611 218.327 Tm [(One)-236(of)-236(the)-235(optional)-236(ar)18(guments)]TJ/F145 9.9626 Tf 1 0 0 1 309.412 218.327 Tm [(parts)]TJ/F84 9.9626 Tf 0.98 0 0 1 335.564 218.327 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 340.344 218.327 Tm [(vg)]TJ/F84 9.9626 Tf 0.98 0 0 1 350.805 218.327 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 355.585 218.327 Tm [(vl)]TJ/F84 9.9626 Tf 0.98 0 0 1 366.046 218.327 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 370.827 218.327 Tm [(nl)]TJ/F84 9.9626 Tf 0.98 0 0 1 383.589 218.327 Tm [(or)]TJ/F145 9.9626 Tf 1 0 0 1 395.078 218.327 Tm [(repl)]TJ/F84 9.9626 Tf 0.98 0 0 1 418.302 218.327 Tm [(must)-236(be)-235(speci\002ed,)]TJ 1 0 0 1 175.611 206.371 Tm [(ther)18(eby)-250(choosing)-250(the)-250(initialization)-250(strategy)-250(as)-250(follows:)]TJ + 0.98 0 0 1 175.611 218.327 Tm [(One)-236(of)-236(the)-235(optional)-236(ar)18(guments)]TJ/F147 9.9626 Tf 1 0 0 1 309.412 218.327 Tm [(parts)]TJ/F84 9.9626 Tf 0.98 0 0 1 335.564 218.327 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 340.344 218.327 Tm [(vg)]TJ/F84 9.9626 Tf 0.98 0 0 1 350.805 218.327 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 355.585 218.327 Tm [(vl)]TJ/F84 9.9626 Tf 0.98 0 0 1 366.046 218.327 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 370.827 218.327 Tm [(nl)]TJ/F84 9.9626 Tf 0.98 0 0 1 383.589 218.327 Tm [(or)]TJ/F147 9.9626 Tf 1 0 0 1 395.078 218.327 Tm [(repl)]TJ/F84 9.9626 Tf 0.98 0 0 1 418.302 218.327 Tm [(must)-236(be)-235(speci\002ed,)]TJ 1 0 0 1 175.611 206.371 Tm [(ther)18(eby)-250(choosing)-250(the)-250(initialization)-250(strategy)-250(as)-250(follows:)]TJ 0 g 0 G /F75 9.9626 Tf 0 -20.135 Td [(parts)]TJ 0 g 0 G -/F84 9.9626 Tf 0.997 0 0 1 203.278 186.236 Tm [(In)-251(this)-251(case)-251(we)-251(have)-251(a)-251(sub)1(r)18(outine)-251(specifying)-251(the)-251(mapping)-251(between)]TJ 1.02 0 0 1 197.529 174.281 Tm [(global)-273(indices)-272(and)-273(pr)18(ocess/local)-273(index)-273(pairs.)-386(If)-273(this)-273(optional)-272(ar)17(gu-)]TJ 0.991 0 0 1 197.529 162.326 Tm [(ment)-252(is)-252(speci\002ed,)-252(then)-252(it)-253(is)-252(mandatory)-252(to)-252(specify)-252(the)-252(ar)18(gument)]TJ/F145 9.9626 Tf 1 0 0 1 472.343 162.326 Tm [(mg)]TJ/F84 9.9626 Tf 0.991 0 0 1 485.293 162.326 Tm [(as)]TJ 1 0 0 1 197.111 150.371 Tm [(well.)-310(The)-250(subr)18(outine)-250(must)-250(conform)-250(to)-250(the)-250(following)-250(interface:)]TJ +/F84 9.9626 Tf 0.997 0 0 1 203.278 186.236 Tm [(In)-251(this)-251(case)-251(we)-251(have)-251(a)-251(sub)1(r)18(outine)-251(specifying)-251(the)-251(mapping)-251(between)]TJ 1.02 0 0 1 197.529 174.281 Tm [(global)-273(indices)-272(and)-273(pr)18(ocess/local)-273(index)-273(pairs.)-386(If)-273(this)-273(optional)-272(ar)17(gu-)]TJ 0.991 0 0 1 197.529 162.326 Tm [(ment)-252(is)-252(speci\002ed,)-252(then)-252(it)-253(is)-252(mandatory)-252(to)-252(specify)-252(the)-252(ar)18(gument)]TJ/F147 9.9626 Tf 1 0 0 1 472.343 162.326 Tm [(mg)]TJ/F84 9.9626 Tf 0.991 0 0 1 485.293 162.326 Tm [(as)]TJ 1 0 0 1 197.111 150.371 Tm [(well.)-310(The)-250(subr)18(outine)-250(must)-250(conform)-250(to)-250(the)-250(following)-250(interface:)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 10.879 -18.09 Td [(interface)]TJ 15.691 -11.955 Td [(subroutine)-525(psb_parts\050glob_index,mg,np,pv,nv\051)]TJ +/F147 9.9626 Tf 10.879 -18.09 Td [(interface)]TJ 15.691 -11.955 Td [(subroutine)-525(psb_parts\050glob_index,mg,np,pv,nv\051)]TJ 0 g 0 G /F84 9.9626 Tf 93.898 -29.888 Td [(72)]TJ 0 g 0 G @@ -17074,7 +17083,7 @@ ET endstream endobj -1488 0 obj +1489 0 obj << /Length 11618 >> @@ -17082,7 +17091,7 @@ stream 0 g 0 G 0 g 0 G BT -/F145 9.9626 Tf 183.332 706.129 Td [(integer,)-525(intent)-525(\050in\051)-1050(::)-525(glob_index,np,mg)]TJ 0 -11.955 Td [(integer,)-525(intent)-525(\050out\051)-525(::)-525(nv,)-525(pv\050*\051)]TJ -10.46 -11.955 Td [(end)-525(subroutine)-525(psb_parts)]TJ -15.691 -11.956 Td [(end)-525(interface)]TJ/F84 9.9626 Tf -10.77 -17.586 Td [(The)-250(input)-250(ar)18(guments)-250(ar)18(e:)]TJ +/F147 9.9626 Tf 183.332 706.129 Td [(integer,)-525(intent)-525(\050in\051)-1050(::)-525(glob_index,np,mg)]TJ 0 -11.955 Td [(integer,)-525(intent)-525(\050out\051)-525(::)-525(nv,)-525(pv\050*\051)]TJ -10.46 -11.955 Td [(end)-525(subroutine)-525(psb_parts)]TJ -15.691 -11.956 Td [(end)-525(interface)]TJ/F84 9.9626 Tf -10.77 -17.586 Td [(The)-250(input)-250(ar)18(guments)-250(ar)18(e:)]TJ 0 g 0 G /F75 9.9626 Tf 0.309 -15.594 Td [(glob)]TJ ET @@ -17105,23 +17114,23 @@ BT 0 g 0 G /F75 9.9626 Tf 0.309 -15.594 Td [(nv)]TJ 0 g 0 G -/F84 9.9626 Tf 16.299 0 Td [(The)-250(number)-250(of)-250(entries)-250(in)]TJ/F145 9.9626 Tf 111.052 0 Td [(pv)]TJ/F84 9.9626 Tf 10.46 0 Td [(;)]TJ +/F84 9.9626 Tf 16.299 0 Td [(The)-250(number)-250(of)-250(entries)-250(in)]TJ/F147 9.9626 Tf 111.052 0 Td [(pv)]TJ/F84 9.9626 Tf 10.46 0 Td [(;)]TJ 0 g 0 G /F75 9.9626 Tf -137.811 -13.774 Td [(pv)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 162.939 564.573 Tm [(A)-342(vector)-342(containing)-342(the)-342(indices)-343(of)-342(the)-342(pr)18(ocesses)-342(to)-343(which)-342(the)]TJ 1.02 0 0 1 165.35 552.618 Tm [(global)-309(index)-310(should)-309(be)-310(assigend;)-341(each)-310(entry)-309(must)-310(satisfy)-309(0)]TJ/F190 10.3811 Tf 1 0 0 1 435.412 552.618 Tm [(\024)]TJ/F78 9.9626 Tf -269.39 -11.956 Td [(p)-25(v)]TJ/F192 10.3811 Tf 10.461 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.089 0 Td [(\051)]TJ/F148 10.3811 Tf 8.296 0 Td [(<)]TJ/F78 9.9626 Tf 12.342 0 Td [(n)-80(p)]TJ/F84 9.9626 Tf 1.02 0 0 1 215.856 540.662 Tm [(;)-345(if)]TJ/F78 9.9626 Tf 1 0 0 1 231.538 540.662 Tm [(n)-25(v)]TJ/F148 10.3811 Tf 15.042 0 Td [(>)]TJ/F84 9.9626 Tf 1.02 0 0 1 258.797 540.662 Tm [(1)-312(we)-312(have)-311(an)-312(index)-312(assigned)-312(to)-312(multiple)]TJ 1 0 0 1 165.051 528.707 Tm [(pr)18(ocesses,)-250(i.e.)-310(we)-250(have)-250(an)-250(overlap)-250(among)-250(the)-250(subdomains.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 162.939 564.573 Tm [(A)-342(vector)-342(containing)-342(the)-342(indices)-343(of)-342(the)-342(pr)18(ocesses)-342(to)-343(which)-342(the)]TJ 1.02 0 0 1 165.35 552.618 Tm [(global)-309(index)-310(should)-309(be)-310(assigend;)-341(each)-310(entry)-309(must)-310(satisfy)-309(0)]TJ/F195 10.3811 Tf 1 0 0 1 435.412 552.618 Tm [(\024)]TJ/F78 9.9626 Tf -269.39 -11.956 Td [(p)-25(v)]TJ/F197 10.3811 Tf 10.461 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.089 0 Td [(\051)]TJ/F152 10.3811 Tf 8.296 0 Td [(<)]TJ/F78 9.9626 Tf 12.342 0 Td [(n)-80(p)]TJ/F84 9.9626 Tf 1.02 0 0 1 215.856 540.662 Tm [(;)-345(if)]TJ/F78 9.9626 Tf 1 0 0 1 231.538 540.662 Tm [(n)-25(v)]TJ/F152 10.3811 Tf 15.042 0 Td [(>)]TJ/F84 9.9626 Tf 1.02 0 0 1 258.797 540.662 Tm [(1)-312(we)-312(have)-311(an)-312(index)-312(assigned)-312(to)-312(multiple)]TJ 1 0 0 1 165.051 528.707 Tm [(pr)18(ocesses,)-250(i.e.)-310(we)-250(have)-250(an)-250(overlap)-250(among)-250(the)-250(subdomains.)]TJ 0 g 0 G /F75 9.9626 Tf -40.249 -15.593 Td [(vg)]TJ 0 g 0 G -/F84 9.9626 Tf 0.98 0 0 1 140.862 513.114 Tm [(In)-244(this)-244(case)-244(the)-244(association)-244(between)-244(an)-244(index)-244(and)-244(a)-245(pr)19(ocess)-244(is)-244(speci\002ed)]TJ 0.986 0 0 1 146.441 501.158 Tm [(via)-254(an)-254(integer)-253(vector)]TJ/F145 9.9626 Tf 1 0 0 1 237.956 501.158 Tm [(vg\0501:mg\051)]TJ/F84 9.9626 Tf 0.986 0 0 1 279.798 501.158 Tm [(;)-254(each)-254(index)]TJ/F78 9.9626 Tf 1 0 0 1 333.837 501.158 Tm [(i)]TJ/F190 10.3811 Tf 5.861 0 Td [(2)-290(f)]TJ/F84 9.9626 Tf 0.986 0 0 1 354.949 501.158 Tm [(1)]TJ 1 0 0 1 361.645 501.158 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.201 0 Td [(m)-47(g)]TJ/F190 10.3811 Tf 13.449 0 Td [(g)]TJ/F84 9.9626 Tf 0.986 0 0 1 396.104 501.158 Tm [(is)-254(assigned)]TJ 1.02 0 0 1 146.72 489.203 Tm [(to)-260(pr)18(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 194.476 489.203 Tm [(v)-47(g)]TJ/F192 10.3811 Tf 10.68 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 216.598 489.203 Tm [(.)-349(The)-260(vector)]TJ/F145 9.9626 Tf 1 0 0 1 272.971 489.203 Tm [(vg)]TJ/F84 9.9626 Tf 1.02 0 0 1 286.073 489.203 Tm [(must)-260(be)-260(identical)-260(on)-260(all)-260(calling)-260(pr)18(o-)]TJ 1.02 0 0 1 146.72 477.248 Tm [(cesses;)-427(its)-366(entries)-366(may)-367(have)-366(the)-366(ranges)]TJ/F192 10.3811 Tf 1 0 0 1 329.283 477.248 Tm [(\050)]TJ/F84 9.9626 Tf 1.02 0 0 1 333.433 477.248 Tm [(0)]TJ 1 0 0 1 340.299 477.248 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.96 0 Td [(\000)]TJ/F84 9.9626 Tf 1.02 0 0 1 378.046 477.248 Tm [(1)]TJ/F192 10.3811 Tf 1 0 0 1 383.252 477.248 Tm [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 391.123 477.248 Tm [(or)]TJ/F192 10.3811 Tf 1 0 0 1 404.532 477.248 Tm [(\050)]TJ/F84 9.9626 Tf 1.02 0 0 1 408.681 477.248 Tm [(1)]TJ 1 0 0 1 415.547 477.248 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)-80(p)]TJ/F192 10.3811 Tf 11.567 0 Td [(\051)]TJ/F84 9.9626 Tf 0.993 0 0 1 146.72 465.293 Tm [(accor)18(ding)-252(to)-253(the)-252(value)-252(of)]TJ/F145 9.9626 Tf 1 0 0 1 257.41 465.293 Tm [(flag)]TJ/F84 9.9626 Tf 0.993 0 0 1 278.331 465.293 Tm [(.)-314(The)-253(size)]TJ/F78 9.9626 Tf 1 0 0 1 322.35 465.293 Tm [(m)-47(g)]TJ/F84 9.9626 Tf 0.993 0 0 1 338.172 465.293 Tm [(may)-252(be)-253(speci\002ed)-252(via)-253(the)]TJ 0.999 0 0 1 146.72 453.338 Tm [(optional)-250(ar)18(gument)]TJ/F145 9.9626 Tf 1 0 0 1 231.215 453.338 Tm [(mg)]TJ/F84 9.9626 Tf 0.999 0 0 1 241.676 453.338 Tm [(;)-250(the)-251(default)-250(is)-251(to)-250(use)-250(the)-251(entir)18(e)-250(vector)]TJ/F145 9.9626 Tf 1 0 0 1 408.907 453.338 Tm [(vg)]TJ/F84 9.9626 Tf 0.999 0 0 1 419.367 453.338 Tm [(,)-251(t)1(hus)]TJ 1 0 0 1 146.72 441.383 Tm [(having)]TJ/F145 9.9626 Tf 33.135 0 Td [(mg=size\050vg\051)]TJ/F84 9.9626 Tf 57.534 0 Td [(.)]TJ +/F84 9.9626 Tf 0.98 0 0 1 140.862 513.114 Tm [(In)-244(this)-244(case)-244(the)-244(association)-244(between)-244(an)-244(index)-244(and)-244(a)-245(pr)19(ocess)-244(is)-244(speci\002ed)]TJ 0.986 0 0 1 146.441 501.158 Tm [(via)-254(an)-254(integer)-253(vector)]TJ/F147 9.9626 Tf 1 0 0 1 237.956 501.158 Tm [(vg\0501:mg\051)]TJ/F84 9.9626 Tf 0.986 0 0 1 279.798 501.158 Tm [(;)-254(each)-254(index)]TJ/F78 9.9626 Tf 1 0 0 1 333.837 501.158 Tm [(i)]TJ/F195 10.3811 Tf 5.861 0 Td [(2)-290(f)]TJ/F84 9.9626 Tf 0.986 0 0 1 354.949 501.158 Tm [(1)]TJ 1 0 0 1 361.645 501.158 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.201 0 Td [(m)-47(g)]TJ/F195 10.3811 Tf 13.449 0 Td [(g)]TJ/F84 9.9626 Tf 0.986 0 0 1 396.104 501.158 Tm [(is)-254(assigned)]TJ 1.02 0 0 1 146.72 489.203 Tm [(to)-260(pr)18(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 194.476 489.203 Tm [(v)-47(g)]TJ/F197 10.3811 Tf 10.68 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 216.598 489.203 Tm [(.)-349(The)-260(vector)]TJ/F147 9.9626 Tf 1 0 0 1 272.971 489.203 Tm [(vg)]TJ/F84 9.9626 Tf 1.02 0 0 1 286.073 489.203 Tm [(must)-260(be)-260(identical)-260(on)-260(all)-260(calling)-260(pr)18(o-)]TJ 1.02 0 0 1 146.72 477.248 Tm [(cesses;)-427(its)-366(entries)-366(may)-367(have)-366(the)-366(ranges)]TJ/F197 10.3811 Tf 1 0 0 1 329.283 477.248 Tm [(\050)]TJ/F84 9.9626 Tf 1.02 0 0 1 333.433 477.248 Tm [(0)]TJ 1 0 0 1 340.299 477.248 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.96 0 Td [(\000)]TJ/F84 9.9626 Tf 1.02 0 0 1 378.046 477.248 Tm [(1)]TJ/F197 10.3811 Tf 1 0 0 1 383.252 477.248 Tm [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 391.123 477.248 Tm [(or)]TJ/F197 10.3811 Tf 1 0 0 1 404.532 477.248 Tm [(\050)]TJ/F84 9.9626 Tf 1.02 0 0 1 408.681 477.248 Tm [(1)]TJ 1 0 0 1 415.547 477.248 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(n)-80(p)]TJ/F197 10.3811 Tf 11.567 0 Td [(\051)]TJ/F84 9.9626 Tf 0.993 0 0 1 146.72 465.293 Tm [(accor)18(ding)-252(to)-253(the)-252(value)-252(of)]TJ/F147 9.9626 Tf 1 0 0 1 257.41 465.293 Tm [(flag)]TJ/F84 9.9626 Tf 0.993 0 0 1 278.331 465.293 Tm [(.)-314(The)-253(size)]TJ/F78 9.9626 Tf 1 0 0 1 322.35 465.293 Tm [(m)-47(g)]TJ/F84 9.9626 Tf 0.993 0 0 1 338.172 465.293 Tm [(may)-252(be)-253(speci\002ed)-252(via)-253(the)]TJ 0.999 0 0 1 146.72 453.338 Tm [(optional)-250(ar)18(gument)]TJ/F147 9.9626 Tf 1 0 0 1 231.215 453.338 Tm [(mg)]TJ/F84 9.9626 Tf 0.999 0 0 1 241.676 453.338 Tm [(;)-250(the)-251(default)-250(is)-251(to)-250(use)-250(the)-251(entir)18(e)-250(vector)]TJ/F147 9.9626 Tf 1 0 0 1 408.907 453.338 Tm [(vg)]TJ/F84 9.9626 Tf 0.999 0 0 1 419.367 453.338 Tm [(,)-251(t)1(hus)]TJ 1 0 0 1 146.72 441.383 Tm [(having)]TJ/F147 9.9626 Tf 33.135 0 Td [(mg=size\050vg\051)]TJ/F84 9.9626 Tf 57.534 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -112.587 -15.594 Td [(vl)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 138.64 425.789 Tm [(In)-336(this)-335(case)-336(we)-335(ar)17(e)-335(specifying)-336(the)-335(list)-336(of)-335(indices)]TJ/F145 9.9626 Tf 1 0 0 1 359.058 425.789 Tm [(vl\0501:nl\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 404.311 425.789 Tm [(assigned)]TJ 1.018 0 0 1 146.72 413.834 Tm [(to)-245(the)-246(curr)18(ent)-245(pr)17(ocess;)-245(thus,)-246(th)1(e)-246(global)-245(pr)17(oblem)-245(size)]TJ/F78 9.9626 Tf 1 0 0 1 379.625 413.834 Tm [(m)-47(g)]TJ/F84 9.9626 Tf 1.018 0 0 1 395.438 413.834 Tm [(is)-245(given)-246(by)]TJ 1.02 0 0 1 146.72 401.878 Tm [(the)-255(range)-255(of)-255(the)-255(aggr)18(egate)-255(of)-255(the)-255(individual)-255(vectors)]TJ/F145 9.9626 Tf 1 0 0 1 379.117 401.878 Tm [(vl)]TJ/F84 9.9626 Tf 1.02 0 0 1 392.168 401.878 Tm [(speci\002ed)-255(in)]TJ 1.02 0 0 1 146.72 389.923 Tm [(the)-346(calling)-347(pr)18(ocesses.)-608(The)-347(size)-346(may)-347(be)-346(speci\002ed)-347(via)-346(the)-347(optional)]TJ 1.02 0 0 1 146.72 377.968 Tm [(ar)18(gument)]TJ/F145 9.9626 Tf 1 0 0 1 193.05 377.968 Tm [(nl)]TJ/F84 9.9626 Tf 1.02 0 0 1 203.511 377.968 Tm [(;)-257(the)-253(default)-252(is)-253(to)-253(use)-253(the)-253(entir)18(e)-253(vector)]TJ/F145 9.9626 Tf 1 0 0 1 374.525 377.968 Tm [(vl)]TJ/F84 9.9626 Tf 1.02 0 0 1 384.986 377.968 Tm [(,)-255(thus)-253(having)]TJ/F145 9.9626 Tf 1 0 0 1 146.72 366.013 Tm [(nl=size\050vl\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 204.254 366.013 Tm [(.)-306(If)]TJ/F145 9.9626 Tf 1 0 0 1 218.412 366.013 Tm [(globalcheck=.true.)]TJ/F84 9.9626 Tf 0.98 0 0 1 314.747 366.013 Tm [(the)-224(subr)18(outine)-224(will)-224(check)-224(how)]TJ 0.98 0 0 1 146.72 354.058 Tm [(many)-208(times)-209(each)-208(entry)-209(in)-208(the)-209(global)-208(index)-209(space)]TJ/F192 10.3811 Tf 1 0 0 1 352.531 354.058 Tm [(\050)]TJ/F84 9.9626 Tf 0.98 0 0 1 356.68 354.058 Tm [(1)]TJ 1 0 0 1 363.347 354.058 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(m)-47(g)]TJ/F192 10.3811 Tf 13.45 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 396.182 354.058 Tm [(is)-208(speci\002ed)]TJ 0.999 0 0 1 146.72 342.103 Tm [(in)-249(the)-250(input)-249(lists)]TJ/F145 9.9626 Tf 1 0 0 1 220.533 342.103 Tm [(vl)]TJ/F84 9.9626 Tf 0.999 0 0 1 230.994 342.103 Tm [(,)-250(thus)-249(allowing)-249(for)-250(the)-249(pr)18(esence)-249(of)-250(overlap)-249(in)-249(the)]TJ 1.005 0 0 1 146.72 330.147 Tm [(input,)-248(and)-249(checking)-248(for)-249(\223orphan\224)-248(indices.)-308(If)]TJ/F145 9.9626 Tf 1 0 0 1 342.972 330.147 Tm [(globalcheck=.false.)]TJ/F84 9.9626 Tf 1.005 0 0 1 442.349 330.147 Tm [(,)]TJ 1.018 0 0 1 146.72 318.192 Tm [(the)-246(subr)18(outine)-246(will)-247(not)-246(check)-246(for)-246(overlap,)-246(and)-246(may)-246(be)-247(signi\002)1(cantly)]TJ 1.02 0 0 1 146.72 306.237 Tm [(faster)73(,)-256(but)-253(the)-253(user)-253(is)-254(implicitly)-253(guaranteeing)-253(that)-253(ther)17(e)-253(ar)18(e)-253(neither)]TJ 1 0 0 1 146.72 294.282 Tm [(orphan)-250(nor)-250(overlap)-250(indices.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 138.64 425.789 Tm [(In)-336(this)-335(case)-336(we)-335(ar)17(e)-335(specifying)-336(the)-335(list)-336(of)-335(indices)]TJ/F147 9.9626 Tf 1 0 0 1 359.058 425.789 Tm [(vl\0501:nl\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 404.311 425.789 Tm [(assigned)]TJ 1.018 0 0 1 146.72 413.834 Tm [(to)-245(the)-246(curr)18(ent)-245(pr)17(ocess;)-245(thus,)-246(th)1(e)-246(global)-245(pr)17(oblem)-245(size)]TJ/F78 9.9626 Tf 1 0 0 1 379.625 413.834 Tm [(m)-47(g)]TJ/F84 9.9626 Tf 1.018 0 0 1 395.438 413.834 Tm [(is)-245(given)-246(by)]TJ 1.02 0 0 1 146.72 401.878 Tm [(the)-255(range)-255(of)-255(the)-255(aggr)18(egate)-255(of)-255(the)-255(individual)-255(vectors)]TJ/F147 9.9626 Tf 1 0 0 1 379.117 401.878 Tm [(vl)]TJ/F84 9.9626 Tf 1.02 0 0 1 392.168 401.878 Tm [(speci\002ed)-255(in)]TJ 1.02 0 0 1 146.72 389.923 Tm [(the)-346(calling)-347(pr)18(ocesses.)-608(The)-347(size)-346(may)-347(be)-346(speci\002ed)-347(via)-346(the)-347(optional)]TJ 1.02 0 0 1 146.72 377.968 Tm [(ar)18(gument)]TJ/F147 9.9626 Tf 1 0 0 1 193.05 377.968 Tm [(nl)]TJ/F84 9.9626 Tf 1.02 0 0 1 203.511 377.968 Tm [(;)-257(the)-253(default)-252(is)-253(to)-253(use)-253(the)-253(entir)18(e)-253(vector)]TJ/F147 9.9626 Tf 1 0 0 1 374.525 377.968 Tm [(vl)]TJ/F84 9.9626 Tf 1.02 0 0 1 384.986 377.968 Tm [(,)-255(thus)-253(having)]TJ/F147 9.9626 Tf 1 0 0 1 146.72 366.013 Tm [(nl=size\050vl\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 204.254 366.013 Tm [(.)-306(If)]TJ/F147 9.9626 Tf 1 0 0 1 218.412 366.013 Tm [(globalcheck=.true.)]TJ/F84 9.9626 Tf 0.98 0 0 1 314.747 366.013 Tm [(the)-224(subr)18(outine)-224(will)-224(check)-224(how)]TJ 0.98 0 0 1 146.72 354.058 Tm [(many)-208(times)-209(each)-208(entry)-209(in)-208(the)-209(global)-208(index)-209(space)]TJ/F197 10.3811 Tf 1 0 0 1 352.531 354.058 Tm [(\050)]TJ/F84 9.9626 Tf 0.98 0 0 1 356.68 354.058 Tm [(1)]TJ 1 0 0 1 363.347 354.058 Tm [(.)-192(.)-191(.)]TJ/F78 9.9626 Tf 13.2 0 Td [(m)-47(g)]TJ/F197 10.3811 Tf 13.45 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 396.182 354.058 Tm [(is)-208(speci\002ed)]TJ 0.999 0 0 1 146.72 342.103 Tm [(in)-249(the)-250(input)-249(lists)]TJ/F147 9.9626 Tf 1 0 0 1 220.533 342.103 Tm [(vl)]TJ/F84 9.9626 Tf 0.999 0 0 1 230.994 342.103 Tm [(,)-250(thus)-249(allowing)-249(for)-250(the)-249(pr)18(esence)-249(of)-250(overlap)-249(in)-249(the)]TJ 1.005 0 0 1 146.72 330.147 Tm [(input,)-248(and)-249(checking)-248(for)-249(\223orphan\224)-248(indices.)-308(If)]TJ/F147 9.9626 Tf 1 0 0 1 342.972 330.147 Tm [(globalcheck=.false.)]TJ/F84 9.9626 Tf 1.005 0 0 1 442.349 330.147 Tm [(,)]TJ 1.018 0 0 1 146.72 318.192 Tm [(the)-246(subr)18(outine)-246(will)-247(not)-246(check)-246(for)-246(overlap,)-246(and)-246(may)-246(be)-247(signi\002)1(cantly)]TJ 1.02 0 0 1 146.72 306.237 Tm [(faster)73(,)-256(but)-253(the)-253(user)-253(is)-254(implicitly)-253(guaranteeing)-253(that)-253(ther)17(e)-253(ar)18(e)-253(neither)]TJ 1 0 0 1 146.72 294.282 Tm [(orphan)-250(nor)-250(overlap)-250(indices.)]TJ 0 g 0 G /F75 9.9626 Tf -21.918 -15.594 Td [(lidx)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 147.178 278.688 Tm [(The)-326(optional)-325(ar)18(gument)]TJ/F145 9.9626 Tf 1 0 0 1 255.3 278.688 Tm [(lidx)]TJ/F84 9.9626 Tf 1.02 0 0 1 279.53 278.688 Tm [(is)-326(available)-325(for)-326(those)-325(cases)-326(in)-325(which)]TJ 1.02 0 0 1 146.72 266.733 Tm [(the)-305(user)-305(has)-305(alr)18(eady)-306(established)-305(a)-305(global-to-local)-305(mapping;)-335(if)-305(it)-305(is)]TJ 1.001 0 0 1 146.72 254.778 Tm [(speci\002ed,)-250(each)-250(index)-250(in)]TJ/F145 9.9626 Tf 1 0 0 1 251.841 254.778 Tm [(vl\050i\051)]TJ/F84 9.9626 Tf 1.001 0 0 1 280.486 254.778 Tm [(will)-250(be)-250(mapped)-250(to)-250(the)-250(corr)18(esponding)]TJ 1.02 0 0 1 146.72 242.823 Tm [(local)-275(index)]TJ/F145 9.9626 Tf 1 0 0 1 198.551 242.823 Tm [(lidx\050i\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 235.163 242.823 Tm [(.)-393(When)-275(specifying)-275(the)-274(ar)17(gument)]TJ/F145 9.9626 Tf 1 0 0 1 383.887 242.823 Tm [(lidx)]TJ/F84 9.9626 Tf 1.02 0 0 1 407.601 242.823 Tm [(the)-275(user)]TJ 1.02 0 0 1 146.301 230.868 Tm [(would)-297(also)-297(likely)-297(employ)]TJ/F145 9.9626 Tf 1 0 0 1 264.721 230.868 Tm [(lidx)]TJ/F84 9.9626 Tf 1.02 0 0 1 288.659 230.868 Tm [(in)-297(calls)-297(to)]TJ/F145 9.9626 Tf 1 0 0 1 335.257 230.868 Tm [(psb_cdins)]TJ/F84 9.9626 Tf 1.02 0 0 1 385.346 230.868 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 405.567 230.868 Tm [(local)]TJ/F84 9.9626 Tf 1.02 0 0 1 434.735 230.868 Tm [(in)]TJ 1 0 0 1 146.72 218.912 Tm [(calls)-250(to)]TJ/F145 9.9626 Tf 33.095 0 Td [(psb_spins)]TJ/F84 9.9626 Tf 49.564 0 Td [(and)]TJ/F145 9.9626 Tf 19.357 0 Td [(psb_geins)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)-250(see)-250(also)-250(sec.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 147.178 278.688 Tm [(The)-326(optional)-325(ar)18(gument)]TJ/F147 9.9626 Tf 1 0 0 1 255.3 278.688 Tm [(lidx)]TJ/F84 9.9626 Tf 1.02 0 0 1 279.53 278.688 Tm [(is)-326(available)-325(for)-326(those)-325(cases)-326(in)-325(which)]TJ 1.02 0 0 1 146.72 266.733 Tm [(the)-305(user)-305(has)-305(alr)18(eady)-306(established)-305(a)-305(global-to-local)-305(mapping;)-335(if)-305(it)-305(is)]TJ 1.001 0 0 1 146.72 254.778 Tm [(speci\002ed,)-250(each)-250(index)-250(in)]TJ/F147 9.9626 Tf 1 0 0 1 251.841 254.778 Tm [(vl\050i\051)]TJ/F84 9.9626 Tf 1.001 0 0 1 280.486 254.778 Tm [(will)-250(be)-250(mapped)-250(to)-250(the)-250(corr)18(esponding)]TJ 1.02 0 0 1 146.72 242.823 Tm [(local)-275(index)]TJ/F147 9.9626 Tf 1 0 0 1 198.551 242.823 Tm [(lidx\050i\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 235.163 242.823 Tm [(.)-393(When)-275(specifying)-275(the)-274(ar)17(gument)]TJ/F147 9.9626 Tf 1 0 0 1 383.887 242.823 Tm [(lidx)]TJ/F84 9.9626 Tf 1.02 0 0 1 407.601 242.823 Tm [(the)-275(user)]TJ 1.02 0 0 1 146.301 230.868 Tm [(would)-297(also)-297(likely)-297(employ)]TJ/F147 9.9626 Tf 1 0 0 1 264.721 230.868 Tm [(lidx)]TJ/F84 9.9626 Tf 1.02 0 0 1 288.659 230.868 Tm [(in)-297(calls)-297(to)]TJ/F147 9.9626 Tf 1 0 0 1 335.257 230.868 Tm [(psb_cdins)]TJ/F84 9.9626 Tf 1.02 0 0 1 385.346 230.868 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 405.567 230.868 Tm [(local)]TJ/F84 9.9626 Tf 1.02 0 0 1 434.735 230.868 Tm [(in)]TJ 1 0 0 1 146.72 218.912 Tm [(calls)-250(to)]TJ/F147 9.9626 Tf 33.095 0 Td [(psb_spins)]TJ/F84 9.9626 Tf 49.564 0 Td [(and)]TJ/F147 9.9626 Tf 19.357 0 Td [(psb_geins)]TJ/F84 9.9626 Tf 47.073 0 Td [(;)-250(see)-250(also)-250(sec.)]TJ 0 0 1 rg 0 0 1 RG [-250(2.3.1)]TJ 0 g 0 G @@ -17129,7 +17138,7 @@ BT 0 g 0 G /F75 9.9626 Tf -171.007 -15.593 Td [(nl)]TJ 0 g 0 G -/F84 9.9626 Tf 0.98 0 0 1 139.188 203.319 Tm [(If)-247(this)-248(ar)19(gument)-247(is)-248(speci\002ed)-247(alone)-247(\050i.e.)-314(without)]TJ/F145 9.9626 Tf 1 0 0 1 342.277 203.319 Tm [(vl)]TJ/F84 9.9626 Tf 0.98 0 0 1 352.737 203.319 Tm [(\051)-247(the)-248(r)19(esult)-247(is)-248(a)-247(gener)18(-)]TJ 0.98 0 0 1 146.72 191.364 Tm [(alized)-250(r)18(ow-block)-250(distribution)-250(in)-250(which)-250(each)-251(pr)19(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 372.364 191.364 Tm [(I)]TJ/F84 9.9626 Tf 0.98 0 0 1 378.657 191.364 Tm [(gets)-250(assigned)-250(a)]TJ 1 0 0 1 146.72 179.408 Tm [(consecutive)-250(chunk)-250(of)]TJ/F78 9.9626 Tf 95.904 0 Td [(N)]TJ/F78 7.5716 Tf 7.85 -1.808 Td [(I)]TJ/F192 10.3811 Tf 6.317 1.808 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-25(l)]TJ/F84 9.9626 Tf 11.472 0 Td [(global)-250(indices.)]TJ +/F84 9.9626 Tf 0.98 0 0 1 139.188 203.319 Tm [(If)-247(this)-248(ar)19(gument)-247(is)-248(speci\002ed)-247(alone)-247(\050i.e.)-314(without)]TJ/F147 9.9626 Tf 1 0 0 1 342.277 203.319 Tm [(vl)]TJ/F84 9.9626 Tf 0.98 0 0 1 352.737 203.319 Tm [(\051)-247(the)-248(r)19(esult)-247(is)-248(a)-247(gener)18(-)]TJ 0.98 0 0 1 146.72 191.364 Tm [(alized)-250(r)18(ow-block)-250(distribution)-250(in)-250(which)-250(each)-251(pr)19(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 372.364 191.364 Tm [(I)]TJ/F84 9.9626 Tf 0.98 0 0 1 378.657 191.364 Tm [(gets)-250(assigned)-250(a)]TJ 1 0 0 1 146.72 179.408 Tm [(consecutive)-250(chunk)-250(of)]TJ/F78 9.9626 Tf 95.904 0 Td [(N)]TJ/F78 7.5716 Tf 7.85 -1.808 Td [(I)]TJ/F197 10.3811 Tf 6.317 1.808 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-25(l)]TJ/F84 9.9626 Tf 11.472 0 Td [(global)-250(indices.)]TJ 0 g 0 G /F75 9.9626 Tf -154.547 -15.593 Td [(repl)]TJ 0 g 0 G @@ -17145,7 +17154,7 @@ ET endstream endobj -1495 0 obj +1496 0 obj << /Length 2982 >> @@ -17156,23 +17165,23 @@ stream BT /F84 9.9626 Tf 163.158 706.129 Td [(3.)]TJ 0 g 0 G - 1.005 0 0 1 175.611 706.129 Tm [(Calling)-248(the)-249(r)18(outine)-248(with)]TJ/F145 9.9626 Tf 1 0 0 1 284.117 706.129 Tm [(vg)]TJ/F84 9.9626 Tf 1.005 0 0 1 297.063 706.129 Tm [(or)]TJ/F145 9.9626 Tf 1 0 0 1 308.971 706.129 Tm [(parts)]TJ/F84 9.9626 Tf 1.005 0 0 1 337.608 706.129 Tm [(implies)-248(that)-249(eve)1(ry)-249(pr)18(ocess)-248(will)-248(scan)]TJ 1 0 0 1 175.611 694.174 Tm [(the)-250(entir)18(e)-250(index)-250(space)-250(to)-250(\002gur)18(e)-250(out)-250(the)-250(local)-250(indices.)]TJ + 1.005 0 0 1 175.611 706.129 Tm [(Calling)-248(the)-249(r)18(outine)-248(with)]TJ/F147 9.9626 Tf 1 0 0 1 284.117 706.129 Tm [(vg)]TJ/F84 9.9626 Tf 1.005 0 0 1 297.063 706.129 Tm [(or)]TJ/F147 9.9626 Tf 1 0 0 1 308.971 706.129 Tm [(parts)]TJ/F84 9.9626 Tf 1.005 0 0 1 337.608 706.129 Tm [(implies)-248(that)-249(eve)1(ry)-249(pr)18(ocess)-248(will)-248(scan)]TJ 1 0 0 1 175.611 694.174 Tm [(the)-250(entir)18(e)-250(index)-250(space)-250(to)-250(\002gur)18(e)-250(out)-250(the)-250(local)-250(indices.)]TJ 0 g 0 G -12.453 -19.926 Td [(4.)]TJ 0 g 0 G - [-500(Overlapped)-250(indices)-250(ar)18(e)-250(possible)-250(with)-250(both)]TJ/F145 9.9626 Tf 201.094 0 Td [(parts)]TJ/F84 9.9626 Tf 28.642 0 Td [(and)]TJ/F145 9.9626 Tf 19.357 0 Td [(vl)]TJ/F84 9.9626 Tf 12.952 0 Td [(invocations.)]TJ + [-500(Overlapped)-250(indices)-250(ar)18(e)-250(possible)-250(with)-250(both)]TJ/F147 9.9626 Tf 201.094 0 Td [(parts)]TJ/F84 9.9626 Tf 28.642 0 Td [(and)]TJ/F147 9.9626 Tf 19.357 0 Td [(vl)]TJ/F84 9.9626 Tf 12.952 0 Td [(invocations.)]TJ 0 g 0 G -262.045 -19.925 Td [(5.)]TJ 0 g 0 G - 0.98 0 0 1 175.113 654.323 Tm [(When)-194(the)-194(subr)19(outine)-194(is)-194(invoked)-194(with)]TJ/F145 9.9626 Tf 1 0 0 1 334.791 654.323 Tm [(vl)]TJ/F84 9.9626 Tf 0.98 0 0 1 347.144 654.323 Tm [(in)-194(conjunction)-194(with)]TJ/F145 9.9626 Tf 1 0 0 1 431.769 654.323 Tm [(globalcheck=.true.)]TJ/F84 9.9626 Tf 0.98 0 0 1 525.915 654.323 Tm [(,)]TJ 1.015 0 0 1 175.611 642.368 Tm [(it)-247(will)-246(perform)-247(a)-246(scan)-247(of)-246(the)-247(index)-247(space)-246(to)-247(sear)18(ch)-247(for)-246(overlap)-247(or)-246(orphan)]TJ 1 0 0 1 175.611 630.413 Tm [(indices.)]TJ + 0.98 0 0 1 175.113 654.323 Tm [(When)-194(the)-194(subr)19(outine)-194(is)-194(invoked)-194(with)]TJ/F147 9.9626 Tf 1 0 0 1 334.791 654.323 Tm [(vl)]TJ/F84 9.9626 Tf 0.98 0 0 1 347.144 654.323 Tm [(in)-194(conjunction)-194(with)]TJ/F147 9.9626 Tf 1 0 0 1 431.769 654.323 Tm [(globalcheck=.true.)]TJ/F84 9.9626 Tf 0.98 0 0 1 525.915 654.323 Tm [(,)]TJ 1.015 0 0 1 175.611 642.368 Tm [(it)-247(will)-246(perform)-247(a)-246(scan)-247(of)-246(the)-247(index)-247(space)-246(to)-247(sear)18(ch)-247(for)-246(overlap)-247(or)-246(orphan)]TJ 1 0 0 1 175.611 630.413 Tm [(indices.)]TJ 0 g 0 G -12.453 -19.925 Td [(6.)]TJ 0 g 0 G - 0.98 0 0 1 175.113 610.488 Tm [(When)-194(the)-194(subr)19(outine)-194(is)-194(invoked)-194(with)]TJ/F145 9.9626 Tf 1 0 0 1 334.791 610.488 Tm [(vl)]TJ/F84 9.9626 Tf 0.98 0 0 1 347.144 610.488 Tm [(in)-194(conjunction)-194(with)]TJ/F145 9.9626 Tf 1 0 0 1 431.769 610.488 Tm [(globalcheck=.false.)]TJ/F84 9.9626 Tf 0.98 0 0 1 531.145 610.488 Tm [(,)]TJ 1.02 0 0 1 175.611 598.532 Tm [(no)-295(index)-295(space)-295(scan)-296(wil)1(l)-296(take)-295(place.)-454(Thus)-295(it)-295(is)-295(the)-295(r)17(esponsib)1(ility)-296(of)-295(the)]TJ 1.02 0 0 1 175.611 586.577 Tm [(user)-277(to)-278(make)-277(sur)17(e)-277(that)-277(the)-278(indices)-277(speci\002ed)-278(in)]TJ/F145 9.9626 Tf 1 0 0 1 385.16 586.577 Tm [(vl)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.439 586.577 Tm [(have)-277(neither)-278(orphans)]TJ 1 0 0 1 175.611 574.622 Tm [(nor)-250(overlaps;)-250(if)-250(this)-250(assumption)-250(fails,)-250(r)18(esults)-250(will)-250(be)-250(unpr)18(edictable.)]TJ + 0.98 0 0 1 175.113 610.488 Tm [(When)-194(the)-194(subr)19(outine)-194(is)-194(invoked)-194(with)]TJ/F147 9.9626 Tf 1 0 0 1 334.791 610.488 Tm [(vl)]TJ/F84 9.9626 Tf 0.98 0 0 1 347.144 610.488 Tm [(in)-194(conjunction)-194(with)]TJ/F147 9.9626 Tf 1 0 0 1 431.769 610.488 Tm [(globalcheck=.false.)]TJ/F84 9.9626 Tf 0.98 0 0 1 531.145 610.488 Tm [(,)]TJ 1.02 0 0 1 175.611 598.532 Tm [(no)-295(index)-295(space)-295(scan)-296(wil)1(l)-296(take)-295(place.)-454(Thus)-295(it)-295(is)-295(the)-295(r)17(esponsib)1(ility)-296(of)-295(the)]TJ 1.02 0 0 1 175.611 586.577 Tm [(user)-277(to)-278(make)-277(sur)17(e)-277(that)-277(the)-278(indices)-277(speci\002ed)-278(in)]TJ/F147 9.9626 Tf 1 0 0 1 385.16 586.577 Tm [(vl)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.439 586.577 Tm [(have)-277(neither)-278(orphans)]TJ 1 0 0 1 175.611 574.622 Tm [(nor)-250(overlaps;)-250(if)-250(this)-250(assumption)-250(fails,)-250(r)18(esults)-250(will)-250(be)-250(unpr)18(edictable.)]TJ 0 g 0 G -12.453 -19.925 Td [(7.)]TJ 0 g 0 G - 1.02 0 0 1 175.611 554.697 Tm [(Orphan)-347(and)-347(overlap)-346(indices)-347(ar)17(e)-346(impossible)-347(by)-347(constr)8(uction)-347(when)-347(the)]TJ 1 0 0 1 175.611 542.742 Tm [(subr)18(outine)-250(is)-250(invoked)-250(with)]TJ/F145 9.9626 Tf 121.164 0 Td [(nl)]TJ/F84 9.9626 Tf 12.952 0 Td [(\050alone\051,)-250(or)]TJ/F145 9.9626 Tf 47.372 0 Td [(vg)]TJ/F84 9.9626 Tf 10.46 0 Td [(.)]TJ + 1.02 0 0 1 175.611 554.697 Tm [(Orphan)-347(and)-347(overlap)-346(indices)-347(ar)17(e)-346(impossible)-347(by)-347(constr)8(uction)-347(when)-347(the)]TJ 1 0 0 1 175.611 542.742 Tm [(subr)18(outine)-250(is)-250(invoked)-250(with)]TJ/F147 9.9626 Tf 121.164 0 Td [(nl)]TJ/F84 9.9626 Tf 12.952 0 Td [(\050alone\051,)-250(or)]TJ/F147 9.9626 Tf 47.372 0 Td [(vg)]TJ/F84 9.9626 Tf 10.46 0 Td [(.)]TJ 0 g 0 G -49.98 -452.304 Td [(74)]TJ 0 g 0 G @@ -17180,7 +17189,7 @@ ET endstream endobj -1383 0 obj +1384 0 obj << /Type /ObjStm /N 100 @@ -17188,39 +17197,39 @@ endobj /Length 12161 >> stream -1382 0 292 58 1379 115 1389 196 1384 353 1385 497 1386 644 1391 791 296 850 1392 908 -1388 967 1396 1104 1401 1252 1402 1379 1403 1422 1404 1629 1405 1867 1406 2143 1387 2379 1394 2526 -1398 2672 1399 2730 1395 2788 1410 2925 1412 3043 1409 3102 1417 3170 1413 3327 1414 3471 1415 3616 -1419 3763 300 3821 1420 3878 1416 3936 1426 4072 1421 4229 1423 4376 1424 4521 1428 4667 1429 4726 -1430 4785 1431 4844 1425 4903 1434 5011 1436 5129 1433 5187 1438 5255 1441 5373 1442 5500 1443 5543 -1444 5750 1445 5988 1446 6264 1440 6500 1432 6559 1437 6618 1453 6715 1449 6872 1450 7013 1451 7160 -1455 7307 304 7365 1456 7422 1452 7480 1459 7616 1461 7734 1458 7793 1465 7888 1462 8027 1467 8174 -308 8232 1468 8289 1464 8347 1472 8483 1463 8640 1469 8784 1470 8928 1474 9074 1471 9133 1476 9241 -1478 9359 312 9417 316 9474 1475 9530 1481 9666 1479 9805 1483 9952 1484 10011 1480 10070 1487 10192 -1485 10331 1489 10489 1491 10547 1486 10605 1494 10756 1496 10874 1497 10933 1498 10992 1499 11051 1500 11110 -% 1382 0 obj +1383 0 292 58 1380 115 1390 196 1385 353 1386 497 1387 644 1392 791 296 850 1393 908 +1389 967 1397 1104 1402 1252 1403 1379 1404 1422 1405 1629 1406 1867 1407 2143 1388 2379 1395 2526 +1399 2672 1400 2730 1396 2788 1411 2925 1413 3043 1410 3102 1418 3170 1414 3327 1415 3471 1416 3616 +1420 3763 300 3821 1421 3878 1417 3936 1427 4072 1422 4229 1424 4376 1425 4521 1429 4667 1430 4726 +1431 4785 1432 4844 1426 4903 1435 5011 1437 5129 1434 5187 1439 5255 1442 5373 1443 5500 1444 5543 +1445 5750 1446 5988 1447 6264 1441 6500 1433 6559 1438 6618 1454 6715 1450 6872 1451 7013 1452 7160 +1456 7307 304 7365 1457 7422 1453 7480 1460 7616 1462 7734 1459 7793 1466 7888 1463 8027 1468 8174 +308 8232 1469 8289 1465 8347 1473 8483 1464 8640 1470 8784 1471 8928 1475 9074 1472 9133 1477 9241 +1479 9359 312 9417 316 9474 1476 9530 1482 9666 1480 9805 1484 9952 1485 10011 1481 10070 1488 10192 +1486 10331 1490 10489 1492 10547 1487 10605 1495 10756 1497 10874 1498 10933 1499 10992 1500 11051 1501 11110 +% 1383 0 obj << -/D [1380 0 R /XYZ 98.895 753.953 null] +/D [1381 0 R /XYZ 98.895 753.953 null] >> % 292 0 obj << -/D [1380 0 R /XYZ 99.895 716.092 null] +/D [1381 0 R /XYZ 99.895 716.092 null] >> -% 1379 0 obj +% 1380 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1389 0 obj +% 1390 0 obj << /Type /Page -/Contents 1390 0 R -/Resources 1388 0 R +/Contents 1391 0 R +/Resources 1389 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1351 0 R -/Annots [ 1384 0 R 1385 0 R 1386 0 R ] +/Parent 1352 0 R +/Annots [ 1385 0 R 1386 0 R 1387 0 R ] >> -% 1384 0 obj +% 1385 0 obj << /Type /Annot /Subtype /Link @@ -17228,7 +17237,7 @@ stream /Rect [419.358 344.818 495.412 356.877] /A << /S /GoTo /D (vdata) >> >> -% 1385 0 obj +% 1386 0 obj << /Type /Annot /Subtype /Link @@ -17236,7 +17245,7 @@ stream /Rect [377.462 332.863 389.417 344.922] /A << /S /GoTo /D (table.17) >> >> -% 1386 0 obj +% 1387 0 obj << /Type /Annot /Subtype /Link @@ -17244,47 +17253,47 @@ stream /Rect [342.753 264.733 409.811 276.793] /A << /S /GoTo /D (descdata) >> >> -% 1391 0 obj +% 1392 0 obj << -/D [1389 0 R /XYZ 149.705 753.953 null] +/D [1390 0 R /XYZ 149.705 753.953 null] >> % 296 0 obj << -/D [1389 0 R /XYZ 150.705 716.092 null] +/D [1390 0 R /XYZ 150.705 716.092 null] >> -% 1392 0 obj +% 1393 0 obj << -/D [1389 0 R /XYZ 150.705 513.636 null] +/D [1390 0 R /XYZ 150.705 513.636 null] >> -% 1388 0 obj +% 1389 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F147 1157 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F151 1158 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1396 0 obj +% 1397 0 obj << /Type /Page -/Contents 1397 0 R -/Resources 1395 0 R +/Contents 1398 0 R +/Resources 1396 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1400 0 R -/Annots [ 1387 0 R 1394 0 R ] +/Parent 1401 0 R +/Annots [ 1388 0 R 1395 0 R ] >> -% 1401 0 obj +% 1402 0 obj << /Producer (GPL Ghostscript 9.22) /CreationDate (D:20180323100645Z00'00') /ModDate (D:20180323100645Z00'00') >> -% 1402 0 obj +% 1403 0 obj << /Type /ExtGState /OPM 1 >> -% 1403 0 obj +% 1404 0 obj << /BaseFont /XYUGDR+Times-Roman -/FontDescriptor 1405 0 R +/FontDescriptor 1406 0 R /Type /Font /FirstChar 48 /LastChar 57 @@ -17292,10 +17301,10 @@ stream /Encoding /WinAnsiEncoding /Subtype /Type1 >> -% 1404 0 obj +% 1405 0 obj << /BaseFont /XISTAL+Times-Bold -/FontDescriptor 1406 0 R +/FontDescriptor 1407 0 R /Type /Font /FirstChar 48 /LastChar 80 @@ -17303,7 +17312,7 @@ stream /Encoding /WinAnsiEncoding /Subtype /Type1 >> -% 1405 0 obj +% 1406 0 obj << /Type /FontDescriptor /FontName /XYUGDR+Times-Roman @@ -17316,9 +17325,9 @@ stream /StemV 71 /MissingWidth 250 /CharSet (/eight/five/four/nine/one/seven/six/three/two/zero) -/FontFile3 1407 0 R +/FontFile3 1408 0 R >> -% 1406 0 obj +% 1407 0 obj << /Type /FontDescriptor /FontName /XISTAL+Times-Bold @@ -17331,9 +17340,9 @@ stream /StemV 90 /MissingWidth 250 /CharSet (/P/one/zero) -/FontFile3 1408 0 R +/FontFile3 1409 0 R >> -% 1387 0 obj +% 1388 0 obj << /Type /Annot /Subtype /Link @@ -17341,7 +17350,7 @@ stream /Rect [160.836 625.272 172.792 634.682] /A << /S /GoTo /D (table.17) >> >> -% 1394 0 obj +% 1395 0 obj << /Type /Annot /Subtype /Link @@ -17349,47 +17358,47 @@ stream /Rect [408.91 276.439 415.983 290.202] /A << /S /GoTo /D (figure.3) >> >> -% 1398 0 obj +% 1399 0 obj << -/D [1396 0 R /XYZ 98.895 753.953 null] +/D [1397 0 R /XYZ 98.895 753.953 null] >> -% 1399 0 obj +% 1400 0 obj << -/D [1396 0 R /XYZ 99.895 326.444 null] +/D [1397 0 R /XYZ 99.895 326.444 null] >> -% 1395 0 obj +% 1396 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F145 940 0 R >> -/XObject << /Im4 1393 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F147 941 0 R >> +/XObject << /Im4 1394 0 R >> /ProcSet [ /PDF /Text ] >> -% 1410 0 obj +% 1411 0 obj << /Type /Page -/Contents 1411 0 R -/Resources 1409 0 R +/Contents 1412 0 R +/Resources 1410 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1400 0 R +/Parent 1401 0 R >> -% 1412 0 obj +% 1413 0 obj << -/D [1410 0 R /XYZ 149.705 753.953 null] +/D [1411 0 R /XYZ 149.705 753.953 null] >> -% 1409 0 obj +% 1410 0 obj << /Font << /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1417 0 obj +% 1418 0 obj << /Type /Page -/Contents 1418 0 R -/Resources 1416 0 R +/Contents 1419 0 R +/Resources 1417 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1400 0 R -/Annots [ 1413 0 R 1414 0 R 1415 0 R ] +/Parent 1401 0 R +/Annots [ 1414 0 R 1415 0 R 1416 0 R ] >> -% 1413 0 obj +% 1414 0 obj << /Type /Annot /Subtype /Link @@ -17397,7 +17406,7 @@ stream /Rect [368.549 345.485 444.603 357.545] /A << /S /GoTo /D (vdata) >> >> -% 1414 0 obj +% 1415 0 obj << /Type /Annot /Subtype /Link @@ -17405,7 +17414,7 @@ stream /Rect [326.652 333.53 338.608 345.59] /A << /S /GoTo /D (table.18) >> >> -% 1415 0 obj +% 1416 0 obj << /Type /Annot /Subtype /Link @@ -17413,33 +17422,33 @@ stream /Rect [291.943 266.146 359.001 278.205] /A << /S /GoTo /D (descdata) >> >> -% 1419 0 obj +% 1420 0 obj << -/D [1417 0 R /XYZ 98.895 753.953 null] +/D [1418 0 R /XYZ 98.895 753.953 null] >> % 300 0 obj << -/D [1417 0 R /XYZ 99.895 716.092 null] +/D [1418 0 R /XYZ 99.895 716.092 null] >> -% 1420 0 obj +% 1421 0 obj << -/D [1417 0 R /XYZ 99.895 510.975 null] +/D [1418 0 R /XYZ 99.895 510.975 null] >> -% 1416 0 obj +% 1417 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F145 940 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F147 941 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1426 0 obj +% 1427 0 obj << /Type /Page -/Contents 1427 0 R -/Resources 1425 0 R +/Contents 1428 0 R +/Resources 1426 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1400 0 R -/Annots [ 1421 0 R 1423 0 R 1424 0 R ] +/Parent 1401 0 R +/Annots [ 1422 0 R 1424 0 R 1425 0 R ] >> -% 1421 0 obj +% 1422 0 obj << /Type /Annot /Subtype /Link @@ -17447,7 +17456,7 @@ stream /Rect [253.329 554.876 265.284 566.936] /A << /S /GoTo /D (table.18) >> >> -% 1423 0 obj +% 1424 0 obj << /Type /Annot /Subtype /Link @@ -17455,7 +17464,7 @@ stream /Rect [459.716 325.46 466.79 339.127] /A << /S /GoTo /D (figure.4) >> >> -% 1424 0 obj +% 1425 0 obj << /Type /Annot /Subtype /Link @@ -17463,67 +17472,67 @@ stream /Rect [357.03 301.825 364.103 313.885] /A << /S /GoTo /D (figure.3) >> >> -% 1428 0 obj -<< -/D [1426 0 R /XYZ 149.705 753.953 null] ->> % 1429 0 obj << -/D [1426 0 R /XYZ 150.705 464.818 null] +/D [1427 0 R /XYZ 149.705 753.953 null] >> % 1430 0 obj << -/D [1426 0 R /XYZ 150.705 430.343 null] +/D [1427 0 R /XYZ 150.705 464.818 null] >> % 1431 0 obj << -/D [1426 0 R /XYZ 150.705 386.508 null] +/D [1427 0 R /XYZ 150.705 430.343 null] >> -% 1425 0 obj +% 1432 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F145 940 0 R >> +/D [1427 0 R /XYZ 150.705 386.508 null] +>> +% 1426 0 obj +<< +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1434 0 obj +% 1435 0 obj << /Type /Page -/Contents 1435 0 R -/Resources 1433 0 R +/Contents 1436 0 R +/Resources 1434 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1400 0 R +/Parent 1401 0 R >> -% 1436 0 obj +% 1437 0 obj << -/D [1434 0 R /XYZ 98.895 753.953 null] +/D [1435 0 R /XYZ 98.895 753.953 null] >> -% 1433 0 obj +% 1434 0 obj << /Font << /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1438 0 obj +% 1439 0 obj << /Type /Page -/Contents 1439 0 R -/Resources 1437 0 R +/Contents 1440 0 R +/Resources 1438 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1400 0 R +/Parent 1401 0 R >> -% 1441 0 obj +% 1442 0 obj << /Producer (GPL Ghostscript 9.22) /CreationDate (D:20180323100658Z00'00') /ModDate (D:20180323100658Z00'00') >> -% 1442 0 obj +% 1443 0 obj << /Type /ExtGState /OPM 1 >> -% 1443 0 obj +% 1444 0 obj << /BaseFont /XYUGDR+Times-Roman -/FontDescriptor 1445 0 R +/FontDescriptor 1446 0 R /Type /Font /FirstChar 48 /LastChar 57 @@ -17531,10 +17540,10 @@ stream /Encoding /WinAnsiEncoding /Subtype /Type1 >> -% 1444 0 obj +% 1445 0 obj << /BaseFont /XISTAL+Times-Bold -/FontDescriptor 1446 0 R +/FontDescriptor 1447 0 R /Type /Font /FirstChar 48 /LastChar 80 @@ -17542,7 +17551,7 @@ stream /Encoding /WinAnsiEncoding /Subtype /Type1 >> -% 1445 0 obj +% 1446 0 obj << /Type /FontDescriptor /FontName /XYUGDR+Times-Roman @@ -17555,9 +17564,9 @@ stream /StemV 71 /MissingWidth 250 /CharSet (/eight/five/four/nine/one/seven/six/three/two/zero) -/FontFile3 1447 0 R +/FontFile3 1448 0 R >> -% 1446 0 obj +% 1447 0 obj << /Type /FontDescriptor /FontName /XISTAL+Times-Bold @@ -17570,32 +17579,32 @@ stream /StemV 90 /MissingWidth 250 /CharSet (/P/one/zero) -/FontFile3 1448 0 R +/FontFile3 1449 0 R >> -% 1440 0 obj +% 1441 0 obj << -/D [1438 0 R /XYZ 149.705 753.953 null] +/D [1439 0 R /XYZ 149.705 753.953 null] >> -% 1432 0 obj +% 1433 0 obj << -/D [1438 0 R /XYZ 150.705 282.918 null] +/D [1439 0 R /XYZ 150.705 282.918 null] >> -% 1437 0 obj +% 1438 0 obj << /Font << /F84 687 0 R >> -/XObject << /Im5 1422 0 R >> +/XObject << /Im5 1423 0 R >> /ProcSet [ /PDF /Text ] >> -% 1453 0 obj +% 1454 0 obj << /Type /Page -/Contents 1454 0 R -/Resources 1452 0 R +/Contents 1455 0 R +/Resources 1453 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1457 0 R -/Annots [ 1449 0 R 1450 0 R 1451 0 R ] +/Parent 1458 0 R +/Annots [ 1450 0 R 1451 0 R 1452 0 R ] >> -% 1449 0 obj +% 1450 0 obj << /Type /Annot /Subtype /Link @@ -17603,7 +17612,7 @@ stream /Rect [368.549 298.8 444.603 310.86] /A << /S /GoTo /D (vdata) >> >> -% 1450 0 obj +% 1451 0 obj << /Type /Annot /Subtype /Link @@ -17611,7 +17620,7 @@ stream /Rect [204.522 289.495 216.477 298.905] /A << /S /GoTo /D (table.19) >> >> -% 1451 0 obj +% 1452 0 obj << /Type /Annot /Subtype /Link @@ -17619,50 +17628,50 @@ stream /Rect [291.943 218.115 359.001 230.175] /A << /S /GoTo /D (descdata) >> >> -% 1455 0 obj +% 1456 0 obj << -/D [1453 0 R /XYZ 98.895 753.953 null] +/D [1454 0 R /XYZ 98.895 753.953 null] >> % 304 0 obj << -/D [1453 0 R /XYZ 99.895 716.092 null] +/D [1454 0 R /XYZ 99.895 716.092 null] >> -% 1456 0 obj +% 1457 0 obj << -/D [1453 0 R /XYZ 99.895 460.417 null] +/D [1454 0 R /XYZ 99.895 460.417 null] >> -% 1452 0 obj +% 1453 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F192 942 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F197 943 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1459 0 obj +% 1460 0 obj << /Type /Page -/Contents 1460 0 R -/Resources 1458 0 R +/Contents 1461 0 R +/Resources 1459 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1457 0 R +/Parent 1458 0 R >> -% 1461 0 obj +% 1462 0 obj << -/D [1459 0 R /XYZ 149.705 753.953 null] +/D [1460 0 R /XYZ 149.705 753.953 null] >> -% 1458 0 obj +% 1459 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1465 0 obj +% 1466 0 obj << /Type /Page -/Contents 1466 0 R -/Resources 1464 0 R +/Contents 1467 0 R +/Resources 1465 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1457 0 R -/Annots [ 1462 0 R ] +/Parent 1458 0 R +/Annots [ 1463 0 R ] >> -% 1462 0 obj +% 1463 0 obj << /Type /Annot /Subtype /Link @@ -17670,33 +17679,33 @@ stream /Rect [291.943 211.064 359.001 223.124] /A << /S /GoTo /D (descdata) >> >> -% 1467 0 obj +% 1468 0 obj << -/D [1465 0 R /XYZ 98.895 753.953 null] +/D [1466 0 R /XYZ 98.895 753.953 null] >> % 308 0 obj << -/D [1465 0 R /XYZ 99.895 716.092 null] +/D [1466 0 R /XYZ 99.895 716.092 null] >> -% 1468 0 obj +% 1469 0 obj << -/D [1465 0 R /XYZ 99.895 449.977 null] +/D [1466 0 R /XYZ 99.895 449.977 null] >> -% 1464 0 obj +% 1465 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F192 942 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F197 943 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1472 0 obj +% 1473 0 obj << /Type /Page -/Contents 1473 0 R -/Resources 1471 0 R +/Contents 1474 0 R +/Resources 1472 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1457 0 R -/Annots [ 1463 0 R 1469 0 R 1470 0 R ] +/Parent 1458 0 R +/Annots [ 1464 0 R 1470 0 R 1471 0 R ] >> -% 1463 0 obj +% 1464 0 obj << /Type /Annot /Subtype /Link @@ -17704,7 +17713,7 @@ stream /Rect [338.319 642.547 414.374 654.607] /A << /S /GoTo /D (vdata) >> >> -% 1469 0 obj +% 1470 0 obj << /Type /Annot /Subtype /Link @@ -17712,7 +17721,7 @@ stream /Rect [174.615 542.921 250.669 554.981] /A << /S /GoTo /D (vdata) >> >> -% 1470 0 obj +% 1471 0 obj << /Type /Annot /Subtype /Link @@ -17720,50 +17729,50 @@ stream /Rect [472.325 542.921 484.28 554.981] /A << /S /GoTo /D (table.20) >> >> -% 1474 0 obj +% 1475 0 obj << -/D [1472 0 R /XYZ 149.705 753.953 null] +/D [1473 0 R /XYZ 149.705 753.953 null] >> -% 1471 0 obj +% 1472 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1476 0 obj +% 1477 0 obj << /Type /Page -/Contents 1477 0 R -/Resources 1475 0 R +/Contents 1478 0 R +/Resources 1476 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1457 0 R +/Parent 1458 0 R >> -% 1478 0 obj +% 1479 0 obj << -/D [1476 0 R /XYZ 98.895 753.953 null] +/D [1477 0 R /XYZ 98.895 753.953 null] >> % 312 0 obj << -/D [1476 0 R /XYZ 99.895 716.092 null] +/D [1477 0 R /XYZ 99.895 716.092 null] >> % 316 0 obj << -/D [1476 0 R /XYZ 99.895 691.48 null] +/D [1477 0 R /XYZ 99.895 691.48 null] >> -% 1475 0 obj +% 1476 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1481 0 obj +% 1482 0 obj << /Type /Page -/Contents 1482 0 R -/Resources 1480 0 R +/Contents 1483 0 R +/Resources 1481 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1457 0 R -/Annots [ 1479 0 R ] +/Parent 1458 0 R +/Annots [ 1480 0 R ] >> -% 1479 0 obj +% 1480 0 obj << /Type /Annot /Subtype /Link @@ -17771,29 +17780,29 @@ stream /Rect [342.753 324.687 409.811 336.746] /A << /S /GoTo /D (descdata) >> >> -% 1483 0 obj +% 1484 0 obj << -/D [1481 0 R /XYZ 149.705 753.953 null] +/D [1482 0 R /XYZ 149.705 753.953 null] >> -% 1484 0 obj +% 1485 0 obj << -/D [1481 0 R /XYZ 150.705 234.157 null] +/D [1482 0 R /XYZ 150.705 234.157 null] >> -% 1480 0 obj +% 1481 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F78 686 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1487 0 obj +% 1488 0 obj << /Type /Page -/Contents 1488 0 R -/Resources 1486 0 R +/Contents 1489 0 R +/Resources 1487 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1492 0 R -/Annots [ 1485 0 R ] +/Parent 1493 0 R +/Annots [ 1486 0 R ] >> -% 1485 0 obj +% 1486 0 obj << /Type /Annot /Subtype /Link @@ -17801,51 +17810,51 @@ stream /Rect [354.489 215.702 376.407 227.166] /A << /S /GoTo /D (subsubsection.2.3.1) >> >> -% 1489 0 obj +% 1490 0 obj << -/D [1487 0 R /XYZ 98.895 753.953 null] +/D [1488 0 R /XYZ 98.895 753.953 null] >> -% 1491 0 obj +% 1492 0 obj << -/D [1487 0 R /XYZ 99.895 133.283 null] +/D [1488 0 R /XYZ 99.895 133.283 null] >> -% 1486 0 obj +% 1487 0 obj << -/Font << /F145 940 0 R /F84 687 0 R /F75 685 0 R /F190 941 0 R /F78 686 0 R /F192 942 0 R /F148 1490 0 R >> +/Font << /F147 941 0 R /F84 687 0 R /F75 685 0 R /F195 942 0 R /F78 686 0 R /F197 943 0 R /F152 1491 0 R >> /ProcSet [ /PDF /Text ] >> -% 1494 0 obj +% 1495 0 obj << /Type /Page -/Contents 1495 0 R -/Resources 1493 0 R +/Contents 1496 0 R +/Resources 1494 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1492 0 R ->> -% 1496 0 obj -<< -/D [1494 0 R /XYZ 149.705 753.953 null] +/Parent 1493 0 R >> % 1497 0 obj << -/D [1494 0 R /XYZ 150.705 716.092 null] +/D [1495 0 R /XYZ 149.705 753.953 null] >> % 1498 0 obj << -/D [1494 0 R /XYZ 150.705 687.379 null] +/D [1495 0 R /XYZ 150.705 716.092 null] >> % 1499 0 obj << -/D [1494 0 R /XYZ 150.705 667.454 null] +/D [1495 0 R /XYZ 150.705 687.379 null] >> % 1500 0 obj << -/D [1494 0 R /XYZ 150.705 626.268 null] +/D [1495 0 R /XYZ 150.705 667.454 null] +>> +% 1501 0 obj +<< +/D [1495 0 R /XYZ 150.705 626.268 null] >> endstream endobj -1506 0 obj +1507 0 obj << /Length 7189 >> @@ -17863,7 +17872,7 @@ BT /F75 11.9552 Tf 151.016 706.129 Td [(cdins)-250(\227)-250(Communication)-250(descriptor)-250(insert)-250(routine)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -51.121 -18.964 Td [(call)-525(psb_cdins\050nz,)-525(ia,)-525(ja,)-525(desc_a,)-525(info)-525([,ila,jla]\051)]TJ 0 -11.955 Td [(call)-525(psb_cdins\050nz,ja,desc,info[,jla,mask,lidx]\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 114.839 654.844 Tm [(This)-292(subr)18(outine)-292(examine)1(s)-292(the)-292(edges)-291(of)-292(the)-291(graph)-292(associated)-292(with)-291(the)-292(dis-)]TJ 1.02 0 0 1 99.895 642.889 Tm [(cr)18(etization)-343(mesh)-343(\050and)-343(isomorphic)-342(to)-343(the)-343(sparsity)-343(pattern)-342(of)-343(a)-343(linear)-343(system)]TJ 0.98 0 0 1 99.895 630.934 Tm [(coef)18(\002cient)-226(matrix\051,)-232(storing)-226(them)-226(as)-227(necessary)-226(into)-226(the)-226(communication)-226(descriptor)75(.)]TJ 0.98 0 0 1 99.895 618.979 Tm [(In)-225(the)-225(\002rst)-225(form)-225(the)-226(edge)1(s)-226(ar)19(e)-225(speci\002ed)-225(as)-226(pairs)-225(of)-225(indices)]TJ/F78 9.9626 Tf 1 0 0 1 346.727 618.979 Tm [(i)-47(a)]TJ/F192 10.3811 Tf 7.91 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 366.079 618.979 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 370.653 618.979 Tm [(j)-40(a)]TJ/F192 10.3811 Tf 7.841 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 389.936 618.979 Tm [(;)-235(the)-225(starting)]TJ 1.02 0 0 1 99.895 607.023 Tm [(index)]TJ/F78 9.9626 Tf 1 0 0 1 127.77 607.023 Tm [(i)-47(a)]TJ/F192 10.3811 Tf 7.91 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 149.752 607.023 Tm [(should)-259(belong)-258(to)-259(the)-259(curr)18(ent)-259(pr)18(ocess.)-345(In)-259(the)-258(second)-259(form)-259(only)-258(the)]TJ 1 0 0 1 99.895 595.068 Tm [(r)18(emote)-250(indices)]TJ/F78 9.9626 Tf 67.342 0 Td [(j)-40(a)]TJ/F192 10.3811 Tf 7.84 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 6.64 0 Td [(ar)18(e)-250(speci\002ed.)]TJ +/F147 9.9626 Tf -51.121 -18.964 Td [(call)-525(psb_cdins\050nz,)-525(ia,)-525(ja,)-525(desc_a,)-525(info)-525([,ila,jla]\051)]TJ 0 -11.955 Td [(call)-525(psb_cdins\050nz,ja,desc,info[,jla,mask,lidx]\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 114.839 654.844 Tm [(This)-292(subr)18(outine)-292(examine)1(s)-292(the)-292(edges)-291(of)-292(the)-291(graph)-292(associated)-292(with)-291(the)-292(dis-)]TJ 1.02 0 0 1 99.895 642.889 Tm [(cr)18(etization)-343(mesh)-343(\050and)-343(isomorphic)-342(to)-343(the)-343(sparsity)-343(pattern)-342(of)-343(a)-343(linear)-343(system)]TJ 0.98 0 0 1 99.895 630.934 Tm [(coef)18(\002cient)-226(matrix\051,)-232(storing)-226(them)-226(as)-227(necessary)-226(into)-226(the)-226(communication)-226(descriptor)75(.)]TJ 0.98 0 0 1 99.895 618.979 Tm [(In)-225(the)-225(\002rst)-225(form)-225(the)-226(edge)1(s)-226(ar)19(e)-225(speci\002ed)-225(as)-226(pairs)-225(of)-225(indices)]TJ/F78 9.9626 Tf 1 0 0 1 346.727 618.979 Tm [(i)-47(a)]TJ/F197 10.3811 Tf 7.91 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 366.079 618.979 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 370.653 618.979 Tm [(j)-40(a)]TJ/F197 10.3811 Tf 7.841 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 389.936 618.979 Tm [(;)-235(the)-225(starting)]TJ 1.02 0 0 1 99.895 607.023 Tm [(index)]TJ/F78 9.9626 Tf 1 0 0 1 127.77 607.023 Tm [(i)-47(a)]TJ/F197 10.3811 Tf 7.91 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 149.752 607.023 Tm [(should)-259(belong)-258(to)-259(the)-259(curr)18(ent)-259(pr)18(ocess.)-345(In)-259(the)-258(second)-259(form)-259(only)-258(the)]TJ 1 0 0 1 99.895 595.068 Tm [(r)18(emote)-250(indices)]TJ/F78 9.9626 Tf 67.342 0 Td [(j)-40(a)]TJ/F197 10.3811 Tf 7.84 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 6.64 0 Td [(ar)18(e)-250(speci\002ed.)]TJ 0 g 0 G /F75 9.9626 Tf -89.115 -20.366 Td [(T)90(ype:)]TJ 0 g 0 G @@ -17886,11 +17895,11 @@ BT 0 g 0 G /F75 9.9626 Tf -207.221 -19.304 Td [(mask)]TJ 0 g 0 G -/F84 9.9626 Tf 29.33 0 Td [(Mask)-250(entries)-250(in)]TJ/F145 9.9626 Tf 69.983 0 Td [(ja)]TJ/F84 9.9626 Tf 10.461 0 Td [(,)-250(they)-250(ar)18(e)-250(inserted)-249(only)-250(when)-250(the)-250(corr)18(esponding)]TJ/F145 9.9626 Tf 213.278 0 Td [(mask)]TJ/F84 9.9626 Tf -298.145 -11.955 Td [(entries)-250(ar)18(e)]TJ/F145 9.9626 Tf 48.139 0 Td [(.true.)]TJ/F84 9.9626 Tf -48.139 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(array)-250(of)-250(length)]TJ/F78 9.9626 Tf 164.297 0 Td [(n)-25(z)]TJ/F84 9.9626 Tf 10.336 0 Td [(,)-250(default)]TJ/F145 9.9626 Tf 38.784 0 Td [(.true.)]TJ/F84 9.9626 Tf 31.382 0 Td [(.)]TJ +/F84 9.9626 Tf 29.33 0 Td [(Mask)-250(entries)-250(in)]TJ/F147 9.9626 Tf 69.983 0 Td [(ja)]TJ/F84 9.9626 Tf 10.461 0 Td [(,)-250(they)-250(ar)18(e)-250(inserted)-249(only)-250(when)-250(the)-250(corr)18(esponding)]TJ/F147 9.9626 Tf 213.278 0 Td [(mask)]TJ/F84 9.9626 Tf -298.145 -11.955 Td [(entries)-250(ar)18(e)]TJ/F147 9.9626 Tf 48.139 0 Td [(.true.)]TJ/F84 9.9626 Tf -48.139 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(array)-250(of)-250(length)]TJ/F78 9.9626 Tf 164.297 0 Td [(n)-25(z)]TJ/F84 9.9626 Tf 10.336 0 Td [(,)-250(default)]TJ/F147 9.9626 Tf 38.784 0 Td [(.true.)]TJ/F84 9.9626 Tf 31.382 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -269.706 -19.305 Td [(lidx)]TJ 0 g 0 G -/F84 9.9626 Tf 22.685 0 Td [(User)-250(de\002ned)-250(local)-250(indices)-250(for)]TJ/F145 9.9626 Tf 131.117 0 Td [(ja)]TJ/F84 9.9626 Tf 10.461 0 Td [(.)]TJ -139.356 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)-250(of)-250(length)]TJ/F78 9.9626 Tf 171.978 0 Td [(n)-25(z)]TJ/F84 9.9626 Tf 10.336 0 Td [(.)]TJ +/F84 9.9626 Tf 22.685 0 Td [(User)-250(de\002ned)-250(local)-250(indices)-250(for)]TJ/F147 9.9626 Tf 131.117 0 Td [(ja)]TJ/F84 9.9626 Tf 10.461 0 Td [(.)]TJ -139.356 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)-250(of)-250(length)]TJ/F78 9.9626 Tf 171.978 0 Td [(n)-25(z)]TJ/F84 9.9626 Tf 10.336 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -207.221 -20.366 Td [(On)-250(Return)]TJ 0 g 0 G @@ -17906,21 +17915,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(updated)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 120.525 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 120.326 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 120.326 Td [(desc)]TJ ET q 1 0 0 1 333.945 120.525 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 120.326 Td [(type)]TJ +/F147 9.9626 Tf 337.084 120.326 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -17930,7 +17939,7 @@ ET endstream endobj -1511 0 obj +1512 0 obj << /Length 3083 >> @@ -17973,7 +17982,7 @@ ET endstream endobj -1520 0 obj +1521 0 obj << /Length 6186 >> @@ -17991,7 +18000,7 @@ BT /F75 11.9552 Tf 151.016 706.129 Td [(cdasb)-250(\227)-250(Communication)-250(descriptor)-250(assembly)-250(routine)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -51.121 -18.964 Td [(call)-525(psb_cdasb\050desc_a,)-525(info)-525([,)-525(mold]\051)]TJ +/F147 9.9626 Tf -51.121 -18.964 Td [(call)-525(psb_cdasb\050desc_a,)-525(info)-525([,)-525(mold]\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -18011,55 +18020,55 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 577.576 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 577.576 Td [(desc)]TJ ET q 1 0 0 1 333.945 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 577.576 Td [(type)]TJ +/F147 9.9626 Tf 337.084 577.576 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -258.11 -19.925 Td [(mold)]TJ 0 g 0 G -/F84 9.9626 Tf 28.473 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(index)-250(storage.)]TJ -3.566 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 509.83 Tm [(Speci\002ed)-212(as:)-295(a)-212(object)-212(of)-212(type)-213(der)1(ived)-213(fr)19(om)-212(\050integer\051)]TJ/F145 9.9626 Tf 1 0 0 1 344.16 509.83 Tm [(psb)]TJ +/F84 9.9626 Tf 28.473 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(index)-250(storage.)]TJ -3.566 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 509.83 Tm [(Speci\002ed)-212(as:)-295(a)-212(object)-212(of)-212(type)-213(der)1(ived)-213(fr)19(om)-212(\050integer\051)]TJ/F147 9.9626 Tf 1 0 0 1 344.16 509.83 Tm [(psb)]TJ ET q 1 0 0 1 360.479 510.029 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.617 509.83 Td [(T)]TJ +/F147 9.9626 Tf 363.617 509.83 Td [(T)]TJ ET q 1 0 0 1 369.475 510.029 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 372.613 509.83 Td [(base)]TJ +/F147 9.9626 Tf 372.613 509.83 Td [(base)]TJ ET q 1 0 0 1 394.162 510.029 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 397.301 509.83 Td [(vect)]TJ +/F147 9.9626 Tf 397.301 509.83 Td [(vect)]TJ ET q 1 0 0 1 418.849 510.029 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 421.988 509.83 Td [(type)]TJ/F84 9.9626 Tf 0.98 0 0 1 442.909 509.83 Tm [(.)]TJ +/F147 9.9626 Tf 421.988 509.83 Td [(type)]TJ/F84 9.9626 Tf 0.98 0 0 1 442.909 509.83 Tm [(.)]TJ 0 g 0 G /F75 9.9626 Tf 1 0 0 1 99.895 487.912 Tm [(On)-250(Return)]TJ 0 g 0 G @@ -18075,21 +18084,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 420.366 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 420.166 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 420.166 Td [(desc)]TJ ET q 1 0 0 1 333.945 420.366 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 420.166 Td [(type)]TJ +/F147 9.9626 Tf 337.084 420.166 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -18099,7 +18108,7 @@ BT 0 g 0 G /F84 9.9626 Tf 12.454 -19.926 Td [(1.)]TJ 0 g 0 G - [-500(On)-250(exit)-250(fr)18(om)-250(this)-250(r)18(outine)-250(the)-250(descriptor)-250(is)-250(in)-250(the)-250(assembled)-250(state.)]TJ 1.017 0 0 1 99.587 290.652 Tm [(This)-246(call)-245(will)-246(set)-246(up)-245(all)-246(the)-246(necessary)-245(information)-246(for)-246(the)-246(halo)-245(data)-246(exchanges.)]TJ 1.02 0 0 1 99.895 278.697 Tm [(In)-289(doing)-290(so,)-300(the)-289(library)-289(will)-289(need)-290(to)-289(identify)-289(the)-289(set)-290(of)-289(pr)18(ocesses)-289(owning)-290(the)]TJ 1.02 0 0 1 99.895 266.742 Tm [(halo)-332(indices)-332(thr)18(ough)-332(the)-331(use)-332(of)-332(the)]TJ/F145 9.9626 Tf 1 0 0 1 263.448 266.742 Tm [(desc%fnd_owner\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 350.505 266.742 Tm [(method;)-375(the)-332(owning)]TJ 1.02 0 0 1 99.596 254.786 Tm [(pr)18(ocesses)-361(ar)18(e)-361(the)-361(topological)-360(neighbours)-361(of)-361(the)-361(calling)-360(pr)17(ocess.)-650(If)-361(the)-361(user)]TJ 1.007 0 0 1 99.895 242.831 Tm [(has)-249(some)-249(backgr)18(ound)-249(information)-249(on)-249(the)-249(pr)18(ocesses)-249(that)-249(ar)18(e)-249(neighbours)-249(of)-249(the)]TJ 0.989 0 0 1 99.895 230.876 Tm [(curr)18(ent)-253(one,)-253(it)-253(is)-253(possible)-253(to)-253(specify)-253(explicitly)-253(the)-253(list)-253(of)-253(adjacent)-253(pr)18(ocesses)-253(with)]TJ 1.003 0 0 1 99.895 218.921 Tm [(a)-249(call)-249(to)]TJ/F145 9.9626 Tf 1 0 0 1 136.323 218.921 Tm [(desc%set_p_adjcncy\050list\051)]TJ/F84 9.9626 Tf 1.003 0 0 1 261.851 218.921 Tm [(;)-249(this)-249(will)-249(speed)-250(up)-249(the)-249(subsequent)-249(call)-249(to)]TJ/F145 9.9626 Tf 1 0 0 1 99.895 206.966 Tm [(psb_cdasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(.)]TJ + [-500(On)-250(exit)-250(fr)18(om)-250(this)-250(r)18(outine)-250(the)-250(descriptor)-250(is)-250(in)-250(the)-250(assembled)-250(state.)]TJ 1.017 0 0 1 99.587 290.652 Tm [(This)-246(call)-245(will)-246(set)-246(up)-245(all)-246(the)-246(necessary)-245(information)-246(for)-246(the)-246(halo)-245(data)-246(exchanges.)]TJ 1.02 0 0 1 99.895 278.697 Tm [(In)-289(doing)-290(so,)-300(the)-289(library)-289(will)-289(need)-290(to)-289(identify)-289(the)-289(set)-290(of)-289(pr)18(ocesses)-289(owning)-290(the)]TJ 1.02 0 0 1 99.895 266.742 Tm [(halo)-332(indices)-332(thr)18(ough)-332(the)-331(use)-332(of)-332(the)]TJ/F147 9.9626 Tf 1 0 0 1 263.448 266.742 Tm [(desc%fnd_owner\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 350.505 266.742 Tm [(method;)-375(the)-332(owning)]TJ 1.02 0 0 1 99.596 254.786 Tm [(pr)18(ocesses)-361(ar)18(e)-361(the)-361(topological)-360(neighbours)-361(of)-361(the)-361(calling)-360(pr)17(ocess.)-650(If)-361(the)-361(user)]TJ 1.007 0 0 1 99.895 242.831 Tm [(has)-249(some)-249(backgr)18(ound)-249(information)-249(on)-249(the)-249(pr)18(ocesses)-249(that)-249(ar)18(e)-249(neighbours)-249(of)-249(the)]TJ 0.989 0 0 1 99.895 230.876 Tm [(curr)18(ent)-253(one,)-253(it)-253(is)-253(possible)-253(to)-253(specify)-253(explicitly)-253(the)-253(list)-253(of)-253(adjacent)-253(pr)18(ocesses)-253(with)]TJ 1.003 0 0 1 99.895 218.921 Tm [(a)-249(call)-249(to)]TJ/F147 9.9626 Tf 1 0 0 1 136.323 218.921 Tm [(desc%set_p_adjcncy\050list\051)]TJ/F84 9.9626 Tf 1.003 0 0 1 261.851 218.921 Tm [(;)-249(this)-249(will)-249(speed)-250(up)-249(the)-249(subsequent)-249(call)-249(to)]TJ/F147 9.9626 Tf 1 0 0 1 99.895 206.966 Tm [(psb_cdasb)]TJ/F84 9.9626 Tf 47.073 0 Td [(.)]TJ 0 g 0 G 119.802 -116.528 Td [(77)]TJ 0 g 0 G @@ -18107,7 +18116,7 @@ ET endstream endobj -1527 0 obj +1528 0 obj << /Length 3186 >> @@ -18125,7 +18134,7 @@ BT /F75 11.9552 Tf 201.825 706.129 Td [(cdcpy)-250(\227)-250(Copies)-250(a)-250(communication)-250(descriptor)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -51.12 -18.964 Td [(call)-525(psb_cdcpy\050desc_in,)-525(desc_out,)-525(info\051)]TJ +/F147 9.9626 Tf -51.12 -18.964 Td [(call)-525(psb_cdcpy\050desc_in,)-525(desc_out,)-525(info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -18145,21 +18154,21 @@ BT 0 g 0 G /F84 9.9626 Tf 14.386 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -12.982 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 577.576 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 577.576 Td [(desc)]TJ ET q 1 0 0 1 384.755 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 577.576 Td [(type)]TJ +/F147 9.9626 Tf 387.893 577.576 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -18177,21 +18186,21 @@ BT 0 g 0 G /F84 9.9626 Tf 19.925 0 Td [(the)-250(communication)-250(descriptor)-250(copy)111(.)]TJ -18.521 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.744 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.137 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.137 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 488.112 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 487.912 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 487.912 Td [(desc)]TJ ET q 1 0 0 1 384.755 488.112 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 487.912 Td [(type)]TJ +/F147 9.9626 Tf 387.893 487.912 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -18205,7 +18214,7 @@ ET endstream endobj -1532 0 obj +1533 0 obj << /Length 2169 >> @@ -18223,7 +18232,7 @@ BT /F75 11.9552 Tf 151.016 706.129 Td [(cdfree)-250(\227)-250(Frees)-250(a)-250(communication)-250(descriptor)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -51.121 -18.964 Td [(call)-525(psb_cdfree\050desc_a,)-525(info\051)]TJ +/F147 9.9626 Tf -51.121 -18.964 Td [(call)-525(psb_cdfree\050desc_a,)-525(info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -18243,21 +18252,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(communication)-250(descriptor)-250(to)-250(be)-250(fr)18(eed.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 577.576 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 577.576 Td [(desc)]TJ ET q 1 0 0 1 333.945 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 577.576 Td [(type)]TJ +/F147 9.9626 Tf 337.084 577.576 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -18274,7 +18283,7 @@ ET endstream endobj -1539 0 obj +1540 0 obj << /Length 5958 >> @@ -18292,7 +18301,7 @@ BT /F75 11.9552 Tf 0.984 0 0 1 201.506 706.129 Tm [(cdbldext)-253(\227)-253(Build)-253(an)-253(extended)-253(communication)-253(descrip-)]TJ 1 0 0 1 177.604 692.181 Tm [(tor)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -26.899 -19.693 Td [(call)-525(psb_cdbldext\050a,desc_a,nl,desc_out,)-525(info,)-525(extype\051)]TJ/F84 9.9626 Tf 0.982 0 0 1 165.649 649.066 Tm [(This)-254(subr)19(outine)-254(builds)-254(an)-254(extended)-253(communication)-254(descriptor)75(,)-254(b)1(ased)-254(on)-254(the)]TJ 1.019 0 0 1 150.705 637.111 Tm [(input)-244(descriptor)]TJ/F145 9.9626 Tf 1 0 0 1 225.863 637.111 Tm [(desc_a)]TJ/F84 9.9626 Tf 1.019 0 0 1 259.725 637.111 Tm [(and)-244(on)-244(the)-245(stencil)-244(speci\002ed)-244(thr)18(ough)-245(the)-244(input)-244(sparse)]TJ 1 0 0 1 150.705 625.156 Tm [(matrix)]TJ/F145 9.9626 Tf 31.491 0 Td [(a)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ +/F147 9.9626 Tf -26.899 -19.693 Td [(call)-525(psb_cdbldext\050a,desc_a,nl,desc_out,)-525(info,)-525(extype\051)]TJ/F84 9.9626 Tf 0.982 0 0 1 165.649 649.066 Tm [(This)-254(subr)19(outine)-254(builds)-254(an)-254(extended)-253(communication)-254(descriptor)75(,)-254(b)1(ased)-254(on)-254(the)]TJ 1.019 0 0 1 150.705 637.111 Tm [(input)-244(descriptor)]TJ/F147 9.9626 Tf 1 0 0 1 225.863 637.111 Tm [(desc_a)]TJ/F84 9.9626 Tf 1.019 0 0 1 259.725 637.111 Tm [(and)-244(on)-244(the)-245(stencil)-244(speci\002ed)-244(thr)18(ough)-245(the)-244(input)-244(sparse)]TJ 1 0 0 1 150.705 625.156 Tm [(matrix)]TJ/F147 9.9626 Tf 31.491 0 Td [(a)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -36.722 -21.054 Td [(T)90(ype:)]TJ 0 g 0 G @@ -18316,31 +18325,31 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 456.326 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 456.127 Td [(Tspmat)]TJ +/F147 9.9626 Tf 363.206 456.127 Td [(Tspmat)]TJ ET q 1 0 0 1 395.216 456.326 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 398.354 456.127 Td [(type)]TJ +/F147 9.9626 Tf 398.354 456.127 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -268.57 -21.43 Td [(nl)]TJ 0 g 0 G -/F84 9.9626 Tf 14.386 0 Td [(the)-250(number)-250(of)-250(additional)-250(layers)-250(desir)18(ed.)]TJ 10.52 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -57.434 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F78 9.9626 Tf 131.102 0 Td [(n)-25(l)]TJ/F190 10.3811 Tf 11.873 0 Td [(\025)]TJ/F84 9.9626 Tf 10.962 0 Td [(0.)]TJ +/F84 9.9626 Tf 14.386 0 Td [(the)-250(number)-250(of)-250(additional)-250(layers)-250(desir)18(ed.)]TJ 10.52 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -57.434 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F78 9.9626 Tf 131.102 0 Td [(n)-25(l)]TJ/F195 10.3811 Tf 11.873 0 Td [(\025)]TJ/F84 9.9626 Tf 10.962 0 Td [(0.)]TJ 0 g 0 G /F75 9.9626 Tf -178.843 -21.43 Td [(extype)]TJ 0 g 0 G -/F84 9.9626 Tf 34.869 0 Td [(the)-250(kind)-250(of)-250(estension)-250(r)18(equir)18(ed.)]TJ -9.963 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -57.434 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 40.678 0 Td [(.)]TJ -64.368 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 175.611 317.626 Tm [(Speci\002ed)-317(as:)-447(an)-317(i)1(nteger)-317(value)]TJ/F145 9.9626 Tf 1 0 0 1 313.312 317.626 Tm [(psb_ovt_xhal_)]TJ/F84 9.9626 Tf 1.02 0 0 1 381.307 317.626 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 387.247 317.626 Tm [(psb_ovt_asov_)]TJ/F84 9.9626 Tf 1.02 0 0 1 455.242 317.626 Tm [(,)-335(default:)]TJ/F145 9.9626 Tf 1 0 0 1 175.611 305.671 Tm [(psb_ovt_xhal_)]TJ +/F84 9.9626 Tf 34.869 0 Td [(the)-250(kind)-250(of)-250(estension)-250(r)18(equir)18(ed.)]TJ -9.963 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -57.434 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 40.678 0 Td [(.)]TJ -64.368 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 175.611 317.626 Tm [(Speci\002ed)-317(as:)-447(an)-317(i)1(nteger)-317(value)]TJ/F147 9.9626 Tf 1 0 0 1 313.312 317.626 Tm [(psb_ovt_xhal_)]TJ/F84 9.9626 Tf 1.02 0 0 1 381.307 317.626 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 387.247 317.626 Tm [(psb_ovt_asov_)]TJ/F84 9.9626 Tf 1.02 0 0 1 455.242 317.626 Tm [(,)-335(default:)]TJ/F147 9.9626 Tf 1 0 0 1 175.611 305.671 Tm [(psb_ovt_xhal_)]TJ 0 g 0 G /F75 9.9626 Tf -24.906 -23.422 Td [(On)-250(Return)]TJ 0 g 0 G @@ -18356,21 +18365,21 @@ BT 0 g 0 G /F84 9.9626 Tf 19.925 0 Td [(the)-250(extended)-250(communication)-250(descriptor)74(.)]TJ -18.521 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 213.198 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 212.998 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 212.998 Td [(desc)]TJ ET q 1 0 0 1 384.755 213.198 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 212.998 Td [(type)]TJ +/F147 9.9626 Tf 387.893 212.998 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -18384,7 +18393,7 @@ ET endstream endobj -1543 0 obj +1544 0 obj << /Length 1748 >> @@ -18395,11 +18404,11 @@ stream BT /F84 9.9626 Tf 112.349 706.129 Td [(1.)]TJ 0 g 0 G - 0.98 0 0 1 124.802 706.129 Tm [(Specifying)]TJ/F145 9.9626 Tf 1 0 0 1 172.776 706.129 Tm [(psb_ovt_xhal_)]TJ/F84 9.9626 Tf 0.98 0 0 1 243.267 706.129 Tm [(for)-256(the)]TJ/F145 9.9626 Tf 1 0 0 1 274.24 706.129 Tm [(extype)]TJ/F84 9.9626 Tf 0.98 0 0 1 308.119 706.129 Tm [(ar)18(gument)-255(the)-256(user)-256(will)-255(obtain)-256(a)]TJ 0.98 0 0 1 124.802 694.174 Tm [(descriptor)-209(for)-209(a)-209(domain)-209(partition)-209(in)-209(which)-209(the)-209(additional)-209(layers)-209(ar)18(e)-209(fetched)]TJ 1.02 0 0 1 124.802 682.219 Tm [(as)-244(part)-244(of)-244(an)-244(\050extended\051)-244(halo;)-244(however)-244(the)-244(index-to-pr)18(ocess)-244(mapping)-244(is)]TJ 1 0 0 1 124.802 670.263 Tm [(identical)-250(to)-250(that)-250(of)-250(the)-250(base)-250(descriptor;)]TJ + 0.98 0 0 1 124.802 706.129 Tm [(Specifying)]TJ/F147 9.9626 Tf 1 0 0 1 172.776 706.129 Tm [(psb_ovt_xhal_)]TJ/F84 9.9626 Tf 0.98 0 0 1 243.267 706.129 Tm [(for)-256(the)]TJ/F147 9.9626 Tf 1 0 0 1 274.24 706.129 Tm [(extype)]TJ/F84 9.9626 Tf 0.98 0 0 1 308.119 706.129 Tm [(ar)18(gument)-255(the)-256(user)-256(will)-255(obtain)-256(a)]TJ 0.98 0 0 1 124.802 694.174 Tm [(descriptor)-209(for)-209(a)-209(domain)-209(partition)-209(in)-209(which)-209(the)-209(additional)-209(layers)-209(ar)18(e)-209(fetched)]TJ 1.02 0 0 1 124.802 682.219 Tm [(as)-244(part)-244(of)-244(an)-244(\050extended\051)-244(halo;)-244(however)-244(the)-244(index-to-pr)18(ocess)-244(mapping)-244(is)]TJ 1 0 0 1 124.802 670.263 Tm [(identical)-250(to)-250(that)-250(of)-250(the)-250(base)-250(descriptor;)]TJ 0 g 0 G -12.453 -19.925 Td [(2.)]TJ 0 g 0 G - 1.018 0 0 1 124.802 650.338 Tm [(Specifying)]TJ/F145 9.9626 Tf 1 0 0 1 174.542 650.338 Tm [(psb_ovt_asov_)]TJ/F84 9.9626 Tf 1.018 0 0 1 245.035 650.338 Tm [(for)-246(the)]TJ/F145 9.9626 Tf 1 0 0 1 277.02 650.338 Tm [(extype)]TJ/F84 9.9626 Tf 1.018 0 0 1 310.901 650.338 Tm [(ar)18(gument)-247(the)-246(user)-246(will)-247(obtain)]TJ 1.02 0 0 1 124.802 638.383 Tm [(a)-267(descriptor)-267(with)-268(an)-267(overlapped)-267(decomposition:)-348(the)-267(additional)-267(layer)-268(is)]TJ 1.02 0 0 1 124.802 626.428 Tm [(aggr)18(egated)-278(to)-278(the)-278(local)-278(subdomain)-278(\050and)-278(thus)-278(is)-278(an)-278(overlap\051,)-286(and)-278(a)-278(new)]TJ 1 0 0 1 124.802 614.473 Tm [(halo)-250(extending)-250(beyond)-250(the)-250(last)-250(additional)-250(layer)-250(is)-250(formed.)]TJ + 1.018 0 0 1 124.802 650.338 Tm [(Specifying)]TJ/F147 9.9626 Tf 1 0 0 1 174.542 650.338 Tm [(psb_ovt_asov_)]TJ/F84 9.9626 Tf 1.018 0 0 1 245.035 650.338 Tm [(for)-246(the)]TJ/F147 9.9626 Tf 1 0 0 1 277.02 650.338 Tm [(extype)]TJ/F84 9.9626 Tf 1.018 0 0 1 310.901 650.338 Tm [(ar)18(gument)-247(the)-246(user)-246(will)-247(obtain)]TJ 1.02 0 0 1 124.802 638.383 Tm [(a)-267(descriptor)-267(with)-268(an)-267(overlapped)-267(decomposition:)-348(the)-267(additional)-267(layer)-268(is)]TJ 1.02 0 0 1 124.802 626.428 Tm [(aggr)18(egated)-278(to)-278(the)-278(local)-278(subdomain)-278(\050and)-278(thus)-278(is)-278(an)-278(overlap\051,)-286(and)-278(a)-278(new)]TJ 1 0 0 1 124.802 614.473 Tm [(halo)-250(extending)-250(beyond)-250(the)-250(last)-250(additional)-250(layer)-250(is)-250(formed.)]TJ 0 g 0 G 141.968 -524.035 Td [(81)]TJ 0 g 0 G @@ -18407,7 +18416,7 @@ ET endstream endobj -1551 0 obj +1552 0 obj << /Length 5951 >> @@ -18425,7 +18434,7 @@ BT /F75 11.9552 Tf 201.825 706.129 Td [(spall)-250(\227)-250(Allocates)-250(a)-250(sparse)-250(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -51.12 -19.277 Td [(call)-525(psb_spall\050a,)-525(desc_a,)-525(info)-525([,)-525(nnz,)-525(dupl,)-525(bldmode]\051)]TJ +/F147 9.9626 Tf -51.12 -19.277 Td [(call)-525(psb_spall\050a,)-525(desc_a,)-525(info)-525([,)-525(nnz,)-525(dupl,)-525(bldmode]\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -22.403 Td [(T)90(ype:)]TJ 0 g 0 G @@ -18445,21 +18454,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 575.684 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 575.485 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 575.485 Td [(desc)]TJ ET q 1 0 0 1 384.755 575.684 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 575.485 Td [(type)]TJ +/F147 9.9626 Tf 387.893 575.485 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -18469,11 +18478,11 @@ BT 0 g 0 G /F75 9.9626 Tf -24.906 -20.572 Td [(dupl)]TJ 0 g 0 G -/F84 9.9626 Tf 26.56 0 Td [(How)-250(to)-250(handle)-250(duplicate)-250(coef)18(\002cients.)]TJ -1.654 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ 1.006 0 0 1 175.611 426.745 Tm [(Speci\002ed)-248(as:)-308(integer)74(,)-248(possible)-248(values:)]TJ/F145 9.9626 Tf 1 0 0 1 341.716 426.745 Tm [(psb_dupl_ovwrt_)]TJ/F84 9.9626 Tf 1.006 0 0 1 420.171 426.745 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 425.161 426.745 Tm [(psb_dupl_add_)]TJ/F84 9.9626 Tf 1.006 0 0 1 493.156 426.745 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 175.611 414.79 Tm [(psb_dupl_err_)]TJ/F84 9.9626 Tf 67.995 0 Td [(.)]TJ +/F84 9.9626 Tf 26.56 0 Td [(How)-250(to)-250(handle)-250(duplicate)-250(coef)18(\002cients.)]TJ -1.654 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ 1.006 0 0 1 175.611 426.745 Tm [(Speci\002ed)-248(as:)-308(integer)74(,)-248(possible)-248(values:)]TJ/F147 9.9626 Tf 1 0 0 1 341.716 426.745 Tm [(psb_dupl_ovwrt_)]TJ/F84 9.9626 Tf 1.006 0 0 1 420.171 426.745 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 425.161 426.745 Tm [(psb_dupl_add_)]TJ/F84 9.9626 Tf 1.006 0 0 1 493.156 426.745 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 175.611 414.79 Tm [(psb_dupl_err_)]TJ/F84 9.9626 Tf 67.995 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -92.901 -20.572 Td [(bldmode)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 196.144 394.218 Tm [(Whether)-327(to)-327(keep)-327(track)-327(of)-327(matrix)-327(entries)-327(that)-327(do)-327(not)-327(belong)-327(to)-327(the)]TJ 1 0 0 1 175.611 382.263 Tm [(curr)18(ent)-250(pr)18(ocess.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ 0.98 0 0 1 175.611 334.443 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)-194(value)]TJ/F145 9.9626 Tf 1 0 0 1 301.54 334.443 Tm [(psb_matbld_noremote_)]TJ/F84 9.9626 Tf 0.98 0 0 1 406.147 334.443 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 410.601 334.443 Tm [(psb_matbld_remote_)]TJ/F84 9.9626 Tf 0.98 0 0 1 504.747 334.443 Tm [(.)]TJ 1 0 0 1 175.611 322.487 Tm [(Default:)]TJ/F145 9.9626 Tf 38.516 0 Td [(psb_matbld_noremote_)]TJ/F84 9.9626 Tf 104.606 0 Td [(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 196.144 394.218 Tm [(Whether)-327(to)-327(keep)-327(track)-327(of)-327(matrix)-327(entries)-327(that)-327(do)-327(not)-327(belong)-327(to)-327(the)]TJ 1 0 0 1 175.611 382.263 Tm [(curr)18(ent)-250(pr)18(ocess.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ 0.98 0 0 1 175.611 334.443 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)-194(value)]TJ/F147 9.9626 Tf 1 0 0 1 301.54 334.443 Tm [(psb_matbld_noremote_)]TJ/F84 9.9626 Tf 0.98 0 0 1 406.147 334.443 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 410.601 334.443 Tm [(psb_matbld_remote_)]TJ/F84 9.9626 Tf 0.98 0 0 1 504.747 334.443 Tm [(.)]TJ 1 0 0 1 175.611 322.487 Tm [(Default:)]TJ/F147 9.9626 Tf 38.516 0 Td [(psb_matbld_noremote_)]TJ/F84 9.9626 Tf 104.606 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -168.028 -22.402 Td [(On)-250(Return)]TJ 0 g 0 G @@ -18482,21 +18491,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(the)-250(matrix)-250(to)-250(be)-250(allocated.)]TJ 14.944 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf -28.652 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf -23.691 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.745 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 231.892 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 231.692 Td [(Tspmat)]TJ +/F147 9.9626 Tf 363.206 231.692 Td [(Tspmat)]TJ ET q 1 0 0 1 395.216 231.892 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 398.354 231.692 Td [(type)]TJ +/F147 9.9626 Tf 398.354 231.692 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -18514,9 +18523,9 @@ ET endstream endobj -1556 0 obj +1557 0 obj << -/Length 1305 +/Length 1255 >> stream 0 g 0 G @@ -18529,19 +18538,19 @@ BT 0 g 0 G 0 -19.925 Td [(3.)]TJ 0 g 0 G - 0.993 0 0 1 124.802 686.204 Tm [(Pr)18(oviding)-250(a)-251(good)-251(estimate)-250(for)-251(the)-251(number)-250(of)-251(nonzer)18(oes)]TJ/F78 9.9626 Tf 1 0 0 1 369.235 686.204 Tm [(n)-25(n)-25(z)]TJ/F84 9.9626 Tf 0.993 0 0 1 387.839 686.204 Tm [(in)-251(the)-250(assem-)]TJ 1.014 0 0 1 124.802 674.248 Tm [(bled)-245(matrix)-246(may)-245(substantially)-245(impr)17(ove)-245(performance)-245(in)-246(the)-245(matrix)-245(build)]TJ 1.02 0 0 1 124.503 662.293 Tm [(phase,)-315(as)-302(it)-301(will)-301(r)18(educe)-302(or)-301(eliminate)-301(the)-301(need)-302(for)-301(\050potentially)-301(multiple\051)]TJ 1 0 0 1 124.802 650.338 Tm [(data)-250(r)18(eallocations;)]TJ + 0.993 0 0 1 124.802 686.204 Tm [(Pr)18(oviding)-250(a)-251(good)-251(estimate)-250(for)-251(the)-251(number)-250(of)-251(nonzer)18(oes)]TJ/F78 9.9626 Tf 1 0 0 1 369.235 686.204 Tm [(n)-25(n)-25(z)]TJ/F84 9.9626 Tf 0.993 0 0 1 387.839 686.204 Tm [(in)-251(the)-250(assem-)]TJ 0.98 0 0 1 124.802 674.248 Tm [(bled)-240(matrix)-241(may)-240(impr)18(ove)-240(performance)-240(in)-240(the)-241(matrix)-240(build)-240(phase,)-244(as)-240(it)-240(will)]TJ 1 0 0 1 124.802 662.293 Tm [(r)18(educe)-250(or)-250(eliminate)-250(the)-250(need)-250(for)-250(\050potentially)-250(multiple\051)-250(data)-250(r)18(eallocations;)]TJ 0 g 0 G -12.453 -19.925 Td [(4.)]TJ 0 g 0 G - 1.02 0 0 1 124.802 630.413 Tm [(Using)]TJ/F145 9.9626 Tf 1 0 0 1 154.449 630.413 Tm [(psb_matbld_remote_)]TJ/F84 9.9626 Tf 1.02 0 0 1 251.507 630.413 Tm [(is)-287(likely)-286(to)-287(cause)-286(a)-287(r)8(untime)-286(over)17(head)-286(at)-287(as-)]TJ 1 0 0 1 124.802 618.458 Tm [(sembly)-250(time;)]TJ + 1.02 0 0 1 124.802 642.368 Tm [(Using)]TJ/F147 9.9626 Tf 1 0 0 1 154.449 642.368 Tm [(psb_matbld_remote_)]TJ/F84 9.9626 Tf 1.02 0 0 1 251.507 642.368 Tm [(is)-287(likely)-286(to)-287(cause)-286(a)-287(r)8(untime)-286(over)17(head)-286(at)-287(as-)]TJ 1 0 0 1 124.802 630.413 Tm [(sembly)-250(time;)]TJ 0 g 0 G - 141.968 -528.02 Td [(83)]TJ + 141.968 -539.975 Td [(83)]TJ 0 g 0 G ET endstream endobj -1564 0 obj +1565 0 obj << /Length 5490 >> @@ -18559,7 +18568,7 @@ BT /F75 11.9552 Tf 0.994 0 0 1 201.706 706.129 Tm [(spins)-251(\227)-252(Insert)-251(a)-252(set)-251(of)-251(coef)18(\002cients)-252(into)-251(a)-251(sparse)-252(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 1 0 0 1 150.705 685.756 Tm [(call)-525(psb_spins\050nz,)-525(ia,)-525(ja,)-525(val,)-525(a,)-525(desc_a,)-525(info)-525([,local]\051)]TJ 0 -11.956 Td [(call)-525(psb_spins\050nr,)-525(irw,)-525(irp,)-525(ja,)-525(val,)-525(a,)-525(desc_a,)-525(info)-525([,local]\051)]TJ +/F147 9.9626 Tf 1 0 0 1 150.705 685.756 Tm [(call)-525(psb_spins\050nz,)-525(ia,)-525(ja,)-525(val,)-525(a,)-525(desc_a,)-525(info)-525([,local]\051)]TJ 0 -11.956 Td [(call)-525(psb_spins\050nr,)-525(irw,)-525(irp,)-525(ja,)-525(val,)-525(a,)-525(desc_a,)-525(info)-525([,local]\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -24.099 Td [(T)90(ype:)]TJ 0 g 0 G @@ -18586,7 +18595,7 @@ BT 0 g 0 G /F75 9.9626 Tf -196.043 -22.834 Td [(irp)]TJ 0 g 0 G -/F84 9.9626 Tf 18.261 0 Td [(the)-250(r)18(ow)-250(pointers)-250(of)-250(the)-250(coef)18(\002cients)-250(to)-250(be)-250(inserted.)]TJ 6.646 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)-250(of)-250(size)]TJ/F78 9.9626 Tf 160.8 0 Td [(n)-15(r)]TJ/F192 10.3811 Tf 11.85 0 Td [(+)]TJ/F84 9.9626 Tf 10.131 0 Td [(1.)]TJ +/F84 9.9626 Tf 18.261 0 Td [(the)-250(r)18(ow)-250(pointers)-250(of)-250(the)-250(coef)18(\002cients)-250(to)-250(be)-250(inserted.)]TJ 6.646 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)-250(of)-250(size)]TJ/F78 9.9626 Tf 160.8 0 Td [(n)-15(r)]TJ/F197 10.3811 Tf 11.85 0 Td [(+)]TJ/F84 9.9626 Tf 10.131 0 Td [(1.)]TJ 0 g 0 G /F75 9.9626 Tf -207.688 -22.835 Td [(ja)]TJ 0 g 0 G @@ -18602,7 +18611,7 @@ ET endstream endobj -1570 0 obj +1571 0 obj << /Length 7379 >> @@ -18622,27 +18631,27 @@ BT 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(communication)-250(descriptor)74(.)]TJ -8.249 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(variable)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 136.327 0 Td [(psb)]TJ +/F147 9.9626 Tf 136.327 0 Td [(psb)]TJ ET q 1 0 0 1 277.448 658.507 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 280.586 658.308 Td [(desc)]TJ +/F147 9.9626 Tf 280.586 658.308 Td [(desc)]TJ ET q 1 0 0 1 302.135 658.507 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 305.273 658.308 Td [(type)]TJ +/F147 9.9626 Tf 305.273 658.308 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -226.3 -33.398 Td [(local)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 125.957 624.91 Tm [(Whether)-378(the)-378(entries)-378(in)-377(the)-378(indices)-378(vectors)]TJ/F145 9.9626 Tf 1 0 0 1 323.219 624.91 Tm [(ia)]TJ/F84 9.9626 Tf 1.02 0 0 1 333.679 624.91 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 340.397 624.91 Tm [(ja)]TJ/F84 9.9626 Tf 1.02 0 0 1 354.698 624.91 Tm [(ar)18(e)-378(alr)17(eady)-377(in)-378(local)]TJ 1 0 0 1 124.802 612.954 Tm [(numbering.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(value;)-250(default:)]TJ/F145 9.9626 Tf 162.678 0 Td [(.false.)]TJ/F84 9.9626 Tf 36.612 0 Td [(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 125.957 624.91 Tm [(Whether)-378(the)-378(entries)-378(in)-377(the)-378(indices)-378(vectors)]TJ/F147 9.9626 Tf 1 0 0 1 323.219 624.91 Tm [(ia)]TJ/F84 9.9626 Tf 1.02 0 0 1 333.679 624.91 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 340.397 624.91 Tm [(ja)]TJ/F84 9.9626 Tf 1.02 0 0 1 354.698 624.91 Tm [(ar)18(e)-378(alr)17(eady)-377(in)-378(local)]TJ 1 0 0 1 124.802 612.954 Tm [(numbering.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(value;)-250(default:)]TJ/F147 9.9626 Tf 162.678 0 Td [(.false.)]TJ/F84 9.9626 Tf 36.612 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -224.197 -23.056 Td [(On)-250(Return)]TJ 0 g 0 G @@ -18651,21 +18660,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(matrix)-250(into)-250(which)-250(coef)18(\002cients)-250(will)-250(be)-250(inserted.)]TJ 14.944 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf -28.652 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf -23.691 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 484.968 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 484.768 Td [(Tspmat)]TJ +/F147 9.9626 Tf 312.397 484.768 Td [(Tspmat)]TJ ET q 1 0 0 1 344.406 484.968 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 347.544 484.768 Td [(type)]TJ +/F147 9.9626 Tf 347.544 484.768 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -18680,21 +18689,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(communication)-250(descriptor)74(.)]TJ -8.249 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(variable)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 136.327 0 Td [(psb)]TJ +/F147 9.9626 Tf 136.327 0 Td [(psb)]TJ ET q 1 0 0 1 277.448 415.704 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 280.586 415.504 Td [(desc)]TJ +/F147 9.9626 Tf 280.586 415.504 Td [(desc)]TJ ET q 1 0 0 1 302.135 415.704 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 305.273 415.504 Td [(type)]TJ +/F147 9.9626 Tf 305.273 415.504 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -18712,7 +18721,7 @@ BT 0 g 0 G -12.453 -21.444 Td [(3.)]TJ 0 g 0 G - 1.006 0 0 1 124.802 222.988 Tm [(If)-249(the)-250(descriptor)-249(is)-250(in)-249(the)-250(build)-249(state,)-250(then)-249(the)-250(sparse)-249(matrix)-249(must)-250(also)-249(be)]TJ 0.98 0 0 1 124.802 211.033 Tm [(in)-256(the)-256(build)-256(state;)-256(the)-256(action)-256(of)-256(the)-256(r)18(outine)-256(is)-256(to)-256(\050implicitly\051)-256(call)]TJ/F145 9.9626 Tf 1 0 0 1 396.533 211.033 Tm [(psb_cdins)]TJ/F84 9.9626 Tf 1.005 0 0 1 124.802 199.078 Tm [(to)-248(add)-249(entries)-248(to)-249(the)-248(sparsity)-249(pattern;)-248(each)-249(sparse)-248(matrix)-248(entry)-249(implicitly)]TJ 1.02 0 0 1 124.802 187.123 Tm [(de\002nes)-377(a)-377(graph)-378(edge,)-410(that)-377(is)-377(passed)-377(to)-378(the)-377(descriptor)-377(r)18(outine)-377(for)-378(the)]TJ 1 0 0 1 124.802 175.168 Tm [(appr)18(opriate)-250(pr)18(ocessing;)]TJ + 1.006 0 0 1 124.802 222.988 Tm [(If)-249(the)-250(descriptor)-249(is)-250(in)-249(the)-250(build)-249(state,)-250(then)-249(the)-250(sparse)-249(matrix)-249(must)-250(also)-249(be)]TJ 0.98 0 0 1 124.802 211.033 Tm [(in)-256(the)-256(build)-256(state;)-256(the)-256(action)-256(of)-256(the)-256(r)18(outine)-256(is)-256(to)-256(\050implicitly\051)-256(call)]TJ/F147 9.9626 Tf 1 0 0 1 396.533 211.033 Tm [(psb_cdins)]TJ/F84 9.9626 Tf 1.005 0 0 1 124.802 199.078 Tm [(to)-248(add)-249(entries)-248(to)-249(the)-248(sparsity)-249(pattern;)-248(each)-249(sparse)-248(matrix)-248(entry)-249(implicitly)]TJ 1.02 0 0 1 124.802 187.123 Tm [(de\002nes)-377(a)-377(graph)-378(edge,)-410(that)-377(is)-377(passed)-377(to)-378(the)-377(descriptor)-377(r)18(outine)-377(for)-378(the)]TJ 1 0 0 1 124.802 175.168 Tm [(appr)18(opriate)-250(pr)18(ocessing;)]TJ 0 g 0 G -12.453 -21.444 Td [(4.)]TJ 0 g 0 G @@ -18720,7 +18729,7 @@ BT 0 g 0 G 0 -21.443 Td [(5.)]TJ 0 g 0 G - 1.02 0 0 1 124.802 132.281 Tm [(In)-268(COO)-268(format)-268(the)-268(coef)18(\002cients)-268(to)-268(be)-268(inserted)-268(ar)18(e)-268(r)17(epr)18(esented)-268(by)-268(the)-268(or)18(-)]TJ 0.985 0 0 1 124.802 120.326 Tm [(der)18(ed)-253(triples)]TJ/F78 9.9626 Tf 1 0 0 1 182.455 120.326 Tm [(i)-47(a)]TJ/F192 10.3811 Tf 7.91 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 0.985 0 0 1 201.807 120.326 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 206.394 120.326 Tm [(j)-40(a)]TJ/F192 10.3811 Tf 7.841 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 0.985 0 0 1 225.677 120.326 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 229.915 120.326 Tm [(v)-40(a)-25(l)]TJ/F192 10.3811 Tf 13.37 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 0.985 0 0 1 254.727 120.326 Tm [(,)-253(for)]TJ/F78 9.9626 Tf 1 0 0 1 274.702 120.326 Tm [(i)]TJ/F192 10.3811 Tf 5.856 0 Td [(=)]TJ/F84 9.9626 Tf 0.985 0 0 1 291.52 120.326 Tm [(1,)]TJ 1 0 0 1 300.664 120.326 Tm [(.)-192(.)-191(.)]TJ 0.985 0 0 1 313.74 120.326 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 317.978 120.326 Tm [(n)-25(z)]TJ/F84 9.9626 Tf 0.985 0 0 1 328.315 120.326 Tm [(;)-253(these)-253(triples)-253(ar)18(e)-253(arbitrary;)]TJ + 1.02 0 0 1 124.802 132.281 Tm [(In)-268(COO)-268(format)-268(the)-268(coef)18(\002cients)-268(to)-268(be)-268(inserted)-268(ar)18(e)-268(r)17(epr)18(esented)-268(by)-268(the)-268(or)18(-)]TJ 0.985 0 0 1 124.802 120.326 Tm [(der)18(ed)-253(triples)]TJ/F78 9.9626 Tf 1 0 0 1 182.455 120.326 Tm [(i)-47(a)]TJ/F197 10.3811 Tf 7.91 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 0.985 0 0 1 201.807 120.326 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 206.394 120.326 Tm [(j)-40(a)]TJ/F197 10.3811 Tf 7.841 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 0.985 0 0 1 225.677 120.326 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 229.915 120.326 Tm [(v)-40(a)-25(l)]TJ/F197 10.3811 Tf 13.37 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 0.985 0 0 1 254.727 120.326 Tm [(,)-253(for)]TJ/F78 9.9626 Tf 1 0 0 1 274.702 120.326 Tm [(i)]TJ/F197 10.3811 Tf 5.856 0 Td [(=)]TJ/F84 9.9626 Tf 0.985 0 0 1 291.52 120.326 Tm [(1,)]TJ 1 0 0 1 300.664 120.326 Tm [(.)-192(.)-191(.)]TJ 0.985 0 0 1 313.74 120.326 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 317.978 120.326 Tm [(n)-25(z)]TJ/F84 9.9626 Tf 0.985 0 0 1 328.315 120.326 Tm [(;)-253(these)-253(triples)-253(ar)18(e)-253(arbitrary;)]TJ 0 g 0 G 1 0 0 1 266.77 90.438 Tm [(85)]TJ 0 g 0 G @@ -18728,9 +18737,9 @@ ET endstream endobj -1580 0 obj +1581 0 obj << -/Length 5304 +/Length 5341 >> stream 0 g 0 G @@ -18739,7 +18748,7 @@ stream BT /F84 9.9626 Tf 163.158 706.129 Td [(6.)]TJ 0 g 0 G - 1.02 0 0 1 175.611 706.129 Tm [(In)-389(CSR)-388(format)-389(the)-388(coef)17(\002)1(cients)-389(to)-388(be)-389(inserted)-388(for)-389(each)-389(inpu)1(t)-389(r)18(ow)]TJ/F78 9.9626 Tf 1 0 0 1 477.666 706.129 Tm [(i)]TJ/F192 10.3811 Tf 8.556 0 Td [(=)]TJ/F84 9.9626 Tf 1.017 0 0 1 175.113 694.174 Tm [(1,)]TJ/F78 9.9626 Tf 1 0 0 1 184.497 694.174 Tm [(n)-15(r)]TJ/F84 9.9626 Tf 1.017 0 0 1 196.778 694.174 Tm [(ar)18(e)-246(r)17(epr)18(esented)-246(by)-246(the)-246(or)18(der)18(ed)-246(triples)]TJ/F192 10.3811 Tf 1 0 0 1 367.425 694.174 Tm [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 5.026 0 Td [(+)]TJ/F78 9.9626 Tf 10.186 0 Td [(i)-22(r)-35(w)]TJ/F190 10.3811 Tf 16.593 0 Td [(\000)]TJ/F84 9.9626 Tf 1.017 0 0 1 413.566 694.174 Tm [(1)]TJ/F192 10.3811 Tf 1 0 0 1 418.756 694.174 Tm [(\051)]TJ/F84 9.9626 Tf 1.017 0 0 1 422.906 694.174 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 427.572 694.174 Tm [(j)-40(a)]TJ/F192 10.3811 Tf 7.841 0 Td [(\050)]TJ/F78 9.9626 Tf 4.622 0 Td [(j)]TJ/F192 10.3811 Tf 3.019 0 Td [(\051)]TJ/F84 9.9626 Tf 1.017 0 0 1 447.203 694.174 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 451.521 694.174 Tm [(v)-40(a)-25(l)]TJ/F192 10.3811 Tf 13.37 0 Td [(\050)]TJ/F78 9.9626 Tf 4.623 0 Td [(j)]TJ/F192 10.3811 Tf 3.018 0 Td [(\051)]TJ/F84 9.9626 Tf 1.017 0 0 1 476.682 694.174 Tm [(,)-246(for)]TJ/F78 9.9626 Tf 1 0 0 1 176.085 682.219 Tm [(j)]TJ/F192 10.3811 Tf 6.885 0 Td [(=)]TJ/F78 9.9626 Tf 12.116 0 Td [(i)-22(r)-90(p)]TJ/F192 10.3811 Tf 12.991 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 219.519 682.219 Tm [(,)]TJ 1 0 0 1 223.844 682.219 Tm [(.)-192(.)-191(.)]TJ 1.02 0 0 1 236.92 682.219 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 241.175 682.219 Tm [(i)-22(r)-90(p)]TJ/F192 10.3811 Tf 12.991 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F192 10.3811 Tf 5.245 0 Td [(+)]TJ/F84 9.9626 Tf 1.02 0 0 1 273.967 682.219 Tm [(1)]TJ/F192 10.3811 Tf 1 0 0 1 279.173 682.219 Tm [(\051)]TJ/F190 10.3811 Tf 6.431 0 Td [(\000)]TJ/F84 9.9626 Tf 1.02 0 0 1 295.955 682.219 Tm [(1;)-333(these)-303(triples)-304(should)-303(belong)-304(to)-303(the)-304(curr)18(ent)]TJ 0.98 0 0 1 175.313 670.263 Tm [(pr)18(ocess,)-219(i.e.)]TJ/F78 9.9626 Tf 1 0 0 1 227.459 670.263 Tm [(i)]TJ/F192 10.3811 Tf 4.622 0 Td [(+)]TJ/F78 9.9626 Tf 9.782 0 Td [(i)-22(r)-35(w)]TJ/F190 10.3811 Tf 16.189 0 Td [(\000)]TJ/F84 9.9626 Tf 0.98 0 0 1 267.779 670.263 Tm [(1)-211(shou)1(ld)-211(be)-210(one)-211(of)-210(the)-211(local)-210(indices,)-220(but)-210(ar)18(e)-210(otherwise)]TJ 1 0 0 1 175.611 658.308 Tm [(arbitrary;)]TJ + 1.02 0 0 1 175.611 706.129 Tm [(In)-389(CSR)-388(format)-389(the)-388(coef)17(\002)1(cients)-389(to)-388(be)-389(inserted)-388(for)-389(each)-389(inpu)1(t)-389(r)18(ow)]TJ/F78 9.9626 Tf 1 0 0 1 477.666 706.129 Tm [(i)]TJ/F197 10.3811 Tf 8.556 0 Td [(=)]TJ/F84 9.9626 Tf 1.017 0 0 1 175.113 694.174 Tm [(1,)]TJ/F78 9.9626 Tf 1 0 0 1 184.497 694.174 Tm [(n)-15(r)]TJ/F84 9.9626 Tf 1.017 0 0 1 196.778 694.174 Tm [(ar)18(e)-246(r)17(epr)18(esented)-246(by)-246(the)-246(or)18(der)18(ed)-246(triples)]TJ/F197 10.3811 Tf 1 0 0 1 367.425 694.174 Tm [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 5.026 0 Td [(+)]TJ/F78 9.9626 Tf 10.186 0 Td [(i)-22(r)-35(w)]TJ/F195 10.3811 Tf 16.593 0 Td [(\000)]TJ/F84 9.9626 Tf 1.017 0 0 1 413.566 694.174 Tm [(1)]TJ/F197 10.3811 Tf 1 0 0 1 418.756 694.174 Tm [(\051)]TJ/F84 9.9626 Tf 1.017 0 0 1 422.906 694.174 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 427.572 694.174 Tm [(j)-40(a)]TJ/F197 10.3811 Tf 7.841 0 Td [(\050)]TJ/F78 9.9626 Tf 4.622 0 Td [(j)]TJ/F197 10.3811 Tf 3.019 0 Td [(\051)]TJ/F84 9.9626 Tf 1.017 0 0 1 447.203 694.174 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 451.521 694.174 Tm [(v)-40(a)-25(l)]TJ/F197 10.3811 Tf 13.37 0 Td [(\050)]TJ/F78 9.9626 Tf 4.623 0 Td [(j)]TJ/F197 10.3811 Tf 3.018 0 Td [(\051)]TJ/F84 9.9626 Tf 1.017 0 0 1 476.682 694.174 Tm [(,)-246(for)]TJ/F78 9.9626 Tf 1 0 0 1 176.085 682.219 Tm [(j)]TJ/F197 10.3811 Tf 6.885 0 Td [(=)]TJ/F78 9.9626 Tf 12.116 0 Td [(i)-22(r)-90(p)]TJ/F197 10.3811 Tf 12.991 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 219.519 682.219 Tm [(,)]TJ 1 0 0 1 223.844 682.219 Tm [(.)-192(.)-191(.)]TJ 1.02 0 0 1 236.92 682.219 Tm [(,)]TJ/F78 9.9626 Tf 1 0 0 1 241.175 682.219 Tm [(i)-22(r)-90(p)]TJ/F197 10.3811 Tf 12.991 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F197 10.3811 Tf 5.245 0 Td [(+)]TJ/F84 9.9626 Tf 1.02 0 0 1 273.967 682.219 Tm [(1)]TJ/F197 10.3811 Tf 1 0 0 1 279.173 682.219 Tm [(\051)]TJ/F195 10.3811 Tf 6.431 0 Td [(\000)]TJ/F84 9.9626 Tf 1.02 0 0 1 295.955 682.219 Tm [(1;)-333(these)-303(triples)-304(should)-303(belong)-304(to)-303(the)-304(curr)18(ent)]TJ 0.98 0 0 1 175.313 670.263 Tm [(pr)18(ocess,)-219(i.e.)]TJ/F78 9.9626 Tf 1 0 0 1 227.459 670.263 Tm [(i)]TJ/F197 10.3811 Tf 4.622 0 Td [(+)]TJ/F78 9.9626 Tf 9.782 0 Td [(i)-22(r)-35(w)]TJ/F195 10.3811 Tf 16.189 0 Td [(\000)]TJ/F84 9.9626 Tf 0.98 0 0 1 267.779 670.263 Tm [(1)-211(shou)1(ld)-211(be)-210(one)-211(of)-210(the)-211(local)-210(indices,)-220(but)-210(ar)18(e)-210(otherwise)]TJ 1 0 0 1 175.611 658.308 Tm [(arbitrary;)]TJ 0 g 0 G -12.453 -19.925 Td [(7.)]TJ 0 g 0 G @@ -18747,11 +18756,11 @@ BT 0 g 0 G -12.453 -19.926 Td [(8.)]TJ 0 g 0 G - 1.016 0 0 1 175.611 594.547 Tm [(Coef)18(\002cients)-246(fr)17(om)-246(dif)18(fer)18(ent)-246(r)17(ows)-246(may)-246(also)-246(be)-247(mixed)-246(up)-246(fr)18(eely)-247(in)-246(a)-246(single)]TJ 1 0 0 1 175.611 582.592 Tm [(call,)-250(accor)18(ding)-250(to)-250(the)-250(application)-250(needs;)]TJ + 1.016 0 0 1 175.611 594.547 Tm [(Coef)18(\002cients)-246(fr)17(om)-246(dif)18(fer)18(ent)-246(r)17(ows)-246(may)-246(also)-246(be)-247(mixed)-246(up)-246(fr)18(eely)-247(in)-246(a)-246(single)]TJ 1 0 0 1 175.611 582.592 Tm [(call)-250(\050in)-250(COO)-250(format\051,)-250(accor)18(ding)-250(to)-250(the)-250(application)-250(needs;)]TJ 0 g 0 G -12.453 -19.925 Td [(9.)]TJ 0 g 0 G - 0.98 0 0 1 175.611 562.667 Tm [(Coef)18(\002cients)-229(fr)18(om)-228(matrix)-229(r)18(ows)-229(not)-229(owned)-229(by)-229(the)-229(calling)-229(p)1(r)18(ocess)-229(ar)18(e)-229(tr)19(eated)]TJ 1.002 0 0 1 175.611 550.712 Tm [(accor)18(ding)-250(to)-249(the)-249(value)-250(of)]TJ/F145 9.9626 Tf 1 0 0 1 287.159 550.712 Tm [(bldmode)]TJ/F84 9.9626 Tf 1.002 0 0 1 326.262 550.712 Tm [(speci\002ed)-249(at)-250(allocation)-249(time;)-250(if)]TJ/F145 9.9626 Tf 1 0 0 1 457.804 550.712 Tm [(bldmode)]TJ/F84 9.9626 Tf 1.02 0 0 1 175.193 538.757 Tm [(was)-272(chosen)-273(as)]TJ/F145 9.9626 Tf 1 0 0 1 241.813 538.757 Tm [(psb_matbld_remote_)]TJ/F84 9.9626 Tf 1.02 0 0 1 338.726 538.757 Tm [(the)-272(library)-273(wi)1(ll)-273(keep)-272(track)-272(of)-273(them,)]TJ 1 0 0 1 175.611 526.801 Tm [(otherwise)-250(they)-250(ar)18(e)-250(silently)-250(ignor)18(ed;)]TJ + 0.98 0 0 1 175.611 562.667 Tm [(Coef)18(\002cients)-229(fr)18(om)-228(matrix)-229(r)18(ows)-229(not)-229(owned)-229(by)-229(the)-229(calling)-229(p)1(r)18(ocess)-229(ar)18(e)-229(tr)19(eated)]TJ 1.002 0 0 1 175.611 550.712 Tm [(accor)18(ding)-250(to)-249(the)-249(value)-250(of)]TJ/F147 9.9626 Tf 1 0 0 1 287.159 550.712 Tm [(bldmode)]TJ/F84 9.9626 Tf 1.002 0 0 1 326.262 550.712 Tm [(speci\002ed)-249(at)-250(allocation)-249(time;)-250(if)]TJ/F147 9.9626 Tf 1 0 0 1 457.804 550.712 Tm [(bldmode)]TJ/F84 9.9626 Tf 1.02 0 0 1 175.193 538.757 Tm [(was)-272(chosen)-273(as)]TJ/F147 9.9626 Tf 1 0 0 1 241.813 538.757 Tm [(psb_matbld_remote_)]TJ/F84 9.9626 Tf 1.02 0 0 1 338.726 538.757 Tm [(the)-272(library)-273(wi)1(ll)-273(keep)-272(track)-272(of)-273(them,)]TJ 1 0 0 1 175.611 526.801 Tm [(otherwise)-250(they)-250(ar)18(e)-250(silently)-250(ignor)18(ed;)]TJ 0 g 0 G -17.434 -19.925 Td [(10.)]TJ 0 g 0 G @@ -18767,7 +18776,7 @@ ET endstream endobj -1593 0 obj +1594 0 obj << /Length 6893 >> @@ -18785,7 +18794,7 @@ BT /F75 11.9552 Tf 151.016 706.129 Td [(spasb)-250(\227)-250(Sparse)-250(matrix)-250(assembly)-250(routine)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -51.121 -19.204 Td [(call)-525(psb_spasb\050a,)-525(desc_a,)-525(info)-525([,)-525(afmt,)-525(upd,)-1050(mold]\051)]TJ +/F147 9.9626 Tf -51.121 -19.204 Td [(call)-525(psb_spasb\050a,)-525(desc_a,)-525(info)-525([,)-525(afmt,)-525(upd,)-1050(mold]\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -22.289 Td [(T)90(ype:)]TJ 0 g 0 G @@ -18805,21 +18814,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in/out)]TJ/F84 9.9626 Tf 27.298 0 Td [(.)]TJ -59.098 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 576.173 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 575.974 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 575.974 Td [(desc)]TJ ET q 1 0 0 1 333.945 576.173 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 575.974 Td [(type)]TJ +/F147 9.9626 Tf 337.084 575.974 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -18829,39 +18838,39 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -20.42 Td [(upd)]TJ 0 g 0 G -/F84 9.9626 Tf 23.243 0 Td [(Pr)18(ovide)-250(for)-250(updates)-250(to)-250(the)-250(matrix)-250(coef)18(\002cients.)]TJ 1.664 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(integer)74(,)-250(possible)-250(values:)]TJ/F145 9.9626 Tf 165.218 0 Td [(psb_upd_srch_)]TJ/F84 9.9626 Tf 67.995 0 Td [(,)]TJ/F145 9.9626 Tf 4.981 0 Td [(psb_upd_perm_)]TJ +/F84 9.9626 Tf 23.243 0 Td [(Pr)18(ovide)-250(for)-250(updates)-250(to)-250(the)-250(matrix)-250(coef)18(\002cients.)]TJ 1.664 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(integer)74(,)-250(possible)-250(values:)]TJ/F147 9.9626 Tf 165.218 0 Td [(psb_upd_srch_)]TJ/F84 9.9626 Tf 67.995 0 Td [(,)]TJ/F147 9.9626 Tf 4.981 0 Td [(psb_upd_perm_)]TJ 0 g 0 G /F75 9.9626 Tf -263.101 -20.421 Td [(mold)]TJ 0 g 0 G -/F84 9.9626 Tf 28.473 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(matrix)-250(storage.)]TJ -3.566 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(a)-250(class)-250(derived)-250(fr)18(om)]TJ/F145 9.9626 Tf 201.393 0 Td [(psb)]TJ +/F84 9.9626 Tf 28.473 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(matrix)-250(storage.)]TJ -3.566 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(a)-250(class)-250(derived)-250(fr)18(om)]TJ/F147 9.9626 Tf 201.393 0 Td [(psb)]TJ ET q 1 0 0 1 342.513 371.449 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 345.652 371.249 Td [(T)]TJ +/F147 9.9626 Tf 345.652 371.249 Td [(T)]TJ ET q 1 0 0 1 351.51 371.449 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 354.648 371.249 Td [(base)]TJ +/F147 9.9626 Tf 354.648 371.249 Td [(base)]TJ ET q 1 0 0 1 376.197 371.449 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 379.335 371.249 Td [(sparse)]TJ +/F147 9.9626 Tf 379.335 371.249 Td [(sparse)]TJ ET q 1 0 0 1 411.345 371.449 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 414.483 371.249 Td [(mat)]TJ/F84 9.9626 Tf 15.691 0 Td [(.)]TJ +/F147 9.9626 Tf 414.483 371.249 Td [(mat)]TJ/F84 9.9626 Tf 15.691 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -330.279 -22.289 Td [(On)-250(Return)]TJ 0 g 0 G @@ -18870,21 +18879,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(matrix)-250(to)-250(be)-250(assembled.)]TJ 14.944 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf -28.652 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf -23.691 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 280.918 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 280.719 Td [(Tspmat)]TJ +/F147 9.9626 Tf 312.397 280.719 Td [(Tspmat)]TJ ET q 1 0 0 1 344.406 280.918 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 347.544 280.719 Td [(type)]TJ +/F147 9.9626 Tf 347.544 280.719 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -18899,23 +18908,23 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in/out)]TJ/F84 9.9626 Tf 27.298 0 Td [(.)]TJ 1.02 0 0 1 124.802 212.477 Tm [(Speci\002ed)-253(as:)-320(a)-253(str)8(uctur)17(ed)-253(data)-253(of)-253(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 296.601 212.477 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 296.601 212.477 Tm [(psb)]TJ ET q 1 0 0 1 312.92 212.677 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 316.058 212.477 Td [(desc)]TJ +/F147 9.9626 Tf 316.058 212.477 Td [(desc)]TJ ET q 1 0 0 1 337.607 212.677 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 340.745 212.477 Td [(type)]TJ +/F147 9.9626 Tf 340.745 212.477 Td [(type)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 361.667 212.477 Tm [(.)-328(If)-253(the)-253(matrix)-253(was)]TJ 0.984 0 0 1 124.802 200.522 Tm [(allocated)-253(with)]TJ/F145 9.9626 Tf 1 0 0 1 188.786 200.522 Tm [(bldmode=psb_matbld_remote_)]TJ/F84 9.9626 Tf 0.984 0 0 1 324.774 200.522 Tm [(,)-253(then)-253(the)-253(descriptor)-253(will)-253(be)]TJ 1 0 0 1 124.802 188.567 Tm [(r)18(eassembled.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 361.667 212.477 Tm [(.)-328(If)-253(the)-253(matrix)-253(was)]TJ 0.984 0 0 1 124.802 200.522 Tm [(allocated)-253(with)]TJ/F147 9.9626 Tf 1 0 0 1 188.786 200.522 Tm [(bldmode=psb_matbld_remote_)]TJ/F84 9.9626 Tf 0.984 0 0 1 324.774 200.522 Tm [(,)-253(then)-253(the)-253(descriptor)-253(will)-253(be)]TJ 1 0 0 1 124.802 188.567 Tm [(r)18(eassembled.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -20.421 Td [(info)]TJ 0 g 0 G @@ -18927,7 +18936,7 @@ ET endstream endobj -1597 0 obj +1598 0 obj << /Length 3496 >> @@ -18939,7 +18948,7 @@ BT 0 g 0 G /F84 9.9626 Tf 12.453 -19.925 Td [(1.)]TJ 0 g 0 G - 0.996 0 0 1 175.611 686.204 Tm [(On)-250(entry)-251(to)-250(this)-250(r)18(outine)-250(the)-250(descriptor)-251(must)-250(be)-250(in)-250(the)-251(assembled)-250(state,)-250(i.e.)]TJ/F145 9.9626 Tf 1 0 0 1 175.611 674.248 Tm [(psb_cdasb)]TJ/F84 9.9626 Tf 49.564 0 Td [(must)-250(alr)18(eady)-250(have)-250(been)-250(called.)]TJ + 0.996 0 0 1 175.611 686.204 Tm [(On)-250(entry)-251(to)-250(this)-250(r)18(outine)-250(the)-250(descriptor)-251(must)-250(be)-250(in)-250(the)-251(assembled)-250(state,)-250(i.e.)]TJ/F147 9.9626 Tf 1 0 0 1 175.611 674.248 Tm [(psb_cdasb)]TJ/F84 9.9626 Tf 49.564 0 Td [(must)-250(alr)18(eady)-250(have)-250(been)-250(called.)]TJ 0 g 0 G -62.017 -19.925 Td [(2.)]TJ 0 g 0 G @@ -18951,7 +18960,7 @@ BT 0 g 0 G -12.453 -19.926 Td [(4.)]TJ 0 g 0 G - 0.98 0 0 1 175.611 590.562 Tm [(If)-211(the)-210(update)-211(choice)-211(is)]TJ/F145 9.9626 Tf 1 0 0 1 270.622 590.562 Tm [(psb_upd_perm_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.616 590.562 Tm [(,)-220(then)-210(subsequent)-211(calls)-211(to)]TJ/F145 9.9626 Tf 1 0 0 1 447.343 590.562 Tm [(psb_spins)]TJ/F84 9.9626 Tf 1.02 0 0 1 175.611 578.607 Tm [(to)-386(update)-387(the)-386(matrix)-387(must)-386(be)-386(arranged)-387(in)-386(such)-387(a)-386(way)-387(as)-386(to)-386(pr)17(oduce)]TJ 0.992 0 0 1 175.611 566.652 Tm [(exactly)-252(the)-253(same)-252(sequence)-253(of)-252(coef)18(\002cient)-252(values)-253(as)-252(encounter)18(ed)-252(at)-253(the)-252(\002rst)]TJ 1 0 0 1 175.611 554.697 Tm [(assembly;)]TJ + 0.98 0 0 1 175.611 590.562 Tm [(If)-211(the)-210(update)-211(choice)-211(is)]TJ/F147 9.9626 Tf 1 0 0 1 270.622 590.562 Tm [(psb_upd_perm_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.616 590.562 Tm [(,)-220(then)-210(subsequent)-211(calls)-211(to)]TJ/F147 9.9626 Tf 1 0 0 1 447.343 590.562 Tm [(psb_spins)]TJ/F84 9.9626 Tf 1.02 0 0 1 175.611 578.607 Tm [(to)-386(update)-387(the)-386(matrix)-387(must)-386(be)-386(arranged)-387(in)-386(such)-387(a)-386(way)-387(as)-386(to)-386(pr)17(oduce)]TJ 0.992 0 0 1 175.611 566.652 Tm [(exactly)-252(the)-253(same)-252(sequence)-253(of)-252(coef)18(\002cient)-252(values)-253(as)-252(encounter)18(ed)-252(at)-253(the)-252(\002rst)]TJ 1 0 0 1 175.611 554.697 Tm [(assembly;)]TJ 0 g 0 G -12.453 -19.926 Td [(5.)]TJ 0 g 0 G @@ -18963,7 +18972,7 @@ BT 0 g 0 G -12.453 -19.925 Td [(7.)]TJ 0 g 0 G - 1.02 0 0 1 175.611 482.966 Tm [(If)-380(the)]TJ/F145 9.9626 Tf 1 0 0 1 204.239 482.966 Tm [(bldmode=psb_matbld_remote_)]TJ/F84 9.9626 Tf 1.02 0 0 1 344.09 482.966 Tm [(value)-380(was)-380(speci\002ed)-380(at)-380(allocation)]TJ 1.02 0 0 1 175.611 471.011 Tm [(time,)-381(cont)1(ributions)-354(de\002ned)-353(on)-354(the)-353(curr)18(ent)-354(pr)18(ocess)-354(but)-353(belonging)-353(to)-354(a)]TJ 0.98 0 0 1 175.611 459.055 Tm [(r)18(emote)-252(pr)18(ocess)-253(will)-252(be)-253(handled)-253(accor)19(dingly)113(.)-315(This)-253(is)-253(most)-252(likely)-253(to)-253(occur)-252(in)]TJ 1.016 0 0 1 175.611 447.1 Tm [(\002nite)-247(element)-247(applications,)-247(with)]TJ/F145 9.9626 Tf 1 0 0 1 322.076 447.1 Tm [(dupl=psb_dupl_add_)]TJ/F84 9.9626 Tf 1.016 0 0 1 416.222 447.1 Tm [(;)-247(it)-247(is)-247(necessary)-247(to)]TJ 0.994 0 0 1 175.611 435.145 Tm [(check)-252(for)-252(possible)-252(updates)-252(needed)-252(in)-252(the)-252(descriptor)74(,)-252(hence)-252(ther)18(e)-252(will)-252(be)-252(a)]TJ 1 0 0 1 175.611 423.19 Tm [(r)8(untime)-250(over)18(head.)]TJ + 1.02 0 0 1 175.611 482.966 Tm [(If)-380(the)]TJ/F147 9.9626 Tf 1 0 0 1 204.239 482.966 Tm [(bldmode=psb_matbld_remote_)]TJ/F84 9.9626 Tf 1.02 0 0 1 344.09 482.966 Tm [(value)-380(was)-380(speci\002ed)-380(at)-380(allocation)]TJ 1.02 0 0 1 175.611 471.011 Tm [(time,)-381(cont)1(ributions)-354(de\002ned)-353(on)-354(the)-353(curr)18(ent)-354(pr)18(ocess)-354(but)-353(belonging)-353(to)-354(a)]TJ 0.98 0 0 1 175.611 459.055 Tm [(r)18(emote)-252(pr)18(ocess)-253(will)-252(be)-253(handled)-253(accor)19(dingly)113(.)-315(This)-253(is)-253(most)-252(likely)-253(to)-253(occur)-252(in)]TJ 1.016 0 0 1 175.611 447.1 Tm [(\002nite)-247(element)-247(applications,)-247(with)]TJ/F147 9.9626 Tf 1 0 0 1 322.076 447.1 Tm [(dupl=psb_dupl_add_)]TJ/F84 9.9626 Tf 1.016 0 0 1 416.222 447.1 Tm [(;)-247(it)-247(is)-247(necessary)-247(to)]TJ 0.994 0 0 1 175.611 435.145 Tm [(check)-252(for)-252(possible)-252(updates)-252(needed)-252(in)-252(the)-252(descriptor)74(,)-252(hence)-252(ther)18(e)-252(will)-252(be)-252(a)]TJ 1 0 0 1 175.611 423.19 Tm [(r)8(untime)-250(over)18(head.)]TJ 0 g 0 G 141.968 -332.752 Td [(88)]TJ 0 g 0 G @@ -18971,7 +18980,7 @@ ET endstream endobj -1610 0 obj +1611 0 obj << /Length 2988 >> @@ -18989,7 +18998,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(spfree)-250(\227)-250(Frees)-250(a)-250(sparse)-250(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_spfree\050a,)-525(desc_a,)-525(info\051)]TJ +/F147 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_spfree\050a,)-525(desc_a,)-525(info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -19002,21 +19011,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(matrix)-250(to)-250(be)-250(fr)18(eed.)]TJ 14.944 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf -28.652 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf -23.691 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 577.576 Td [(Tspmat)]TJ +/F147 9.9626 Tf 312.397 577.576 Td [(Tspmat)]TJ ET q 1 0 0 1 344.406 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 347.544 577.576 Td [(type)]TJ +/F147 9.9626 Tf 347.544 577.576 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -19031,21 +19040,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 510.029 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 509.83 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 509.83 Td [(desc)]TJ ET q 1 0 0 1 333.945 510.029 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 509.83 Td [(type)]TJ +/F147 9.9626 Tf 337.084 509.83 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -19062,7 +19071,7 @@ ET endstream endobj -1502 0 obj +1503 0 obj << /Type /ObjStm /N 100 @@ -19070,35 +19079,35 @@ endobj /Length 10335 >> stream -1501 0 1493 59 1505 141 1503 280 1507 425 320 483 1504 540 1510 662 1508 801 1512 959 -1513 1018 1514 1077 1515 1136 1509 1195 1519 1289 1516 1437 1517 1582 1521 1728 324 1786 1522 1843 -1518 1901 1526 1996 1523 2144 1524 2289 1528 2436 328 2495 1525 2553 1531 2648 1529 2787 1533 2932 -332 2990 1530 3047 1538 3142 1535 3290 1536 3435 1540 3582 336 3641 1537 3699 1542 3821 1544 3939 -1545 3997 1546 4055 1541 4113 1550 4195 1547 4343 1548 4490 1552 4635 340 4694 1553 4752 1549 4811 -1555 4906 1557 5024 1558 5082 1559 5140 1560 5198 1554 5256 1563 5351 1565 5469 344 5528 1562 5586 -1569 5708 1561 5865 1566 6012 1567 6157 1571 6304 1572 6362 1573 6419 1574 6477 1575 6535 1576 6593 -1568 6651 1579 6773 1581 6891 1582 6950 1583 7009 1584 7068 1585 7127 1586 7186 1587 7245 1578 7304 -1592 7427 1588 7584 1589 7731 1590 7876 1594 8023 348 8081 1591 8138 1596 8233 1598 8351 1599 8410 -1600 8469 1601 8528 1602 8587 1603 8646 1604 8705 1605 8764 1595 8823 1609 8918 1606 9066 1607 9209 -% 1501 0 obj +1502 0 1494 59 1506 141 1504 280 1508 425 320 483 1505 540 1511 662 1509 801 1513 959 +1514 1018 1515 1077 1516 1136 1510 1195 1520 1289 1517 1437 1518 1582 1522 1728 324 1786 1523 1843 +1519 1901 1527 1996 1524 2144 1525 2289 1529 2436 328 2495 1526 2553 1532 2648 1530 2787 1534 2932 +332 2990 1531 3047 1539 3142 1536 3290 1537 3435 1541 3582 336 3641 1538 3699 1543 3821 1545 3939 +1546 3997 1547 4055 1542 4113 1551 4195 1548 4343 1549 4490 1553 4635 340 4694 1554 4752 1550 4811 +1556 4906 1558 5024 1559 5082 1560 5140 1561 5198 1555 5256 1564 5351 1566 5469 344 5528 1563 5586 +1570 5708 1562 5865 1567 6012 1568 6157 1572 6304 1573 6362 1574 6419 1575 6477 1576 6535 1577 6593 +1569 6651 1580 6773 1582 6891 1583 6950 1584 7009 1585 7068 1586 7127 1587 7186 1588 7245 1579 7304 +1593 7427 1589 7584 1590 7731 1591 7876 1595 8023 348 8081 1592 8138 1597 8233 1599 8351 1600 8410 +1601 8469 1602 8528 1603 8587 1604 8646 1605 8705 1606 8764 1596 8823 1610 8918 1607 9066 1608 9209 +% 1502 0 obj << -/D [1494 0 R /XYZ 150.705 567.828 null] +/D [1495 0 R /XYZ 150.705 567.828 null] >> -% 1493 0 obj +% 1494 0 obj << -/Font << /F84 687 0 R /F145 940 0 R >> +/Font << /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1505 0 obj +% 1506 0 obj << /Type /Page -/Contents 1506 0 R -/Resources 1504 0 R +/Contents 1507 0 R +/Resources 1505 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1492 0 R -/Annots [ 1503 0 R ] +/Parent 1493 0 R +/Annots [ 1504 0 R ] >> -% 1503 0 obj +% 1504 0 obj << /Type /Annot /Subtype /Link @@ -19106,29 +19115,29 @@ stream /Rect [291.943 116.52 359.001 128.58] /A << /S /GoTo /D (descdata) >> >> -% 1507 0 obj +% 1508 0 obj << -/D [1505 0 R /XYZ 98.895 753.953 null] +/D [1506 0 R /XYZ 98.895 753.953 null] >> % 320 0 obj << -/D [1505 0 R /XYZ 99.895 716.092 null] +/D [1506 0 R /XYZ 99.895 716.092 null] >> -% 1504 0 obj +% 1505 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1510 0 obj +% 1511 0 obj << /Type /Page -/Contents 1511 0 R -/Resources 1509 0 R +/Contents 1512 0 R +/Resources 1510 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1492 0 R -/Annots [ 1508 0 R ] +/Parent 1493 0 R +/Annots [ 1509 0 R ] >> -% 1508 0 obj +% 1509 0 obj << /Type /Annot /Subtype /Link @@ -19136,37 +19145,37 @@ stream /Rect [328.975 401.451 350.892 413.511] /A << /S /GoTo /D (subsubsection.2.3.1) >> >> -% 1512 0 obj -<< -/D [1510 0 R /XYZ 149.705 753.953 null] ->> % 1513 0 obj << -/D [1510 0 R /XYZ 150.705 496.698 null] +/D [1511 0 R /XYZ 149.705 753.953 null] >> % 1514 0 obj << -/D [1510 0 R /XYZ 150.705 474.179 null] +/D [1511 0 R /XYZ 150.705 496.698 null] >> % 1515 0 obj << -/D [1510 0 R /XYZ 150.705 430.343 null] +/D [1511 0 R /XYZ 150.705 474.179 null] >> -% 1509 0 obj +% 1516 0 obj +<< +/D [1511 0 R /XYZ 150.705 430.343 null] +>> +% 1510 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1519 0 obj +% 1520 0 obj << /Type /Page -/Contents 1520 0 R -/Resources 1518 0 R +/Contents 1521 0 R +/Resources 1519 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1492 0 R -/Annots [ 1516 0 R 1517 0 R ] +/Parent 1493 0 R +/Annots [ 1517 0 R 1518 0 R ] >> -% 1516 0 obj +% 1517 0 obj << /Type /Annot /Subtype /Link @@ -19174,7 +19183,7 @@ stream /Rect [291.943 573.77 359.001 585.83] /A << /S /GoTo /D (descdata) >> >> -% 1517 0 obj +% 1518 0 obj << /Type /Annot /Subtype /Link @@ -19182,33 +19191,33 @@ stream /Rect [291.943 416.361 359.001 428.42] /A << /S /GoTo /D (descdata) >> >> -% 1521 0 obj +% 1522 0 obj << -/D [1519 0 R /XYZ 98.895 753.953 null] +/D [1520 0 R /XYZ 98.895 753.953 null] >> % 324 0 obj << -/D [1519 0 R /XYZ 99.895 716.092 null] +/D [1520 0 R /XYZ 99.895 716.092 null] >> -% 1522 0 obj +% 1523 0 obj << -/D [1519 0 R /XYZ 99.895 326.302 null] +/D [1520 0 R /XYZ 99.895 326.302 null] >> -% 1518 0 obj +% 1519 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1526 0 obj +% 1527 0 obj << /Type /Page -/Contents 1527 0 R -/Resources 1525 0 R +/Contents 1528 0 R +/Resources 1526 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1492 0 R -/Annots [ 1523 0 R 1524 0 R ] +/Parent 1493 0 R +/Annots [ 1524 0 R 1525 0 R ] >> -% 1523 0 obj +% 1524 0 obj << /Type /Annot /Subtype /Link @@ -19216,7 +19225,7 @@ stream /Rect [342.753 573.77 409.811 585.83] /A << /S /GoTo /D (descdata) >> >> -% 1524 0 obj +% 1525 0 obj << /Type /Annot /Subtype /Link @@ -19224,29 +19233,29 @@ stream /Rect [342.753 484.107 409.811 496.166] /A << /S /GoTo /D (descdata) >> >> -% 1528 0 obj +% 1529 0 obj << -/D [1526 0 R /XYZ 149.705 753.953 null] +/D [1527 0 R /XYZ 149.705 753.953 null] >> % 328 0 obj << -/D [1526 0 R /XYZ 150.705 716.092 null] +/D [1527 0 R /XYZ 150.705 716.092 null] >> -% 1525 0 obj +% 1526 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1531 0 obj +% 1532 0 obj << /Type /Page -/Contents 1532 0 R -/Resources 1530 0 R +/Contents 1533 0 R +/Resources 1531 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1534 0 R -/Annots [ 1529 0 R ] +/Parent 1535 0 R +/Annots [ 1530 0 R ] >> -% 1529 0 obj +% 1530 0 obj << /Type /Annot /Subtype /Link @@ -19254,29 +19263,29 @@ stream /Rect [291.943 573.77 359.001 585.83] /A << /S /GoTo /D (descdata) >> >> -% 1533 0 obj +% 1534 0 obj << -/D [1531 0 R /XYZ 98.895 753.953 null] +/D [1532 0 R /XYZ 98.895 753.953 null] >> % 332 0 obj << -/D [1531 0 R /XYZ 99.895 716.092 null] +/D [1532 0 R /XYZ 99.895 716.092 null] >> -% 1530 0 obj +% 1531 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1538 0 obj +% 1539 0 obj << /Type /Page -/Contents 1539 0 R -/Resources 1537 0 R +/Contents 1540 0 R +/Resources 1538 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1534 0 R -/Annots [ 1535 0 R 1536 0 R ] +/Parent 1535 0 R +/Annots [ 1536 0 R 1537 0 R ] >> -% 1535 0 obj +% 1536 0 obj << /Type /Annot /Subtype /Link @@ -19284,7 +19293,7 @@ stream /Rect [342.753 452.321 420.271 464.381] /A << /S /GoTo /D (spdata) >> >> -% 1536 0 obj +% 1537 0 obj << /Type /Annot /Subtype /Link @@ -19292,54 +19301,54 @@ stream /Rect [342.753 209.193 409.811 221.252] /A << /S /GoTo /D (descdata) >> >> -% 1540 0 obj +% 1541 0 obj << -/D [1538 0 R /XYZ 149.705 753.953 null] +/D [1539 0 R /XYZ 149.705 753.953 null] >> % 336 0 obj << -/D [1538 0 R /XYZ 150.705 716.092 null] +/D [1539 0 R /XYZ 150.705 716.092 null] >> -% 1537 0 obj +% 1538 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R >> /ProcSet [ /PDF /Text ] >> -% 1542 0 obj +% 1543 0 obj << /Type /Page -/Contents 1543 0 R -/Resources 1541 0 R +/Contents 1544 0 R +/Resources 1542 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1534 0 R ->> -% 1544 0 obj -<< -/D [1542 0 R /XYZ 98.895 753.953 null] +/Parent 1535 0 R >> % 1545 0 obj << -/D [1542 0 R /XYZ 99.895 716.092 null] +/D [1543 0 R /XYZ 98.895 753.953 null] >> % 1546 0 obj << -/D [1542 0 R /XYZ 99.895 663.469 null] +/D [1543 0 R /XYZ 99.895 716.092 null] >> -% 1541 0 obj +% 1547 0 obj << -/Font << /F84 687 0 R /F145 940 0 R >> +/D [1543 0 R /XYZ 99.895 663.469 null] +>> +% 1542 0 obj +<< +/Font << /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1550 0 obj +% 1551 0 obj << /Type /Page -/Contents 1551 0 R -/Resources 1549 0 R +/Contents 1552 0 R +/Resources 1550 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1534 0 R -/Annots [ 1547 0 R 1548 0 R ] +/Parent 1535 0 R +/Annots [ 1548 0 R 1549 0 R ] >> -% 1547 0 obj +% 1548 0 obj << /Type /Annot /Subtype /Link @@ -19347,7 +19356,7 @@ stream /Rect [342.753 571.679 409.811 583.739] /A << /S /GoTo /D (descdata) >> >> -% 1548 0 obj +% 1549 0 obj << /Type /Annot /Subtype /Link @@ -19355,83 +19364,83 @@ stream /Rect [342.753 227.887 420.271 239.946] /A << /S /GoTo /D (spdata) >> >> -% 1552 0 obj +% 1553 0 obj << -/D [1550 0 R /XYZ 149.705 753.953 null] +/D [1551 0 R /XYZ 149.705 753.953 null] >> % 340 0 obj << -/D [1550 0 R /XYZ 150.705 716.092 null] +/D [1551 0 R /XYZ 150.705 716.092 null] >> -% 1553 0 obj +% 1554 0 obj << -/D [1550 0 R /XYZ 150.705 136.374 null] +/D [1551 0 R /XYZ 150.705 136.374 null] >> -% 1549 0 obj +% 1550 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1555 0 obj +% 1556 0 obj << /Type /Page -/Contents 1556 0 R -/Resources 1554 0 R +/Contents 1557 0 R +/Resources 1555 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1534 0 R ->> -% 1557 0 obj -<< -/D [1555 0 R /XYZ 98.895 753.953 null] +/Parent 1535 0 R >> % 1558 0 obj << -/D [1555 0 R /XYZ 99.895 716.092 null] +/D [1556 0 R /XYZ 98.895 753.953 null] >> % 1559 0 obj << -/D [1555 0 R /XYZ 99.895 699.334 null] +/D [1556 0 R /XYZ 99.895 716.092 null] >> % 1560 0 obj << -/D [1555 0 R /XYZ 99.895 644.819 null] +/D [1556 0 R /XYZ 99.895 699.334 null] >> -% 1554 0 obj +% 1561 0 obj << -/Font << /F84 687 0 R /F78 686 0 R /F145 940 0 R >> +/D [1556 0 R /XYZ 99.895 655.499 null] +>> +% 1555 0 obj +<< +/Font << /F84 687 0 R /F78 686 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1563 0 obj +% 1564 0 obj << /Type /Page -/Contents 1564 0 R -/Resources 1562 0 R +/Contents 1565 0 R +/Resources 1563 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1534 0 R +/Parent 1535 0 R >> -% 1565 0 obj +% 1566 0 obj << -/D [1563 0 R /XYZ 149.705 753.953 null] +/D [1564 0 R /XYZ 149.705 753.953 null] >> % 344 0 obj << -/D [1563 0 R /XYZ 150.705 716.092 null] +/D [1564 0 R /XYZ 150.705 716.092 null] >> -% 1562 0 obj +% 1563 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1569 0 obj +% 1570 0 obj << /Type /Page -/Contents 1570 0 R -/Resources 1568 0 R +/Contents 1571 0 R +/Resources 1569 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1577 0 R -/Annots [ 1561 0 R 1566 0 R 1567 0 R ] +/Parent 1578 0 R +/Annots [ 1562 0 R 1567 0 R 1568 0 R ] >> -% 1561 0 obj +% 1562 0 obj << /Type /Annot /Subtype /Link @@ -19439,7 +19448,7 @@ stream /Rect [260.133 654.503 327.191 666.562] /A << /S /GoTo /D (descdata) >> >> -% 1566 0 obj +% 1567 0 obj << /Type /Annot /Subtype /Link @@ -19447,7 +19456,7 @@ stream /Rect [291.943 480.963 369.462 493.022] /A << /S /GoTo /D (spdata) >> >> -% 1567 0 obj +% 1568 0 obj << /Type /Annot /Subtype /Link @@ -19455,86 +19464,86 @@ stream /Rect [260.133 411.699 327.191 423.758] /A << /S /GoTo /D (descdata) >> >> -% 1571 0 obj -<< -/D [1569 0 R /XYZ 98.895 753.953 null] ->> % 1572 0 obj << -/D [1569 0 R /XYZ 99.895 306.27 null] +/D [1570 0 R /XYZ 98.895 753.953 null] >> % 1573 0 obj << -/D [1569 0 R /XYZ 99.895 272.927 null] +/D [1570 0 R /XYZ 99.895 306.27 null] >> % 1574 0 obj << -/D [1569 0 R /XYZ 99.895 236.878 null] +/D [1570 0 R /XYZ 99.895 272.927 null] >> % 1575 0 obj << -/D [1569 0 R /XYZ 99.895 167.614 null] +/D [1570 0 R /XYZ 99.895 236.878 null] >> % 1576 0 obj << -/D [1569 0 R /XYZ 99.895 146.171 null] +/D [1570 0 R /XYZ 99.895 167.614 null] >> -% 1568 0 obj +% 1577 0 obj +<< +/D [1570 0 R /XYZ 99.895 146.171 null] +>> +% 1569 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F78 686 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1579 0 obj +% 1580 0 obj << /Type /Page -/Contents 1580 0 R -/Resources 1578 0 R +/Contents 1581 0 R +/Resources 1579 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1577 0 R ->> -% 1581 0 obj -<< -/D [1579 0 R /XYZ 149.705 753.953 null] +/Parent 1578 0 R >> % 1582 0 obj << -/D [1579 0 R /XYZ 150.705 716.092 null] +/D [1580 0 R /XYZ 149.705 753.953 null] >> % 1583 0 obj << -/D [1579 0 R /XYZ 150.705 651.514 null] +/D [1580 0 R /XYZ 150.705 716.092 null] >> % 1584 0 obj << -/D [1579 0 R /XYZ 150.705 608.346 null] +/D [1580 0 R /XYZ 150.705 651.514 null] >> % 1585 0 obj << -/D [1579 0 R /XYZ 150.705 575.798 null] +/D [1580 0 R /XYZ 150.705 608.346 null] >> % 1586 0 obj << -/D [1579 0 R /XYZ 150.705 520.007 null] +/D [1580 0 R /XYZ 150.705 575.798 null] >> % 1587 0 obj << -/D [1579 0 R /XYZ 150.705 476.171 null] +/D [1580 0 R /XYZ 150.705 520.007 null] >> -% 1578 0 obj +% 1588 0 obj +<< +/D [1580 0 R /XYZ 150.705 476.171 null] +>> +% 1579 0 obj << -/Font << /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F145 940 0 R >> +/Font << /F84 687 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1592 0 obj +% 1593 0 obj << /Type /Page -/Contents 1593 0 R -/Resources 1591 0 R +/Contents 1594 0 R +/Resources 1592 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1577 0 R -/Annots [ 1588 0 R 1589 0 R 1590 0 R ] +/Parent 1578 0 R +/Annots [ 1589 0 R 1590 0 R 1591 0 R ] >> -% 1588 0 obj +% 1589 0 obj << /Type /Annot /Subtype /Link @@ -19542,7 +19551,7 @@ stream /Rect [291.943 572.168 359.001 584.228] /A << /S /GoTo /D (descdata) >> >> -% 1589 0 obj +% 1590 0 obj << /Type /Annot /Subtype /Link @@ -19550,7 +19559,7 @@ stream /Rect [291.943 276.913 369.462 288.973] /A << /S /GoTo /D (spdata) >> >> -% 1590 0 obj +% 1591 0 obj << /Type /Annot /Subtype /Link @@ -19558,74 +19567,74 @@ stream /Rect [295.605 208.672 362.663 220.731] /A << /S /GoTo /D (descdata) >> >> -% 1594 0 obj +% 1595 0 obj << -/D [1592 0 R /XYZ 98.895 753.953 null] +/D [1593 0 R /XYZ 98.895 753.953 null] >> % 348 0 obj << -/D [1592 0 R /XYZ 99.895 716.092 null] +/D [1593 0 R /XYZ 99.895 716.092 null] >> -% 1591 0 obj +% 1592 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1596 0 obj +% 1597 0 obj << /Type /Page -/Contents 1597 0 R -/Resources 1595 0 R +/Contents 1598 0 R +/Resources 1596 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1577 0 R ->> -% 1598 0 obj -<< -/D [1596 0 R /XYZ 149.705 753.953 null] +/Parent 1578 0 R >> % 1599 0 obj << -/D [1596 0 R /XYZ 150.705 701.929 null] +/D [1597 0 R /XYZ 149.705 753.953 null] >> % 1600 0 obj << -/D [1596 0 R /XYZ 150.705 667.454 null] +/D [1597 0 R /XYZ 150.705 701.929 null] >> % 1601 0 obj << -/D [1596 0 R /XYZ 150.705 647.529 null] +/D [1597 0 R /XYZ 150.705 667.454 null] >> % 1602 0 obj << -/D [1596 0 R /XYZ 150.705 603.693 null] +/D [1597 0 R /XYZ 150.705 647.529 null] >> % 1603 0 obj << -/D [1596 0 R /XYZ 150.705 547.902 null] +/D [1597 0 R /XYZ 150.705 603.693 null] >> % 1604 0 obj << -/D [1596 0 R /XYZ 150.705 527.977 null] +/D [1597 0 R /XYZ 150.705 547.902 null] >> % 1605 0 obj << -/D [1596 0 R /XYZ 150.705 496.097 null] +/D [1597 0 R /XYZ 150.705 527.977 null] >> -% 1595 0 obj +% 1606 0 obj +<< +/D [1597 0 R /XYZ 150.705 496.097 null] +>> +% 1596 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1609 0 obj +% 1610 0 obj << /Type /Page -/Contents 1610 0 R -/Resources 1608 0 R +/Contents 1611 0 R +/Resources 1609 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1577 0 R -/Annots [ 1606 0 R 1607 0 R ] +/Parent 1578 0 R +/Annots [ 1607 0 R 1608 0 R ] >> -% 1606 0 obj +% 1607 0 obj << /Type /Annot /Subtype /Link @@ -19633,7 +19642,7 @@ stream /Rect [291.943 573.77 369.462 585.83] /A << /S /GoTo /D (spdata) >> >> -% 1607 0 obj +% 1608 0 obj << /Type /Annot /Subtype /Link @@ -19644,7 +19653,7 @@ stream endstream endobj -1617 0 obj +1618 0 obj << /Length 3932 >> @@ -19662,7 +19671,7 @@ BT /F75 11.9552 Tf 1.009 0 0 1 207.982 706.129 Tm [(sprn)-246(\227)-247(Reinit)-246(sparse)-246(matrix)-247(structure)-246(for)-246(psblas)-247(rou-)]TJ 1 0 0 1 183.582 692.181 Tm [(tines.)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -32.877 -18.964 Td [(call)-525(psb_sprn\050a,)-525(decsc_a,)-525(info,)-525(clear\051)]TJ +/F147 9.9626 Tf -32.877 -18.964 Td [(call)-525(psb_sprn\050a,)-525(decsc_a,)-525(info,)-525(clear\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.917 Td [(T)90(ype:)]TJ 0 g 0 G @@ -19675,21 +19684,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(matrix)-250(to)-250(be)-250(r)18(einitialized.)]TJ 14.944 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf -28.652 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf -23.69 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.148 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.137 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.137 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 563.828 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 563.628 Td [(Tspmat)]TJ +/F147 9.9626 Tf 363.206 563.628 Td [(Tspmat)]TJ ET q 1 0 0 1 395.216 563.828 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 398.354 563.628 Td [(type)]TJ +/F147 9.9626 Tf 398.354 563.628 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -19704,21 +19713,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 496.082 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 495.882 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 495.882 Td [(desc)]TJ ET q 1 0 0 1 384.755 496.082 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 495.882 Td [(type)]TJ +/F147 9.9626 Tf 387.893 495.882 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -19743,7 +19752,7 @@ ET endstream endobj -1624 0 obj +1625 0 obj << /Length 6512 >> @@ -19761,7 +19770,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(geall)-250(\227)-250(Allocates)-250(a)-250(dense)-250(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_geall\050x,)-525(desc_a,)-525(info[,)-525(dupl,)-525(bldmode,)-525(n,)-525(lb]\051)]TJ +/F147 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_geall\050x,)-525(desc_a,)-525(info[,)-525(dupl,)-525(bldmode,)-525(n,)-525(lb]\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -19.627 Td [(T)90(ype:)]TJ 0 g 0 G @@ -19781,21 +19790,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(communication)-250(descriptor)74(.)]TJ -8.249 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(variable)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 136.327 0 Td [(psb)]TJ +/F147 9.9626 Tf 136.327 0 Td [(psb)]TJ ET q 1 0 0 1 277.448 581.898 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 280.586 581.699 Td [(desc)]TJ +/F147 9.9626 Tf 280.586 581.699 Td [(desc)]TJ ET q 1 0 0 1 302.135 581.898 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 305.273 581.699 Td [(type)]TJ +/F147 9.9626 Tf 305.273 581.699 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -19809,11 +19818,11 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -19.009 Td [(dupl)]TJ 0 g 0 G -/F84 9.9626 Tf 26.561 0 Td [(How)-250(to)-250(handle)-250(duplicate)-250(coef)18(\002cients.)]TJ -1.654 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.006 0 0 1 124.802 333.389 Tm [(Speci\002ed)-248(as:)-308(inte)1(ger)73(,)-248(possible)-248(values:)]TJ/F145 9.9626 Tf 1 0 0 1 290.906 333.389 Tm [(psb_dupl_ovwrt_)]TJ/F84 9.9626 Tf 1.006 0 0 1 369.361 333.389 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 374.352 333.389 Tm [(psb_dupl_add_)]TJ/F84 9.9626 Tf 1.006 0 0 1 442.346 333.389 Tm [(;)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 321.433 Tm [(psb_dupl_err_)]TJ/F84 9.9626 Tf 70.485 0 Td [(has)-250(no)-250(ef)18(fect.)]TJ +/F84 9.9626 Tf 26.561 0 Td [(How)-250(to)-250(handle)-250(duplicate)-250(coef)18(\002cients.)]TJ -1.654 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.006 0 0 1 124.802 333.389 Tm [(Speci\002ed)-248(as:)-308(inte)1(ger)73(,)-248(possible)-248(values:)]TJ/F147 9.9626 Tf 1 0 0 1 290.906 333.389 Tm [(psb_dupl_ovwrt_)]TJ/F84 9.9626 Tf 1.006 0 0 1 369.361 333.389 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 374.352 333.389 Tm [(psb_dupl_add_)]TJ/F84 9.9626 Tf 1.006 0 0 1 442.346 333.389 Tm [(;)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 321.433 Tm [(psb_dupl_err_)]TJ/F84 9.9626 Tf 70.485 0 Td [(has)-250(no)-250(ef)18(fect.)]TJ 0 g 0 G /F75 9.9626 Tf -95.392 -19.009 Td [(bldmode)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 145.335 302.424 Tm [(Whether)-327(to)-327(keep)-327(track)-327(of)-327(matrix)-327(entries)-327(that)-327(do)-327(not)-327(belong)-327(to)-327(the)]TJ 1 0 0 1 124.802 290.469 Tm [(curr)18(ent)-250(pr)18(ocess.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 242.648 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)-194(value)]TJ/F145 9.9626 Tf 1 0 0 1 250.731 242.648 Tm [(psb_matbld_noremote_)]TJ/F84 9.9626 Tf 0.98 0 0 1 355.338 242.648 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 359.791 242.648 Tm [(psb_matbld_remote_)]TJ/F84 9.9626 Tf 0.98 0 0 1 453.937 242.648 Tm [(.)]TJ 1 0 0 1 124.802 230.693 Tm [(Default:)]TJ/F145 9.9626 Tf 38.515 0 Td [(psb_matbld_noremote_)]TJ/F84 9.9626 Tf 104.607 0 Td [(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 145.335 302.424 Tm [(Whether)-327(to)-327(keep)-327(track)-327(of)-327(matrix)-327(entries)-327(that)-327(do)-327(not)-327(belong)-327(to)-327(the)]TJ 1 0 0 1 124.802 290.469 Tm [(curr)18(ent)-250(pr)18(ocess.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 242.648 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)-194(value)]TJ/F147 9.9626 Tf 1 0 0 1 250.731 242.648 Tm [(psb_matbld_noremote_)]TJ/F84 9.9626 Tf 0.98 0 0 1 355.338 242.648 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 359.791 242.648 Tm [(psb_matbld_remote_)]TJ/F84 9.9626 Tf 0.98 0 0 1 453.937 242.648 Tm [(.)]TJ 1 0 0 1 124.802 230.693 Tm [(Default:)]TJ/F147 9.9626 Tf 38.515 0 Td [(psb_matbld_noremote_)]TJ/F84 9.9626 Tf 104.607 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -168.029 -19.627 Td [(On)-250(Return)]TJ 0 g 0 G @@ -19822,28 +19831,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(dense)-250(matrix)-250(to)-250(be)-250(allocated.)]TJ 15.253 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ 1.01 0 0 1 124.802 144.236 Tm [(Speci\002ed)-247(as:)-306(a)-247(rank)-246(one)-247(or)-246(two)-247(array)-246(with)-247(the)-246(ALLOCA)73(T)73(ABLE)-246(attribute)]TJ 1 0 0 1 124.802 132.281 Tm [(or)-250(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 86.634 0 Td [(psb)]TJ +/F147 9.9626 Tf 86.634 0 Td [(psb)]TJ ET q 1 0 0 1 227.755 132.48 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 230.893 132.281 Td [(T)]TJ +/F147 9.9626 Tf 230.893 132.281 Td [(T)]TJ ET q 1 0 0 1 236.751 132.48 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 239.889 132.281 Td [(vect)]TJ +/F147 9.9626 Tf 239.889 132.281 Td [(vect)]TJ ET q 1 0 0 1 261.438 132.48 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 264.576 132.281 Td [(type)]TJ +/F147 9.9626 Tf 264.576 132.281 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(,)-250(of)-250(type)-250(r)18(eal,)-250(complex)-250(or)-250(integer)74(.)]TJ 0 g 0 G @@ -19853,7 +19862,7 @@ ET endstream endobj -1629 0 obj +1630 0 obj << /Length 991 >> @@ -19868,7 +19877,7 @@ BT 0 g 0 G /F84 9.9626 Tf 12.453 -19.925 Td [(1.)]TJ 0 g 0 G - 1.02 0 0 1 175.611 616.465 Tm [(Using)]TJ/F145 9.9626 Tf 1 0 0 1 205.259 616.465 Tm [(psb_matbld_remote_)]TJ/F84 9.9626 Tf 1.02 0 0 1 302.317 616.465 Tm [(is)-287(li)1(kely)-287(to)-287(cause)-286(a)-287(r)8(untime)-286(over)17(head)-286(at)-287(as-)]TJ 1 0 0 1 175.611 604.51 Tm [(sembly)-250(time;)]TJ + 1.02 0 0 1 175.611 616.465 Tm [(Using)]TJ/F147 9.9626 Tf 1 0 0 1 205.259 616.465 Tm [(psb_matbld_remote_)]TJ/F84 9.9626 Tf 1.02 0 0 1 302.317 616.465 Tm [(is)-287(li)1(kely)-287(to)-287(cause)-286(a)-287(r)8(untime)-286(over)17(head)-286(at)-287(as-)]TJ 1 0 0 1 175.611 604.51 Tm [(sembly)-250(time;)]TJ 0 g 0 G 141.968 -514.072 Td [(92)]TJ 0 g 0 G @@ -19876,7 +19885,7 @@ ET endstream endobj -1636 0 obj +1637 0 obj << /Length 6572 >> @@ -19894,7 +19903,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(geins)-250(\227)-250(Dense)-250(matrix)-250(insertion)-250(routine)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_geins\050m,)-525(irw,)-525(val,)-525(x,)-525(desc_a,)-525(info)-525([,local]\051)]TJ +/F147 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_geins\050m,)-525(irw,)-525(val,)-525(x,)-525(desc_a,)-525(info)-525([,local]\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -20.57 Td [(T)90(ype:)]TJ 0 g 0 G @@ -19909,7 +19918,7 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -19.386 Td [(irw)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 120.368 560.616 Tm [(Indices)-354(of)-353(the)-354(r)18(ows)-354(to)-353(be)-354(inserted.)-629(Speci\002cally)109(,)-381(r)18(ow)]TJ/F78 9.9626 Tf 1 0 0 1 361.94 560.616 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 368.497 560.616 Tm [(of)]TJ/F78 9.9626 Tf 1 0 0 1 381.147 560.616 Tm [(v)-40(a)-25(l)]TJ/F84 9.9626 Tf 1.02 0 0 1 397.986 560.616 Tm [(will)-354(be)-353(in-)]TJ 1.02 0 0 1 124.802 548.661 Tm [(serted)-307(into)-307(the)-307(local)-308(r)18(ow)-307(corr)18(esponding)-308(to)-307(the)-307(global)-307(r)18(ow)-308(index)]TJ/F78 9.9626 Tf 1 0 0 1 416.713 548.661 Tm [(i)-22(r)-35(w)]TJ/F192 10.3811 Tf 14.654 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 442.809 548.661 Tm [(.)]TJ 1 0 0 1 124.802 536.706 Tm [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)111(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 120.368 560.616 Tm [(Indices)-354(of)-353(the)-354(r)18(ows)-354(to)-353(be)-354(inserted.)-629(Speci\002cally)109(,)-381(r)18(ow)]TJ/F78 9.9626 Tf 1 0 0 1 361.94 560.616 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 368.497 560.616 Tm [(of)]TJ/F78 9.9626 Tf 1 0 0 1 381.147 560.616 Tm [(v)-40(a)-25(l)]TJ/F84 9.9626 Tf 1.02 0 0 1 397.986 560.616 Tm [(will)-354(be)-353(in-)]TJ 1.02 0 0 1 124.802 548.661 Tm [(serted)-307(into)-307(the)-307(local)-308(r)18(ow)-307(corr)18(esponding)-308(to)-307(the)-307(global)-307(r)18(ow)-308(index)]TJ/F78 9.9626 Tf 1 0 0 1 416.713 548.661 Tm [(i)-22(r)-35(w)]TJ/F197 10.3811 Tf 14.654 0 Td [(\050)]TJ/F78 9.9626 Tf 4.205 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 442.809 548.661 Tm [(.)]TJ 1 0 0 1 124.802 536.706 Tm [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)111(.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -19.386 Td [(val)]TJ 0 g 0 G @@ -19926,27 +19935,27 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 366.626 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 366.426 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 366.426 Td [(desc)]TJ ET q 1 0 0 1 333.945 366.626 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 366.426 Td [(type)]TJ +/F147 9.9626 Tf 337.084 366.426 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -258.11 -19.386 Td [(local)]TJ 0 g 0 G -/F84 9.9626 Tf 1.004 0 0 1 125.957 347.04 Tm [(Whether)-248(the)-248(entries)-249(in)-248(the)-248(index)-248(vector)]TJ/F145 9.9626 Tf 1 0 0 1 300.374 347.04 Tm [(irw)]TJ/F84 9.9626 Tf 1.004 0 0 1 316.065 347.04 Tm [(,)-248(ar)18(e)-249(alr)18(eady)-248(in)-248(local)-248(number)18(-)]TJ 1 0 0 1 124.802 335.085 Tm [(ing.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(value;)-250(default:)]TJ/F145 9.9626 Tf 162.678 0 Td [(.false.)]TJ/F84 9.9626 Tf 36.612 0 Td [(.)]TJ +/F84 9.9626 Tf 1.004 0 0 1 125.957 347.04 Tm [(Whether)-248(the)-248(entries)-249(in)-248(the)-248(index)-248(vector)]TJ/F147 9.9626 Tf 1 0 0 1 300.374 347.04 Tm [(irw)]TJ/F84 9.9626 Tf 1.004 0 0 1 316.065 347.04 Tm [(,)-248(ar)18(e)-249(alr)18(eady)-248(in)-248(local)-248(number)18(-)]TJ 1 0 0 1 124.802 335.085 Tm [(ing.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(logical)-250(value;)-250(default:)]TJ/F147 9.9626 Tf 162.678 0 Td [(.false.)]TJ/F84 9.9626 Tf 36.612 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -224.197 -20.57 Td [(On)-250(Return)]TJ 0 g 0 G @@ -19955,28 +19964,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(output)-250(dense)-250(matrix.)]TJ 14.944 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ 0.98 0 0 1 124.802 211.443 Tm [(Speci\002ed)-237(as:)-308(a)-237(rank)-238(one)-237(or)-238(two)-237(array)-238(or)-237(an)-238(object)-237(of)-238(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 368.349 211.443 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 368.349 211.443 Tm [(psb)]TJ ET q 1 0 0 1 384.668 211.642 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.806 211.443 Td [(T)]TJ +/F147 9.9626 Tf 387.806 211.443 Td [(T)]TJ ET q 1 0 0 1 393.664 211.642 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 396.802 211.443 Td [(vect)]TJ +/F147 9.9626 Tf 396.802 211.443 Td [(vect)]TJ ET q 1 0 0 1 418.351 211.642 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 421.49 211.443 Td [(type)]TJ +/F147 9.9626 Tf 421.49 211.443 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 0.98 0 0 1 442.411 211.443 Tm [(,)]TJ 1 0 0 1 124.802 199.488 Tm [(of)-250(type)-250(r)18(eal,)-250(complex)-250(or)-250(integer)74(.)]TJ 0 g 0 G @@ -19990,7 +19999,7 @@ ET endstream endobj -1640 0 obj +1641 0 obj << /Length 578 >> @@ -20014,7 +20023,7 @@ ET endstream endobj -1649 0 obj +1650 0 obj << /Length 6324 >> @@ -20032,7 +20041,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(geasb)-250(\227)-250(Assembly)-250(a)-250(dense)-250(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_geasb\050x,)-525(desc_a,)-525(info,)-525(mold\051)]TJ +/F147 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_geasb\050x,)-525(desc_a,)-525(info,)-525(mold\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -20052,78 +20061,78 @@ BT 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(communication)-250(descriptor)74(.)]TJ -8.249 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(variable)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 136.327 0 Td [(psb)]TJ +/F147 9.9626 Tf 136.327 0 Td [(psb)]TJ ET q 1 0 0 1 277.448 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 280.586 577.576 Td [(desc)]TJ +/F147 9.9626 Tf 280.586 577.576 Td [(desc)]TJ ET q 1 0 0 1 302.135 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 305.273 577.576 Td [(type)]TJ +/F147 9.9626 Tf 305.273 577.576 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -226.3 -31.88 Td [(mold)]TJ 0 g 0 G -/F84 9.9626 Tf 28.473 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(vector)-250(storage.)]TJ -3.566 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.987 0 0 1 124.802 497.875 Tm [(Speci\002ed)-254(as:)-315(an)-254(object)-254(of)-254(a)-254(class)-254(derived)-254(fr)18(om)]TJ/F145 9.9626 Tf 1 0 0 1 323.94 497.875 Tm [(psb)]TJ +/F84 9.9626 Tf 28.473 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(vector)-250(storage.)]TJ -3.566 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.987 0 0 1 124.802 497.875 Tm [(Speci\002ed)-254(as:)-315(an)-254(object)-254(of)-254(a)-254(class)-254(derived)-254(fr)18(om)]TJ/F147 9.9626 Tf 1 0 0 1 323.94 497.875 Tm [(psb)]TJ ET q 1 0 0 1 340.259 498.074 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 343.397 497.875 Td [(T)]TJ +/F147 9.9626 Tf 343.397 497.875 Td [(T)]TJ ET q 1 0 0 1 349.255 498.074 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 352.393 497.875 Td [(base)]TJ +/F147 9.9626 Tf 352.393 497.875 Td [(base)]TJ ET q 1 0 0 1 373.942 498.074 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 377.08 497.875 Td [(vect)]TJ +/F147 9.9626 Tf 377.08 497.875 Td [(vect)]TJ ET q 1 0 0 1 398.629 498.074 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 401.767 497.875 Td [(type)]TJ/F84 9.9626 Tf 0.987 0 0 1 422.689 497.875 Tm [(;)-254(this)]TJ 1 0 0 1 124.802 485.92 Tm [(is)-250(only)-250(allowed)-250(when)]TJ/F78 9.9626 Tf 97.12 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(of)-250(type)]TJ +/F147 9.9626 Tf 401.767 497.875 Td [(type)]TJ/F84 9.9626 Tf 0.987 0 0 1 422.689 497.875 Tm [(;)-254(this)]TJ 1 0 0 1 124.802 485.92 Tm [(is)-250(only)-250(allowed)-250(when)]TJ/F78 9.9626 Tf 97.12 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 42.898 0 Td [(psb)]TJ +/F147 9.9626 Tf 42.898 0 Td [(psb)]TJ ET q 1 0 0 1 288.835 486.119 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 291.973 485.92 Td [(T)]TJ +/F147 9.9626 Tf 291.973 485.92 Td [(T)]TJ ET q 1 0 0 1 297.831 486.119 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 300.969 485.92 Td [(vect)]TJ +/F147 9.9626 Tf 300.969 485.92 Td [(vect)]TJ ET q 1 0 0 1 322.518 486.119 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 325.657 485.92 Td [(type)]TJ +/F147 9.9626 Tf 325.657 485.92 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -20134,28 +20143,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(dense)-250(matrix)-250(to)-250(be)-250(assembled.)]TJ 15.253 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ 0.98 0 0 1 124.802 396.256 Tm [(Speci\002ed)-220(as:)-299(a)-220(rank)-220(one)-220(or)-220(two)-221(array)-220(with)-220(the)-220(ALLOCA)76(T)75(ABLE)-220(or)-220(an)-220(object)]TJ 1 0 0 1 124.802 384.301 Tm [(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 33.285 0 Td [(psb)]TJ +/F147 9.9626 Tf 33.285 0 Td [(psb)]TJ ET q 1 0 0 1 174.405 384.5 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 177.544 384.301 Td [(T)]TJ +/F147 9.9626 Tf 177.544 384.301 Td [(T)]TJ ET q 1 0 0 1 183.402 384.5 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 186.54 384.301 Td [(vect)]TJ +/F147 9.9626 Tf 186.54 384.301 Td [(vect)]TJ ET q 1 0 0 1 208.089 384.5 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 211.227 384.301 Td [(type)]TJ +/F147 9.9626 Tf 211.227 384.301 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(,)-250(of)-250(type)-250(r)18(eal,)-250(complex)-250(or)-250(integer)74(.)]TJ 0 g 0 G @@ -20165,11 +20174,11 @@ BT 0 g 0 G /F84 9.9626 Tf 12.454 -19.925 Td [(1.)]TJ 0 g 0 G - 0.996 0 0 1 124.802 262.757 Tm [(On)-250(entry)-251(to)-250(this)-250(r)18(outine)-250(the)-250(descriptor)-251(must)-250(be)-250(in)-250(the)-251(assembled)-250(state,)-250(i.e.)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 250.801 Tm [(psb_cdasb)]TJ/F84 9.9626 Tf 49.564 0 Td [(must)-250(alr)18(eady)-250(have)-250(been)-250(called.)]TJ + 0.996 0 0 1 124.802 262.757 Tm [(On)-250(entry)-251(to)-250(this)-250(r)18(outine)-250(the)-250(descriptor)-251(must)-250(be)-250(in)-250(the)-251(assembled)-250(state,)-250(i.e.)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 250.801 Tm [(psb_cdasb)]TJ/F84 9.9626 Tf 49.564 0 Td [(must)-250(alr)18(eady)-250(have)-250(been)-250(called.)]TJ 0 g 0 G -62.017 -19.925 Td [(2.)]TJ 0 g 0 G - 1.02 0 0 1 124.802 230.876 Tm [(If)-380(the)]TJ/F145 9.9626 Tf 1 0 0 1 153.429 230.876 Tm [(bldmode=psb_matbld_remote_)]TJ/F84 9.9626 Tf 1.02 0 0 1 293.28 230.876 Tm [(value)-380(was)-380(speci\002ed)-380(at)-380(allocation)]TJ 1.02 0 0 1 124.802 218.921 Tm [(time,)-380(contributions)-354(de\002ned)-353(on)-354(the)-353(curr)18(ent)-354(pr)18(ocess)-353(but)-354(belonging)-353(to)-354(a)]TJ 0.98 0 0 1 124.802 206.966 Tm [(r)18(emote)-252(pr)18(ocess)-253(will)-252(be)-253(handled)-252(accor)18(dingly)113(.)-315(This)-253(is)-253(most)-252(likely)-253(to)-253(occur)-252(in)]TJ 1 0 0 1 124.802 195.011 Tm [(\002nite)-250(element)-250(applications,)-250(with)]TJ/F145 9.9626 Tf 144.277 0 Td [(dupl=psb_dupl_add_)]TJ/F84 9.9626 Tf 94.146 0 Td [(.)]TJ + 1.02 0 0 1 124.802 230.876 Tm [(If)-380(the)]TJ/F147 9.9626 Tf 1 0 0 1 153.429 230.876 Tm [(bldmode=psb_matbld_remote_)]TJ/F84 9.9626 Tf 1.02 0 0 1 293.28 230.876 Tm [(value)-380(was)-380(speci\002ed)-380(at)-380(allocation)]TJ 1.02 0 0 1 124.802 218.921 Tm [(time,)-380(contributions)-354(de\002ned)-353(on)-354(the)-353(curr)18(ent)-354(pr)18(ocess)-353(but)-354(belonging)-353(to)-354(a)]TJ 0.98 0 0 1 124.802 206.966 Tm [(r)18(emote)-252(pr)18(ocess)-253(will)-252(be)-253(handled)-252(accor)18(dingly)113(.)-315(This)-253(is)-253(most)-252(likely)-253(to)-253(occur)-252(in)]TJ 1 0 0 1 124.802 195.011 Tm [(\002nite)-250(element)-250(applications,)-250(with)]TJ/F147 9.9626 Tf 144.277 0 Td [(dupl=psb_dupl_add_)]TJ/F84 9.9626 Tf 94.146 0 Td [(.)]TJ 0 g 0 G -96.455 -104.573 Td [(95)]TJ 0 g 0 G @@ -20177,7 +20186,7 @@ ET endstream endobj -1657 0 obj +1658 0 obj << /Length 3253 >> @@ -20195,7 +20204,7 @@ BT /F75 11.9552 Tf 207.803 706.129 Td [(gefree)-250(\227)-250(Frees)-250(a)-250(dense)-250(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_gefree\050x,)-525(desc_a,)-525(info\051)]TJ +/F147 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_gefree\050x,)-525(desc_a,)-525(info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -20208,28 +20217,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(dense)-250(matrix)-250(to)-250(be)-250(fr)18(eed.)]TJ 15.252 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ 0.98 0 0 1 175.611 577.576 Tm [(Speci\002ed)-220(as:)-299(a)-220(rank)-220(one)-220(or)-220(two)-221(array)-220(with)-220(the)-220(ALLOCA)76(T)75(ABLE)-220(or)-220(an)-220(object)]TJ 1 0 0 1 175.611 565.621 Tm [(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 33.285 0 Td [(psb)]TJ +/F147 9.9626 Tf 33.285 0 Td [(psb)]TJ ET q 1 0 0 1 225.215 565.82 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 228.353 565.621 Td [(T)]TJ +/F147 9.9626 Tf 228.353 565.621 Td [(T)]TJ ET q 1 0 0 1 234.211 565.82 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 237.349 565.621 Td [(vect)]TJ +/F147 9.9626 Tf 237.349 565.621 Td [(vect)]TJ ET q 1 0 0 1 258.898 565.82 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 262.036 565.621 Td [(type)]TJ +/F147 9.9626 Tf 262.036 565.621 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(,)-250(of)-250(type)-250(r)18(eal,)-250(complex)-250(or)-250(integer)74(.)]TJ 0 g 0 G @@ -20244,21 +20253,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.653 0 Td [(The)-250(communication)-250(descriptor)74(.)]TJ -8.249 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(variable)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 136.328 0 Td [(psb)]TJ +/F147 9.9626 Tf 136.328 0 Td [(psb)]TJ ET q 1 0 0 1 328.257 486.119 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 331.395 485.92 Td [(desc)]TJ +/F147 9.9626 Tf 331.395 485.92 Td [(desc)]TJ ET q 1 0 0 1 352.944 486.119 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 356.083 485.92 Td [(type)]TJ +/F147 9.9626 Tf 356.083 485.92 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -20275,7 +20284,7 @@ ET endstream endobj -1661 0 obj +1662 0 obj << /Length 3208 >> @@ -20293,7 +20302,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(gelp)-250(\227)-250(Applies)-250(a)-250(left)-250(permutation)-250(to)-250(a)-250(dense)-250(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_gelp\050trans,)-525(iperm,)-525(x,)-525(info\051)]TJ +/F147 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_gelp\050trans,)-525(iperm,)-525(x,)-525(info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -20327,9 +20336,9 @@ ET endstream endobj -1667 0 obj +1668 0 obj << -/Length 6625 +/Length 7021 >> stream 0 g 0 G @@ -20356,106 +20365,107 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 251.618 706.129 Td [(loc)-250(\227)-250(Global)-250(to)-250(local)-250(indices)-250(convertion)]TJ +/F75 11.9552 Tf 251.618 706.129 Td [(loc)-250(\227)-250(Global)-250(to)-250(local)-250(indices)-250(conversion)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -100.913 -18.964 Td [(call)-525(psb_glob_to_loc\050x,)-525(y,)-525(desc_a,)-525(info,)-525(iact,owned\051)]TJ 0 -11.955 Td [(call)-525(psb_glob_to_loc\050x,)-525(desc_a,)-525(info,)-525(iact,owned\051)]TJ +/F147 9.9626 Tf -100.913 -19.204 Td [(call)-525(psb_glob_to_loc\050x,)-525(y,)-525(desc_a,)-525(info,)-525(iact,owned\051)]TJ 0 -11.955 Td [(call)-525(psb_glob_to_loc\050x,)-525(desc_a,)-525(info,)-525(iact,owned\051)]TJ 0 g 0 G -/F75 9.9626 Tf 0 -21.109 Td [(T)90(ype:)]TJ +/F75 9.9626 Tf 0 -22.29 Td [(T)90(ype:)]TJ 0 g 0 G /F84 9.9626 Tf 29.439 0 Td [(Asynchr)18(onous.)]TJ 0 g 0 G -/F75 9.9626 Tf -29.439 -19.602 Td [(On)-250(Entry)]TJ +/F75 9.9626 Tf -29.439 -20.42 Td [(On)-250(Entry)]TJ 0 g 0 G 0 g 0 G - 0 -19.601 Td [(x)]TJ + 0 -20.421 Td [(x)]TJ 0 g 0 G -/F84 9.9626 Tf 9.574 0 Td [(An)-250(integer)-250(vector)-250(of)-250(indices)-250(to)-250(be)-250(converted.)]TJ 15.332 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in,)-250(inout)]TJ/F84 9.9626 Tf 38.734 0 Td [(.)]TJ -70.535 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(integer)-250(array)111(.)]TJ +/F84 9.9626 Tf 9.574 0 Td [(An)-250(integer)-250(vector)-250(of)-250(indices)-250(to)-250(be)-250(converted.)]TJ 15.332 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in,)-250(inout)]TJ/F84 9.9626 Tf 38.734 0 Td [(.)]TJ -70.535 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(integer)-250(array)-250(of)-250(global)-250(indices,)-250(i.e.)]TJ/F147 9.9626 Tf 258.339 0 Td [(psb_lpk_)]TJ/F84 9.9626 Tf 41.843 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -24.906 -31.557 Td [(desc)]TJ +/F75 9.9626 Tf -325.088 -32.375 Td [(desc)]TJ ET q -1 0 0 1 171.218 535.72 cm +1 0 0 1 171.218 531.842 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F75 9.9626 Tf 174.207 535.52 Td [(a)]TJ +/F75 9.9626 Tf 174.207 531.643 Td [(a)]TJ 0 g 0 G -/F84 9.9626 Tf 9.962 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ +/F84 9.9626 Tf 9.962 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q -1 0 0 1 360.068 487.899 cm +1 0 0 1 360.068 484.021 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 487.7 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 483.822 Td [(desc)]TJ ET q -1 0 0 1 384.755 487.899 cm +1 0 0 1 384.755 484.021 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 487.7 Td [(type)]TJ +/F147 9.9626 Tf 387.893 483.822 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -258.11 -19.602 Td [(iact)]TJ +/F75 9.9626 Tf -258.11 -20.421 Td [(iact)]TJ 0 g 0 G -/F84 9.9626 Tf 21.021 0 Td [(speci\002es)-250(action)-250(to)-250(be)-250(taken)-250(in)-250(case)-250(of)-250(range)-250(err)18(ors.)-310(Scope:)]TJ/F75 9.9626 Tf 253.795 0 Td [(global)]TJ/F84 9.9626 Tf -250.218 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.983 0 0 1 175.611 432.232 Tm [(Speci\002ed)-254(as:)-316(a)-254(character)-254(variable)]TJ/F145 9.9626 Tf 1 0 0 1 319.381 432.232 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 324.612 432.232 Tm [(gnor)18(e,)]TJ/F145 9.9626 Tf 1 0 0 1 354.422 432.232 Tm [(W)]TJ/F84 9.9626 Tf 0.983 0 0 1 359.653 432.232 Tm [(arning)-254(or)]TJ/F145 9.9626 Tf 1 0 0 1 402.308 432.232 Tm [(A)]TJ/F84 9.9626 Tf 0.983 0 0 1 407.539 432.232 Tm [(bort,)-254(default)]TJ/F145 9.9626 Tf 1 0 0 1 463.572 432.232 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 468.802 432.232 Tm [(gnor)18(e.)]TJ +/F84 9.9626 Tf 21.021 0 Td [(speci\002es)-250(action)-250(to)-250(be)-250(taken)-250(in)-250(case)-250(of)-250(range)-250(err)18(ors.)-310(Scope:)]TJ/F75 9.9626 Tf 253.795 0 Td [(global)]TJ/F84 9.9626 Tf -250.218 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.983 0 0 1 175.611 427.536 Tm [(Speci\002ed)-254(as:)-316(a)-254(character)-254(variable)]TJ/F147 9.9626 Tf 1 0 0 1 319.381 427.536 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 324.612 427.536 Tm [(gnor)18(e,)]TJ/F147 9.9626 Tf 1 0 0 1 354.422 427.536 Tm [(W)]TJ/F84 9.9626 Tf 0.983 0 0 1 359.653 427.536 Tm [(arning)-254(or)]TJ/F147 9.9626 Tf 1 0 0 1 402.308 427.536 Tm [(A)]TJ/F84 9.9626 Tf 0.983 0 0 1 407.539 427.536 Tm [(bort,)-254(default)]TJ/F147 9.9626 Tf 1 0 0 1 463.572 427.536 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 468.802 427.536 Tm [(gnor)18(e.)]TJ 0 g 0 G -/F75 9.9626 Tf 1 0 0 1 150.705 412.631 Tm [(owned)]TJ +/F75 9.9626 Tf 1 0 0 1 150.705 407.115 Tm [(owned)]TJ 0 g 0 G -/F84 9.9626 Tf 35.975 0 Td [(Spec\002es)-250(valid)-250(range)-250(of)-250(input)-250(Scope:)]TJ/F75 9.9626 Tf 159.54 0 Td [(global)]TJ/F84 9.9626 Tf -170.917 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.99 0 0 1 175.611 376.765 Tm [(If)-252(tr)8(ue,)-252(then)-252(on)1(ly)-252(indices)-252(strictly)-252(owned)-252(by)-251(the)-252(curr)18(ent)-252(pr)18(ocess)-251(ar)18(e)-252(consid-)]TJ 1 0 0 1 175.611 364.81 Tm [(er)18(ed)-250(valid,)-250(if)-250(false)-250(then)-250(halo)-250(indices)-250(ar)18(e)-250(also)-250(accepted.)-310(Default:)-310(false.)]TJ +/F84 9.9626 Tf 35.975 0 Td [(Spec\002es)-250(valid)-250(range)-250(of)-250(input)-250(Scope:)]TJ/F75 9.9626 Tf 159.54 0 Td [(global)]TJ/F84 9.9626 Tf -170.917 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.99 0 0 1 175.611 371.249 Tm [(If)-252(tr)8(ue,)-252(then)-252(on)1(ly)-252(indices)-252(strictly)-252(owned)-252(by)-251(the)-252(curr)18(ent)-252(pr)18(ocess)-251(ar)18(e)-252(consid-)]TJ 1 0 0 1 175.611 359.294 Tm [(er)18(ed)-250(valid,)-250(if)-250(false)-250(then)-250(halo)-250(indices)-250(ar)18(e)-250(also)-250(accepted.)-310(Default:)-310(false.)]TJ 0 g 0 G -/F75 9.9626 Tf -24.906 -21.109 Td [(On)-250(Return)]TJ +/F75 9.9626 Tf -24.906 -22.289 Td [(On)-250(Return)]TJ 0 g 0 G 0 g 0 G - 0 -19.601 Td [(x)]TJ + 0 -20.421 Td [(x)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 160.667 324.1 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 170.229 324.1 Tm [(y)]TJ/F84 9.9626 Tf 1.02 0 0 1 177.963 324.1 Tm [(is)-259(not)-258(pr)17(esent,)-262(then)]TJ/F78 9.9626 Tf 1 0 0 1 266.607 324.1 Tm [(x)]TJ/F84 9.9626 Tf 1.02 0 0 1 274.441 324.1 Tm [(is)-259(overwritten)-258(with)-259(the)-258(translated)-259(integer)-259(indices.)]TJ 1 0 0 1 175.611 312.145 Tm [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(integer)-250(array)111(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 160.667 316.584 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 170.229 316.584 Tm [(y)]TJ/F84 9.9626 Tf 1.02 0 0 1 177.963 316.584 Tm [(is)-259(not)-258(pr)17(esent,)-262(then)]TJ/F78 9.9626 Tf 1 0 0 1 266.607 316.584 Tm [(x)]TJ/F84 9.9626 Tf 1.02 0 0 1 274.441 316.584 Tm [(is)-259(overwritten)-258(with)-259(the)-258(translated)-259(integer)-259(indices.)]TJ 1 0 0 1 175.611 304.629 Tm [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(integer)-250(array)111(.)]TJ 0 g 0 G -/F75 9.9626 Tf -24.906 -19.602 Td [(y)]TJ +/F75 9.9626 Tf -24.906 -20.421 Td [(y)]TJ 0 g 0 G -/F84 9.9626 Tf 0.983 0 0 1 161.225 256.677 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 170.403 256.677 Tm [(y)]TJ/F84 9.9626 Tf 0.983 0 0 1 178 256.677 Tm [(is)-254(pr)18(esent,)-254(then)]TJ/F78 9.9626 Tf 1 0 0 1 246.332 256.677 Tm [(y)]TJ/F84 9.9626 Tf 0.983 0 0 1 253.929 256.677 Tm [(is)-254(overwritten)-255(with)-254(the)-254(translated)-255(integer)-254(indices,)-255(and)]TJ/F78 9.9626 Tf 1 0 0 1 489.211 256.677 Tm [(x)]TJ/F84 9.9626 Tf -313.6 -11.955 Td [(is)-250(left)-250(unchanged.)-310(Scope:)]TJ/F75 9.9626 Tf 112.557 0 Td [(global)]TJ/F84 9.9626 Tf -112.865 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.745 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(integer)-250(array)111(.)]TJ +/F84 9.9626 Tf 1.011 0 0 1 161.225 248.343 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 170.585 248.343 Tm [(y)]TJ/F84 9.9626 Tf 1.011 0 0 1 178.178 248.343 Tm [(is)-247(pr)18(esent,)-247(then)]TJ/F78 9.9626 Tf 1 0 0 1 248.232 248.343 Tm [(y)]TJ/F84 9.9626 Tf 1.011 0 0 1 255.825 248.343 Tm [(is)-247(overwritten)-247(with)-247(the)-246(translated)-247(integer)-247(indices,)-247(and)]TJ/F78 9.9626 Tf 1 0 0 1 175.905 236.388 Tm [(x)]TJ/F84 9.9626 Tf 1.001 0 0 1 183.603 236.388 Tm [(is)-250(left)-250(unchanged;)-250(since)]TJ/F78 9.9626 Tf 1 0 0 1 288.967 236.388 Tm [(y)]TJ/F84 9.9626 Tf 1.001 0 0 1 296.565 236.388 Tm [(contains)-250(local)-250(indices)-250(it)-250(should)-250(use)]TJ/F147 9.9626 Tf 1 0 0 1 451.824 236.388 Tm [(psb_ipk_)]TJ/F84 9.9626 Tf 1.001 0 0 1 493.666 236.388 Tm [(.)]TJ 1 0 0 1 175.611 224.433 Tm [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.745 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(integer)-250(array)111(.)]TJ 0 g 0 G -/F75 9.9626 Tf -24.906 -19.602 Td [(info)]TJ +/F75 9.9626 Tf -24.906 -20.421 Td [(info)]TJ 0 g 0 G -/F84 9.9626 Tf 23.8 0 Td [(Err)18(or)-250(code.)]TJ 1.106 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -47.133 -11.956 Td [(An)-250(integer)-250(value;)-250(0)-250(means)-250(no)-250(err)18(or)-250(has)-250(been)-250(detected.)]TJ/F75 11.9552 Tf -24.518 -21.108 Td [(Notes)]TJ +/F84 9.9626 Tf 23.8 0 Td [(Err)18(or)-250(code.)]TJ 1.106 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -47.133 -11.955 Td [(An)-250(integer)-250(value;)-250(0)-250(means)-250(no)-250(err)18(or)-250(has)-250(been)-250(detected.)]TJ 0 g 0 G -/F84 9.9626 Tf 166.874 -29.888 Td [(98)]TJ + 142.356 -29.888 Td [(98)]TJ 0 g 0 G ET endstream endobj -1671 0 obj +1672 0 obj << -/Length 775 +/Length 819 >> stream 0 g 0 G 0 g 0 G -0 g 0 G BT -/F84 9.9626 Tf 112.349 706.129 Td [(1.)]TJ +/F75 11.9552 Tf 99.895 706.129 Td [(Notes)]TJ +0 g 0 G +/F84 9.9626 Tf 12.454 -19.925 Td [(1.)]TJ 0 g 0 G - 1.01 0 0 1 124.802 706.129 Tm [(If)-248(an)-249(input)-248(index)-249(is)-248(out)-248(of)-249(range,)-248(then)-249(the)-248(corr)18(esponding)-249(output)-248(index)-248(is)]TJ 1 0 0 1 124.802 694.174 Tm [(set)-250(to)-250(a)-250(negative)-250(number;)]TJ + 1.01 0 0 1 124.802 686.204 Tm [(If)-248(an)-249(input)-248(index)-249(is)-248(out)-248(of)-249(range,)-248(then)-249(the)-248(corr)18(esponding)-249(output)-248(index)-248(is)]TJ 1 0 0 1 124.802 674.248 Tm [(set)-250(to)-250(a)-250(negative)-250(number;)]TJ 0 g 0 G - -12.453 -19.926 Td [(2.)]TJ + -12.453 -19.925 Td [(2.)]TJ 0 g 0 G - 0.98 0 0 1 124.493 674.248 Tm [(The)-234(default)]TJ/F145 9.9626 Tf 1 0 0 1 176.098 674.248 Tm [(I)]TJ/F84 9.9626 Tf 0.98 0 0 1 181.328 674.248 Tm [(gnor)18(e)-234(means)-234(that)-235(the)-234(negative)-234(output)-234(is)-235(the)-234(only)-234(action)-235(taken)]TJ 1 0 0 1 124.802 662.293 Tm [(on)-250(an)-250(out-of-range)-250(input.)]TJ + 0.98 0 0 1 124.493 654.323 Tm [(The)-234(default)]TJ/F147 9.9626 Tf 1 0 0 1 176.098 654.323 Tm [(I)]TJ/F84 9.9626 Tf 0.98 0 0 1 181.328 654.323 Tm [(gnor)18(e)-234(means)-234(that)-235(the)-234(negative)-234(output)-234(is)-235(the)-234(only)-234(action)-235(taken)]TJ 1 0 0 1 124.802 642.368 Tm [(on)-250(an)-250(out-of-range)-250(input.)]TJ 0 g 0 G - 141.968 -571.855 Td [(99)]TJ + 141.968 -551.93 Td [(99)]TJ 0 g 0 G ET endstream endobj -1678 0 obj +1679 0 obj << -/Length 5816 +/Length 6270 >> stream 0 g 0 G @@ -20485,7 +20495,7 @@ BT /F75 11.9552 Tf 242.974 706.129 Td [(glob)-250(\227)-250(Local)-250(to)-250(global)-250(indices)-250(conversion)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -92.269 -18.964 Td [(call)-525(psb_loc_to_glob\050x,)-525(y,)-525(desc_a,)-525(info,)-525(iact\051)]TJ 0 -11.955 Td [(call)-525(psb_loc_to_glob\050x,)-525(desc_a,)-525(info,)-525(iact\051)]TJ +/F147 9.9626 Tf -92.269 -18.964 Td [(call)-525(psb_loc_to_glob\050x,)-525(y,)-525(desc_a,)-525(info,)-525(iact\051)]TJ 0 -11.955 Td [(call)-525(psb_loc_to_glob\050x,)-525(desc_a,)-525(info,)-525(iact\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -20496,63 +20506,63 @@ BT 0 g 0 G 0 -19.925 Td [(x)]TJ 0 g 0 G -/F84 9.9626 Tf 9.574 0 Td [(An)-250(integer)-250(vector)-250(of)-250(indices)-250(to)-250(be)-250(converted.)]TJ 15.332 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in,)-250(inout)]TJ/F84 9.9626 Tf 38.734 0 Td [(.)]TJ -70.535 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(integer)-250(array)111(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 160.279 613.442 Tm [(An)-306(integer)-306(vector)-307(of)-306(indices)-306(to)-306(be)-307(converted;)-336(if)]TJ/F78 9.9626 Tf 1 0 0 1 375.994 613.442 Tm [(y)]TJ/F84 9.9626 Tf 1.02 0 0 1 384.212 613.442 Tm [(is)-306(pr)17(esent,)-321(they)-306(ar)17(e)-306(local)]TJ 1 0 0 1 175.611 601.486 Tm [(indices,)-250(i.e.)]TJ/F147 9.9626 Tf 51.825 0 Td [(psb_ipk_)]TJ/F84 9.9626 Tf -51.825 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in,)-250(inout)]TJ/F84 9.9626 Tf 38.734 0 Td [(.)]TJ -70.535 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(integer)-250(array)111(.)]TJ 0 g 0 G /F75 9.9626 Tf -24.906 -31.881 Td [(desc)]TJ ET q -1 0 0 1 171.218 533.94 cm +1 0 0 1 171.218 521.985 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F75 9.9626 Tf 174.207 533.74 Td [(a)]TJ +/F75 9.9626 Tf 174.207 521.785 Td [(a)]TJ 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q -1 0 0 1 360.068 486.119 cm +1 0 0 1 360.068 474.164 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 485.92 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 473.965 Td [(desc)]TJ ET q -1 0 0 1 384.755 486.119 cm +1 0 0 1 384.755 474.164 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 485.92 Td [(type)]TJ +/F147 9.9626 Tf 387.893 473.965 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -258.11 -19.926 Td [(iact)]TJ 0 g 0 G -/F84 9.9626 Tf 21.021 0 Td [(speci\002es)-250(action)-250(to)-250(be)-250(taken)-250(in)-250(case)-250(of)-250(range)-250(err)18(ors.)-310(Scope:)]TJ/F75 9.9626 Tf 253.795 0 Td [(global)]TJ/F84 9.9626 Tf -250.218 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.983 0 0 1 175.611 430.129 Tm [(Speci\002ed)-254(as:)-316(a)-254(character)-254(variable)]TJ/F145 9.9626 Tf 1 0 0 1 319.381 430.129 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 324.612 430.129 Tm [(gnor)18(e,)]TJ/F145 9.9626 Tf 1 0 0 1 354.422 430.129 Tm [(W)]TJ/F84 9.9626 Tf 0.983 0 0 1 359.653 430.129 Tm [(arning)-254(or)]TJ/F145 9.9626 Tf 1 0 0 1 402.308 430.129 Tm [(A)]TJ/F84 9.9626 Tf 0.983 0 0 1 407.539 430.129 Tm [(bort,)-254(default)]TJ/F145 9.9626 Tf 1 0 0 1 463.572 430.129 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 468.802 430.129 Tm [(gnor)18(e.)]TJ +/F84 9.9626 Tf 21.021 0 Td [(speci\002es)-250(action)-250(to)-250(be)-250(taken)-250(in)-250(case)-250(of)-250(range)-250(err)18(ors.)-310(Scope:)]TJ/F75 9.9626 Tf 253.795 0 Td [(global)]TJ/F84 9.9626 Tf -250.218 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.983 0 0 1 175.611 418.174 Tm [(Speci\002ed)-254(as:)-316(a)-254(character)-254(variable)]TJ/F147 9.9626 Tf 1 0 0 1 319.381 418.174 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 324.612 418.174 Tm [(gnor)18(e,)]TJ/F147 9.9626 Tf 1 0 0 1 354.422 418.174 Tm [(W)]TJ/F84 9.9626 Tf 0.983 0 0 1 359.653 418.174 Tm [(arning)-254(or)]TJ/F147 9.9626 Tf 1 0 0 1 402.308 418.174 Tm [(A)]TJ/F84 9.9626 Tf 0.983 0 0 1 407.539 418.174 Tm [(bort,)-254(default)]TJ/F147 9.9626 Tf 1 0 0 1 463.572 418.174 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 468.802 418.174 Tm [(gnor)18(e.)]TJ 0 g 0 G -/F75 9.9626 Tf 1 0 0 1 150.705 408.211 Tm [(On)-250(Return)]TJ +/F75 9.9626 Tf 1 0 0 1 150.705 396.256 Tm [(On)-250(Return)]TJ 0 g 0 G 0 g 0 G 0 -19.925 Td [(x)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 160.667 388.286 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 170.229 388.286 Tm [(y)]TJ/F84 9.9626 Tf 1.02 0 0 1 177.963 388.286 Tm [(is)-259(not)-258(pr)17(esent,)-262(then)]TJ/F78 9.9626 Tf 1 0 0 1 266.607 388.286 Tm [(x)]TJ/F84 9.9626 Tf 1.02 0 0 1 274.441 388.286 Tm [(is)-259(overwritten)-258(with)-259(the)-258(translated)-259(integer)-259(indices.)]TJ 1 0 0 1 175.611 376.331 Tm [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(integer)-250(array)111(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 160.667 376.331 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 170.584 376.331 Tm [(y)]TJ/F84 9.9626 Tf 1.02 0 0 1 178.674 376.331 Tm [(is)-294(not)-293(pr)17(esent,)-305(then)]TJ/F78 9.9626 Tf 1 0 0 1 268.828 376.331 Tm [(x)]TJ/F84 9.9626 Tf 1.02 0 0 1 277.018 376.331 Tm [(is)-294(overwritten)-293(with)-294(the)-293(translated)-294(integer)-294(global)]TJ 1 0 0 1 175.611 364.376 Tm [(indices,)-250(i.e.)]TJ/F147 9.9626 Tf 51.825 0 Td [(psb_lpk_)]TJ/F84 9.9626 Tf 44.334 0 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -127.899 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(integer)-250(array)111(.)]TJ 0 g 0 G /F75 9.9626 Tf -24.906 -19.925 Td [(y)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 161.225 320.54 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 170.727 320.54 Tm [(y)]TJ/F84 9.9626 Tf 1.02 0 0 1 178.402 320.54 Tm [(is)-253(not)-253(pr)18(esent,)-255(then)]TJ/F78 9.9626 Tf 1 0 0 1 266.624 320.54 Tm [(y)]TJ/F84 9.9626 Tf 1.02 0 0 1 274.299 320.54 Tm [(is)-253(overwritten)-253(with)-252(the)-253(translated)-253(integer)-253(indices,)]TJ 1 0 0 1 175.611 308.585 Tm [(and)]TJ/F78 9.9626 Tf 19.652 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(left)-250(unchanged.)-310(Scope:)]TJ/F75 9.9626 Tf 112.556 0 Td [(global)]TJ/F84 9.9626 Tf -140.212 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.744 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(integer)-250(array)111(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 161.225 308.585 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 170.816 308.585 Tm [(y)]TJ/F84 9.9626 Tf 1.02 0 0 1 178.579 308.585 Tm [(not)-261(pr)17(esent,)-265(then)]TJ/F78 9.9626 Tf 1 0 0 1 257.253 308.585 Tm [(y)]TJ/F84 9.9626 Tf 1.02 0 0 1 265.016 308.585 Tm [(is)-261(overwritten)-262(with)-261(the)-262(translated)-261(global)-262(indices)-261(i.e.)]TJ/F147 9.9626 Tf 1 0 0 1 175.611 296.63 Tm [(psb_lpk_)]TJ/F84 9.9626 Tf 41.843 0 Td [(,)-250(and)]TJ/F78 9.9626 Tf 24.633 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(is)-250(left)-250(unchanged.)-310(Scope:)]TJ/F75 9.9626 Tf 112.556 0 Td [(global)]TJ/F84 9.9626 Tf -187.036 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.745 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(integer)-250(array)111(.)]TJ 0 g 0 G -/F75 9.9626 Tf -24.907 -19.925 Td [(info)]TJ +/F75 9.9626 Tf -24.906 -19.925 Td [(info)]TJ 0 g 0 G -/F84 9.9626 Tf 23.8 0 Td [(Err)18(or)-250(code.)]TJ 1.107 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -47.133 -11.955 Td [(An)-250(integer)-250(value;)-250(0)-250(means)-250(no)-250(err)18(or)-250(has)-250(been)-250(detected.)]TJ +/F84 9.9626 Tf 23.8 0 Td [(Err)18(or)-250(code.)]TJ 1.106 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -47.133 -11.955 Td [(An)-250(integer)-250(value;)-250(0)-250(means)-250(no)-250(err)18(or)-250(has)-250(been)-250(detected.)]TJ 0 g 0 G - 139.865 -114.535 Td [(100)]TJ + 139.865 -102.58 Td [(100)]TJ 0 g 0 G ET endstream endobj -1683 0 obj +1684 0 obj << /Length 3295 >> @@ -20577,7 +20587,7 @@ BT /F75 11.9552 Tf 170.586 706.129 Td [(owned)-250(\227)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -70.691 -18.964 Td [(call)-525(psb_is_owned\050x,)-525(desc_a\051)]TJ +/F147 9.9626 Tf -70.691 -18.964 Td [(call)-525(psb_is_owned\050x,)-525(desc_a\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -20601,21 +20611,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 498.074 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 497.875 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 497.875 Td [(desc)]TJ ET q 1 0 0 1 333.945 498.074 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 497.875 Td [(type)]TJ +/F147 9.9626 Tf 337.084 497.875 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -20628,7 +20638,7 @@ BT 0 g 0 G /F84 9.9626 Tf 12.454 -19.925 Td [(1.)]TJ 0 g 0 G - 0.997 0 0 1 124.493 366.368 Tm [(This)-252(r)18(outine)-251(r)18(eturns)-252(a)]TJ/F145 9.9626 Tf 1 0 0 1 221.898 366.368 Tm [(.true.)]TJ/F84 9.9626 Tf 0.997 0 0 1 255.779 366.368 Tm [(value)-252(for)-251(an)-252(index)-252(that)-251(is)-252(strictly)-251(owned)-252(by)]TJ 1 0 0 1 124.802 354.413 Tm [(the)-250(curr)18(ent)-250(pr)18(ocess,)-250(excluding)-250(the)-250(halo)-250(indices)]TJ + 0.997 0 0 1 124.493 366.368 Tm [(This)-252(r)18(outine)-251(r)18(eturns)-252(a)]TJ/F147 9.9626 Tf 1 0 0 1 221.898 366.368 Tm [(.true.)]TJ/F84 9.9626 Tf 0.997 0 0 1 255.779 366.368 Tm [(value)-252(for)-251(an)-252(index)-252(that)-251(is)-252(strictly)-251(owned)-252(by)]TJ 1 0 0 1 124.802 354.413 Tm [(the)-250(curr)18(ent)-250(pr)18(ocess,)-250(excluding)-250(the)-250(halo)-250(indices)]TJ 0 g 0 G 139.477 -263.975 Td [(101)]TJ 0 g 0 G @@ -20636,7 +20646,7 @@ ET endstream endobj -1689 0 obj +1690 0 obj << /Length 5095 >> @@ -20661,7 +20671,7 @@ BT /F75 11.9552 Tf 249.299 706.129 Td [(index)-250(\227)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -98.594 -18.964 Td [(call)-525(psb_owned_index\050y,)-525(x,)-525(desc_a,)-525(info\051)]TJ +/F147 9.9626 Tf -98.594 -18.964 Td [(call)-525(psb_owned_index\050y,)-525(x,)-525(desc_a,)-525(info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -20685,27 +20695,27 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 498.074 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 497.875 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 497.875 Td [(desc)]TJ ET q 1 0 0 1 384.755 498.074 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 497.875 Td [(type)]TJ +/F147 9.9626 Tf 387.893 497.875 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -258.11 -19.925 Td [(iact)]TJ 0 g 0 G -/F84 9.9626 Tf 21.021 0 Td [(speci\002es)-250(action)-250(to)-250(be)-250(taken)-250(in)-250(case)-250(of)-250(range)-250(err)18(ors.)-310(Scope:)]TJ/F75 9.9626 Tf 253.795 0 Td [(global)]TJ/F84 9.9626 Tf -250.218 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.983 0 0 1 175.611 442.084 Tm [(Speci\002ed)-254(as:)-316(a)-254(character)-254(variable)]TJ/F145 9.9626 Tf 1 0 0 1 319.381 442.084 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 324.612 442.084 Tm [(gnor)18(e,)]TJ/F145 9.9626 Tf 1 0 0 1 354.422 442.084 Tm [(W)]TJ/F84 9.9626 Tf 0.983 0 0 1 359.653 442.084 Tm [(arning)-254(or)]TJ/F145 9.9626 Tf 1 0 0 1 402.308 442.084 Tm [(A)]TJ/F84 9.9626 Tf 0.983 0 0 1 407.539 442.084 Tm [(bort,)-254(default)]TJ/F145 9.9626 Tf 1 0 0 1 463.572 442.084 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 468.802 442.084 Tm [(gnor)18(e.)]TJ +/F84 9.9626 Tf 21.021 0 Td [(speci\002es)-250(action)-250(to)-250(be)-250(taken)-250(in)-250(case)-250(of)-250(range)-250(err)18(ors.)-310(Scope:)]TJ/F75 9.9626 Tf 253.795 0 Td [(global)]TJ/F84 9.9626 Tf -250.218 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.983 0 0 1 175.611 442.084 Tm [(Speci\002ed)-254(as:)-316(a)-254(character)-254(variable)]TJ/F147 9.9626 Tf 1 0 0 1 319.381 442.084 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 324.612 442.084 Tm [(gnor)18(e,)]TJ/F147 9.9626 Tf 1 0 0 1 354.422 442.084 Tm [(W)]TJ/F84 9.9626 Tf 0.983 0 0 1 359.653 442.084 Tm [(arning)-254(or)]TJ/F147 9.9626 Tf 1 0 0 1 402.308 442.084 Tm [(A)]TJ/F84 9.9626 Tf 0.983 0 0 1 407.539 442.084 Tm [(bort,)-254(default)]TJ/F147 9.9626 Tf 1 0 0 1 463.572 442.084 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 468.802 442.084 Tm [(gnor)18(e.)]TJ 0 g 0 G /F75 9.9626 Tf 1 0 0 1 150.705 420.166 Tm [(On)-250(Return)]TJ 0 g 0 G @@ -20720,7 +20730,7 @@ BT 0 g 0 G /F84 9.9626 Tf 12.453 -19.926 Td [(1.)]TJ 0 g 0 G - 1.02 0 0 1 175.303 242.831 Tm [(This)-383(r)17(outine)-383(r)17(eturns)-383(a)]TJ/F145 9.9626 Tf 1 0 0 1 280.321 242.831 Tm [(.true.)]TJ/F84 9.9626 Tf 1.02 0 0 1 315.6 242.831 Tm [(value)-383(for)-384(those)-383(indices)-384(that)-383(ar)17(e)-383(strictly)]TJ 1 0 0 1 175.611 230.876 Tm [(owned)-250(by)-250(the)-250(curr)18(ent)-250(pr)18(ocess,)-250(excluding)-250(the)-250(halo)-250(indices)]TJ + 1.02 0 0 1 175.303 242.831 Tm [(This)-383(r)17(outine)-383(r)17(eturns)-383(a)]TJ/F147 9.9626 Tf 1 0 0 1 280.321 242.831 Tm [(.true.)]TJ/F84 9.9626 Tf 1.02 0 0 1 315.6 242.831 Tm [(value)-383(for)-384(those)-383(indices)-384(that)-383(ar)17(e)-383(strictly)]TJ 1 0 0 1 175.611 230.876 Tm [(owned)-250(by)-250(the)-250(curr)18(ent)-250(pr)18(ocess,)-250(excluding)-250(the)-250(halo)-250(indices)]TJ 0 g 0 G 139.477 -140.438 Td [(102)]TJ 0 g 0 G @@ -20728,7 +20738,7 @@ ET endstream endobj -1695 0 obj +1696 0 obj << /Length 3275 >> @@ -20753,7 +20763,7 @@ BT /F75 11.9552 Tf 170.586 706.129 Td [(local)-250(\227)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -70.691 -18.964 Td [(call)-525(psb_is_local\050x,)-525(desc_a\051)]TJ +/F147 9.9626 Tf -70.691 -18.964 Td [(call)-525(psb_is_local\050x,)-525(desc_a\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -20777,21 +20787,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 498.074 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 497.875 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 497.875 Td [(desc)]TJ ET q 1 0 0 1 333.945 498.074 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 497.875 Td [(type)]TJ +/F147 9.9626 Tf 337.084 497.875 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -20804,7 +20814,7 @@ BT 0 g 0 G /F84 9.9626 Tf 12.454 -19.925 Td [(1.)]TJ 0 g 0 G - 0.98 0 0 1 124.493 366.368 Tm [(This)-244(r)19(outine)-244(r)18(eturns)-244(a)]TJ/F145 9.9626 Tf 1 0 0 1 219.923 366.368 Tm [(.true.)]TJ/F84 9.9626 Tf 0.98 0 0 1 253.685 366.368 Tm [(value)-244(for)-244(an)-243(index)-244(that)-244(is)-244(local)-243(to)-244(the)-244(curr)18(e)1(nt)]TJ 1 0 0 1 124.503 354.413 Tm [(pr)18(ocess,)-250(including)-250(the)-250(halo)-250(indices)]TJ + 0.98 0 0 1 124.493 366.368 Tm [(This)-244(r)19(outine)-244(r)18(eturns)-244(a)]TJ/F147 9.9626 Tf 1 0 0 1 219.923 366.368 Tm [(.true.)]TJ/F84 9.9626 Tf 0.98 0 0 1 253.685 366.368 Tm [(value)-244(for)-244(an)-243(index)-244(that)-244(is)-244(local)-243(to)-244(the)-244(curr)18(e)1(nt)]TJ 1 0 0 1 124.503 354.413 Tm [(pr)18(ocess,)-250(including)-250(the)-250(halo)-250(indices)]TJ 0 g 0 G 139.776 -263.975 Td [(103)]TJ 0 g 0 G @@ -20812,7 +20822,7 @@ ET endstream endobj -1702 0 obj +1703 0 obj << /Length 5087 >> @@ -20837,7 +20847,7 @@ BT /F75 11.9552 Tf 238.001 706.129 Td [(index)-250(\227)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -87.296 -18.964 Td [(call)-525(psb_local_index\050y,)-525(x,)-525(desc_a,)-525(info\051)]TJ +/F147 9.9626 Tf -87.296 -18.964 Td [(call)-525(psb_local_index\050y,)-525(x,)-525(desc_a,)-525(info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -20861,27 +20871,27 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ -8.558 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 498.074 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 497.875 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 497.875 Td [(desc)]TJ ET q 1 0 0 1 384.755 498.074 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 497.875 Td [(type)]TJ +/F147 9.9626 Tf 387.893 497.875 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -258.11 -19.925 Td [(iact)]TJ 0 g 0 G -/F84 9.9626 Tf 21.021 0 Td [(speci\002es)-250(action)-250(to)-250(be)-250(taken)-250(in)-250(case)-250(of)-250(range)-250(err)18(ors.)-310(Scope:)]TJ/F75 9.9626 Tf 253.795 0 Td [(global)]TJ/F84 9.9626 Tf -250.218 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.983 0 0 1 175.611 442.084 Tm [(Speci\002ed)-254(as:)-316(a)-254(character)-254(variable)]TJ/F145 9.9626 Tf 1 0 0 1 319.381 442.084 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 324.612 442.084 Tm [(gnor)18(e,)]TJ/F145 9.9626 Tf 1 0 0 1 354.422 442.084 Tm [(W)]TJ/F84 9.9626 Tf 0.983 0 0 1 359.653 442.084 Tm [(arning)-254(or)]TJ/F145 9.9626 Tf 1 0 0 1 402.308 442.084 Tm [(A)]TJ/F84 9.9626 Tf 0.983 0 0 1 407.539 442.084 Tm [(bort,)-254(default)]TJ/F145 9.9626 Tf 1 0 0 1 463.572 442.084 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 468.802 442.084 Tm [(gnor)18(e.)]TJ +/F84 9.9626 Tf 21.021 0 Td [(speci\002es)-250(action)-250(to)-250(be)-250(taken)-250(in)-250(case)-250(of)-250(range)-250(err)18(ors.)-310(Scope:)]TJ/F75 9.9626 Tf 253.795 0 Td [(global)]TJ/F84 9.9626 Tf -250.218 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.983 0 0 1 175.611 442.084 Tm [(Speci\002ed)-254(as:)-316(a)-254(character)-254(variable)]TJ/F147 9.9626 Tf 1 0 0 1 319.381 442.084 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 324.612 442.084 Tm [(gnor)18(e,)]TJ/F147 9.9626 Tf 1 0 0 1 354.422 442.084 Tm [(W)]TJ/F84 9.9626 Tf 0.983 0 0 1 359.653 442.084 Tm [(arning)-254(or)]TJ/F147 9.9626 Tf 1 0 0 1 402.308 442.084 Tm [(A)]TJ/F84 9.9626 Tf 0.983 0 0 1 407.539 442.084 Tm [(bort,)-254(default)]TJ/F147 9.9626 Tf 1 0 0 1 463.572 442.084 Tm [(I)]TJ/F84 9.9626 Tf 0.983 0 0 1 468.802 442.084 Tm [(gnor)18(e.)]TJ 0 g 0 G /F75 9.9626 Tf 1 0 0 1 150.705 420.166 Tm [(On)-250(Return)]TJ 0 g 0 G @@ -20896,7 +20906,7 @@ BT 0 g 0 G /F84 9.9626 Tf 12.453 -19.926 Td [(1.)]TJ 0 g 0 G - 1.009 0 0 1 175.303 242.831 Tm [(This)-247(r)18(outine)-247(r)18(eturns)-247(a)]TJ/F145 9.9626 Tf 1 0 0 1 273.698 242.831 Tm [(.true.)]TJ/F84 9.9626 Tf 1.009 0 0 1 307.563 242.831 Tm [(value)-247(for)-247(those)-247(indices)-247(that)-247(ar)18(e)-247(local)-247(to)-247(the)]TJ 1 0 0 1 175.611 230.876 Tm [(curr)18(ent)-250(pr)18(ocess,)-250(including)-250(the)-250(halo)-250(indices.)]TJ + 1.009 0 0 1 175.303 242.831 Tm [(This)-247(r)18(outine)-247(r)18(eturns)-247(a)]TJ/F147 9.9626 Tf 1 0 0 1 273.698 242.831 Tm [(.true.)]TJ/F84 9.9626 Tf 1.009 0 0 1 307.563 242.831 Tm [(value)-247(for)-247(those)-247(indices)-247(that)-247(ar)18(e)-247(local)-247(to)-247(the)]TJ 1 0 0 1 175.611 230.876 Tm [(curr)18(ent)-250(pr)18(ocess,)-250(including)-250(the)-250(halo)-250(indices.)]TJ 0 g 0 G 139.477 -140.438 Td [(104)]TJ 0 g 0 G @@ -20904,7 +20914,7 @@ ET endstream endobj -1708 0 obj +1709 0 obj << /Length 3771 >> @@ -20929,7 +20939,7 @@ BT /F75 11.9552 Tf 177.903 706.129 Td [(boundary)-250(\227)-250(Extract)-250(list)-250(of)-250(boundary)-250(elements)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -78.008 -18.964 Td [(call)-525(psb_get_boundary\050bndel,)-525(desc,)-525(info\051)]TJ +/F147 9.9626 Tf -78.008 -18.964 Td [(call)-525(psb_get_boundary\050bndel,)-525(desc,)-525(info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -20942,21 +20952,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.897 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ 0.01 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 577.576 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 577.576 Td [(desc)]TJ ET q 1 0 0 1 333.945 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 577.576 Td [(type)]TJ +/F147 9.9626 Tf 337.084 577.576 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -20977,7 +20987,7 @@ BT 0 g 0 G 1 0 0 1 112.349 322.532 Tm [(2.)]TJ 0 g 0 G - 0.985 0 0 1 124.802 322.532 Tm [(Otherwise)-253(the)-253(size)-253(of)]TJ/F145 9.9626 Tf 1 0 0 1 218.697 322.532 Tm [(bndel)]TJ/F84 9.9626 Tf 0.985 0 0 1 247.333 322.532 Tm [(will)-253(be)-253(exactly)-253(equal)-253(to)-253(the)-253(number)-253(of)-254(bound-)]TJ 1 0 0 1 124.802 310.577 Tm [(ary)-250(elements.)]TJ + 0.985 0 0 1 124.802 322.532 Tm [(Otherwise)-253(the)-253(size)-253(of)]TJ/F147 9.9626 Tf 1 0 0 1 218.697 322.532 Tm [(bndel)]TJ/F84 9.9626 Tf 0.985 0 0 1 247.333 322.532 Tm [(will)-253(be)-253(exactly)-253(equal)-253(to)-253(the)-253(number)-253(of)-254(bound-)]TJ 1 0 0 1 124.802 310.577 Tm [(ary)-250(elements.)]TJ 0 g 0 G 139.477 -220.139 Td [(105)]TJ 0 g 0 G @@ -20985,7 +20995,7 @@ ET endstream endobj -1715 0 obj +1716 0 obj << /Length 3593 >> @@ -21010,7 +21020,7 @@ BT /F75 11.9552 Tf 228.712 706.129 Td [(overlap)-250(\227)-250(Extract)-250(list)-250(of)-250(overlap)-250(elements)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -78.007 -18.964 Td [(call)-525(psb_get_overlap\050ovrel,)-525(desc,)-525(info\051)]TJ +/F147 9.9626 Tf -78.007 -18.964 Td [(call)-525(psb_get_overlap\050ovrel,)-525(desc,)-525(info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -21023,21 +21033,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.896 0 Td [(the)-250(communication)-250(descriptor)74(.)]TJ 0.01 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 577.576 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 577.576 Td [(desc)]TJ ET q 1 0 0 1 384.755 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 577.576 Td [(type)]TJ +/F147 9.9626 Tf 387.893 577.576 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -21058,7 +21068,7 @@ BT 0 g 0 G -12.453 -19.926 Td [(2.)]TJ 0 g 0 G - 0.98 0 0 1 175.611 322.532 Tm [(Otherwise)-243(the)-242(size)-243(of)]TJ/F145 9.9626 Tf 1 0 0 1 268.625 322.532 Tm [(ovrel)]TJ/F84 9.9626 Tf 0.98 0 0 1 297.147 322.532 Tm [(will)-243(be)-242(exactly)-243(equal)-243(to)-243(the)-242(number)-243(of)-243(overlap)]TJ 1 0 0 1 175.611 310.577 Tm [(elements.)]TJ + 0.98 0 0 1 175.611 322.532 Tm [(Otherwise)-243(the)-242(size)-243(of)]TJ/F147 9.9626 Tf 1 0 0 1 268.625 322.532 Tm [(ovrel)]TJ/F84 9.9626 Tf 0.98 0 0 1 297.147 322.532 Tm [(will)-243(be)-242(exactly)-243(equal)-243(to)-243(the)-242(number)-243(of)-243(overlap)]TJ 1 0 0 1 175.611 310.577 Tm [(elements.)]TJ 0 g 0 G 139.477 -220.139 Td [(106)]TJ 0 g 0 G @@ -21066,47 +21076,47 @@ ET endstream endobj -1612 0 obj +1613 0 obj << /Type /ObjStm /N 100 /First 971 -/Length 10528 +/Length 10541 >> stream -1611 0 352 58 1608 115 1616 210 1613 358 1614 503 1618 650 356 709 1619 767 1615 826 -1623 921 1620 1069 1621 1216 1625 1359 360 1417 1622 1474 1628 1582 1630 1700 1631 1759 1627 1817 -1635 1912 1632 2060 1633 2206 1637 2350 364 2408 1634 2465 1639 2587 1641 2705 1642 2764 1643 2823 -1638 2882 1648 2963 1644 3120 1645 3265 1646 3408 1650 3551 368 3609 1651 3666 1652 3724 1647 3782 -1656 3890 1653 4038 1654 4180 1658 4323 372 4382 1655 4440 1660 4535 1662 4653 376 4711 1659 4768 -1666 4876 1664 5015 1668 5162 380 5221 1665 5279 1670 5387 1672 5505 1673 5563 1674 5621 1669 5679 -1677 5761 1675 5900 1679 6047 384 6106 1676 6164 1682 6272 1680 6411 1684 6558 388 6616 1685 6673 -1681 6731 1688 6839 1686 6978 1690 7125 392 7184 1691 7242 1687 7301 1694 7409 1692 7548 1696 7695 -396 7753 1697 7810 1693 7868 1701 7976 1699 8115 1703 8262 400 8321 1704 8379 1700 8438 1707 8546 -1705 8685 1709 8830 405 8888 1710 8945 1711 9003 1706 9061 1714 9156 1712 9295 1716 9440 409 9499 -% 1611 0 obj +1612 0 352 58 1609 115 1617 210 1614 358 1615 503 1619 650 356 709 1620 767 1616 826 +1624 921 1621 1069 1622 1216 1626 1359 360 1417 1623 1474 1629 1582 1631 1700 1632 1759 1628 1817 +1636 1912 1633 2060 1634 2206 1638 2350 364 2408 1635 2465 1640 2587 1642 2705 1643 2764 1644 2823 +1639 2882 1649 2963 1645 3120 1646 3265 1647 3408 1651 3551 368 3609 1652 3666 1653 3724 1648 3782 +1657 3890 1654 4038 1655 4180 1659 4323 372 4382 1656 4440 1661 4535 1663 4653 376 4711 1660 4768 +1667 4876 1665 5015 1669 5162 380 5221 1666 5279 1671 5387 1673 5505 1674 5563 1675 5621 1670 5679 +1678 5774 1676 5913 1680 6060 384 6119 1677 6177 1683 6285 1681 6424 1685 6571 388 6629 1686 6686 +1682 6744 1689 6852 1687 6991 1691 7138 392 7197 1692 7255 1688 7314 1695 7422 1693 7561 1697 7708 +396 7766 1698 7823 1694 7881 1702 7989 1700 8128 1704 8275 400 8334 1705 8392 1701 8451 1708 8559 +1706 8698 1710 8843 405 8901 1711 8958 1712 9016 1707 9074 1715 9169 1713 9308 1717 9453 409 9512 +% 1612 0 obj << -/D [1609 0 R /XYZ 98.895 753.953 null] +/D [1610 0 R /XYZ 98.895 753.953 null] >> % 352 0 obj << -/D [1609 0 R /XYZ 99.895 716.092 null] +/D [1610 0 R /XYZ 99.895 716.092 null] >> -% 1608 0 obj +% 1609 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1616 0 obj +% 1617 0 obj << /Type /Page -/Contents 1617 0 R -/Resources 1615 0 R +/Contents 1618 0 R +/Resources 1616 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1577 0 R -/Annots [ 1613 0 R 1614 0 R ] +/Parent 1578 0 R +/Annots [ 1614 0 R 1615 0 R ] >> -% 1613 0 obj +% 1614 0 obj << /Type /Annot /Subtype /Link @@ -21114,7 +21124,7 @@ stream /Rect [342.753 559.823 420.271 571.882] /A << /S /GoTo /D (spdata) >> >> -% 1614 0 obj +% 1615 0 obj << /Type /Annot /Subtype /Link @@ -21122,33 +21132,33 @@ stream /Rect [342.753 492.077 409.811 504.136] /A << /S /GoTo /D (descdata) >> >> -% 1618 0 obj +% 1619 0 obj << -/D [1616 0 R /XYZ 149.705 753.953 null] +/D [1617 0 R /XYZ 149.705 753.953 null] >> % 356 0 obj << -/D [1616 0 R /XYZ 150.705 716.092 null] +/D [1617 0 R /XYZ 150.705 716.092 null] >> -% 1619 0 obj +% 1620 0 obj << -/D [1616 0 R /XYZ 150.705 312.355 null] +/D [1617 0 R /XYZ 150.705 312.355 null] >> -% 1615 0 obj +% 1616 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1623 0 obj +% 1624 0 obj << /Type /Page -/Contents 1624 0 R -/Resources 1622 0 R +/Contents 1625 0 R +/Resources 1623 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1626 0 R -/Annots [ 1620 0 R 1621 0 R ] +/Parent 1627 0 R +/Annots [ 1621 0 R 1622 0 R ] >> -% 1620 0 obj +% 1621 0 obj << /Type /Annot /Subtype /Link @@ -21156,7 +21166,7 @@ stream /Rect [260.133 577.893 327.191 589.953] /A << /S /GoTo /D (descdata) >> >> -% 1621 0 obj +% 1622 0 obj << /Type /Annot /Subtype /Link @@ -21164,50 +21174,50 @@ stream /Rect [210.44 128.475 286.494 140.535] /A << /S /GoTo /D (vdata) >> >> -% 1625 0 obj +% 1626 0 obj << -/D [1623 0 R /XYZ 98.895 753.953 null] +/D [1624 0 R /XYZ 98.895 753.953 null] >> % 360 0 obj << -/D [1623 0 R /XYZ 99.895 716.092 null] +/D [1624 0 R /XYZ 99.895 716.092 null] >> -% 1622 0 obj +% 1623 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1628 0 obj +% 1629 0 obj << /Type /Page -/Contents 1629 0 R -/Resources 1627 0 R +/Contents 1630 0 R +/Resources 1628 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1626 0 R +/Parent 1627 0 R >> -% 1630 0 obj +% 1631 0 obj << -/D [1628 0 R /XYZ 149.705 753.953 null] +/D [1629 0 R /XYZ 149.705 753.953 null] >> -% 1631 0 obj +% 1632 0 obj << -/D [1628 0 R /XYZ 150.705 632.19 null] +/D [1629 0 R /XYZ 150.705 632.19 null] >> -% 1627 0 obj +% 1628 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1635 0 obj +% 1636 0 obj << /Type /Page -/Contents 1636 0 R -/Resources 1634 0 R +/Contents 1637 0 R +/Resources 1635 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1626 0 R -/Annots [ 1632 0 R 1633 0 R ] +/Parent 1627 0 R +/Annots [ 1633 0 R 1634 0 R ] >> -% 1632 0 obj +% 1633 0 obj << /Type /Annot /Subtype /Link @@ -21215,7 +21225,7 @@ stream /Rect [291.943 362.621 359.001 374.68] /A << /S /GoTo /D (descdata) >> >> -% 1633 0 obj +% 1634 0 obj << /Type /Annot /Subtype /Link @@ -21223,54 +21233,54 @@ stream /Rect [367.353 207.637 443.407 219.697] /A << /S /GoTo /D (vdata) >> >> -% 1637 0 obj +% 1638 0 obj << -/D [1635 0 R /XYZ 98.895 753.953 null] +/D [1636 0 R /XYZ 98.895 753.953 null] >> % 364 0 obj << -/D [1635 0 R /XYZ 99.895 716.092 null] +/D [1636 0 R /XYZ 99.895 716.092 null] >> -% 1634 0 obj +% 1635 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1639 0 obj +% 1640 0 obj << /Type /Page -/Contents 1640 0 R -/Resources 1638 0 R +/Contents 1641 0 R +/Resources 1639 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1626 0 R ->> -% 1641 0 obj -<< -/D [1639 0 R /XYZ 149.705 753.953 null] +/Parent 1627 0 R >> % 1642 0 obj << -/D [1639 0 R /XYZ 150.705 701.929 null] +/D [1640 0 R /XYZ 149.705 753.953 null] >> % 1643 0 obj << -/D [1639 0 R /XYZ 150.705 680.684 null] +/D [1640 0 R /XYZ 150.705 701.929 null] >> -% 1638 0 obj +% 1644 0 obj +<< +/D [1640 0 R /XYZ 150.705 680.684 null] +>> +% 1639 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1648 0 obj +% 1649 0 obj << /Type /Page -/Contents 1649 0 R -/Resources 1647 0 R +/Contents 1650 0 R +/Resources 1648 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1626 0 R -/Annots [ 1644 0 R 1645 0 R 1646 0 R ] +/Parent 1627 0 R +/Annots [ 1645 0 R 1646 0 R 1647 0 R ] >> -% 1644 0 obj +% 1645 0 obj << /Type /Annot /Subtype /Link @@ -21278,7 +21288,7 @@ stream /Rect [260.133 573.77 327.191 585.83] /A << /S /GoTo /D (descdata) >> >> -% 1645 0 obj +% 1646 0 obj << /Type /Annot /Subtype /Link @@ -21286,7 +21296,7 @@ stream /Rect [271.52 482.114 347.574 494.174] /A << /S /GoTo /D (vdata) >> >> -% 1646 0 obj +% 1647 0 obj << /Type /Annot /Subtype /Link @@ -21294,37 +21304,37 @@ stream /Rect [157.09 380.495 233.145 392.555] /A << /S /GoTo /D (vdata) >> >> -% 1650 0 obj +% 1651 0 obj << -/D [1648 0 R /XYZ 98.895 753.953 null] +/D [1649 0 R /XYZ 98.895 753.953 null] >> % 368 0 obj << -/D [1648 0 R /XYZ 99.895 716.092 null] +/D [1649 0 R /XYZ 99.895 716.092 null] >> -% 1651 0 obj +% 1652 0 obj << -/D [1648 0 R /XYZ 99.895 278.482 null] +/D [1649 0 R /XYZ 99.895 278.482 null] >> -% 1652 0 obj +% 1653 0 obj << -/D [1648 0 R /XYZ 99.895 244.007 null] +/D [1649 0 R /XYZ 99.895 244.007 null] >> -% 1647 0 obj +% 1648 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1656 0 obj +% 1657 0 obj << /Type /Page -/Contents 1657 0 R -/Resources 1655 0 R +/Contents 1658 0 R +/Resources 1656 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1626 0 R -/Annots [ 1653 0 R 1654 0 R ] +/Parent 1627 0 R +/Annots [ 1654 0 R 1655 0 R ] >> -% 1653 0 obj +% 1654 0 obj << /Type /Annot /Subtype /Link @@ -21332,7 +21342,7 @@ stream /Rect [207.9 561.815 283.954 573.875] /A << /S /GoTo /D (vdata) >> >> -% 1654 0 obj +% 1655 0 obj << /Type /Annot /Subtype /Link @@ -21340,135 +21350,135 @@ stream /Rect [310.942 482.114 378 494.174] /A << /S /GoTo /D (descdata) >> >> -% 1658 0 obj +% 1659 0 obj << -/D [1656 0 R /XYZ 149.705 753.953 null] +/D [1657 0 R /XYZ 149.705 753.953 null] >> % 372 0 obj << -/D [1656 0 R /XYZ 150.705 716.092 null] +/D [1657 0 R /XYZ 150.705 716.092 null] >> -% 1655 0 obj +% 1656 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1660 0 obj +% 1661 0 obj << /Type /Page -/Contents 1661 0 R -/Resources 1659 0 R +/Contents 1662 0 R +/Resources 1660 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1663 0 R +/Parent 1664 0 R >> -% 1662 0 obj +% 1663 0 obj << -/D [1660 0 R /XYZ 98.895 753.953 null] +/D [1661 0 R /XYZ 98.895 753.953 null] >> % 376 0 obj << -/D [1660 0 R /XYZ 99.895 716.092 null] +/D [1661 0 R /XYZ 99.895 716.092 null] >> -% 1659 0 obj +% 1660 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1666 0 obj +% 1667 0 obj << /Type /Page -/Contents 1667 0 R -/Resources 1665 0 R +/Contents 1668 0 R +/Resources 1666 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1663 0 R -/Annots [ 1664 0 R ] +/Parent 1664 0 R +/Annots [ 1665 0 R ] >> -% 1664 0 obj +% 1665 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [342.753 483.894 409.811 495.954] +/Rect [342.753 480.016 409.811 492.076] /A << /S /GoTo /D (descdata) >> >> -% 1668 0 obj +% 1669 0 obj << -/D [1666 0 R /XYZ 149.705 753.953 null] +/D [1667 0 R /XYZ 149.705 753.953 null] >> % 380 0 obj << -/D [1666 0 R /XYZ 150.705 716.092 null] +/D [1667 0 R /XYZ 150.705 716.092 null] >> -% 1665 0 obj +% 1666 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1670 0 obj +% 1671 0 obj << /Type /Page -/Contents 1671 0 R -/Resources 1669 0 R +/Contents 1672 0 R +/Resources 1670 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1663 0 R ->> -% 1672 0 obj -<< -/D [1670 0 R /XYZ 98.895 753.953 null] +/Parent 1664 0 R >> % 1673 0 obj << -/D [1670 0 R /XYZ 99.895 716.092 null] +/D [1671 0 R /XYZ 98.895 753.953 null] >> % 1674 0 obj << -/D [1670 0 R /XYZ 99.895 687.379 null] +/D [1671 0 R /XYZ 99.895 701.929 null] >> -% 1669 0 obj +% 1675 0 obj << -/Font << /F84 687 0 R /F145 940 0 R >> +/D [1671 0 R /XYZ 99.895 667.454 null] +>> +% 1670 0 obj +<< +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1677 0 obj +% 1678 0 obj << /Type /Page -/Contents 1678 0 R -/Resources 1676 0 R +/Contents 1679 0 R +/Resources 1677 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1663 0 R -/Annots [ 1675 0 R ] +/Parent 1664 0 R +/Annots [ 1676 0 R ] >> -% 1675 0 obj +% 1676 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [342.753 482.114 409.811 494.174] +/Rect [342.753 470.159 409.811 482.219] /A << /S /GoTo /D (descdata) >> >> -% 1679 0 obj +% 1680 0 obj << -/D [1677 0 R /XYZ 149.705 753.953 null] +/D [1678 0 R /XYZ 149.705 753.953 null] >> % 384 0 obj << -/D [1677 0 R /XYZ 150.705 716.092 null] +/D [1678 0 R /XYZ 150.705 716.092 null] >> -% 1676 0 obj +% 1677 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1682 0 obj +% 1683 0 obj << /Type /Page -/Contents 1683 0 R -/Resources 1681 0 R +/Contents 1684 0 R +/Resources 1682 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1663 0 R -/Annots [ 1680 0 R ] +/Parent 1664 0 R +/Annots [ 1681 0 R ] >> -% 1680 0 obj +% 1681 0 obj << /Type /Annot /Subtype /Link @@ -21476,33 +21486,33 @@ stream /Rect [291.943 494.069 359.001 506.129] /A << /S /GoTo /D (descdata) >> >> -% 1684 0 obj +% 1685 0 obj << -/D [1682 0 R /XYZ 98.895 753.953 null] +/D [1683 0 R /XYZ 98.895 753.953 null] >> % 388 0 obj << -/D [1682 0 R /XYZ 99.895 716.092 null] +/D [1683 0 R /XYZ 99.895 716.092 null] >> -% 1685 0 obj +% 1686 0 obj << -/D [1682 0 R /XYZ 99.895 382.093 null] +/D [1683 0 R /XYZ 99.895 382.093 null] >> -% 1681 0 obj +% 1682 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1688 0 obj +% 1689 0 obj << /Type /Page -/Contents 1689 0 R -/Resources 1687 0 R +/Contents 1690 0 R +/Resources 1688 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1663 0 R -/Annots [ 1686 0 R ] +/Parent 1664 0 R +/Annots [ 1687 0 R ] >> -% 1686 0 obj +% 1687 0 obj << /Type /Annot /Subtype /Link @@ -21510,33 +21520,33 @@ stream /Rect [342.753 494.069 409.811 506.129] /A << /S /GoTo /D (descdata) >> >> -% 1690 0 obj +% 1691 0 obj << -/D [1688 0 R /XYZ 149.705 753.953 null] +/D [1689 0 R /XYZ 149.705 753.953 null] >> % 392 0 obj << -/D [1688 0 R /XYZ 150.705 716.092 null] +/D [1689 0 R /XYZ 150.705 716.092 null] >> -% 1691 0 obj +% 1692 0 obj << -/D [1688 0 R /XYZ 150.705 258.556 null] +/D [1689 0 R /XYZ 150.705 258.556 null] >> -% 1687 0 obj +% 1688 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1694 0 obj +% 1695 0 obj << /Type /Page -/Contents 1695 0 R -/Resources 1693 0 R +/Contents 1696 0 R +/Resources 1694 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1698 0 R -/Annots [ 1692 0 R ] +/Parent 1699 0 R +/Annots [ 1693 0 R ] >> -% 1692 0 obj +% 1693 0 obj << /Type /Annot /Subtype /Link @@ -21544,33 +21554,33 @@ stream /Rect [291.943 494.069 359.001 506.129] /A << /S /GoTo /D (descdata) >> >> -% 1696 0 obj +% 1697 0 obj << -/D [1694 0 R /XYZ 98.895 753.953 null] +/D [1695 0 R /XYZ 98.895 753.953 null] >> % 396 0 obj << -/D [1694 0 R /XYZ 99.895 716.092 null] +/D [1695 0 R /XYZ 99.895 716.092 null] >> -% 1697 0 obj +% 1698 0 obj << -/D [1694 0 R /XYZ 99.895 382.093 null] +/D [1695 0 R /XYZ 99.895 382.093 null] >> -% 1693 0 obj +% 1694 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1701 0 obj +% 1702 0 obj << /Type /Page -/Contents 1702 0 R -/Resources 1700 0 R +/Contents 1703 0 R +/Resources 1701 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1698 0 R -/Annots [ 1699 0 R ] +/Parent 1699 0 R +/Annots [ 1700 0 R ] >> -% 1699 0 obj +% 1700 0 obj << /Type /Annot /Subtype /Link @@ -21578,33 +21588,33 @@ stream /Rect [342.753 494.069 409.811 506.129] /A << /S /GoTo /D (descdata) >> >> -% 1703 0 obj +% 1704 0 obj << -/D [1701 0 R /XYZ 149.705 753.953 null] +/D [1702 0 R /XYZ 149.705 753.953 null] >> % 400 0 obj << -/D [1701 0 R /XYZ 150.705 716.092 null] +/D [1702 0 R /XYZ 150.705 716.092 null] >> -% 1704 0 obj +% 1705 0 obj << -/D [1701 0 R /XYZ 150.705 258.556 null] +/D [1702 0 R /XYZ 150.705 258.556 null] >> -% 1700 0 obj +% 1701 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1707 0 obj +% 1708 0 obj << /Type /Page -/Contents 1708 0 R -/Resources 1706 0 R +/Contents 1709 0 R +/Resources 1707 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1698 0 R -/Annots [ 1705 0 R ] +/Parent 1699 0 R +/Annots [ 1706 0 R ] >> -% 1705 0 obj +% 1706 0 obj << /Type /Annot /Subtype /Link @@ -21612,37 +21622,37 @@ stream /Rect [291.943 573.77 359.001 585.83] /A << /S /GoTo /D (descdata) >> >> -% 1709 0 obj +% 1710 0 obj << -/D [1707 0 R /XYZ 98.895 753.953 null] +/D [1708 0 R /XYZ 98.895 753.953 null] >> % 405 0 obj << -/D [1707 0 R /XYZ 99.895 716.092 null] +/D [1708 0 R /XYZ 99.895 716.092 null] >> -% 1710 0 obj +% 1711 0 obj << -/D [1707 0 R /XYZ 99.895 370.138 null] +/D [1708 0 R /XYZ 99.895 370.138 null] >> -% 1711 0 obj +% 1712 0 obj << -/D [1707 0 R /XYZ 99.895 335.663 null] +/D [1708 0 R /XYZ 99.895 335.663 null] >> -% 1706 0 obj +% 1707 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1714 0 obj +% 1715 0 obj << /Type /Page -/Contents 1715 0 R -/Resources 1713 0 R +/Contents 1716 0 R +/Resources 1714 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1698 0 R -/Annots [ 1712 0 R ] +/Parent 1699 0 R +/Annots [ 1713 0 R ] >> -% 1712 0 obj +% 1713 0 obj << /Type /Annot /Subtype /Link @@ -21650,18 +21660,18 @@ stream /Rect [342.753 573.77 409.811 585.83] /A << /S /GoTo /D (descdata) >> >> -% 1716 0 obj +% 1717 0 obj << -/D [1714 0 R /XYZ 149.705 753.953 null] +/D [1715 0 R /XYZ 149.705 753.953 null] >> % 409 0 obj << -/D [1714 0 R /XYZ 150.705 716.092 null] +/D [1715 0 R /XYZ 150.705 716.092 null] >> endstream endobj -1723 0 obj +1724 0 obj << /Length 5529 >> @@ -21686,7 +21696,7 @@ BT /F75 11.9552 Tf 173.91 706.129 Td [(getrow)-250(\227)-250(Extract)-250(row\050s\051)-250(from)-250(a)-250(sparse)-250(matrix)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -74.015 -19.204 Td [(call)-525(psb_sp_getrow\050row,)-525(a,)-525(nz,)-525(ia,)-525(ja,)-525(val,)-525(info,)-525(&)]TJ 73.225 -11.955 Td [(&)-525(append,)-525(nzin,)-525(lrw\051)]TJ +/F147 9.9626 Tf -74.015 -19.204 Td [(call)-525(psb_sp_getrow\050row,)-525(a,)-525(nz,)-525(ia,)-525(ja,)-525(val,)-525(info,)-525(&)]TJ 73.225 -11.955 Td [(&)-525(append,)-525(nzin,)-525(lrw\051)]TJ 0 g 0 G /F75 9.9626 Tf -73.225 -22.29 Td [(T)90(ype:)]TJ 0 g 0 G @@ -21697,27 +21707,27 @@ BT 0 g 0 G 0 -20.421 Td [(row)]TJ 0 g 0 G -/F84 9.9626 Tf 22.386 0 Td [(The)-250(\050\002rst\051)-250(r)18(ow)-250(to)-250(be)-250(extracted.)]TJ 2.521 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf -28.652 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf -23.691 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)]TJ/F148 10.3811 Tf 104.323 0 Td [(>)]TJ/F84 9.9626 Tf 10.961 0 Td [(0.)]TJ +/F84 9.9626 Tf 22.386 0 Td [(The)-250(\050\002rst\051)-250(r)18(ow)-250(to)-250(be)-250(extracted.)]TJ 2.521 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf -28.652 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf -23.691 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)]TJ/F152 10.3811 Tf 104.323 0 Td [(>)]TJ/F84 9.9626 Tf 10.961 0 Td [(0.)]TJ 0 g 0 G /F75 9.9626 Tf -140.191 -20.42 Td [(a)]TJ 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(matrix)-250(fr)18(om)-250(which)-250(to)-250(get)-250(r)18(ows.)]TJ 14.944 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf -28.652 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf -23.691 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 495.976 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 495.777 Td [(Tspmat)]TJ +/F147 9.9626 Tf 312.397 495.777 Td [(Tspmat)]TJ ET q 1 0 0 1 344.406 495.976 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 347.544 495.777 Td [(type)]TJ +/F147 9.9626 Tf 347.544 495.777 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -21727,11 +21737,11 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -20.421 Td [(nzin)]TJ 0 g 0 G -/F84 9.9626 Tf 25.455 0 Td [(Input)-250(size)-250(to)-250(be)-250(appended)-250(to.)]TJ -0.548 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf -28.652 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf -23.691 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 359.294 Tm [(Speci\002ed)-267(as:)-347(an)-267(integer)]TJ/F148 10.3811 Tf 1 0 0 1 232.103 359.294 Tm [(>)]TJ/F84 9.9626 Tf 1.02 0 0 1 243.473 359.294 Tm [(0.)-369(When)-267(append)-267(is)-267(tr)8(ue,)-272(speci\002es)-267(how)-267(many)]TJ 1 0 0 1 124.802 347.339 Tm [(entries)-250(in)-250(the)-250(output)-250(vectors)-250(ar)18(e)-250(alr)18(eady)-250(\002lled.)]TJ +/F84 9.9626 Tf 25.455 0 Td [(Input)-250(size)-250(to)-250(be)-250(appended)-250(to.)]TJ -0.548 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf -28.652 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf -23.691 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 359.294 Tm [(Speci\002ed)-267(as:)-347(an)-267(integer)]TJ/F152 10.3811 Tf 1 0 0 1 232.103 359.294 Tm [(>)]TJ/F84 9.9626 Tf 1.02 0 0 1 243.473 359.294 Tm [(0.)-369(When)-267(append)-267(is)-267(tr)8(ue,)-272(speci\002es)-267(how)-267(many)]TJ 1 0 0 1 124.802 347.339 Tm [(entries)-250(in)-250(the)-250(output)-250(vectors)-250(ar)18(e)-250(alr)18(eady)-250(\002lled.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -20.421 Td [(lrw)]TJ 0 g 0 G -/F84 9.9626 Tf 20.165 0 Td [(The)-250(last)-250(r)18(ow)-250(to)-250(be)-250(extracted.)]TJ 4.742 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf -28.652 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf -23.691 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)]TJ/F148 10.3811 Tf 104.323 0 Td [(>)]TJ/F84 9.9626 Tf 10.961 0 Td [(0,)-250(default:)]TJ/F78 9.9626 Tf 46.879 0 Td [(r)-17(o)-35(w)]TJ/F84 9.9626 Tf 16.134 0 Td [(.)]TJ +/F84 9.9626 Tf 20.165 0 Td [(The)-250(last)-250(r)18(ow)-250(to)-250(be)-250(extracted.)]TJ 4.742 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf -28.652 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf -23.691 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)]TJ/F152 10.3811 Tf 104.323 0 Td [(>)]TJ/F84 9.9626 Tf 10.961 0 Td [(0,)-250(default:)]TJ/F78 9.9626 Tf 46.879 0 Td [(r)-17(o)-35(w)]TJ/F84 9.9626 Tf 16.134 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -203.204 -22.29 Td [(On)-250(Return)]TJ 0 g 0 G @@ -21742,7 +21752,7 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -20.421 Td [(ia)]TJ 0 g 0 G -/F84 9.9626 Tf 13.28 0 Td [(the)-250(r)18(ow)-250(indices.)]TJ 11.627 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)-250(with)-250(the)]TJ/F145 9.9626 Tf 169.114 0 Td [(ALLOCATABLE)]TJ/F84 9.9626 Tf 60.024 0 Td [(attribute.)]TJ +/F84 9.9626 Tf 13.28 0 Td [(the)-250(r)18(ow)-250(indices.)]TJ 11.627 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.343 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)-250(with)-250(the)]TJ/F147 9.9626 Tf 169.114 0 Td [(ALLOCATABLE)]TJ/F84 9.9626 Tf 60.024 0 Td [(attribute.)]TJ 0 g 0 G -89.661 -29.888 Td [(107)]TJ 0 g 0 G @@ -21750,7 +21760,7 @@ ET endstream endobj -1727 0 obj +1728 0 obj << /Length 3789 >> @@ -21761,11 +21771,11 @@ stream BT /F75 9.9626 Tf 150.705 706.129 Td [(ja)]TJ 0 g 0 G -/F84 9.9626 Tf 13.28 0 Td [(the)-250(column)-250(indices)-250(of)-250(the)-250(elements)-250(to)-250(be)-250(inserted.)]TJ 11.626 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)-250(with)-250(the)]TJ/F145 9.9626 Tf 169.114 0 Td [(ALLOCATABLE)]TJ/F84 9.9626 Tf 60.025 0 Td [(attribute.)]TJ +/F84 9.9626 Tf 13.28 0 Td [(the)-250(column)-250(indices)-250(of)-250(the)-250(elements)-250(to)-250(be)-250(inserted.)]TJ 11.626 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)-250(with)-250(the)]TJ/F147 9.9626 Tf 169.114 0 Td [(ALLOCATABLE)]TJ/F84 9.9626 Tf 60.025 0 Td [(attribute.)]TJ 0 g 0 G /F75 9.9626 Tf -254.045 -19.925 Td [(val)]TJ 0 g 0 G -/F84 9.9626 Tf 18.819 0 Td [(the)-250(elements)-250(to)-250(be)-250(inserted.)]TJ 6.087 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.983 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.148 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(r)18(eal)-250(array)-250(with)-250(the)]TJ/F145 9.9626 Tf 148.76 0 Td [(ALLOCATABLE)]TJ/F84 9.9626 Tf 60.025 0 Td [(attribute.)]TJ +/F84 9.9626 Tf 18.819 0 Td [(the)-250(elements)-250(to)-250(be)-250(inserted.)]TJ 6.087 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 28.344 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -50.231 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.983 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.148 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(r)18(eal)-250(array)-250(with)-250(the)]TJ/F147 9.9626 Tf 148.76 0 Td [(ALLOCATABLE)]TJ/F84 9.9626 Tf 60.025 0 Td [(attribute.)]TJ 0 g 0 G /F75 9.9626 Tf -233.692 -19.925 Td [(info)]TJ 0 g 0 G @@ -21773,15 +21783,15 @@ BT 0 g 0 G /F84 9.9626 Tf 12.453 -19.925 Td [(1.)]TJ 0 g 0 G - 1.02 0 0 1 175.303 480.973 Tm [(The)-263(outp)1(ut)]TJ/F78 9.9626 Tf 1 0 0 1 228.31 480.973 Tm [(n)-25(z)]TJ/F84 9.9626 Tf 1.02 0 0 1 241.315 480.973 Tm [(is)-263(always)-262(the)-263(size)-262(of)-263(the)-262(output)-263(generated)-263(b)1(y)-263(the)-263(curr)18(ent)]TJ 1.016 0 0 1 175.611 469.018 Tm [(call;)-246(thus,)-246(if)]TJ/F145 9.9626 Tf 1 0 0 1 229.489 469.018 Tm [(append=.true.)]TJ/F84 9.9626 Tf 1.016 0 0 1 297.484 469.018 Tm [(,)-246(the)-246(total)-246(output)-246(size)-246(will)-246(be)]TJ/F78 9.9626 Tf 1 0 0 1 427.023 469.018 Tm [(n)-25(z)-18(i)-32(n)]TJ/F192 10.3811 Tf 21.204 0 Td [(+)]TJ/F78 9.9626 Tf 10.255 0 Td [(n)-25(z)]TJ/F84 9.9626 Tf 1.016 0 0 1 468.818 469.018 Tm [(,)-246(with)]TJ 1.017 0 0 1 175.611 457.063 Tm [(the)-247(newly)-246(extracted)-247(coef)18(\002cients)-247(stor)18(ed)-247(in)-246(entries)]TJ/F145 9.9626 Tf 1 0 0 1 393.234 457.063 Tm [(nzin+1:nzin+nz)]TJ/F84 9.9626 Tf 1.017 0 0 1 468.958 457.063 Tm [(of)-247(the)]TJ 1 0 0 1 175.611 445.108 Tm [(array)-250(ar)18(guments;)]TJ + 1.02 0 0 1 175.303 480.973 Tm [(The)-263(outp)1(ut)]TJ/F78 9.9626 Tf 1 0 0 1 228.31 480.973 Tm [(n)-25(z)]TJ/F84 9.9626 Tf 1.02 0 0 1 241.315 480.973 Tm [(is)-263(always)-262(the)-263(size)-262(of)-263(the)-262(output)-263(generated)-263(b)1(y)-263(the)-263(curr)18(ent)]TJ 1.016 0 0 1 175.611 469.018 Tm [(call;)-246(thus,)-246(if)]TJ/F147 9.9626 Tf 1 0 0 1 229.489 469.018 Tm [(append=.true.)]TJ/F84 9.9626 Tf 1.016 0 0 1 297.484 469.018 Tm [(,)-246(the)-246(total)-246(output)-246(size)-246(will)-246(be)]TJ/F78 9.9626 Tf 1 0 0 1 427.023 469.018 Tm [(n)-25(z)-18(i)-32(n)]TJ/F197 10.3811 Tf 21.204 0 Td [(+)]TJ/F78 9.9626 Tf 10.255 0 Td [(n)-25(z)]TJ/F84 9.9626 Tf 1.016 0 0 1 468.818 469.018 Tm [(,)-246(with)]TJ 1.017 0 0 1 175.611 457.063 Tm [(the)-247(newly)-246(extracted)-247(coef)18(\002cients)-247(stor)18(ed)-247(in)-246(entries)]TJ/F147 9.9626 Tf 1 0 0 1 393.234 457.063 Tm [(nzin+1:nzin+nz)]TJ/F84 9.9626 Tf 1.017 0 0 1 468.958 457.063 Tm [(of)-247(the)]TJ 1 0 0 1 175.611 445.108 Tm [(array)-250(ar)18(guments;)]TJ 0 g 0 G -12.453 -19.926 Td [(2.)]TJ 0 g 0 G - [-450(When)]TJ/F145 9.9626 Tf 40.777 0 Td [(append=.true.)]TJ/F84 9.9626 Tf 70.485 0 Td [(the)-250(output)-250(arrays)-250(ar)18(e)-250(r)18(eallocated)-250(as)-250(necessary;)]TJ + [-450(When)]TJ/F147 9.9626 Tf 40.777 0 Td [(append=.true.)]TJ/F84 9.9626 Tf 70.485 0 Td [(the)-250(output)-250(arrays)-250(ar)18(e)-250(r)18(eallocated)-250(as)-250(necessary;)]TJ 0 g 0 G -111.262 -19.925 Td [(3.)]TJ 0 g 0 G - 0.98 0 0 1 175.303 405.257 Tm [(The)-204(r)19(ow)-204(and)-204(column)-204(indices)-203(ar)18(e)-204(r)19(eturned)-204(in)-204(the)-203(local)-204(numbering)-204(scheme;)-221(if)]TJ 0.98 0 0 1 175.611 393.302 Tm [(the)-194(global)-194(numbering)-194(is)-193(desir)18(ed,)-206(the)-194(user)-194(may)-194(employ)-194(the)]TJ/F145 9.9626 Tf 1 0 0 1 421.701 393.302 Tm [(psb_loc_to_glob)]TJ/F84 9.9626 Tf -246.09 -11.955 Td [(r)18(outine)-250(on)-250(the)-250(output.)]TJ + 0.98 0 0 1 175.303 405.257 Tm [(The)-204(r)19(ow)-204(and)-204(column)-204(indices)-203(ar)18(e)-204(r)19(eturned)-204(in)-204(the)-203(local)-204(numbering)-204(scheme;)-221(if)]TJ 0.98 0 0 1 175.611 393.302 Tm [(the)-194(global)-194(numbering)-194(is)-193(desir)18(ed,)-206(the)-194(user)-194(may)-194(employ)-194(the)]TJ/F147 9.9626 Tf 1 0 0 1 421.701 393.302 Tm [(psb_loc_to_glob)]TJ/F84 9.9626 Tf -246.09 -11.955 Td [(r)18(outine)-250(on)-250(the)-250(output.)]TJ 0 g 0 G 139.477 -290.909 Td [(108)]TJ 0 g 0 G @@ -21789,9 +21799,9 @@ ET endstream endobj -1737 0 obj +1738 0 obj << -/Length 4035 +/Length 4027 >> stream 0 g 0 G @@ -21807,7 +21817,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(sizeof)-250(\227)-250(Memory)-250(occupation)]TJ/F84 9.9626 Tf -57.406 -18.964 Td [(This)-250(function)-250(computes)-250(the)-250(memory)-250(occupation)-250(of)-250(a)-250(PSBLAS)-250(object.)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 0.308 -21.918 Td [(isz)-525(=)-525(psb_sizeof\050a\051)]TJ 0 -11.955 Td [(isz)-525(=)-525(psb_sizeof\050desc_a\051)]TJ 0 -11.955 Td [(isz)-525(=)-525(psb_sizeof\050prec\051)]TJ +/F147 9.9626 Tf 0.308 -21.918 Td [(isz)-525(=)-525(psb_sizeof\050a\051)]TJ 0 -11.955 Td [(isz)-525(=)-525(psb_sizeof\050desc_a\051)]TJ 0 -11.955 Td [(isz)-525(=)-525(psb_sizeof\050prec\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -21820,21 +21830,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.574 0 Td [(A)-250(sparse)-250(matrix)]TJ/F78 9.9626 Tf 72.971 0 Td [(A)]TJ/F84 9.9626 Tf 7.318 0 Td [(.)]TJ -64.956 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 531.947 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 531.748 Td [(Tspmat)]TJ +/F147 9.9626 Tf 312.397 531.748 Td [(Tspmat)]TJ ET q 1 0 0 1 344.406 531.947 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 347.544 531.748 Td [(type)]TJ +/F147 9.9626 Tf 347.544 531.748 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -21849,21 +21859,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(Communication)-250(descriptor)74(.)]TJ -8.558 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 464.201 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 464.002 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 464.002 Td [(desc)]TJ ET q 1 0 0 1 333.945 464.201 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 464.002 Td [(type)]TJ +/F147 9.9626 Tf 337.084 464.002 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -21871,21 +21881,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.349 0 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.183 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(pr)18(econditioner)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 196.511 0 Td [(psb)]TJ +/F147 9.9626 Tf 196.511 0 Td [(psb)]TJ ET q 1 0 0 1 337.631 408.41 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 340.77 408.211 Td [(Tprec)]TJ +/F147 9.9626 Tf 340.77 408.211 Td [(Tprec)]TJ ET q 1 0 0 1 367.549 408.41 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 370.687 408.211 Td [(type)]TJ +/F147 9.9626 Tf 370.687 408.211 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -21894,205 +21904,279 @@ BT 0 g 0 G 0 -19.925 Td [(Function)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 172.363 368.361 Tm [(The)-266(memory)-267(occupati)1(on)-267(of)-266(the)-266(object)-267(speci\002ed)-266(in)-266(the)-266(calling)]TJ 1 0 0 1 124.802 356.405 Tm [(sequence,)-250(in)-250(bytes.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.432 -11.955 Td [(Returned)-250(as:)-310(an)]TJ/F145 9.9626 Tf 71.82 0 Td [(integer\050psb_long_int_k_\051)]TJ/F84 9.9626 Tf 128.019 0 Td [(number)74(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 172.363 368.361 Tm [(The)-266(memory)-267(occupati)1(on)-267(of)-266(the)-266(object)-267(speci\002ed)-266(in)-266(the)-266(calling)]TJ 1 0 0 1 124.802 356.405 Tm [(sequence,)-250(in)-250(bytes.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.432 -11.955 Td [(Returned)-250(as:)-310(an)]TJ/F147 9.9626 Tf 71.82 0 Td [(integer\050psb_lpk_\051)]TJ/F84 9.9626 Tf 91.406 0 Td [(number)74(.)]TJ 0 g 0 G - -60.362 -242.057 Td [(109)]TJ + -23.749 -242.057 Td [(109)]TJ 0 g 0 G ET endstream endobj -1742 0 obj +1743 0 obj << -/Length 6065 +/Length 7828 >> stream 0 g 0 G 0 g 0 G BT -/F75 11.9552 Tf 150.705 706.129 Td [(6.27)-1000(Sorting)-250(utilities)-250(\227)]TJ -0.371 -20.164 Td [(psb)]TJ +/F75 11.9552 Tf 150.705 706.129 Td [(6.27)-1000(Sorting)-250(utilities)-250(\227)]TJ -0.371 -18.964 Td [(psb)]TJ +ET +q +1 0 0 1 170.969 687.364 cm +[]0 d 0 J 0.398 w 0 0 m 3.587 0 l S +Q +BT +/F75 11.9552 Tf 174.555 687.165 Td [(isort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Insertion-sort)-250(algorithm)]TJ -24.221 -11.955 Td [(psb)]TJ ET q -1 0 0 1 170.969 686.164 cm +1 0 0 1 170.969 675.409 cm []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 174.555 685.965 Td [(msort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Merge-sort)-250(algorithm)]TJ -24.221 -12.574 Td [(psb)]TJ +/F75 11.9552 Tf 174.555 675.21 Td [(msort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Merge-sort)-250(algorithm)]TJ -24.221 -11.955 Td [(psb)]TJ ET q -1 0 0 1 170.969 673.59 cm +1 0 0 1 170.969 663.454 cm []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 174.555 673.391 Td [(qsort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Quicksort)-250(algorithm)]TJ -24.221 -12.575 Td [(psb)]TJ +/F75 11.9552 Tf 174.555 663.255 Td [(qsort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Quicksort)-250(algorithm)]TJ -24.221 -11.955 Td [(psb)]TJ ET q -1 0 0 1 170.969 661.016 cm +1 0 0 1 170.969 651.499 cm []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 174.555 660.816 Td [(hsort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Heapsort)-250(algorithm)]TJ +/F75 11.9552 Tf 174.555 651.3 Td [(hsort)-250(\227)-250(Sorting)-250(by)-250(the)-250(Heapsort)-250(algorithm)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -23.85 -22.402 Td [(call)-525(psb_msort\050x,ix,dir,flag\051)]TJ 0 -11.955 Td [(call)-525(psb_qsort\050x,ix,dir,flag\051)]TJ 0 -11.955 Td [(call)-525(psb_hsort\050x,ix,dir,flag\051)]TJ/F84 9.9626 Tf 1.001 0 0 1 165.649 592.721 Tm [(These)-249(serial)-248(r)18(outines)-249(sort)-248(a)-249(sequence)]TJ/F78 9.9626 Tf 1 0 0 1 328.652 592.721 Tm [(X)]TJ/F84 9.9626 Tf 1.001 0 0 1 338.668 592.721 Tm [(into)-249(ascending)-248(or)-249(descending)-248(or)18(der)74(.)]TJ 0.998 0 0 1 150.396 580.766 Tm [(The)-251(ar)18(gument)-250(meaning)-251(is)-251(identical)-251(for)-250(the)-251(thr)18(ee)-251(calls;)-250(the)-251(only)-251(dif)18(fer)18(ence)-251(is)-250(the)]TJ 1 0 0 1 150.705 568.811 Tm [(algorithm)-250(used)-250(to)-250(accomplish)-250(the)-250(task)-250(\050see)-250(Usage)-250(Notes)-250(below\051.)]TJ +/F147 9.9626 Tf -23.85 -19.808 Td [(call)-525(psb_isort\050x,ix,dir,flag,reord\051)]TJ 0 -11.955 Td [(call)-525(psb_msort\050x,ix,dir,flag,reord\051)]TJ 0 -11.955 Td [(call)-525(psb_qsort\050x,ix,dir,flag,reord\051)]TJ 0 -11.955 Td [(call)-525(psb_hsort\050x,ix,dir,flag,reord\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 165.649 575.819 Tm [(These)-314(serial)-313(r)17(outines)-313(sort)-314(a)-314(sequence)]TJ/F78 9.9626 Tf 1 0 0 1 335.711 575.819 Tm [(X)]TJ/F84 9.9626 Tf 1.02 0 0 1 346.436 575.819 Tm [(into)-314(ascending)-313(or)-314(descending)-314(or)18(-)]TJ 1.02 0 0 1 150.705 563.864 Tm [(der)73(.)-328(The)-253(ar)18(gument)-253(meaning)-253(is)-253(identical)-253(for)-253(all)-253(calls;)-257(the)-253(only)-253(dif)17(f)1(er)17(ence)-253(is)-253(the)]TJ 1 0 0 1 150.705 551.909 Tm [(algorithm)-250(used)-250(to)-250(accomplish)-250(the)-250(task)-250(\050see)-250(Usage)-250(Notes)-250(below\051.)]TJ 0 g 0 G -/F75 9.9626 Tf 0 -21.783 Td [(T)90(ype:)]TJ +/F75 9.9626 Tf 0 -19.808 Td [(T)90(ype:)]TJ 0 g 0 G /F84 9.9626 Tf 29.439 0 Td [(Asynchr)18(onous.)]TJ 0 g 0 G -/F75 9.9626 Tf -29.439 -22.402 Td [(On)-250(Entry)]TJ +/F75 9.9626 Tf -29.439 -19.866 Td [(On)-250(Entry)]TJ 0 g 0 G 0 g 0 G - 0 -22.402 Td [(x)]TJ + 0 -19.866 Td [(x)]TJ 0 g 0 G -/F84 9.9626 Tf 9.654 0 Td [(The)-250(sequence)-250(to)-250(be)-250(sorted.)]TJ 14.944 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(,)-250(r)18(eal)-250(or)-250(complex)-250(array)-250(of)-250(rank)-250(1.)]TJ +/F84 9.9626 Tf 9.654 0 Td [(The)-250(sequence)-250(to)-250(be)-250(sorted.)]TJ 14.944 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(,)-250(r)18(eal)-250(or)-250(complex)-250(array)-250(of)-250(rank)-250(1.)]TJ 0 g 0 G -/F75 9.9626 Tf -24.906 -22.402 Td [(ix)]TJ +/F75 9.9626 Tf -24.906 -19.866 Td [(ix)]TJ 0 g 0 G -/F84 9.9626 Tf 12.891 0 Td [(A)-250(vector)-250(of)-250(indices.)]TJ 11.707 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)-250(of)-250(\050at)-250(least\051)-250(the)-250(same)-250(size)-250(as)]TJ/F78 9.9626 Tf 254.19 0 Td [(X)]TJ/F84 9.9626 Tf 7.536 0 Td [(.)]TJ +/F84 9.9626 Tf 12.891 0 Td [(A)-250(vector)-250(of)-250(indices.)]TJ 11.707 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 0.98 0 0 1 175.611 424.682 Tm [(Speci\002ed)-198(as:)-288(an)-198(integer)-198(array)-198(of)-198(\050at)-198(least\051)-198(t)1(he)-198(same)-198(size)-198(as)]TJ/F78 9.9626 Tf 1 0 0 1 418.918 424.682 Tm [(X)]TJ/F84 9.9626 Tf 0.98 0 0 1 426.455 424.682 Tm [(.)-297(This)-198(ar)18(gument)]TJ 1 0 0 1 175.611 412.726 Tm [(is)-250(r)18(equir)18(ed)-250(when)]TJ/F78 9.9626 Tf 76.926 0 Td [(r)-17(e)-25(o)-25(r)-17(d)]TJ/F197 10.3811 Tf 24.884 0 Td [(=)]TJ/F78 9.9626 Tf 11.634 0 Td [(p)-25(s)-25(b)]TJ +ET +q +1 0 0 1 303.745 412.926 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F78 9.9626 Tf 306.858 412.726 Td [(s)-25(o)-25(r)-35(t)]TJ +ET +q +1 0 0 1 323.919 412.926 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F78 9.9626 Tf 327.032 412.726 Td [(n)-25(o)-25(r)-17(e)-25(o)-25(r)-17(d)]TJ +ET +q +1 0 0 1 360.083 412.926 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F78 9.9626 Tf 363.366 412.726 Td [(x)]TJ +ET +q +1 0 0 1 369.169 412.926 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F84 9.9626 Tf 372.158 412.726 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -286.632 -22.402 Td [(dir)]TJ +/F75 9.9626 Tf -221.453 -19.866 Td [(dir)]TJ 0 g 0 G -/F84 9.9626 Tf 17.952 0 Td [(The)-250(desir)18(ed)-250(or)18(dering.)]TJ 6.646 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value:)]TJ +/F84 9.9626 Tf 17.952 0 Td [(The)-250(desir)18(ed)-250(or)18(dering.)]TJ 6.646 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value:)]TJ 0 g 0 G -/F75 9.9626 Tf 0 -22.402 Td [(Integer)-250(and)-250(real)-250(data:)]TJ +/F75 9.9626 Tf 0 -19.867 Td [(Integer)-250(and)-250(real)-250(data:)]TJ 0 g 0 G -/F145 9.9626 Tf 101.28 0 Td [(psb_sort_up_)]TJ/F84 9.9626 Tf 1.02 0 0 1 339.655 363.286 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 345.778 363.286 Tm [(psb_sort_down_)]TJ/F84 9.9626 Tf 1.02 0 0 1 419.003 363.286 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 425.126 363.286 Tm [(psb_asort_up_)]TJ/F84 9.9626 Tf 1.02 0 0 1 493.121 363.286 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 197.529 351.331 Tm [(psb_asort_down_)]TJ/F84 9.9626 Tf 78.455 0 Td [(;)-250(default)]TJ/F145 9.9626 Tf 38.784 0 Td [(psb_sort_up_)]TJ/F84 9.9626 Tf 62.765 0 Td [(.)]TJ +/F147 9.9626 Tf 101.28 0 Td [(psb_sort_up_)]TJ/F84 9.9626 Tf 1.02 0 0 1 339.655 349.083 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 345.778 349.083 Tm [(psb_sort_down_)]TJ/F84 9.9626 Tf 1.02 0 0 1 419.003 349.083 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 425.126 349.083 Tm [(psb_asort_up_)]TJ/F84 9.9626 Tf 1.02 0 0 1 493.121 349.083 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 197.529 337.128 Tm [(psb_asort_down_)]TJ/F84 9.9626 Tf 78.455 0 Td [(;)-250(default)]TJ/F147 9.9626 Tf 38.784 0 Td [(psb_sort_up_)]TJ/F84 9.9626 Tf 62.765 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -201.922 -17.178 Td [(Complex)-250(data:)]TJ +/F75 9.9626 Tf -201.922 -15.881 Td [(Complex)-250(data:)]TJ 0 g 0 G -/F145 9.9626 Tf 70.287 0 Td [(psb_lsort_up_)]TJ/F84 9.9626 Tf 0.98 0 0 1 313.892 334.153 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 318.345 334.153 Tm [(psb_lsort_down_)]TJ/F84 9.9626 Tf 0.98 0 0 1 396.8 334.153 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 401.254 334.153 Tm [(psb_asort_up_)]TJ/F84 9.9626 Tf 0.98 0 0 1 469.248 334.153 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 473.701 334.153 Tm [(psb_asort_down_)]TJ/F84 9.9626 Tf 0.98 0 0 1 552.157 334.153 Tm [(;)]TJ 1 0 0 1 197.529 322.197 Tm [(default)]TJ/F145 9.9626 Tf 33.803 0 Td [(psb_lsort_up_)]TJ/F84 9.9626 Tf 67.994 0 Td [(.)]TJ +/F147 9.9626 Tf 70.287 0 Td [(psb_lsort_up_)]TJ/F84 9.9626 Tf 0.98 0 0 1 313.892 321.247 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 318.345 321.247 Tm [(psb_lsort_down_)]TJ/F84 9.9626 Tf 0.98 0 0 1 396.8 321.247 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 401.254 321.247 Tm [(psb_asort_up_)]TJ/F84 9.9626 Tf 0.98 0 0 1 469.248 321.247 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 473.701 321.247 Tm [(psb_asort_down_)]TJ/F84 9.9626 Tf 0.98 0 0 1 552.157 321.247 Tm [(;)]TJ 1 0 0 1 197.529 309.292 Tm [(default)]TJ/F147 9.9626 Tf 33.803 0 Td [(psb_lsort_up_)]TJ/F84 9.9626 Tf 67.994 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -148.621 -22.402 Td [(\003ag)]TJ +/F75 9.9626 Tf -148.621 -19.867 Td [(\003ag)]TJ 0 g 0 G -/F84 9.9626 Tf 21.091 0 Td [(Whether)-250(to)-250(keep)-250(the)-250(original)-250(values)-250(in)]TJ/F78 9.9626 Tf 171.519 0 Td [(I)-81(X)]TJ/F84 9.9626 Tf 11.661 0 Td [(.)]TJ -179.673 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 0.98 0 0 1 175.611 275.885 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)-194(value)]TJ/F145 9.9626 Tf 1 0 0 1 301.54 275.885 Tm [(psb_sort_ovw_idx_)]TJ/F84 9.9626 Tf 0.98 0 0 1 392.349 275.885 Tm [(or)]TJ/F145 9.9626 Tf 1 0 0 1 403.429 275.885 Tm [(psb_sort_keep_idx_)]TJ/F84 9.9626 Tf 0.98 0 0 1 497.575 275.885 Tm [(;)]TJ 1 0 0 1 175.611 263.93 Tm [(default)]TJ/F145 9.9626 Tf 33.803 0 Td [(psb_sort_ovw_idx_)]TJ/F84 9.9626 Tf 88.916 0 Td [(.)]TJ +/F84 9.9626 Tf 21.091 0 Td [(Whether)-250(to)-250(keep)-250(the)-250(original)-250(values)-250(in)]TJ/F78 9.9626 Tf 171.519 0 Td [(I)-81(X)]TJ/F84 9.9626 Tf 11.661 0 Td [(.)]TJ -179.673 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 0.98 0 0 1 175.611 265.515 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)-194(value)]TJ/F147 9.9626 Tf 1 0 0 1 301.54 265.515 Tm [(psb_sort_ovw_idx_)]TJ/F84 9.9626 Tf 0.98 0 0 1 392.349 265.515 Tm [(or)]TJ/F147 9.9626 Tf 1 0 0 1 403.429 265.515 Tm [(psb_sort_keep_idx_)]TJ/F84 9.9626 Tf 0.98 0 0 1 497.575 265.515 Tm [(;)]TJ 1 0 0 1 175.611 253.56 Tm [(default)]TJ/F147 9.9626 Tf 33.803 0 Td [(psb_sort_ovw_idx_)]TJ/F84 9.9626 Tf 88.916 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -147.625 -24.395 Td [(On)-250(Return)]TJ +/F75 9.9626 Tf -147.625 -19.866 Td [(reord)]TJ 0 g 0 G +/F84 9.9626 Tf 0.984 0 0 1 179.546 233.694 Tm [(Whether)-253(to)-254(r)19(eor)18(der)-253(the)-254(input)-253(vector)]TJ/F78 9.9626 Tf 1 0 0 1 337.115 233.694 Tm [(x)]TJ/F84 9.9626 Tf 0.984 0 0 1 344.804 233.694 Tm [(or)-253(just)-254(r)19(eturn)]TJ/F78 9.9626 Tf 1 0 0 1 404.732 233.694 Tm [(I)-81(X)]TJ/F84 9.9626 Tf 0.984 0 0 1 418.877 233.694 Tm [(for)-253(further)-254(usage.)]TJ 1 0 0 1 175.303 221.738 Tm [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 0.98 0 0 1 175.611 209.783 Tm [(Speci\002ed)-194(as:)-286(an)-193(integer)-194(value)]TJ/F147 9.9626 Tf 1 0 0 1 301.54 209.783 Tm [(psb_sort_reord_x_)]TJ/F84 9.9626 Tf 0.98 0 0 1 392.349 209.783 Tm [(or)]TJ/F147 9.9626 Tf 1 0 0 1 403.429 209.783 Tm [(psb_sort_noreord_x_)]TJ/F84 9.9626 Tf 0.98 0 0 1 502.806 209.783 Tm [(;)]TJ 1 0 0 1 175.611 197.828 Tm [(default)]TJ/F147 9.9626 Tf 33.803 0 Td [(psb_sort_reord_x_)]TJ/F84 9.9626 Tf 88.916 0 Td [(.)]TJ 0 g 0 G - 0 -22.402 Td [(x)]TJ +/F75 9.9626 Tf -147.625 -21.771 Td [(On)-250(Return)]TJ 0 g 0 G -/F84 9.9626 Tf 9.654 0 Td [(The)-250(sequence)-250(of)-250(values,)-250(in)-250(the)-250(chosen)-250(or)18(dering.)]TJ 14.944 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(,)-250(r)18(eal)-250(or)-250(complex)-250(array)-250(of)-250(rank)-250(1.)]TJ 0 g 0 G -/F75 9.9626 Tf -24.906 -22.402 Td [(ix)]TJ + 0 -19.866 Td [(x)]TJ 0 g 0 G -/F84 9.9626 Tf 12.891 0 Td [(A)-250(vector)-250(of)-250(indices.)]TJ 11.707 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(Optional)]TJ/F84 9.9626 Tf 0.996 0 0 1 175.223 146.91 Tm [(An)-251(integer)-250(array)-251(of)-251(rank)-250(1,)-251(whose)-251(entries)-250(ar)18(e)-251(moved)-251(to)-250(the)-251(same)-251(position)]TJ 1 0 0 1 175.611 134.955 Tm [(as)-250(the)-250(corr)18(esponding)-250(entries)-250(in)]TJ/F78 9.9626 Tf 138.215 0 Td [(x)]TJ/F84 9.9626 Tf 5.206 0 Td [(.)]TJ +/F84 9.9626 Tf 0.984 0 0 1 160.359 156.191 Tm [(The)-254(sequence)-254(of)-254(values;)-254(if)]TJ/F147 9.9626 Tf 1 0 0 1 274.16 156.191 Tm [(reord=psb_sort_reord_x_)]TJ/F84 9.9626 Tf 0.984 0 0 1 396.947 156.191 Tm [(it)-254(will)-254(be)-254(in)-254(the)-254(chosen)]TJ 1 0 0 1 175.611 144.236 Tm [(or)18(dering.)]TJ -0.308 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(,)-250(r)18(eal)-250(or)-250(complex)-250(array)-250(of)-250(rank)-250(1.)]TJ 0 g 0 G - -3.944 -44.517 Td [(110)]TJ + 139.477 -29.888 Td [(110)]TJ 0 g 0 G ET endstream endobj -1746 0 obj +1747 0 obj << -/Length 8202 +/Length 11603 >> stream 0 g 0 G 0 g 0 G +0 g 0 G BT -/F75 11.9552 Tf 99.895 706.129 Td [(Notes)]TJ +/F75 9.9626 Tf 99.895 706.129 Td [(ix)]TJ 0 g 0 G -/F84 9.9626 Tf 12.454 -19.925 Td [(1.)]TJ +/F84 9.9626 Tf 12.892 0 Td [(A)-250(vector)-250(of)-250(indices.)]TJ 11.706 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(Optional)]TJ/F84 9.9626 Tf 1.02 0 0 1 124.413 682.219 Tm [(An)-353(integer)-353(array)-354(of)-353(rank)-353(1,)-380(whose)]TJ/F78 9.9626 Tf 1 0 0 1 285.438 682.219 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 288.402 682.219 Tm [(-th)-353(entry)-353(gives)-354(the)-353(position)-353(of)-353(the)]TJ 1 0 0 1 124.473 670.263 Tm [(\050sorted\051)-250(value)-250(of)]TJ/F78 9.9626 Tf 75.152 0 Td [(x)]TJ/F84 9.9626 Tf 7.696 0 Td [(in)-250(the)-250(original)-250(sequence.)]TJ/F75 11.9552 Tf -107.426 -21.917 Td [(Notes)]TJ +0 g 0 G +/F84 9.9626 Tf 12.454 -19.926 Td [(1.)]TJ 0 g 0 G - 1.02 0 0 1 124.802 686.204 Tm [(For)-318(integer)-317(or)-318(r)18(eal)-318(data)-318(the)-318(sorting)-317(can)-318(be)-318(performed)-317(in)-318(the)-318(up/down)]TJ 1 0 0 1 124.802 674.248 Tm [(dir)18(ection,)-250(on)-250(the)-250(natural)-250(or)-250(absolute)-250(values;)]TJ + 1.02 0 0 1 124.802 628.42 Tm [(For)-318(integer)-317(or)-318(r)18(eal)-318(data)-318(the)-318(sorting)-317(can)-318(be)-318(performed)-317(in)-318(the)-318(up/down)]TJ 1 0 0 1 124.802 616.465 Tm [(dir)18(ection,)-250(on)-250(the)-250(natural)-250(or)-250(absolute)-250(values;)]TJ 0 g 0 G -12.453 -19.925 Td [(2.)]TJ 0 g 0 G - 1.02 0 0 1 124.802 654.323 Tm [(For)-287(complex)-288(data)-287(the)-287(sorting)-288(can)-287(be)-287(done)-288(in)-287(a)-287(lexicographic)-288(or)18(der)-287(\050i.e.:)]TJ 1.007 0 0 1 124.802 642.368 Tm [(sort)-247(on)-248(the)-247(r)18(eal)-248(part)-247(with)-248(tie)1(s)-248(br)18(oken)-247(accor)17(ding)-247(to)-247(the)-248(imaginary)-247(part\051)-248(or)]TJ 1 0 0 1 124.802 630.413 Tm [(on)-250(the)-250(absolute)-250(values;)]TJ + 1.02 0 0 1 124.802 596.54 Tm [(For)-287(complex)-288(data)-287(the)-287(sorting)-288(can)-287(be)-287(done)-288(in)-287(a)-287(lexicographic)-288(or)18(der)-287(\050i.e.:)]TJ 1.007 0 0 1 124.802 584.585 Tm [(sort)-247(on)-248(the)-247(r)18(eal)-248(part)-247(with)-248(tie)1(s)-248(br)18(oken)-247(accor)17(ding)-247(to)-247(the)-248(imaginary)-247(part\051)-248(or)]TJ 1 0 0 1 124.802 572.629 Tm [(on)-250(the)-250(absolute)-250(values;)]TJ 0 g 0 G -12.453 -19.925 Td [(3.)]TJ 0 g 0 G - 0.98 0 0 1 124.493 610.488 Tm [(The)-240(r)18(outines)-240(r)18(et)1(urn)-241(the)-240(items)-240(in)-240(the)-240(chosen)-240(or)18(dering;)-245(the)-240(output)-240(dif)18(fer)18(ence)]TJ 0.98 0 0 1 124.802 598.532 Tm [(is)-256(the)-256(handling)-256(of)-256(ties)-256(\050i.e.)-318(items)-256(with)-256(an)-256(equal)-256(value\051)-256(in)-256(the)-256(original)-256(input.)]TJ 0.98 0 0 1 124.304 586.577 Tm [(W)56(ith)-225(the)-226(mer)18(ge-so)1(rt)-226(algorithm)-226(t)1(ies)-226(ar)18(e)-225(pr)18(eserved)-225(in)-226(the)-225(same)-226(r)19(elative)-226(or)18(der)]TJ 1.02 0 0 1 124.802 574.622 Tm [(as)-352(they)-351(had)-352(in)-352(the)-351(original)-352(sequence,)-378(while)-352(this)-351(is)-352(not)-352(guaranteed)-351(for)]TJ 1 0 0 1 124.523 562.667 Tm [(quicksort)-250(or)-250(heapsort;)]TJ + 0.98 0 0 1 124.493 552.704 Tm [(The)-240(r)18(outines)-240(r)18(et)1(urn)-241(the)-240(items)-240(in)-240(the)-240(chosen)-240(or)18(dering;)-245(the)-240(output)-240(dif)18(fer)18(ence)]TJ 0.98 0 0 1 124.802 540.749 Tm [(is)-256(the)-256(handling)-256(of)-256(ties)-256(\050i.e.)-318(items)-256(with)-256(an)-256(equal)-256(value\051)-256(in)-256(the)-256(original)-256(input.)]TJ 1 0 0 1 124.304 528.794 Tm [(W)55(ith)-250(the)-250(insertion-sort)-250(or)-250(mer)18(ge-sort)-250(algorithms)-250(ties)-250(ar)18(e)-250(pr)18(eserved)-250(in)-250(the)]TJ 0.997 0 0 1 124.802 516.839 Tm [(same)-250(r)18(elative)-250(or)18(der)-251(as)-250(they)-250(had)-251(i)1(n)-251(the)-250(original)-250(sequence,)-251(while)-250(this)-250(is)-250(not)]TJ 1 0 0 1 124.802 504.884 Tm [(guaranteed)-250(for)-250(quicksort)-250(or)-250(heapsort;)]TJ 0 g 0 G - -12.174 -19.925 Td [(4.)]TJ + -12.453 -19.926 Td [(4.)]TJ 0 g 0 G - 0.98 0 0 1 124.802 542.742 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 135.146 542.742 Tm [(f)-160(l)-70(a)-47(g)]TJ/F192 10.3811 Tf 20.72 0 Td [(=)]TJ/F78 9.9626 Tf 11.634 0 Td [(p)-25(s)-25(b)]TJ + 0.99 0 0 1 124.802 484.958 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 133.93 484.958 Tm [(r)-17(e)-25(o)-25(r)-17(d)]TJ/F197 10.3811 Tf 24.891 0 Td [(=)]TJ/F78 9.9626 Tf 11.642 0 Td [(p)-25(s)-25(b)]TJ ET q -1 0 0 1 182.189 542.941 cm +1 0 0 1 185.152 485.158 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 185.303 542.742 Td [(s)-25(o)-25(r)-35(t)]TJ +/F78 9.9626 Tf 188.266 484.958 Td [(s)-25(o)-25(r)-35(t)]TJ ET q -1 0 0 1 202.364 542.941 cm +1 0 0 1 205.326 485.158 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 205.477 542.742 Td [(o)-35(v)-25(w)]TJ +/F78 9.9626 Tf 208.44 484.958 Td [(n)-25(o)-25(r)-17(e)-25(o)-25(r)-17(d)]TJ ET q -1 0 0 1 223.394 542.941 cm +1 0 0 1 241.49 485.158 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 226.438 542.742 Td [(i)-32(d)-42(x)]TJ +/F78 9.9626 Tf 244.773 484.958 Td [(x)]TJ ET q -1 0 0 1 240.729 542.941 cm +1 0 0 1 250.576 485.158 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F84 9.9626 Tf 0.98 0 0 1 246.101 542.742 Tm [(then)-244(the)-244(entries)-244(in)]TJ/F78 9.9626 Tf 1 0 0 1 326.032 542.742 Tm [(i)-49(x)]TJ/F192 10.3811 Tf 8.587 0 Td [(\050)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.769 542.742 Tm [(1)]TJ 1 0 0 1 346.542 542.742 Tm [(:)]TJ/F78 9.9626 Tf 5.507 0 Td [(n)]TJ/F192 10.3811 Tf 5.788 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 364.37 542.742 Tm [(wher)18(e)]TJ/F78 9.9626 Tf 1 0 0 1 393.733 542.742 Tm [(n)]TJ/F84 9.9626 Tf 0.98 0 0 1 401.779 542.742 Tm [(is)-244(the)-244(size)]TJ 0.984 0 0 1 124.802 530.786 Tm [(of)]TJ/F78 9.9626 Tf 1 0 0 1 136.206 530.786 Tm [(x)]TJ/F84 9.9626 Tf 0.984 0 0 1 143.904 530.786 Tm [(ar)18(e)-254(initialized)-254(to)]TJ/F78 9.9626 Tf 1 0 0 1 216.929 530.786 Tm [(i)-49(x)]TJ/F192 10.3811 Tf 8.588 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F190 10.3811 Tf 7.046 0 Td [(\040)]TJ/F78 9.9626 Tf 13.332 0 Td [(i)]TJ/F84 9.9626 Tf 0.984 0 0 1 256.15 530.786 Tm [(;)-254(thus,)-255(upon)-254(r)18(eturn)-254(fr)18(om)-254(the)-254(subr)18(outine,)-254(for)]TJ 1.02 0 0 1 124.802 518.831 Tm [(each)-260(index)]TJ/F78 9.9626 Tf 1 0 0 1 175.703 518.831 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 181.308 518.831 Tm [(we)-260(have)-260(in)]TJ/F78 9.9626 Tf 1 0 0 1 233.102 518.831 Tm [(i)-49(x)]TJ/F192 10.3811 Tf 8.588 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 255.772 518.831 Tm [(the)-260(position)-260(that)-260(the)-259(item)]TJ/F78 9.9626 Tf 1 0 0 1 371.842 518.831 Tm [(x)]TJ/F192 10.3811 Tf 5.33 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F192 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 391.255 518.831 Tm [(occupied)-260(in)]TJ 1 0 0 1 124.802 506.876 Tm [(the)-250(original)-250(data)-250(sequence;)]TJ +/F84 9.9626 Tf 0.99 0 0 1 253.565 484.958 Tm [(,)-253(then)-253(the)-253(input)-253(sequence)]TJ/F78 9.9626 Tf 1 0 0 1 365.544 484.958 Tm [(x)]TJ/F84 9.9626 Tf 0.99 0 0 1 373.244 484.958 Tm [(is)-253(not)-253(r)18(eor)19(der)18(ed;)]TJ 1.02 0 0 1 124.802 473.003 Tm [(the)-254(output)-255(i)1(s)-255(given)-254(in)]TJ/F78 9.9626 Tf 1 0 0 1 223.674 473.003 Tm [(i)-49(x)]TJ/F84 9.9626 Tf 1.02 0 0 1 232.137 473.003 Tm [(.)-331(Calling)-255(without)]TJ/F78 9.9626 Tf 1 0 0 1 311.637 473.003 Tm [(i)-49(x)]TJ/F84 9.9626 Tf 1.02 0 0 1 322.684 473.003 Tm [(in)-254(this)-255(case)-254(is)-254(\003agged)-254(as)-255(an)]TJ 1 0 0 1 124.802 461.048 Tm [(err)18(or;)]TJ 0 g 0 G -12.453 -19.925 Td [(5.)]TJ 0 g 0 G - 1.02 0 0 1 124.802 486.951 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 136.291 486.951 Tm [(f)-160(l)-70(a)-47(g)]TJ/F192 10.3811 Tf 22.147 0 Td [(=)]TJ/F78 9.9626 Tf 13.061 0 Td [(p)-25(s)-25(b)]TJ + 0.98 0 0 1 124.802 441.123 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 135.146 441.123 Tm [(f)-160(l)-70(a)-47(g)]TJ/F197 10.3811 Tf 20.72 0 Td [(=)]TJ/F78 9.9626 Tf 11.634 0 Td [(p)-25(s)-25(b)]TJ ET q -1 0 0 1 186.188 487.15 cm +1 0 0 1 182.189 441.322 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 189.302 486.951 Td [(s)-25(o)-25(r)-35(t)]TJ +/F78 9.9626 Tf 185.303 441.123 Td [(s)-25(o)-25(r)-35(t)]TJ ET q -1 0 0 1 206.362 487.15 cm +1 0 0 1 202.364 441.322 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 209.476 486.951 Td [(k)-30(e)-25(e)-80(p)]TJ +/F78 9.9626 Tf 205.477 441.123 Td [(o)-35(v)-25(w)]TJ ET q -1 0 0 1 228.698 487.15 cm +1 0 0 1 223.394 441.322 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F78 9.9626 Tf 231.742 486.951 Td [(i)-32(d)-42(x)]TJ +/F78 9.9626 Tf 226.438 441.123 Td [(i)-32(d)-42(x)]TJ ET q -1 0 0 1 246.033 487.15 cm +1 0 0 1 240.729 441.322 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F84 9.9626 Tf 1.02 0 0 1 252.283 486.951 Tm [(the)-321(r)18(outine)-321(will)-321(assume)-321(that)-321(the)-321(entries)-321(in)]TJ/F78 9.9626 Tf 1 0 0 1 124.857 474.996 Tm [(i)-49(x)]TJ/F192 10.3811 Tf 8.587 0 Td [(\050)]TJ/F84 9.9626 Tf 4.274 0 Td [(:)]TJ/F192 10.3811 Tf 2.74 0 Td [(\051)]TJ/F84 9.9626 Tf 6.64 0 Td [(have)-250(alr)18(eady)-250(been)-250(initialized)-250(by)-250(the)-250(user;)]TJ +/F84 9.9626 Tf 0.98 0 0 1 246.101 441.123 Tm [(then)-244(the)-244(entries)-244(in)]TJ/F78 9.9626 Tf 1 0 0 1 326.032 441.123 Tm [(i)-49(x)]TJ/F197 10.3811 Tf 8.587 0 Td [(\050)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.769 441.123 Tm [(1)]TJ 1 0 0 1 346.542 441.123 Tm [(:)]TJ/F78 9.9626 Tf 5.507 0 Td [(n)]TJ/F197 10.3811 Tf 5.788 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 364.37 441.123 Tm [(wher)18(e)]TJ/F78 9.9626 Tf 1 0 0 1 393.733 441.123 Tm [(n)]TJ/F84 9.9626 Tf 0.98 0 0 1 401.779 441.123 Tm [(is)-244(the)-244(size)]TJ 0.984 0 0 1 124.802 429.167 Tm [(of)]TJ/F78 9.9626 Tf 1 0 0 1 136.206 429.167 Tm [(x)]TJ/F84 9.9626 Tf 0.984 0 0 1 143.904 429.167 Tm [(ar)18(e)-254(initialized)-254(to)]TJ/F78 9.9626 Tf 1 0 0 1 216.929 429.167 Tm [(i)-49(x)]TJ/F197 10.3811 Tf 8.588 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F195 10.3811 Tf 7.046 0 Td [(\040)]TJ/F78 9.9626 Tf 13.332 0 Td [(i)]TJ/F84 9.9626 Tf 0.984 0 0 1 256.15 429.167 Tm [(;)-254(thus,)-255(upon)-254(r)18(eturn)-254(fr)18(om)-254(the)-254(subr)18(outine,)-254(for)]TJ 1.02 0 0 1 124.802 417.212 Tm [(each)-260(index)]TJ/F78 9.9626 Tf 1 0 0 1 175.703 417.212 Tm [(i)]TJ/F84 9.9626 Tf 1.02 0 0 1 181.308 417.212 Tm [(we)-260(have)-260(in)]TJ/F78 9.9626 Tf 1 0 0 1 233.102 417.212 Tm [(i)-49(x)]TJ/F197 10.3811 Tf 8.588 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 255.772 417.212 Tm [(the)-260(position)-260(that)-260(the)-259(item)]TJ/F78 9.9626 Tf 1 0 0 1 371.842 417.212 Tm [(x)]TJ/F197 10.3811 Tf 5.33 0 Td [(\050)]TJ/F78 9.9626 Tf 4.204 0 Td [(i)]TJ/F197 10.3811 Tf 3.088 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 391.255 417.212 Tm [(occupied)-260(in)]TJ 1 0 0 1 124.802 405.257 Tm [(the)-250(original)-250(data)-250(sequence;)]TJ 0 g 0 G - -34.749 -19.926 Td [(6.)]TJ + -12.453 -19.925 Td [(6.)]TJ 0 g 0 G - 1.008 0 0 1 124.493 455.07 Tm [(The)-249(thr)18(ee)-249(sorting)-248(algorithms)-249(have)-249(a)-248(similar)]TJ/F78 9.9626 Tf 1 0 0 1 317.915 455.07 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.273 0 Td [(n)]TJ/F84 9.9626 Tf 7.325 0 Td [(log)]TJ/F78 9.9626 Tf 15.662 0 Td [(n)]TJ/F192 10.3811 Tf 5.789 0 Td [(\051)]TJ/F84 9.9626 Tf 1.008 0 0 1 365.611 455.07 Tm [(expected)-249(r)8(unning)]TJ 1.008 0 0 1 124.802 443.115 Tm [(time;)-248(in)-248(the)-248(average)-248(case)-248(quicksort)-248(will)-247(be)-248(the)-248(fastest)-248(and)-248(mer)18(ge-sort)-248(the)]TJ 1 0 0 1 124.802 431.16 Tm [(slowest.)-310(However)-250(note)-250(that:)]TJ + 1.02 0 0 1 124.802 385.332 Tm [(If)]TJ/F78 9.9626 Tf 1 0 0 1 136.291 385.332 Tm [(f)-160(l)-70(a)-47(g)]TJ/F197 10.3811 Tf 22.147 0 Td [(=)]TJ/F78 9.9626 Tf 13.061 0 Td [(p)-25(s)-25(b)]TJ +ET +q +1 0 0 1 186.188 385.531 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F78 9.9626 Tf 189.302 385.332 Td [(s)-25(o)-25(r)-35(t)]TJ +ET +q +1 0 0 1 206.362 385.531 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F78 9.9626 Tf 209.476 385.332 Td [(k)-30(e)-25(e)-80(p)]TJ +ET +q +1 0 0 1 228.698 385.531 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F78 9.9626 Tf 231.742 385.332 Td [(i)-32(d)-42(x)]TJ +ET +q +1 0 0 1 246.033 385.531 cm +[]0 d 0 J 0.398 w 0 0 m 2.989 0 l S +Q +BT +/F84 9.9626 Tf 1.02 0 0 1 252.283 385.332 Tm [(the)-321(r)18(outine)-321(will)-321(assume)-321(that)-321(the)-321(entries)-321(in)]TJ/F78 9.9626 Tf 1 0 0 1 124.857 373.377 Tm [(i)-49(x)]TJ/F197 10.3811 Tf 8.587 0 Td [(\050)]TJ/F84 9.9626 Tf 4.274 0 Td [(:)]TJ/F197 10.3811 Tf 2.74 0 Td [(\051)]TJ/F84 9.9626 Tf 6.64 0 Td [(have)-250(alr)18(eady)-250(been)-250(initialized)-250(by)-250(the)-250(user;)]TJ +0 g 0 G + -34.749 -19.926 Td [(7.)]TJ +0 g 0 G + 0.98 0 0 1 124.493 353.451 Tm [(Thr)18(ee)-256(sorting)-256(algorithms)-256(have)-256(a)-256(similar)]TJ/F78 9.9626 Tf 1 0 0 1 296.993 353.451 Tm [(O)]TJ/F197 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 9.9626 Tf 7.324 0 Td [(log)]TJ/F78 9.9626 Tf 15.662 0 Td [(n)]TJ/F197 10.3811 Tf 5.789 0 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 344.691 353.451 Tm [(expected)-256(r)8(unning)-256(time,)]TJ 1.017 0 0 1 124.384 341.496 Tm [(wher)18(eas)-247(insertion)-246(sort)-247(has)-246(an)-247(expected)-246(r)8(unning)-247(time)]TJ/F78 9.9626 Tf 1 0 0 1 360.734 341.496 Tm [(O)]TJ/F197 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.617 Td [(2)]TJ/F197 10.3811 Tf 4.408 -3.617 Td [(\051)]TJ/F84 9.9626 Tf 1.017 0 0 1 387.23 341.496 Tm [(;)-247(of)-246(the)-247(other)]TJ 0.999 0 0 1 124.802 329.541 Tm [(thr)18(ee,)-250(in)-250(the)-249(average)-250(case)-250(quicksort)-250(will)-249(be)-250(the)-250(fastest)-250(and)-249(mer)18(ge-sort)-250(the)]TJ 1 0 0 1 124.802 317.586 Tm [(slowest.)-310(However)-250(note)-250(that:)]TJ 0 g 0 G 5.32 -19.925 Td [(\050a\051)]TJ 0 g 0 G - 0.98 0 0 1 146.411 411.235 Tm [(The)-241(worst)-240(case)-241(r)8(unning)-241(time)-240(for)-241(quicksort)-241(is)]TJ/F78 9.9626 Tf 1 0 0 1 338.306 411.235 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.616 Td [(2)]TJ/F192 10.3811 Tf 4.408 -3.616 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 364.802 411.235 Tm [(;)-245(the)-241(algorithm)-241(im-)]TJ 1.007 0 0 1 146.421 399.28 Tm [(plemented)-246(her)18(e)-246(follows)-246(the)-246(well-known)-246(median-of-thr)18(ee)-246(heuristics,)]TJ 1 0 0 1 146.72 387.324 Tm [(but)-250(the)-250(worst)-250(case)-250(may)-250(still)-250(apply;)]TJ + 1.02 0 0 1 146.411 297.661 Tm [(The)-286(best)-287(case)-286(r)8(unning)-286(time)-287(for)-286(insertion)-286(sort)-287(is)]TJ/F241 9.9626 Tf 1 0 0 1 360.32 297.661 Tm [(W)]TJ/F197 10.3811 Tf 8.528 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F197 10.3811 Tf 5.789 0 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 385.97 297.661 Tm [(while)-286(the)-287(av-)]TJ 1.02 0 0 1 146.72 285.705 Tm [(erage)-277(and)-278(worst)-277(case)-277(ar)18(e)]TJ/F78 9.9626 Tf 1 0 0 1 260.579 285.705 Tm [(O)]TJ/F197 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.617 Td [(2)]TJ/F197 10.3811 Tf 4.408 -3.617 Td [(\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 287.075 285.705 Tm [(;)-293(mor)17(eover)73(,)-285(for)-278(very)-277(short)-277(input)-278(se-)]TJ 1 0 0 1 146.441 273.75 Tm [(quences)-250(this)-250(is)-250(likely)-250(to)-250(be)-250(the)-250(fastest)-250(method;)]TJ 0 g 0 G - -17.126 -15.94 Td [(\050b\051)]TJ + -16.847 -15.94 Td [(\050b\051)]TJ 0 g 0 G - 0.98 0 0 1 146.411 371.384 Tm [(The)-194(worst)-194(case)-194(r)9(unning)-194(time)-194(for)-194(mer)18(ge-sort)-193(and)-194(heap-sort)-194(is)]TJ/F78 9.9626 Tf 1 0 0 1 402.204 371.384 Tm [(O)]TJ/F192 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 9.9626 Tf 7.324 0 Td [(log)]TJ/F78 9.9626 Tf 15.663 0 Td [(n)]TJ/F192 10.3811 Tf 5.788 0 Td [(\051)]TJ/F84 9.9626 Tf -296.533 -11.955 Td [(as)-250(the)-250(average)-250(case;)]TJ + 0.98 0 0 1 146.411 257.81 Tm [(The)-241(worst)-240(case)-241(r)8(unning)-241(time)-240(for)-241(quicksort)-241(is)]TJ/F78 9.9626 Tf 1 0 0 1 338.306 257.81 Tm [(O)]TJ/F197 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 7.5716 Tf 5.664 3.616 Td [(2)]TJ/F197 10.3811 Tf 4.408 -3.616 Td [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 364.802 257.81 Tm [(;)-245(the)-241(algorithm)-241(im-)]TJ 1.007 0 0 1 146.421 245.855 Tm [(plemented)-246(her)18(e)-246(follows)-246(the)-246(well-known)-246(median-of-thr)18(ee)-246(heuristics,)]TJ 1 0 0 1 146.72 233.9 Tm [(but)-250(the)-250(worst)-250(case)-250(may)-250(still)-250(apply;)]TJ 0 g 0 G -16.04 -15.94 Td [(\050c\051)]TJ 0 g 0 G - 1.005 0 0 1 146.411 343.489 Tm [(The)-249(mer)18(ge-sort)-249(algorithm)-249(is)-249(implemented)-249(to)-250(take)-249(advantage)-249(of)-249(sub-)]TJ 1.02 0 0 1 146.72 331.534 Tm [(sequences)-260(that)-261(may)-261(be)-260(alr)18(eady)-261(in)-260(the)-261(desir)18(ed)-261(or)18(dering)-261(prior)-260(to)-261(the)]TJ 1.02 0 0 1 146.72 319.578 Tm [(subr)18(outine)-321(call;)-358(this)-321(situation)-320(is)-321(r)18(elatively)-321(common)-320(when)-321(dealing)]TJ 0.98 0 0 1 146.301 307.623 Tm [(with)-239(gr)18(oups)-240(of)-239(indices)-239(of)-240(sparse)-239(matrix)-240(entries,)-242(thus)-240(mer)19(ge-sort)-240(is)-239(the)]TJ 1.02 0 0 1 146.421 295.668 Tm [(pr)18(eferr)17(ed)-268(choice)-268(when)-268(a)-268(sorting)-268(is)-268(needed)-268(by)-269(other)-268(r)18(outines)-268(in)-268(the)]TJ 1 0 0 1 146.72 283.713 Tm [(library)111(.)]TJ + 0.98 0 0 1 146.411 217.96 Tm [(The)-194(worst)-194(case)-194(r)9(unning)-194(time)-194(for)-194(mer)18(ge-sort)-193(and)-194(heap-sort)-194(is)]TJ/F78 9.9626 Tf 1 0 0 1 402.204 217.96 Tm [(O)]TJ/F197 10.3811 Tf 8 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(n)]TJ/F84 9.9626 Tf 7.324 0 Td [(log)]TJ/F78 9.9626 Tf 15.663 0 Td [(n)]TJ/F197 10.3811 Tf 5.788 0 Td [(\051)]TJ/F84 9.9626 Tf -296.533 -11.956 Td [(as)-250(the)-250(average)-250(case;)]TJ +0 g 0 G + -17.704 -15.94 Td [(\050d\051)]TJ +0 g 0 G + 1.005 0 0 1 146.411 190.064 Tm [(The)-249(mer)18(ge-sort)-249(algorithm)-249(is)-249(implemented)-249(to)-250(take)-249(advantage)-249(of)-249(sub-)]TJ 1.02 0 0 1 146.72 178.109 Tm [(sequences)-260(that)-261(may)-261(be)-260(alr)18(eady)-261(in)-260(the)-261(desir)18(ed)-261(or)18(dering)-261(prior)-260(to)-261(the)]TJ 1.02 0 0 1 146.72 166.154 Tm [(subr)18(outine)-321(call;)-358(this)-321(situation)-320(is)-321(r)18(elatively)-321(common)-320(when)-321(dealing)]TJ 0.98 0 0 1 146.301 154.199 Tm [(with)-239(gr)18(oups)-240(of)-239(indices)-239(of)-240(sparse)-239(matrix)-240(entries,)-242(thus)-240(mer)19(ge-sort)-240(is)-239(the)]TJ 0.998 0 0 1 146.421 142.243 Tm [(pr)18(eferr)18(ed)-251(choice)-251(when)-252(a)-251(sorting)-251(r)18(outine)-251(is)-252(needed)-251(for)-251(pr)18(epr)18(ocessing)]TJ 1 0 0 1 146.72 130.288 Tm [(matrix)-250(data.)]TJ 0 g 0 G - 117.559 -193.275 Td [(111)]TJ + 117.559 -39.85 Td [(111)]TJ 0 g 0 G ET endstream endobj -1759 0 obj +1762 0 obj << /Length 172 >> @@ -22108,7 +22192,7 @@ ET endstream endobj -1763 0 obj +1766 0 obj << /Length 6837 >> @@ -22126,7 +22210,7 @@ BT /F75 11.9552 Tf 151.016 706.129 Td [(init)-250(\227)-250(Initializes)-250(PSBLAS)-250(parallel)-250(environment)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -51.121 -18.964 Td [(call)-525(psb_init\050ctxt,)-525(np,)-525(basectxt,)-525(ids,)-525(extcomm\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 114.839 669.261 Tm [(This)-354(subr)18(outine)-353(initializes)-354(the)-354(PSBLAS)-353(parallel)-354(envir)18(onment,)-381(de\002ning)-353(a)]TJ 1 0 0 1 99.616 657.306 Tm [(virtual)-250(parallel)-250(machine.)]TJ +/F147 9.9626 Tf -51.121 -18.964 Td [(call)-525(psb_init\050ctxt,)-525(np,)-525(basectxt,)-525(ids,)-525(extcomm\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 114.839 669.261 Tm [(This)-354(subr)18(outine)-353(initializes)-354(the)-354(PSBLAS)-353(parallel)-354(envir)18(onment,)-381(de\002ning)-353(a)]TJ 1 0 0 1 99.616 657.306 Tm [(virtual)-250(parallel)-250(machine.)]TJ 0 g 0 G /F75 9.9626 Tf 0.279 -16.715 Td [(T)90(ype:)]TJ 0 g 0 G @@ -22159,7 +22243,7 @@ BT 0 g 0 G /F75 9.9626 Tf -277.188 -18.32 Td [(ids)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 118.705 459.715 Tm [(Identities)-374(of)-374(the)-374(pr)18(ocesses)-374(to)-374(use)-374(for)-374(t)1(he)-374(new)-374(context;)-439(the)-373(ar)17(gument)-374(is)]TJ 1.02 0 0 1 124.802 447.76 Tm [(ignor)18(ed)-287(when)]TJ/F145 9.9626 Tf 1 0 0 1 190.771 447.76 Tm [(np)]TJ/F84 9.9626 Tf 1.02 0 0 1 204.14 447.76 Tm [(is)-286(not)-286(speci\002ed.)-428(This)-286(allows)-286(the)-286(pr)17(ocesses)-286(in)-286(the)-286(new)]TJ 1 0 0 1 124.802 435.805 Tm [(envir)18(onment)-250(to)-250(be)-250(in)-250(an)-250(or)18(der)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(original)-250(one.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)111(.)-560(Default:)-310(use)-250(the)-250(indices)]TJ/F192 10.3811 Tf 240.57 0 Td [(\050)]TJ/F84 9.9626 Tf 4.149 0 Td [(0)-179(.)-192(.)-192(.)]TJ/F78 9.9626 Tf 19.967 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.504 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1)]TJ/F192 10.3811 Tf 5.106 0 Td [(\051)]TJ/F84 9.9626 Tf 4.149 0 Td [(.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 118.705 459.715 Tm [(Identities)-374(of)-374(the)-374(pr)18(ocesses)-374(to)-374(use)-374(for)-374(t)1(he)-374(new)-374(context;)-439(the)-373(ar)17(gument)-374(is)]TJ 1.02 0 0 1 124.802 447.76 Tm [(ignor)18(ed)-287(when)]TJ/F147 9.9626 Tf 1 0 0 1 190.771 447.76 Tm [(np)]TJ/F84 9.9626 Tf 1.02 0 0 1 204.14 447.76 Tm [(is)-286(not)-286(speci\002ed.)-428(This)-286(allows)-286(the)-286(pr)17(ocesses)-286(in)-286(the)-286(new)]TJ 1 0 0 1 124.802 435.805 Tm [(envir)18(onment)-250(to)-250(be)-250(in)-250(an)-250(or)18(der)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(original)-250(one.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(array)111(.)-560(Default:)-310(use)-250(the)-250(indices)]TJ/F197 10.3811 Tf 240.57 0 Td [(\050)]TJ/F84 9.9626 Tf 4.149 0 Td [(0)-179(.)-192(.)-192(.)]TJ/F78 9.9626 Tf 19.967 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.504 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1)]TJ/F197 10.3811 Tf 5.106 0 Td [(\051)]TJ/F84 9.9626 Tf 4.149 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -322.483 -18.319 Td [(extcomm)]TJ 0 g 0 G @@ -22184,7 +22268,7 @@ BT 0 g 0 G 0 -18.32 Td [(ctxt)]TJ 0 g 0 G -/F84 9.9626 Tf 1.01 0 0 1 120.916 273.665 Tm [(the)-246(communication)-245(context)-246(identifying)-246(the)-245(virtual)-246(parallel)-245(machine,)-247(t)1(ype)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 261.71 Tm [(psb_ctxt_type)]TJ/F84 9.9626 Tf 1.004 0 0 1 192.796 261.71 Tm [(.)-310(Note)-249(that)-250(this)-249(is)-249(always)-250(a)-249(duplicate)-249(of)]TJ/F145 9.9626 Tf 1 0 0 1 367.227 261.71 Tm [(basectxt)]TJ/F84 9.9626 Tf 1.004 0 0 1 409.07 261.71 Tm [(,)-249(so)-250(that)]TJ 0.985 0 0 1 124.802 249.754 Tm [(library)-255(communications)-256(ar)19(e)-256(completely)-255(separated)-256(fr)19(om)-256(other)-255(communica-)]TJ 1 0 0 1 124.802 237.799 Tm [(tion)-250(operations.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.744 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(variable.)]TJ/F75 11.9552 Tf -24.907 -17.904 Td [(Notes)]TJ +/F84 9.9626 Tf 1.01 0 0 1 120.916 273.665 Tm [(the)-246(communication)-245(context)-246(identifying)-246(the)-245(virtual)-246(parallel)-245(machine,)-247(t)1(ype)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 261.71 Tm [(psb_ctxt_type)]TJ/F84 9.9626 Tf 1.004 0 0 1 192.796 261.71 Tm [(.)-310(Note)-249(that)-250(this)-249(is)-249(always)-250(a)-249(duplicate)-249(of)]TJ/F147 9.9626 Tf 1 0 0 1 367.227 261.71 Tm [(basectxt)]TJ/F84 9.9626 Tf 1.004 0 0 1 409.07 261.71 Tm [(,)-249(so)-250(that)]TJ 0.985 0 0 1 124.802 249.754 Tm [(library)-255(communications)-256(ar)19(e)-256(completely)-255(separated)-256(fr)19(om)-256(other)-255(communica-)]TJ 1 0 0 1 124.802 237.799 Tm [(tion)-250(operations.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.744 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(variable.)]TJ/F75 11.9552 Tf -24.907 -17.904 Td [(Notes)]TJ 0 g 0 G /F84 9.9626 Tf 12.454 -16.714 Td [(1.)]TJ 0 g 0 G @@ -22200,9 +22284,9 @@ ET endstream endobj -1769 0 obj +1772 0 obj << -/Length 4738 +/Length 4732 >> stream 0 g 0 G @@ -22218,7 +22302,7 @@ BT /F75 11.9552 Tf 0.996 0 0 1 201.745 706.129 Tm [(info)-250(\227)-249(Return)-250(information)-250(about)-249(PSBLAS)-250(parallel)-250(en-)]TJ 1 0 0 1 177.269 692.181 Tm [(vironment)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -26.564 -18.964 Td [(call)-525(psb_info\050ctxt,)-525(iam,)-525(np\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 165.649 651.3 Tm [(This)-224(subr)19(outine)-224(r)19(eturns)-224(information)-223(about)-224(the)-223(PSBLAS)-224(parallel)-224(envi)1(r)18(onment,)]TJ 1 0 0 1 150.705 639.344 Tm [(de\002ning)-250(a)-250(virtual)-250(parallel)-250(machine.)]TJ +/F147 9.9626 Tf -26.564 -18.964 Td [(call)-525(psb_info\050ctxt,)-525(iam,)-525(np\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 165.649 651.3 Tm [(This)-224(subr)19(outine)-224(r)19(eturns)-224(information)-223(about)-224(the)-223(PSBLAS)-224(parallel)-224(envi)1(r)18(onment,)]TJ 1 0 0 1 150.705 639.344 Tm [(de\002ning)-250(a)-250(virtual)-250(parallel)-250(machine.)]TJ 0 g 0 G /F75 9.9626 Tf 0 -19.925 Td [(T)90(ype:)]TJ 0 g 0 G @@ -22236,19 +22320,19 @@ BT 0 g 0 G 0 -19.925 Td [(iam)]TJ 0 g 0 G -/F84 9.9626 Tf 22.137 0 Td [(Identi\002er)-250(of)-250(curr)18(ent)-250(pr)18(ocess)-250(in)-250(the)-250(PSBLAS)-250(virtual)-250(parallel)-250(machine.)]TJ 2.769 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.745 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)]TJ/F190 10.3811 Tf 134.191 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F190 10.3811 Tf 7.873 0 Td [(\024)]TJ/F78 9.9626 Tf 11.016 0 Td [(i)-47(a)-25(m)]TJ/F190 10.3811 Tf 18.678 0 Td [(\024)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.504 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1)]TJ +/F84 9.9626 Tf 22.137 0 Td [(Identi\002er)-250(of)-250(curr)18(ent)-250(pr)18(ocess)-250(in)-250(the)-250(PSBLAS)-250(virtual)-250(parallel)-250(machine.)]TJ 2.769 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.745 -11.955 Td [(Returned)-250(as:)-310(an)-250(integer)-250(value.)]TJ/F195 10.3811 Tf 135.267 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F195 10.3811 Tf 7.873 0 Td [(\024)]TJ/F78 9.9626 Tf 11.016 0 Td [(i)-47(a)-25(m)]TJ/F195 10.3811 Tf 18.678 0 Td [(\024)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1)]TJ 0 g 0 G -/F75 9.9626 Tf -239.579 -19.925 Td [(np)]TJ +/F75 9.9626 Tf -240.655 -19.925 Td [(np)]TJ 0 g 0 G -/F84 9.9626 Tf 17.156 0 Td [(Number)-250(of)-250(pr)18(ocesses)-250(in)-250(the)-250(PSBLAS)-250(virtual)-250(parallel)-250(machine.)]TJ 7.751 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -66.071 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.744 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(variable.)]TJ/F75 11.9552 Tf -24.907 -21.918 Td [(Notes)]TJ +/F84 9.9626 Tf 17.156 0 Td [(Number)-250(of)-250(pr)18(ocesses)-250(in)-250(the)-250(PSBLAS)-250(virtual)-250(parallel)-250(machine.)]TJ 7.751 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -66.071 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -46.744 -11.955 Td [(Returned)-250(as:)-310(an)-250(integer)-250(variable.)]TJ/F75 11.9552 Tf -24.907 -21.918 Td [(Notes)]TJ 0 g 0 G /F84 9.9626 Tf 12.453 -19.925 Td [(1.)]TJ 0 g 0 G - 1.02 0 0 1 175.611 332.495 Tm [(For)-337(pr)18(ocesses)-337(in)-337(the)-337(virtual)-337(parallel)-337(machine)-336(the)-337(identi\002er)-337(will)-337(satisfy)]TJ 1 0 0 1 175.611 320.54 Tm [(0)]TJ/F190 10.3811 Tf 7.874 0 Td [(\024)]TJ/F78 9.9626 Tf 11.016 0 Td [(i)-47(a)-25(m)]TJ/F190 10.3811 Tf 18.678 0 Td [(\024)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1;)]TJ + 1.02 0 0 1 175.611 332.495 Tm [(For)-337(pr)18(ocesses)-337(in)-337(the)-337(virtual)-337(parallel)-337(machine)-336(the)-337(identi\002er)-337(will)-337(satisfy)]TJ 1 0 0 1 175.611 320.54 Tm [(0)]TJ/F195 10.3811 Tf 7.874 0 Td [(\024)]TJ/F78 9.9626 Tf 11.016 0 Td [(i)-47(a)-25(m)]TJ/F195 10.3811 Tf 18.678 0 Td [(\024)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1;)]TJ 0 g 0 G -84.741 -19.925 Td [(2.)]TJ 0 g 0 G - 1.02 0 0 1 175.611 300.615 Tm [(If)-304(the)-303(user)-304(has)-304(r)18(equested)-304(on)]TJ/F145 9.9626 Tf 1 0 0 1 305.201 300.615 Tm [(psb_init)]TJ/F84 9.9626 Tf 1.02 0 0 1 350.13 300.615 Tm [(a)-304(number)-303(of)-304(pr)18(ocesses)-304(less)-304(than)]TJ 1.02 0 0 1 175.611 288.659 Tm [(the)-253(total)-254(available)-253(in)-253(the)-254(parallel)-253(execution)-253(envir)17(onment,)-255(the)-253(r)17(emaining)]TJ 0.992 0 0 1 175.313 276.704 Tm [(pr)18(ocesses)-251(will)-251(have)-251(on)-252(r)19(eturn)]TJ/F78 9.9626 Tf 1 0 0 1 305.592 276.704 Tm [(i)-47(a)-25(m)]TJ/F192 10.3811 Tf 18.677 0 Td [(=)]TJ/F190 10.3811 Tf 11.086 0 Td [(\000)]TJ/F84 9.9626 Tf 0.992 0 0 1 343.549 276.704 Tm [(1;)-252(the)-251(only)-251(call)-251(involving)]TJ/F145 9.9626 Tf 1 0 0 1 453.875 276.704 Tm [(ctxt)]TJ/F84 9.9626 Tf 0.992 0 0 1 477.279 276.704 Tm [(that)]TJ 1 0 0 1 175.611 264.749 Tm [(any)-250(such)-250(pr)18(ocess)-250(may)-250(execute)-250(is)-250(to)]TJ/F145 9.9626 Tf 155.296 0 Td [(psb_exit)]TJ/F84 9.9626 Tf 41.843 0 Td [(.)]TJ + 1.02 0 0 1 175.611 300.615 Tm [(If)-304(the)-303(user)-304(has)-304(r)18(equested)-304(on)]TJ/F147 9.9626 Tf 1 0 0 1 305.201 300.615 Tm [(psb_init)]TJ/F84 9.9626 Tf 1.02 0 0 1 350.13 300.615 Tm [(a)-304(number)-303(of)-304(pr)18(ocesses)-304(less)-304(than)]TJ 1.02 0 0 1 175.611 288.659 Tm [(the)-253(total)-254(available)-253(in)-253(the)-254(parallel)-253(execution)-253(envir)17(onment,)-255(the)-253(r)17(emaining)]TJ 0.992 0 0 1 175.313 276.704 Tm [(pr)18(ocesses)-251(will)-251(have)-251(on)-252(r)19(eturn)]TJ/F78 9.9626 Tf 1 0 0 1 305.592 276.704 Tm [(i)-47(a)-25(m)]TJ/F197 10.3811 Tf 18.677 0 Td [(=)]TJ/F195 10.3811 Tf 11.086 0 Td [(\000)]TJ/F84 9.9626 Tf 0.992 0 0 1 343.549 276.704 Tm [(1;)-252(the)-251(only)-251(call)-251(involving)]TJ/F147 9.9626 Tf 1 0 0 1 453.875 276.704 Tm [(ctxt)]TJ/F84 9.9626 Tf 0.992 0 0 1 477.279 276.704 Tm [(that)]TJ 1 0 0 1 175.611 264.749 Tm [(any)-250(such)-250(pr)18(ocess)-250(may)-250(execute)-250(is)-250(to)]TJ/F147 9.9626 Tf 155.296 0 Td [(psb_exit)]TJ/F84 9.9626 Tf 41.843 0 Td [(.)]TJ 0 g 0 G -57.662 -174.311 Td [(114)]TJ 0 g 0 G @@ -22256,9 +22340,9 @@ ET endstream endobj -1775 0 obj +1778 0 obj << -/Length 4507 +/Length 4473 >> stream 0 g 0 G @@ -22274,7 +22358,7 @@ BT /F75 11.9552 Tf 151.016 706.129 Td [(exit)-250(\227)-250(Exit)-250(from)-250(PSBLAS)-250(parallel)-250(environment)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -51.121 -18.964 Td [(call)-525(psb_exit\050ctxt\051)]TJ 0 -11.955 Td [(call)-525(psb_exit\050ctxt,close\051)]TJ/F84 9.9626 Tf 14.944 -21.918 Td [(This)-250(subr)18(outine)-250(exits)-250(fr)18(om)-250(the)-250(PSBLAS)-250(parallel)-250(virtual)-250(machine.)]TJ +/F147 9.9626 Tf -51.121 -18.964 Td [(call)-525(psb_exit\050ctxt\051)]TJ 0 -11.955 Td [(call)-525(psb_exit\050ctxt,close\051)]TJ/F84 9.9626 Tf 14.944 -21.918 Td [(This)-250(subr)18(outine)-250(exits)-250(fr)18(om)-250(the)-250(PSBLAS)-250(parallel)-250(virtual)-250(machine.)]TJ 0 g 0 G /F75 9.9626 Tf -14.944 -19.925 Td [(T)90(ype:)]TJ 0 g 0 G @@ -22293,23 +22377,23 @@ BT 0 g 0 G /F84 9.9626 Tf 12.454 -19.925 Td [(1.)]TJ 0 g 0 G - 0.98 0 0 1 124.493 426.144 Tm [(This)-218(r)19(outine)-218(may)-217(be)-218(called)-217(even)-218(if)-218(a)-217(pr)18(evious)-217(call)-218(to)]TJ/F145 9.9626 Tf 1 0 0 1 345.207 426.144 Tm [(psb_info)]TJ/F84 9.9626 Tf 0.98 0 0 1 389.174 426.144 Tm [(has)-218(r)19(eturned)]TJ 1.02 0 0 1 124.384 414.189 Tm [(with)]TJ/F78 9.9626 Tf 1 0 0 1 147.897 414.189 Tm [(i)-47(a)-25(m)]TJ/F192 10.3811 Tf 19.251 0 Td [(=)]TJ/F190 10.3811 Tf 11.66 0 Td [(\000)]TJ/F84 9.9626 Tf 1.02 0 0 1 187.002 414.189 Tm [(1;)-291(indeed,)-283(it)-275(it)-276(is)-276(the)-275(only)-276(r)18(outine)-276(that)-275(may)-276(be)-275(called)-276(with)]TJ 1 0 0 1 124.802 402.234 Tm [(ar)18(gument)]TJ/F145 9.9626 Tf 45.389 0 Td [(ctxt)]TJ/F84 9.9626 Tf 23.412 0 Td [(in)-250(this)-250(situation.)]TJ + 0.98 0 0 1 124.493 426.144 Tm [(This)-218(r)19(outine)-218(may)-217(be)-218(called)-217(even)-218(if)-218(a)-217(pr)18(evious)-217(call)-218(to)]TJ/F147 9.9626 Tf 1 0 0 1 345.207 426.144 Tm [(psb_info)]TJ/F84 9.9626 Tf 0.98 0 0 1 389.174 426.144 Tm [(has)-218(r)19(eturned)]TJ 1.02 0 0 1 124.384 414.189 Tm [(with)]TJ/F78 9.9626 Tf 1 0 0 1 147.897 414.189 Tm [(i)-47(a)-25(m)]TJ/F197 10.3811 Tf 19.251 0 Td [(=)]TJ/F195 10.3811 Tf 11.66 0 Td [(\000)]TJ/F84 9.9626 Tf 1.02 0 0 1 187.002 414.189 Tm [(1;)-291(indeed,)-283(it)-275(it)-276(is)-276(the)-275(only)-276(r)18(outine)-276(that)-275(may)-276(be)-275(called)-276(with)]TJ 1 0 0 1 124.802 402.234 Tm [(ar)18(gument)]TJ/F147 9.9626 Tf 45.389 0 Td [(ctxt)]TJ/F84 9.9626 Tf 23.412 0 Td [(in)-250(this)-250(situation.)]TJ 0 g 0 G -81.254 -19.926 Td [(2.)]TJ 0 g 0 G - 1.02 0 0 1 124.413 382.308 Tm [(A)-249(call)-249(to)-248(this)-249(r)18(outine)-249(with)]TJ/F145 9.9626 Tf 1 0 0 1 241.568 382.308 Tm [(close=.true.)]TJ/F84 9.9626 Tf 1.02 0 0 1 306.86 382.308 Tm [(implies)-249(a)-248(call)-249(to)]TJ/F145 9.9626 Tf 1 0 0 1 379.547 382.308 Tm [(MPI_Finalize)]TJ/F84 9.9626 Tf 1.02 0 0 1 442.311 382.308 Tm [(,)]TJ 1 0 0 1 124.802 370.353 Tm [(after)-250(which)-250(no)-250(parallel)-250(r)18(outine)-250(may)-250(be)-250(called.)]TJ + 1.02 0 0 1 124.413 382.308 Tm [(A)-249(call)-249(to)-248(this)-249(r)18(outine)-249(with)]TJ/F147 9.9626 Tf 1 0 0 1 241.568 382.308 Tm [(close=.true.)]TJ/F84 9.9626 Tf 1.02 0 0 1 306.86 382.308 Tm [(implies)-249(a)-248(call)-249(to)]TJ/F147 9.9626 Tf 1 0 0 1 379.547 382.308 Tm [(MPI_Finalize)]TJ/F84 9.9626 Tf 1.02 0 0 1 442.311 382.308 Tm [(,)]TJ 1 0 0 1 124.802 370.353 Tm [(after)-250(which)-250(no)-250(parallel)-250(r)18(outine)-250(may)-250(be)-250(called.)]TJ 0 g 0 G -12.453 -19.925 Td [(3.)]TJ 0 g 0 G - 1.015 0 0 1 124.802 350.428 Tm [(If)-245(the)-246(user)-245(whishes)-246(to)-245(use)-246(multiple)-245(communication)-246(contexts)-245(in)-246(the)-245(same)]TJ 1.02 0 0 1 124.503 338.473 Tm [(pr)18(ogram,)-354(or)-332(to)-332(enter)-332(and)-332(exit)-332(multiple)-332(times)-332(into)-332(the)-332(parallel)-333(en)1(vir)17(on-)]TJ 1.02 0 0 1 124.802 326.518 Tm [(ment,)-356(this)-334(r)18(outine)-334(may)-334(be)-334(called)-334(to)-333(selectively)-334(close)-334(the)-334(contexts)-334(with)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 314.562 Tm [(close=.false.)]TJ/F84 9.9626 Tf 0.98 0 0 1 192.796 314.562 Tm [(,)-206(while)-194(on)-194(the)-194(last)-194(call)-193(it)-194(should)-194(be)-194(called)-194(with)]TJ/F145 9.9626 Tf 1 0 0 1 386.196 314.562 Tm [(close=.true.)]TJ/F84 9.9626 Tf -261.394 -11.955 Td [(to)-250(shutdown)-250(in)-250(a)-250(clean)-250(way)-250(the)-250(entir)18(e)-250(parallel)-250(envir)18(onment.)]TJ + 1.015 0 0 1 124.802 350.428 Tm [(If)-245(the)-246(user)-245(whishes)-246(to)-245(use)-246(multiple)-245(communication)-246(contexts)-245(in)-246(the)-245(same)]TJ 1.02 0 0 1 124.503 338.473 Tm [(pr)18(ogram,)-354(or)-332(to)-332(enter)-332(and)-332(exit)-332(multiple)-332(times)-332(into)-332(the)-332(parallel)-333(en)1(vir)17(on-)]TJ 1.02 0 0 1 124.802 326.518 Tm [(ment,)-356(this)-334(r)18(outine)-334(may)-334(be)-334(called)-334(to)-333(selectively)-334(close)-334(the)-334(contexts)-334(with)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 314.562 Tm [(close=.false.)]TJ/F84 9.9626 Tf 1.018 0 0 1 192.796 314.562 Tm [(,)-245(while)-245(on)-245(the)-245(last)-245(instance)-245(it)-245(should)-245(close)-245(in)-245(a)-245(clean)-245(way)]TJ 1 0 0 1 124.802 302.607 Tm [(the)-250(entir)18(e)-250(parallel)-250(envir)18(onment)-250(with)]TJ/F147 9.9626 Tf 161.831 0 Td [(close=.true.)]TJ 0 g 0 G - 139.477 -212.169 Td [(115)]TJ +/F84 9.9626 Tf -22.354 -212.169 Td [(115)]TJ 0 g 0 G ET endstream endobj -1783 0 obj +1786 0 obj << /Length 2607 >> @@ -22341,7 +22425,7 @@ BT /F75 11.9552 Tf 248.952 706.129 Td [(comm)-250(\227)-250(Get)-250(the)-250(MPI)-250(communicator)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -98.247 -18.964 Td [(icomm)-525(=)-525(psb_get_mpi_comm\050ctxt\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 165.649 665.247 Tm [(This)-345(funct)1(ion)-345(r)18(eturns)-345(the)-344(MPI)-345(communicator)-344(associated)-345(with)-344(a)-345(PSBLAS)]TJ 1 0 0 1 150.705 653.292 Tm [(context)]TJ +/F147 9.9626 Tf -98.247 -18.964 Td [(icomm)-525(=)-525(psb_get_mpi_comm\050ctxt\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 165.649 665.247 Tm [(This)-345(funct)1(ion)-345(r)18(eturns)-345(the)-344(MPI)-345(communicator)-344(associated)-345(with)-344(a)-345(PSBLAS)]TJ 1 0 0 1 150.705 653.292 Tm [(context)]TJ 0 g 0 G /F75 9.9626 Tf 0 -19.925 Td [(T)90(ype:)]TJ 0 g 0 G @@ -22359,7 +22443,7 @@ BT 0 g 0 G 0 -19.926 Td [(Function)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 223.173 503.852 Tm [(The)-300(MPI)-299(communicator)-300(associated)-300(with)-300(the)-300(PSBLAS)-299(virtual)]TJ 1 0 0 1 175.313 491.897 Tm [(parallel)-250(machine.)]TJ 0.298 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ/F75 11.9552 Tf 0.999 0 0 1 150.705 422.159 Tm [(Notes)]TJ/F84 9.9626 Tf 0.999 0 0 1 185.028 422.159 Tm [(The)-249(subr)18(outine)-250(version)]TJ/F145 9.9626 Tf 1 0 0 1 289.412 422.159 Tm [(psb_get_mpicomm)]TJ/F84 9.9626 Tf 0.999 0 0 1 370.349 422.159 Tm [(is)-249(still)-250(available)-249(but)-250(is)-249(depr)18(e-)]TJ 1 0 0 1 150.705 410.204 Tm [(cated.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 223.173 503.852 Tm [(The)-300(MPI)-299(communicator)-300(associated)-300(with)-300(the)-300(PSBLAS)-299(virtual)]TJ 1 0 0 1 175.313 491.897 Tm [(parallel)-250(machine.)]TJ 0.298 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ/F75 11.9552 Tf 0.999 0 0 1 150.705 422.159 Tm [(Notes)]TJ/F84 9.9626 Tf 0.999 0 0 1 185.028 422.159 Tm [(The)-249(subr)18(outine)-250(version)]TJ/F147 9.9626 Tf 1 0 0 1 289.412 422.159 Tm [(psb_get_mpicomm)]TJ/F84 9.9626 Tf 0.999 0 0 1 370.349 422.159 Tm [(is)-249(still)-250(available)-249(but)-250(is)-249(depr)18(e-)]TJ 1 0 0 1 150.705 410.204 Tm [(cated.)]TJ 0 g 0 G 164.383 -319.766 Td [(116)]TJ 0 g 0 G @@ -22367,7 +22451,7 @@ ET endstream endobj -1787 0 obj +1790 0 obj << /Length 3383 >> @@ -22399,7 +22483,7 @@ BT /F75 11.9552 Tf 198.143 706.129 Td [(rank)-250(\227)-250(Get)-250(the)-250(MPI)-250(rank)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -98.248 -18.964 Td [(rank)-525(=)-525(psb_get_mpi_rank\050ctxt,)-525(id\051)]TJ/F84 9.9626 Tf 14.944 -21.918 Td [(This)-250(function)-250(r)18(eturns)-250(the)-250(MPI)-250(rank)-250(of)-250(the)-250(PSBLAS)-250(pr)18(ocess)]TJ/F78 9.9626 Tf 257.337 0 Td [(i)-32(d)]TJ +/F147 9.9626 Tf -98.248 -18.964 Td [(rank)-525(=)-525(psb_get_mpi_rank\050ctxt,)-525(id\051)]TJ/F84 9.9626 Tf 14.944 -21.918 Td [(This)-250(function)-250(r)18(eturns)-250(the)-250(MPI)-250(rank)-250(of)-250(the)-250(PSBLAS)-250(pr)18(ocess)]TJ/F78 9.9626 Tf 257.337 0 Td [(i)-32(d)]TJ 0 g 0 G /F75 9.9626 Tf -272.281 -19.925 Td [(T)90(ype:)]TJ 0 g 0 G @@ -22414,14 +22498,14 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -19.926 Td [(id)]TJ 0 g 0 G -/F84 9.9626 Tf 14.386 0 Td [(Identi\002er)-250(of)-250(a)-250(pr)18(ocess)-250(in)-250(the)-250(PSBLAS)-250(virtual)-250(parallel)-250(machine.)]TJ 10.521 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(0)]TJ/F190 10.3811 Tf 141.939 0 Td [(\024)]TJ/F78 9.9626 Tf 11.016 0 Td [(i)-32(d)]TJ/F190 10.3811 Tf 11.086 0 Td [(\024)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.504 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1)]TJ +/F84 9.9626 Tf 14.386 0 Td [(Identi\002er)-250(of)-250(a)-250(pr)18(ocess)-250(in)-250(the)-250(PSBLAS)-250(virtual)-250(parallel)-250(machine.)]TJ 10.521 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(0)]TJ/F195 10.3811 Tf 141.939 0 Td [(\024)]TJ/F78 9.9626 Tf 11.016 0 Td [(i)-32(d)]TJ/F195 10.3811 Tf 11.086 0 Td [(\024)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.504 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1)]TJ 0 g 0 G /F75 9.9626 Tf -223.669 -21.918 Td [(On)-250(Return)]TJ 0 g 0 G 0 g 0 G 0 -19.925 Td [(Funciton)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 72.468 0 Td [(The)-250(MPI)-250(rank)-250(associated)-250(with)-250(the)-250(PSBLAS)-250(pr)18(ocess)]TJ/F78 9.9626 Tf 224.292 0 Td [(i)-32(d)]TJ/F84 9.9626 Tf 8.194 0 Td [(.)]TJ -280.047 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ/F75 11.9552 Tf 0.98 0 0 1 99.895 378.323 Tm [(Notes)]TJ/F84 9.9626 Tf 0.98 0 0 1 133.429 378.323 Tm [(The)-235(subr)18(outine)-235(version)]TJ/F145 9.9626 Tf 1 0 0 1 235.414 378.323 Tm [(psb_get_rank)]TJ/F84 9.9626 Tf 0.98 0 0 1 300.476 378.323 Tm [(is)-235(still)-236(available)-235(but)-236(is)-235(depr)18(ecated.)]TJ +/F84 9.9626 Tf 72.468 0 Td [(The)-250(MPI)-250(rank)-250(associated)-250(with)-250(the)-250(PSBLAS)-250(pr)18(ocess)]TJ/F78 9.9626 Tf 224.292 0 Td [(i)-32(d)]TJ/F84 9.9626 Tf 8.194 0 Td [(.)]TJ -280.047 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ/F75 11.9552 Tf 0.98 0 0 1 99.895 378.323 Tm [(Notes)]TJ/F84 9.9626 Tf 0.98 0 0 1 133.429 378.323 Tm [(The)-235(subr)18(outine)-235(version)]TJ/F147 9.9626 Tf 1 0 0 1 235.414 378.323 Tm [(psb_get_rank)]TJ/F84 9.9626 Tf 0.98 0 0 1 300.476 378.323 Tm [(is)-235(still)-236(available)-235(but)-236(is)-235(depr)18(ecated.)]TJ 0 g 0 G 1 0 0 1 264.279 90.438 Tm [(117)]TJ 0 g 0 G @@ -22429,7 +22513,7 @@ ET endstream endobj -1791 0 obj +1794 0 obj << /Length 1171 >> @@ -22447,7 +22531,7 @@ BT /F75 11.9552 Tf 201.825 706.129 Td [(wtime)-250(\227)-250(W)74(all)-250(clock)-250(timing)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -51.12 -18.964 Td [(time)-525(=)-525(psb_wtime\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 165.649 665.247 Tm [(This)-374(function)-374(r)17(eturns)-374(a)-374(wall)-374(clock)-374(timer)72(.)-691(The)-374(r)18(esolution)-375(of)-374(the)-374(timer)-374(is)]TJ 1 0 0 1 150.705 653.292 Tm [(dependent)-250(on)-250(the)-250(underlying)-250(parallel)-250(envir)18(onment)-250(implementation.)]TJ +/F147 9.9626 Tf -51.12 -18.964 Td [(time)-525(=)-525(psb_wtime\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 165.649 665.247 Tm [(This)-374(function)-374(r)17(eturns)-374(a)-374(wall)-374(clock)-374(timer)72(.)-691(The)-374(r)18(esolution)-375(of)-374(the)-374(timer)-374(is)]TJ 1 0 0 1 150.705 653.292 Tm [(dependent)-250(on)-250(the)-250(underlying)-250(parallel)-250(envir)18(onment)-250(implementation.)]TJ 0 g 0 G /F75 9.9626 Tf 0 -19.925 Td [(T)90(ype:)]TJ 0 g 0 G @@ -22458,7 +22542,7 @@ BT 0 g 0 G 0 -19.926 Td [(Function)-250(value)]TJ 0 g 0 G -/F84 9.9626 Tf 72.776 0 Td [(the)-250(elapsed)-250(time)-250(in)-250(seconds.)]TJ -47.87 -11.955 Td [(Returned)-250(as:)-310(a)]TJ/F145 9.9626 Tf 66.022 0 Td [(real\050psb_dpk_\051)]TJ/F84 9.9626 Tf 75.716 0 Td [(variable.)]TJ +/F84 9.9626 Tf 72.776 0 Td [(the)-250(elapsed)-250(time)-250(in)-250(seconds.)]TJ -47.87 -11.955 Td [(Returned)-250(as:)-310(a)]TJ/F147 9.9626 Tf 66.022 0 Td [(real\050psb_dpk_\051)]TJ/F84 9.9626 Tf 75.716 0 Td [(variable.)]TJ 0 g 0 G -2.261 -491.123 Td [(118)]TJ 0 g 0 G @@ -22466,7 +22550,7 @@ ET endstream endobj -1795 0 obj +1798 0 obj << /Length 1466 >> @@ -22484,7 +22568,7 @@ BT /F75 11.9552 Tf 0.998 0 0 1 150.976 706.129 Tm [(barrier)-250(\227)-251(Sinchronizati)1(on)-251(point)-250(parallel)-250(environment)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 1 0 0 1 99.895 687.165 Tm [(call)-525(psb_barrier\050ctxt\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 114.839 665.247 Tm [(This)-293(subr)18(outine)-293(acts)-293(as)-293(an)-293(explicit)-293(synchr)18(onization)-293(point)-293(for)-293(the)-293(PSBLAS)]TJ 1 0 0 1 99.596 653.292 Tm [(parallel)-250(virtual)-250(machine.)]TJ +/F147 9.9626 Tf 1 0 0 1 99.895 687.165 Tm [(call)-525(psb_barrier\050ctxt\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 114.839 665.247 Tm [(This)-293(subr)18(outine)-293(acts)-293(as)-293(an)-293(explicit)-293(synchr)18(onization)-293(point)-293(for)-293(the)-293(PSBLAS)]TJ 1 0 0 1 99.596 653.292 Tm [(parallel)-250(virtual)-250(machine.)]TJ 0 g 0 G /F75 9.9626 Tf 0.299 -19.925 Td [(T)90(ype:)]TJ 0 g 0 G @@ -22503,7 +22587,7 @@ ET endstream endobj -1799 0 obj +1802 0 obj << /Length 1287 >> @@ -22521,7 +22605,7 @@ BT /F75 11.9552 Tf 201.825 706.129 Td [(abort)-250(\227)-250(Abort)-250(a)-250(computation)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -51.12 -18.964 Td [(call)-525(psb_abort\050ctxt\051)]TJ/F84 9.9626 Tf 14.944 -21.918 Td [(This)-250(subr)18(outine)-250(aborts)-250(computation)-250(on)-250(the)-250(parallel)-250(virtual)-250(machine.)]TJ +/F147 9.9626 Tf -51.12 -18.964 Td [(call)-525(psb_abort\050ctxt\051)]TJ/F84 9.9626 Tf 14.944 -21.918 Td [(This)-250(subr)18(outine)-250(aborts)-250(computation)-250(on)-250(the)-250(parallel)-250(virtual)-250(machine.)]TJ 0 g 0 G /F75 9.9626 Tf -14.944 -19.925 Td [(T)90(ype:)]TJ 0 g 0 G @@ -22540,7 +22624,7 @@ ET endstream endobj -1803 0 obj +1806 0 obj << /Length 6065 >> @@ -22558,7 +22642,7 @@ BT /F75 11.9552 Tf 151.016 706.129 Td [(bcast)-250(\227)-250(Broadcast)-250(data)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -51.121 -19.198 Td [(call)-525(psb_bcast\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 0.992 0 0 1 114.839 664.53 Tm [(This)-251(subr)18(outine)-251(implements)-251(a)-251(br)18(oadcast)-250(operation)-251(based)-251(on)-251(the)-251(underlying)]TJ 1 0 0 1 99.895 652.575 Tm [(communication)-250(library)111(.)]TJ +/F147 9.9626 Tf -51.121 -19.198 Td [(call)-525(psb_bcast\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 0.992 0 0 1 114.839 664.53 Tm [(This)-251(subr)18(outine)-251(implements)-251(a)-251(br)18(oadcast)-250(operation)-251(based)-251(on)-251(the)-251(underlying)]TJ 1 0 0 1 99.895 652.575 Tm [(communication)-250(library)111(.)]TJ 0 g 0 G /F75 9.9626 Tf 0 -20.288 Td [(T)90(ype:)]TJ 0 g 0 G @@ -22577,15 +22661,15 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -20.408 Td [(root)]TJ 0 g 0 G -/F84 9.9626 Tf 23.253 0 Td [(Root)-250(pr)18(ocess)-250(holding)-250(data)-250(to)-250(be)-250(br)18(oadcast.)]TJ 1.654 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)-250(0)]TJ/F148 10.3811 Tf 138.85 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F148 10.3811 Tf 19.923 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.504 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1,)-250(default)-250(0)]TJ +/F84 9.9626 Tf 23.253 0 Td [(Root)-250(pr)18(ocess)-250(holding)-250(data)-250(to)-250(be)-250(br)18(oadcast.)]TJ 1.654 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)-250(0)]TJ/F152 10.3811 Tf 138.85 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F152 10.3811 Tf 19.923 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.504 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1,)-250(default)-250(0)]TJ 0 g 0 G /F75 9.9626 Tf -246.025 -20.409 Td [(mode)]TJ 0 g 0 G -/F84 9.9626 Tf 0.983 0 0 1 129.843 362.871 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 350.916 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 303.096 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 291.14 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 323.986 291.14 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 291.14 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 279.185 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 279.185 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 239.567 279.185 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 279.185 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 267.23 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ +/F84 9.9626 Tf 0.983 0 0 1 129.843 362.871 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 350.916 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 303.096 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 291.14 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 323.986 291.14 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 291.14 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 279.185 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 279.185 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 239.567 279.185 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 279.185 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 267.23 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -32.364 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ 0 g 0 G /F75 9.9626 Tf -57.485 -22.401 Td [(On)-250(Return)]TJ 0 g 0 G @@ -22600,7 +22684,7 @@ ET endstream endobj -1808 0 obj +1811 0 obj << /Length 5230 >> @@ -22612,15 +22696,15 @@ BT 0 g 0 G /F75 9.9626 Tf -24.906 -19.925 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.956 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.917 Td [(Notes)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.956 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.917 Td [(Notes)]TJ 0 g 0 G /F84 9.9626 Tf 12.453 -19.926 Td [(1.)]TJ 0 g 0 G - 0.98 0 0 1 175.303 560.674 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 193.994 560.674 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 560.674 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 548.719 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ + 0.98 0 0 1 175.303 560.674 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 193.994 560.674 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 560.674 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 548.719 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ 0 g 0 G -12.453 -19.925 Td [(2.)]TJ 0 g 0 G - 1.02 0 0 1 175.303 528.794 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 195.057 528.794 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 528.794 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 395.907 528.794 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 528.794 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 516.839 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 504.884 Tm [(the)]TJ/F145 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ + 1.02 0 0 1 175.303 528.794 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 195.057 528.794 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 528.794 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 395.907 528.794 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 528.794 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 516.839 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 504.884 Tm [(the)]TJ/F147 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -22634,7 +22718,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 188.015 482.268 Td [(call)]TJ +/F235 8.9664 Tf 188.015 482.268 Td [(call)]TJ 0 g 0 G [-525(psb_bcast\050ctxt,dat,&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -22655,7 +22739,7 @@ BT 0 g 0 G /F84 9.9626 Tf -48.393 -36.164 Td [(3.)]TJ 0 g 0 G - 1.02 0 0 1 175.113 435.145 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F145 9.9626 Tf 1 0 0 1 379.88 435.145 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 435.145 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 435.145 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 435.145 Tm [(be)]TJ 1 0 0 1 175.611 423.19 Tm [(accessed)-250(between)-250(calls:)]TJ + 1.02 0 0 1 175.113 435.145 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F147 9.9626 Tf 1 0 0 1 379.88 435.145 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 435.145 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 435.145 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 435.145 Tm [(be)]TJ 1 0 0 1 175.611 423.19 Tm [(accessed)-250(between)-250(calls:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -22669,7 +22753,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 188.015 400.575 Td [(call)]TJ +/F235 8.9664 Tf 188.015 400.575 Td [(call)]TJ 0 g 0 G [-525(psb_bcast\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -22692,12 +22776,12 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ +/F281 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F233 8.9664 Tf -37.658 -10.959 Td [(call)]TJ +/F235 8.9664 Tf -37.658 -10.959 Td [(call)]TJ 0 g 0 G [-525(psb_bcast\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -22723,7 +22807,7 @@ ET endstream endobj -1816 0 obj +1819 0 obj << /Length 6196 >> @@ -22741,7 +22825,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(sum)-250(\227)-250(Global)-250(sum)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -19.198 Td [(call)-525(psb_sum\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 0.991 0 0 1 114.839 664.53 Tm [(This)-253(subr)18(outine)-253(implements)-254(a)-253(sum)-253(r)18(eduction)-253(operation)-254(based)-253(on)-253(the)-254(under)19(-)]TJ 1 0 0 1 99.895 652.575 Tm [(lying)-250(communication)-250(library)111(.)]TJ +/F147 9.9626 Tf -57.098 -19.198 Td [(call)-525(psb_sum\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 0.991 0 0 1 114.839 664.53 Tm [(This)-253(subr)18(outine)-253(implements)-254(a)-253(sum)-253(r)18(eduction)-253(operation)-254(based)-253(on)-253(the)-254(under)19(-)]TJ 1 0 0 1 99.895 652.575 Tm [(lying)-250(communication)-250(library)111(.)]TJ 0 g 0 G /F75 9.9626 Tf 0 -20.288 Td [(T)90(ype:)]TJ 0 g 0 G @@ -22760,15 +22844,15 @@ BT 0 g 0 G /F75 9.9626 Tf 1 0 0 1 99.895 443.056 Tm [(root)]TJ 0 g 0 G -/F84 9.9626 Tf 23.253 0 Td [(Pr)18(ocess)-250(to)-250(hold)-250(the)-250(\002nal)-250(sum,)-250(or)]TJ/F190 10.3811 Tf 143.744 0 Td [(\000)]TJ/F84 9.9626 Tf 8.195 0 Td [(1)-250(to)-250(make)-250(it)-250(available)-250(on)-250(all)-250(pr)18(ocesses.)]TJ -150.285 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F190 10.3811 Tf 131.102 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F148 10.3811 Tf 7.873 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F148 10.3811 Tf 19.923 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)-250(-1.)]TJ +/F84 9.9626 Tf 23.253 0 Td [(Pr)18(ocess)-250(to)-250(hold)-250(the)-250(\002nal)-250(sum,)-250(or)]TJ/F195 10.3811 Tf 143.744 0 Td [(\000)]TJ/F84 9.9626 Tf 8.195 0 Td [(1)-250(to)-250(make)-250(it)-250(available)-250(on)-250(all)-250(pr)18(ocesses.)]TJ -150.285 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F195 10.3811 Tf 131.102 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F152 10.3811 Tf 7.873 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F152 10.3811 Tf 19.923 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)-250(-1.)]TJ 0 g 0 G /F75 9.9626 Tf -254.344 -20.408 Td [(mode)]TJ 0 g 0 G -/F84 9.9626 Tf 0.983 0 0 1 129.843 374.827 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 362.871 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 315.051 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 303.096 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 323.986 303.096 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 303.096 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 291.14 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 291.14 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 239.567 291.14 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 291.14 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 279.185 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ +/F84 9.9626 Tf 0.983 0 0 1 129.843 374.827 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 362.871 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 315.051 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 303.096 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 323.986 303.096 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 303.096 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 291.14 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 291.14 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 239.567 291.14 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 291.14 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 279.185 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -32.363 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ 0 g 0 G /F75 9.9626 Tf -57.485 -22.401 Td [(On)-250(Return)]TJ 0 g 0 G @@ -22783,7 +22867,7 @@ ET endstream endobj -1820 0 obj +1823 0 obj << /Length 5025 >> @@ -22795,15 +22879,15 @@ BT 0 g 0 G /F75 9.9626 Tf -24.598 -19.926 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.918 Td [(Notes)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.918 Td [(Notes)]TJ 0 g 0 G /F84 9.9626 Tf 12.453 -19.926 Td [(1.)]TJ 0 g 0 G - 0.98 0 0 1 175.303 572.629 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 193.994 572.629 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 572.629 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 560.674 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ + 0.98 0 0 1 175.303 572.629 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 193.994 572.629 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 572.629 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 560.674 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ 0 g 0 G -12.453 -19.925 Td [(2.)]TJ 0 g 0 G - 1.02 0 0 1 175.303 540.749 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 195.057 540.749 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 540.749 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 395.907 540.749 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 540.749 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 528.794 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 516.839 Tm [(the)]TJ/F145 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ + 1.02 0 0 1 175.303 540.749 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 195.057 540.749 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 540.749 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 395.907 540.749 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 540.749 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 528.794 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 516.839 Tm [(the)]TJ/F147 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -22817,7 +22901,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 188.015 494.224 Td [(call)]TJ +/F235 8.9664 Tf 188.015 494.224 Td [(call)]TJ 0 g 0 G [-525(psb_sum\050ctxt,dat,&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -22838,7 +22922,7 @@ BT 0 g 0 G /F84 9.9626 Tf -48.393 -36.165 Td [(3.)]TJ 0 g 0 G - 1.02 0 0 1 175.113 447.1 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F145 9.9626 Tf 1 0 0 1 379.88 447.1 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 447.1 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 447.1 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 447.1 Tm [(be)]TJ 1 0 0 1 175.611 435.145 Tm [(accessed)-250(between)-250(calls:)]TJ + 1.02 0 0 1 175.113 447.1 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F147 9.9626 Tf 1 0 0 1 379.88 447.1 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 447.1 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 447.1 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 447.1 Tm [(be)]TJ 1 0 0 1 175.611 435.145 Tm [(accessed)-250(between)-250(calls:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -22852,7 +22936,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 188.015 412.53 Td [(call)]TJ +/F235 8.9664 Tf 188.015 412.53 Td [(call)]TJ 0 g 0 G [-525(psb_sum\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -22875,12 +22959,12 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ +/F281 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F233 8.9664 Tf -37.658 -10.959 Td [(call)]TJ +/F235 8.9664 Tf -37.658 -10.959 Td [(call)]TJ 0 g 0 G [-525(psb_sum\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -22906,47 +22990,47 @@ ET endstream endobj -1719 0 obj +1720 0 obj << /Type /ObjStm /N 100 /First 971 -/Length 9417 ->> -stream -1717 0 1718 59 1713 118 1722 213 1720 352 1724 497 413 555 1721 612 1726 735 1728 853 -1729 912 1730 971 1731 1030 1725 1089 1736 1211 1732 1368 1733 1513 1734 1660 1738 1807 417 1865 -1735 1922 1741 2030 1743 2148 421 2207 1740 2265 1745 2373 1747 2491 1748 2549 1749 2607 1750 2665 -1751 2723 1752 2781 1753 2839 1754 2897 1755 2955 1756 3013 1744 3071 1758 3193 1760 3311 425 3370 -1757 3428 1762 3509 1764 3627 429 3685 1765 3742 1766 3800 1761 3858 1768 3994 1770 4112 433 4171 -1771 4229 1772 4287 1767 4344 1774 4480 1776 4598 437 4656 1777 4713 1778 4771 1779 4829 1773 4887 -1782 5023 1784 5141 441 5200 1781 5258 1786 5353 1788 5471 445 5529 1785 5586 1790 5708 1792 5826 -449 5885 1789 5943 1794 6038 1796 6156 453 6214 1793 6271 1798 6366 1800 6484 457 6543 1797 6601 -1802 6696 1804 6814 461 6872 1801 6929 1807 7080 1809 7198 1810 7257 1811 7316 1812 7375 1806 7434 -1815 7572 1817 7690 465 7748 1814 7805 1819 7956 1821 8074 1822 8133 1823 8192 1824 8250 1818 8308 -% 1717 0 obj +/Length 9365 +>> +stream +1718 0 1719 59 1714 118 1723 213 1721 352 1725 497 413 555 1722 612 1727 735 1729 853 +1730 912 1731 971 1732 1030 1726 1089 1737 1211 1733 1368 1734 1513 1735 1660 1739 1807 417 1865 +1736 1922 1742 2030 1744 2148 421 2207 1741 2265 1746 2387 1748 2505 1749 2563 1750 2621 1751 2679 +1752 2736 1753 2794 1754 2852 1755 2910 1756 2968 1757 3026 1758 3084 1759 3142 1745 3200 1761 3337 +1763 3455 425 3514 1760 3572 1765 3653 1767 3771 429 3829 1768 3886 1769 3944 1764 4002 1771 4138 +1773 4256 433 4315 1774 4373 1775 4431 1770 4488 1777 4624 1779 4742 437 4800 1780 4857 1781 4915 +1782 4973 1776 5031 1785 5167 1787 5285 441 5344 1784 5402 1789 5497 1791 5615 445 5673 1788 5730 +1793 5852 1795 5970 449 6029 1792 6087 1797 6182 1799 6300 453 6358 1796 6415 1801 6510 1803 6628 +457 6687 1800 6745 1805 6840 1807 6958 461 7016 1804 7073 1810 7224 1812 7342 1813 7401 1814 7460 +1815 7519 1809 7578 1818 7716 1820 7834 465 7892 1817 7949 1822 8100 1824 8218 1825 8277 1826 8336 +% 1718 0 obj << -/D [1714 0 R /XYZ 150.705 370.138 null] +/D [1715 0 R /XYZ 150.705 370.138 null] >> -% 1718 0 obj +% 1719 0 obj << -/D [1714 0 R /XYZ 150.705 338.313 null] +/D [1715 0 R /XYZ 150.705 338.313 null] >> -% 1713 0 obj +% 1714 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1722 0 obj +% 1723 0 obj << /Type /Page -/Contents 1723 0 R -/Resources 1721 0 R +/Contents 1724 0 R +/Resources 1722 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1698 0 R -/Annots [ 1720 0 R ] +/Parent 1699 0 R +/Annots [ 1721 0 R ] >> -% 1720 0 obj +% 1721 0 obj << /Type /Annot /Subtype /Link @@ -22954,58 +23038,58 @@ stream /Rect [291.943 491.971 369.462 504.031] /A << /S /GoTo /D (spdata) >> >> -% 1724 0 obj +% 1725 0 obj << -/D [1722 0 R /XYZ 98.895 753.953 null] +/D [1723 0 R /XYZ 98.895 753.953 null] >> % 413 0 obj << -/D [1722 0 R /XYZ 99.895 716.092 null] +/D [1723 0 R /XYZ 99.895 716.092 null] >> -% 1721 0 obj +% 1722 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F148 1490 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F152 1491 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1726 0 obj +% 1727 0 obj << /Type /Page -/Contents 1727 0 R -/Resources 1725 0 R +/Contents 1728 0 R +/Resources 1726 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1698 0 R ->> -% 1728 0 obj -<< -/D [1726 0 R /XYZ 149.705 753.953 null] +/Parent 1699 0 R >> % 1729 0 obj << -/D [1726 0 R /XYZ 150.705 496.698 null] +/D [1727 0 R /XYZ 149.705 753.953 null] >> % 1730 0 obj << -/D [1726 0 R /XYZ 150.705 438.313 null] +/D [1727 0 R /XYZ 150.705 496.698 null] >> % 1731 0 obj << -/D [1726 0 R /XYZ 150.705 418.388 null] +/D [1727 0 R /XYZ 150.705 438.313 null] >> -% 1725 0 obj +% 1732 0 obj +<< +/D [1727 0 R /XYZ 150.705 418.388 null] +>> +% 1726 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F78 686 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1736 0 obj +% 1737 0 obj << /Type /Page -/Contents 1737 0 R -/Resources 1735 0 R +/Contents 1738 0 R +/Resources 1736 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1739 0 R -/Annots [ 1732 0 R 1733 0 R 1734 0 R ] +/Parent 1740 0 R +/Annots [ 1733 0 R 1734 0 R 1735 0 R ] >> -% 1732 0 obj +% 1733 0 obj << /Type /Annot /Subtype /Link @@ -23013,7 +23097,7 @@ stream /Rect [291.943 527.942 369.462 540.002] /A << /S /GoTo /D (spdata) >> >> -% 1733 0 obj +% 1734 0 obj << /Type /Annot /Subtype /Link @@ -23021,7 +23105,7 @@ stream /Rect [291.943 460.196 359.001 472.256] /A << /S /GoTo /D (descdata) >> >> -% 1734 0 obj +% 1735 0 obj << /Type /Annot /Subtype /Link @@ -23029,414 +23113,413 @@ stream /Rect [320.317 404.405 392.605 416.465] /A << /S /GoTo /D (precdata) >> >> -% 1738 0 obj +% 1739 0 obj << -/D [1736 0 R /XYZ 98.895 753.953 null] +/D [1737 0 R /XYZ 98.895 753.953 null] >> % 417 0 obj << -/D [1736 0 R /XYZ 99.895 716.092 null] +/D [1737 0 R /XYZ 99.895 716.092 null] >> -% 1735 0 obj +% 1736 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1741 0 obj +% 1742 0 obj << /Type /Page -/Contents 1742 0 R -/Resources 1740 0 R +/Contents 1743 0 R +/Resources 1741 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1739 0 R +/Parent 1740 0 R >> -% 1743 0 obj +% 1744 0 obj << -/D [1741 0 R /XYZ 149.705 753.953 null] +/D [1742 0 R /XYZ 149.705 753.953 null] >> % 421 0 obj << -/D [1741 0 R /XYZ 150.705 716.092 null] +/D [1742 0 R /XYZ 150.705 716.092 null] >> -% 1740 0 obj +% 1741 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1745 0 obj +% 1746 0 obj << /Type /Page -/Contents 1746 0 R -/Resources 1744 0 R +/Contents 1747 0 R +/Resources 1745 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1739 0 R ->> -% 1747 0 obj -<< -/D [1745 0 R /XYZ 98.895 753.953 null] +/Parent 1740 0 R >> % 1748 0 obj << -/D [1745 0 R /XYZ 99.895 701.929 null] +/D [1746 0 R /XYZ 98.895 753.953 null] >> % 1749 0 obj << -/D [1745 0 R /XYZ 99.895 668.729 null] +/D [1746 0 R /XYZ 99.895 644.145 null] >> % 1750 0 obj << -/D [1745 0 R /XYZ 99.895 624.894 null] +/D [1746 0 R /XYZ 99.895 610.946 null] >> % 1751 0 obj << -/D [1745 0 R /XYZ 99.895 555.872 null] +/D [1746 0 R /XYZ 99.895 567.11 null] >> % 1752 0 obj << -/D [1745 0 R /XYZ 99.895 500.082 null] +/D [1746 0 R /XYZ 99.895 498.089 null] >> % 1753 0 obj << -/D [1745 0 R /XYZ 99.895 468.201 null] +/D [1746 0 R /XYZ 99.895 455.529 null] >> % 1754 0 obj << -/D [1745 0 R /XYZ 99.895 425.023 null] +/D [1746 0 R /XYZ 99.895 398.463 null] >> % 1755 0 obj << -/D [1745 0 R /XYZ 99.895 382.522 null] +/D [1746 0 R /XYZ 99.895 366.582 null] >> % 1756 0 obj << -/D [1745 0 R /XYZ 99.895 354.627 null] +/D [1746 0 R /XYZ 99.895 311.449 null] >> -% 1744 0 obj +% 1757 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R >> -/ProcSet [ /PDF /Text ] +/D [1746 0 R /XYZ 99.895 268.948 null] >> % 1758 0 obj << +/D [1746 0 R /XYZ 99.895 229.098 null] +>> +% 1759 0 obj +<< +/D [1746 0 R /XYZ 99.895 201.202 null] +>> +% 1745 0 obj +<< +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F241 1286 0 R >> +/ProcSet [ /PDF /Text ] +>> +% 1761 0 obj +<< /Type /Page -/Contents 1759 0 R -/Resources 1757 0 R +/Contents 1762 0 R +/Resources 1760 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1739 0 R +/Parent 1740 0 R >> -% 1760 0 obj +% 1763 0 obj << -/D [1758 0 R /XYZ 149.705 753.953 null] +/D [1761 0 R /XYZ 149.705 753.953 null] >> % 425 0 obj << -/D [1758 0 R /XYZ 150.705 716.092 null] +/D [1761 0 R /XYZ 150.705 716.092 null] >> -% 1757 0 obj +% 1760 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1762 0 obj +% 1765 0 obj << /Type /Page -/Contents 1763 0 R -/Resources 1761 0 R +/Contents 1766 0 R +/Resources 1764 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1739 0 R +/Parent 1740 0 R >> -% 1764 0 obj +% 1767 0 obj << -/D [1762 0 R /XYZ 98.895 753.953 null] +/D [1765 0 R /XYZ 98.895 753.953 null] >> % 429 0 obj << -/D [1762 0 R /XYZ 99.895 716.092 null] +/D [1765 0 R /XYZ 99.895 716.092 null] >> -% 1765 0 obj +% 1768 0 obj << -/D [1762 0 R /XYZ 99.895 170.282 null] +/D [1765 0 R /XYZ 99.895 170.282 null] >> -% 1766 0 obj +% 1769 0 obj << -/D [1762 0 R /XYZ 99.895 149.368 null] +/D [1765 0 R /XYZ 99.895 149.368 null] >> -% 1761 0 obj +% 1764 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F192 942 0 R /F78 686 0 R /F190 941 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F197 943 0 R /F78 686 0 R /F195 942 0 R >> /ProcSet [ /PDF /Text ] >> -% 1768 0 obj +% 1771 0 obj << /Type /Page -/Contents 1769 0 R -/Resources 1767 0 R +/Contents 1772 0 R +/Resources 1770 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1739 0 R +/Parent 1740 0 R >> -% 1770 0 obj +% 1773 0 obj << -/D [1768 0 R /XYZ 149.705 753.953 null] +/D [1771 0 R /XYZ 149.705 753.953 null] >> % 433 0 obj << -/D [1768 0 R /XYZ 150.705 716.092 null] +/D [1771 0 R /XYZ 150.705 716.092 null] >> -% 1771 0 obj +% 1774 0 obj << -/D [1768 0 R /XYZ 150.705 348.22 null] +/D [1771 0 R /XYZ 150.705 348.22 null] >> -% 1772 0 obj +% 1775 0 obj << -/D [1768 0 R /XYZ 150.705 313.8 null] +/D [1771 0 R /XYZ 150.705 313.8 null] >> -% 1767 0 obj +% 1770 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F78 686 0 R /F192 942 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F195 942 0 R /F78 686 0 R /F197 943 0 R >> /ProcSet [ /PDF /Text ] >> -% 1774 0 obj +% 1777 0 obj << /Type /Page -/Contents 1775 0 R -/Resources 1773 0 R +/Contents 1778 0 R +/Resources 1776 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1780 0 R +/Parent 1783 0 R >> -% 1776 0 obj +% 1779 0 obj << -/D [1774 0 R /XYZ 98.895 753.953 null] +/D [1777 0 R /XYZ 98.895 753.953 null] >> % 437 0 obj << -/D [1774 0 R /XYZ 99.895 716.092 null] +/D [1777 0 R /XYZ 99.895 716.092 null] >> -% 1777 0 obj +% 1780 0 obj << -/D [1774 0 R /XYZ 99.895 441.869 null] +/D [1777 0 R /XYZ 99.895 441.869 null] >> -% 1778 0 obj +% 1781 0 obj << -/D [1774 0 R /XYZ 99.895 395.439 null] +/D [1777 0 R /XYZ 99.895 395.439 null] >> -% 1779 0 obj +% 1782 0 obj << -/D [1774 0 R /XYZ 99.895 363.559 null] +/D [1777 0 R /XYZ 99.895 363.559 null] >> -% 1773 0 obj +% 1776 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R >> /ProcSet [ /PDF /Text ] >> -% 1782 0 obj +% 1785 0 obj << /Type /Page -/Contents 1783 0 R -/Resources 1781 0 R +/Contents 1786 0 R +/Resources 1784 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1780 0 R +/Parent 1783 0 R >> -% 1784 0 obj +% 1787 0 obj << -/D [1782 0 R /XYZ 149.705 753.953 null] +/D [1785 0 R /XYZ 149.705 753.953 null] >> % 441 0 obj << -/D [1782 0 R /XYZ 150.705 716.092 null] +/D [1785 0 R /XYZ 150.705 716.092 null] >> -% 1781 0 obj +% 1784 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1786 0 obj +% 1789 0 obj << /Type /Page -/Contents 1787 0 R -/Resources 1785 0 R +/Contents 1790 0 R +/Resources 1788 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1780 0 R +/Parent 1783 0 R >> -% 1788 0 obj +% 1791 0 obj << -/D [1786 0 R /XYZ 98.895 753.953 null] +/D [1789 0 R /XYZ 98.895 753.953 null] >> % 445 0 obj << -/D [1786 0 R /XYZ 99.895 716.092 null] +/D [1789 0 R /XYZ 99.895 716.092 null] >> -% 1785 0 obj +% 1788 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R >> /ProcSet [ /PDF /Text ] >> -% 1790 0 obj +% 1793 0 obj << /Type /Page -/Contents 1791 0 R -/Resources 1789 0 R +/Contents 1794 0 R +/Resources 1792 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1780 0 R +/Parent 1783 0 R >> -% 1792 0 obj +% 1795 0 obj << -/D [1790 0 R /XYZ 149.705 753.953 null] +/D [1793 0 R /XYZ 149.705 753.953 null] >> % 449 0 obj << -/D [1790 0 R /XYZ 150.705 716.092 null] +/D [1793 0 R /XYZ 150.705 716.092 null] >> -% 1789 0 obj +% 1792 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1794 0 obj +% 1797 0 obj << /Type /Page -/Contents 1795 0 R -/Resources 1793 0 R +/Contents 1798 0 R +/Resources 1796 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1780 0 R +/Parent 1783 0 R >> -% 1796 0 obj +% 1799 0 obj << -/D [1794 0 R /XYZ 98.895 753.953 null] +/D [1797 0 R /XYZ 98.895 753.953 null] >> % 453 0 obj << -/D [1794 0 R /XYZ 99.895 716.092 null] +/D [1797 0 R /XYZ 99.895 716.092 null] >> -% 1793 0 obj +% 1796 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1798 0 obj +% 1801 0 obj << /Type /Page -/Contents 1799 0 R -/Resources 1797 0 R +/Contents 1802 0 R +/Resources 1800 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1780 0 R +/Parent 1783 0 R >> -% 1800 0 obj +% 1803 0 obj << -/D [1798 0 R /XYZ 149.705 753.953 null] +/D [1801 0 R /XYZ 149.705 753.953 null] >> % 457 0 obj << -/D [1798 0 R /XYZ 150.705 716.092 null] +/D [1801 0 R /XYZ 150.705 716.092 null] >> -% 1797 0 obj +% 1800 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1802 0 obj +% 1805 0 obj << /Type /Page -/Contents 1803 0 R -/Resources 1801 0 R +/Contents 1806 0 R +/Resources 1804 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1805 0 R +/Parent 1808 0 R >> -% 1804 0 obj +% 1807 0 obj << -/D [1802 0 R /XYZ 98.895 753.953 null] +/D [1805 0 R /XYZ 98.895 753.953 null] >> % 461 0 obj << -/D [1802 0 R /XYZ 99.895 716.092 null] +/D [1805 0 R /XYZ 99.895 716.092 null] >> -% 1801 0 obj +% 1804 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R /F190 941 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F152 1491 0 R /F197 943 0 R /F78 686 0 R /F195 942 0 R >> /ProcSet [ /PDF /Text ] >> -% 1807 0 obj +% 1810 0 obj << /Type /Page -/Contents 1808 0 R -/Resources 1806 0 R +/Contents 1811 0 R +/Resources 1809 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1805 0 R +/Parent 1808 0 R >> -% 1809 0 obj +% 1812 0 obj << -/D [1807 0 R /XYZ 149.705 753.953 null] +/D [1810 0 R /XYZ 149.705 753.953 null] >> -% 1810 0 obj +% 1813 0 obj << -/D [1807 0 R /XYZ 150.705 576.399 null] +/D [1810 0 R /XYZ 150.705 576.399 null] >> -% 1811 0 obj +% 1814 0 obj << -/D [1807 0 R /XYZ 150.705 541.925 null] +/D [1810 0 R /XYZ 150.705 541.925 null] >> -% 1812 0 obj +% 1815 0 obj << -/D [1807 0 R /XYZ 150.705 451.085 null] +/D [1810 0 R /XYZ 150.705 451.085 null] >> -% 1806 0 obj +% 1809 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1813 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F147 941 0 R /F235 1045 0 R /F78 686 0 R /F281 1816 0 R >> /ProcSet [ /PDF /Text ] >> -% 1815 0 obj +% 1818 0 obj << /Type /Page -/Contents 1816 0 R -/Resources 1814 0 R +/Contents 1819 0 R +/Resources 1817 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1805 0 R +/Parent 1808 0 R >> -% 1817 0 obj +% 1820 0 obj << -/D [1815 0 R /XYZ 98.895 753.953 null] +/D [1818 0 R /XYZ 98.895 753.953 null] >> % 465 0 obj << -/D [1815 0 R /XYZ 99.895 716.092 null] +/D [1818 0 R /XYZ 99.895 716.092 null] >> -% 1814 0 obj +% 1817 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F195 942 0 R /F152 1491 0 R /F197 943 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1819 0 obj +% 1822 0 obj << /Type /Page -/Contents 1820 0 R -/Resources 1818 0 R +/Contents 1823 0 R +/Resources 1821 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1805 0 R +/Parent 1808 0 R >> -% 1821 0 obj -<< -/D [1819 0 R /XYZ 149.705 753.953 null] ->> -% 1822 0 obj -<< -/D [1819 0 R /XYZ 150.705 588.355 null] ->> -% 1823 0 obj +% 1824 0 obj << -/D [1819 0 R /XYZ 150.705 553.88 null] +/D [1822 0 R /XYZ 149.705 753.953 null] >> -% 1824 0 obj +% 1825 0 obj << -/D [1819 0 R /XYZ 150.705 463.04 null] +/D [1822 0 R /XYZ 150.705 588.355 null] >> -% 1818 0 obj +% 1826 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1813 0 R >> -/ProcSet [ /PDF /Text ] +/D [1822 0 R /XYZ 150.705 553.88 null] >> endstream endobj -1827 0 obj +1831 0 obj << /Length 6060 >> @@ -23454,7 +23537,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(max)-250(\227)-250(Global)-250(maximum)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -19.198 Td [(call)-525(psb_max\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 114.839 664.53 Tm [(This)-253(subr)18(outine)-253(implements)-253(a)-253(maximum)-253(valuer)19(eduction)-254(oper)1(ation)-254(based)-253(on)]TJ 1 0 0 1 99.895 652.575 Tm [(the)-250(underlying)-250(communication)-250(library)111(.)]TJ +/F147 9.9626 Tf -57.098 -19.198 Td [(call)-525(psb_max\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 114.839 664.53 Tm [(This)-253(subr)18(outine)-253(implements)-253(a)-253(maximum)-253(valuer)19(eduction)-254(oper)1(ation)-254(based)-253(on)]TJ 1 0 0 1 99.895 652.575 Tm [(the)-250(underlying)-250(communication)-250(library)111(.)]TJ 0 g 0 G /F75 9.9626 Tf 0 -20.288 Td [(T)90(ype:)]TJ 0 g 0 G @@ -23473,15 +23556,15 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -20.409 Td [(root)]TJ 0 g 0 G -/F84 9.9626 Tf 1.009 0 0 1 123.148 443.056 Tm [(Pr)18(ocess)-247(to)-247(hold)-247(the)-247(\002nal)-247(maximum,)-247(or)]TJ/F190 10.3811 Tf 1 0 0 1 294.6 443.056 Tm [(\000)]TJ/F84 9.9626 Tf 1.009 0 0 1 302.794 443.056 Tm [(1)-247(to)-247(make)-247(it)-247(available)-247(on)-246(a)-1(l)1(l)-247(pr)17(o-)]TJ 1 0 0 1 124.802 431.101 Tm [(cesses.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F190 10.3811 Tf 131.102 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F148 10.3811 Tf 7.873 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F148 10.3811 Tf 19.923 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)-250(-1.)]TJ +/F84 9.9626 Tf 1.009 0 0 1 123.148 443.056 Tm [(Pr)18(ocess)-247(to)-247(hold)-247(the)-247(\002nal)-247(maximum,)-247(or)]TJ/F195 10.3811 Tf 1 0 0 1 294.6 443.056 Tm [(\000)]TJ/F84 9.9626 Tf 1.009 0 0 1 302.794 443.056 Tm [(1)-247(to)-247(make)-247(it)-247(available)-247(on)-246(a)-1(l)1(l)-247(pr)17(o-)]TJ 1 0 0 1 124.802 431.101 Tm [(cesses.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F195 10.3811 Tf 131.102 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F152 10.3811 Tf 7.873 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F152 10.3811 Tf 19.923 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)-250(-1.)]TJ 0 g 0 G /F75 9.9626 Tf -254.344 -32.364 Td [(mode)]TJ 0 g 0 G -/F84 9.9626 Tf 0.983 0 0 1 129.843 350.916 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 338.961 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 291.14 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 279.185 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 323.986 279.185 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 279.185 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 267.23 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 267.23 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 239.567 267.23 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 267.23 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 255.275 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ +/F84 9.9626 Tf 0.983 0 0 1 129.843 350.916 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 338.961 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 291.14 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 279.185 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 323.986 279.185 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 279.185 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 267.23 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 267.23 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 239.567 267.23 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 267.23 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 255.275 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -32.364 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ 0 g 0 G /F75 9.9626 Tf -57.485 -22.402 Td [(On)-250(Return)]TJ 0 g 0 G @@ -23496,7 +23579,7 @@ ET endstream endobj -1832 0 obj +1835 0 obj << /Length 5209 >> @@ -23508,15 +23591,15 @@ BT 0 g 0 G /F75 9.9626 Tf -24.906 -19.925 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.956 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.917 Td [(Notes)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.956 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.917 Td [(Notes)]TJ 0 g 0 G /F84 9.9626 Tf 12.453 -19.926 Td [(1.)]TJ 0 g 0 G - 0.98 0 0 1 175.303 560.674 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 193.994 560.674 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 560.674 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 548.719 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ + 0.98 0 0 1 175.303 560.674 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 193.994 560.674 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 560.674 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 548.719 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ 0 g 0 G -12.453 -19.925 Td [(2.)]TJ 0 g 0 G - 1.02 0 0 1 175.303 528.794 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 195.057 528.794 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 528.794 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 395.907 528.794 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 528.794 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 516.839 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 504.884 Tm [(the)]TJ/F145 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ + 1.02 0 0 1 175.303 528.794 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 195.057 528.794 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 528.794 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 395.907 528.794 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 528.794 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 516.839 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 504.884 Tm [(the)]TJ/F147 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -23530,7 +23613,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 188.015 482.268 Td [(call)]TJ +/F235 8.9664 Tf 188.015 482.268 Td [(call)]TJ 0 g 0 G [-525(psb_max\050ctxt,dat,&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -23551,7 +23634,7 @@ BT 0 g 0 G /F84 9.9626 Tf -48.393 -36.164 Td [(3.)]TJ 0 g 0 G - 1.02 0 0 1 175.113 435.145 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F145 9.9626 Tf 1 0 0 1 379.88 435.145 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 435.145 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 435.145 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 435.145 Tm [(be)]TJ 1 0 0 1 175.611 423.19 Tm [(accessed)-250(between)-250(calls:)]TJ + 1.02 0 0 1 175.113 435.145 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F147 9.9626 Tf 1 0 0 1 379.88 435.145 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 435.145 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 435.145 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 435.145 Tm [(be)]TJ 1 0 0 1 175.611 423.19 Tm [(accessed)-250(between)-250(calls:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -23565,7 +23648,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 188.015 400.575 Td [(call)]TJ +/F235 8.9664 Tf 188.015 400.575 Td [(call)]TJ 0 g 0 G [-525(psb_max\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -23588,12 +23671,12 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ +/F281 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F233 8.9664 Tf -37.658 -10.959 Td [(call)]TJ +/F235 8.9664 Tf -37.658 -10.959 Td [(call)]TJ 0 g 0 G [-525(psb_max\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -23619,7 +23702,7 @@ ET endstream endobj -1839 0 obj +1842 0 obj << /Length 6144 >> @@ -23637,7 +23720,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(min)-250(\227)-250(Global)-250(minimum)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -19.198 Td [(call)-525(psb_min\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 114.839 664.53 Tm [(This)-247(subr)18(outine)-247(implements)-246(a)-247(minimum)-247(value)-246(r)17(eduction)-246(operation)-247(based)]TJ 1 0 0 1 99.895 652.575 Tm [(on)-250(the)-250(underlying)-250(communication)-250(library)111(.)]TJ +/F147 9.9626 Tf -57.098 -19.198 Td [(call)-525(psb_min\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 114.839 664.53 Tm [(This)-247(subr)18(outine)-247(implements)-246(a)-247(minimum)-247(value)-246(r)17(eduction)-246(operation)-247(based)]TJ 1 0 0 1 99.895 652.575 Tm [(on)-250(the)-250(underlying)-250(communication)-250(library)111(.)]TJ 0 g 0 G /F75 9.9626 Tf 0 -20.288 Td [(T)90(ype:)]TJ 0 g 0 G @@ -23656,15 +23739,15 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -20.409 Td [(root)]TJ 0 g 0 G -/F84 9.9626 Tf 0.986 0 0 1 123.148 443.056 Tm [(Pr)18(ocess)-253(to)-254(hold)-253(the)-253(\002nal)-254(value,)-253(or)]TJ/F190 10.3811 Tf 1 0 0 1 270.3 443.056 Tm [(\000)]TJ/F84 9.9626 Tf 0.986 0 0 1 278.495 443.056 Tm [(1)-253(to)-254(make)-253(it)-254(available)-253(on)-253(all)-254(pr)19(ocesses.)]TJ 1 0 0 1 124.802 431.101 Tm [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F190 10.3811 Tf 131.102 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F148 10.3811 Tf 7.873 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F148 10.3811 Tf 19.923 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)-250(-1.)]TJ +/F84 9.9626 Tf 0.986 0 0 1 123.148 443.056 Tm [(Pr)18(ocess)-253(to)-254(hold)-253(the)-253(\002nal)-254(value,)-253(or)]TJ/F195 10.3811 Tf 1 0 0 1 270.3 443.056 Tm [(\000)]TJ/F84 9.9626 Tf 0.986 0 0 1 278.495 443.056 Tm [(1)-253(to)-254(make)-253(it)-254(available)-253(on)-253(all)-254(pr)19(ocesses.)]TJ 1 0 0 1 124.802 431.101 Tm [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F195 10.3811 Tf 131.102 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F152 10.3811 Tf 7.873 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F152 10.3811 Tf 19.923 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)-250(-1.)]TJ 0 g 0 G /F75 9.9626 Tf -254.344 -32.364 Td [(mode)]TJ 0 g 0 G -/F84 9.9626 Tf 0.983 0 0 1 129.843 362.871 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 350.916 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 303.096 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 291.14 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 323.986 291.14 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 291.14 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 279.185 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 279.185 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 239.567 279.185 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 279.185 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 267.23 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ +/F84 9.9626 Tf 0.983 0 0 1 129.843 362.871 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 350.916 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 303.096 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 291.14 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 323.986 291.14 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 291.14 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 279.185 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 279.185 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 239.567 279.185 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 279.185 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 267.23 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -32.364 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ 0 g 0 G /F75 9.9626 Tf -57.485 -22.401 Td [(On)-250(Return)]TJ 0 g 0 G @@ -23679,7 +23762,7 @@ ET endstream endobj -1844 0 obj +1847 0 obj << /Length 5122 >> @@ -23691,15 +23774,15 @@ BT 0 g 0 G /F75 9.9626 Tf -24.598 -19.925 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.956 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.917 Td [(Notes)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.956 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.917 Td [(Notes)]TJ 0 g 0 G /F84 9.9626 Tf 12.453 -19.926 Td [(1.)]TJ 0 g 0 G - 0.98 0 0 1 175.303 560.674 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 193.994 560.674 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 560.674 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 548.719 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ + 0.98 0 0 1 175.303 560.674 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 193.994 560.674 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 560.674 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 548.719 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ 0 g 0 G -12.453 -19.925 Td [(2.)]TJ 0 g 0 G - 1.02 0 0 1 175.303 528.794 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 195.057 528.794 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 528.794 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 395.907 528.794 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 528.794 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 516.839 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 504.884 Tm [(the)]TJ/F145 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ + 1.02 0 0 1 175.303 528.794 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 195.057 528.794 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 528.794 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 395.907 528.794 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 528.794 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 516.839 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 504.884 Tm [(the)]TJ/F147 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -23713,7 +23796,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 188.015 482.268 Td [(call)]TJ +/F235 8.9664 Tf 188.015 482.268 Td [(call)]TJ 0 g 0 G [-525(psb_min\050ctxt,dat,&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -23734,7 +23817,7 @@ BT 0 g 0 G /F84 9.9626 Tf -48.393 -36.164 Td [(3.)]TJ 0 g 0 G - 1.02 0 0 1 175.113 435.145 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F145 9.9626 Tf 1 0 0 1 379.88 435.145 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 435.145 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 435.145 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 435.145 Tm [(be)]TJ 1 0 0 1 175.611 423.19 Tm [(accessed)-250(between)-250(calls:)]TJ + 1.02 0 0 1 175.113 435.145 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F147 9.9626 Tf 1 0 0 1 379.88 435.145 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 435.145 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 435.145 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 435.145 Tm [(be)]TJ 1 0 0 1 175.611 423.19 Tm [(accessed)-250(between)-250(calls:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -23748,7 +23831,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 188.015 400.575 Td [(call)]TJ +/F235 8.9664 Tf 188.015 400.575 Td [(call)]TJ 0 g 0 G [-525(psb_min\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -23771,12 +23854,12 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ +/F281 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F233 8.9664 Tf -37.658 -10.959 Td [(call)]TJ +/F235 8.9664 Tf -37.658 -10.959 Td [(call)]TJ 0 g 0 G [-525(psb_min\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -23802,7 +23885,7 @@ ET endstream endobj -1851 0 obj +1854 0 obj << /Length 6205 >> @@ -23820,7 +23903,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(amx)-250(\227)-250(Global)-250(maximum)-250(absolute)-250(value)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -19.198 Td [(call)-525(psb_amx\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 114.839 664.53 Tm [(This)-250(subr)19(outine)-250(implements)-250(a)-249(maximum)-250(absolute)-250(value)-249(r)18(eduction)-250(operation)]TJ 1 0 0 1 99.895 652.575 Tm [(based)-250(on)-250(the)-250(underlying)-250(communication)-250(library)111(.)]TJ +/F147 9.9626 Tf -57.098 -19.198 Td [(call)-525(psb_amx\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 114.839 664.53 Tm [(This)-250(subr)19(outine)-250(implements)-250(a)-249(maximum)-250(absolute)-250(value)-249(r)18(eduction)-250(operation)]TJ 1 0 0 1 99.895 652.575 Tm [(based)-250(on)-250(the)-250(underlying)-250(communication)-250(library)111(.)]TJ 0 g 0 G /F75 9.9626 Tf 0 -20.288 Td [(T)90(ype:)]TJ 0 g 0 G @@ -23839,15 +23922,15 @@ BT 0 g 0 G /F75 9.9626 Tf 1 0 0 1 99.895 443.056 Tm [(root)]TJ 0 g 0 G -/F84 9.9626 Tf 0.986 0 0 1 123.148 443.056 Tm [(Pr)18(ocess)-253(to)-254(hold)-253(the)-253(\002nal)-254(value,)-253(or)]TJ/F190 10.3811 Tf 1 0 0 1 270.3 443.056 Tm [(\000)]TJ/F84 9.9626 Tf 0.986 0 0 1 278.495 443.056 Tm [(1)-253(to)-254(make)-253(it)-254(available)-253(on)-253(all)-254(pr)19(ocesses.)]TJ 1 0 0 1 124.802 431.101 Tm [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F190 10.3811 Tf 131.102 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F148 10.3811 Tf 7.873 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F148 10.3811 Tf 19.923 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)-250(-1.)]TJ +/F84 9.9626 Tf 0.986 0 0 1 123.148 443.056 Tm [(Pr)18(ocess)-253(to)-254(hold)-253(the)-253(\002nal)-254(value,)-253(or)]TJ/F195 10.3811 Tf 1 0 0 1 270.3 443.056 Tm [(\000)]TJ/F84 9.9626 Tf 0.986 0 0 1 278.495 443.056 Tm [(1)-253(to)-254(make)-253(it)-254(available)-253(on)-253(all)-254(pr)19(ocesses.)]TJ 1 0 0 1 124.802 431.101 Tm [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F195 10.3811 Tf 131.102 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F152 10.3811 Tf 7.873 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F152 10.3811 Tf 19.923 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)-250(-1.)]TJ 0 g 0 G /F75 9.9626 Tf -254.344 -32.364 Td [(mode)]TJ 0 g 0 G -/F84 9.9626 Tf 0.983 0 0 1 129.843 362.871 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 350.916 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 303.096 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 291.14 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 323.986 291.14 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 291.14 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 279.185 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 279.185 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 239.567 279.185 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 279.185 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 267.23 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ +/F84 9.9626 Tf 0.983 0 0 1 129.843 362.871 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 350.916 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 303.096 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 291.14 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 323.986 291.14 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 291.14 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 279.185 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 279.185 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 239.567 279.185 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 279.185 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 267.23 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -32.364 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ 0 g 0 G /F75 9.9626 Tf -57.485 -22.401 Td [(On)-250(Return)]TJ 0 g 0 G @@ -23862,7 +23945,7 @@ ET endstream endobj -1855 0 obj +1858 0 obj << /Length 5076 >> @@ -23874,15 +23957,15 @@ BT 0 g 0 G /F75 9.9626 Tf 1 0 0 1 150.705 662.293 Tm [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.918 Td [(Notes)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.918 Td [(Notes)]TJ 0 g 0 G /F84 9.9626 Tf 12.453 -19.926 Td [(1.)]TJ 0 g 0 G - 0.98 0 0 1 175.303 572.629 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 193.994 572.629 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 572.629 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 560.674 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ + 0.98 0 0 1 175.303 572.629 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 193.994 572.629 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 572.629 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 560.674 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ 0 g 0 G -12.453 -19.925 Td [(2.)]TJ 0 g 0 G - 1.02 0 0 1 175.303 540.749 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 195.057 540.749 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 540.749 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 395.907 540.749 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 540.749 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 528.794 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 516.839 Tm [(the)]TJ/F145 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ + 1.02 0 0 1 175.303 540.749 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 195.057 540.749 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 540.749 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 395.907 540.749 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 540.749 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 528.794 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 516.839 Tm [(the)]TJ/F147 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -23896,7 +23979,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 188.015 494.224 Td [(call)]TJ +/F235 8.9664 Tf 188.015 494.224 Td [(call)]TJ 0 g 0 G [-525(psb_amx\050ctxt,dat,&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -23917,7 +24000,7 @@ BT 0 g 0 G /F84 9.9626 Tf -48.393 -36.165 Td [(3.)]TJ 0 g 0 G - 1.02 0 0 1 175.113 447.1 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F145 9.9626 Tf 1 0 0 1 379.88 447.1 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 447.1 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 447.1 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 447.1 Tm [(be)]TJ 1 0 0 1 175.611 435.145 Tm [(accessed)-250(between)-250(calls:)]TJ + 1.02 0 0 1 175.113 447.1 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F147 9.9626 Tf 1 0 0 1 379.88 447.1 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 447.1 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 447.1 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 447.1 Tm [(be)]TJ 1 0 0 1 175.611 435.145 Tm [(accessed)-250(between)-250(calls:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -23929,7 +24012,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 178.6 412.53 Td [(call)]TJ +/F235 8.9664 Tf 178.6 412.53 Td [(call)]TJ 0 g 0 G [-525(psb_amx\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -23952,12 +24035,12 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ +/F281 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F233 8.9664 Tf -37.658 -10.959 Td [(call)]TJ +/F235 8.9664 Tf -37.658 -10.959 Td [(call)]TJ 0 g 0 G [-525(psb_amx\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -23983,7 +24066,7 @@ ET endstream endobj -1862 0 obj +1865 0 obj << /Length 6206 >> @@ -24001,7 +24084,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(amn)-250(\227)-250(Global)-250(minimum)-250(absolute)-250(value)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -19.198 Td [(call)-525(psb_amn\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 0.983 0 0 1 114.839 664.53 Tm [(This)-255(subr)19(outine)-255(implements)-255(a)-254(minimum)-255(absolute)-255(value)-255(r)19(eduction)-255(operation)]TJ 1 0 0 1 99.895 652.575 Tm [(based)-250(on)-250(the)-250(underlying)-250(communication)-250(library)111(.)]TJ +/F147 9.9626 Tf -57.098 -19.198 Td [(call)-525(psb_amn\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 0.983 0 0 1 114.839 664.53 Tm [(This)-255(subr)19(outine)-255(implements)-255(a)-254(minimum)-255(absolute)-255(value)-255(r)19(eduction)-255(operation)]TJ 1 0 0 1 99.895 652.575 Tm [(based)-250(on)-250(the)-250(underlying)-250(communication)-250(library)111(.)]TJ 0 g 0 G /F75 9.9626 Tf 0 -20.288 Td [(T)90(ype:)]TJ 0 g 0 G @@ -24020,15 +24103,15 @@ BT 0 g 0 G /F75 9.9626 Tf 1 0 0 1 99.895 443.056 Tm [(root)]TJ 0 g 0 G -/F84 9.9626 Tf 0.986 0 0 1 123.148 443.056 Tm [(Pr)18(ocess)-253(to)-254(hold)-253(the)-253(\002nal)-254(value,)-253(or)]TJ/F190 10.3811 Tf 1 0 0 1 270.3 443.056 Tm [(\000)]TJ/F84 9.9626 Tf 0.986 0 0 1 278.495 443.056 Tm [(1)-253(to)-254(make)-253(it)-254(available)-253(on)-253(all)-254(pr)19(ocesses.)]TJ 1 0 0 1 124.802 431.101 Tm [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F190 10.3811 Tf 131.102 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F148 10.3811 Tf 7.873 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F148 10.3811 Tf 19.923 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)-250(-1.)]TJ +/F84 9.9626 Tf 0.986 0 0 1 123.148 443.056 Tm [(Pr)18(ocess)-253(to)-254(hold)-253(the)-253(\002nal)-254(value,)-253(or)]TJ/F195 10.3811 Tf 1 0 0 1 270.3 443.056 Tm [(\000)]TJ/F84 9.9626 Tf 0.986 0 0 1 278.495 443.056 Tm [(1)-253(to)-254(make)-253(it)-254(available)-253(on)-253(all)-254(pr)19(ocesses.)]TJ 1 0 0 1 124.802 431.101 Tm [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F195 10.3811 Tf 131.102 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F152 10.3811 Tf 7.873 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F152 10.3811 Tf 19.923 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)-250(-1.)]TJ 0 g 0 G /F75 9.9626 Tf -254.344 -32.364 Td [(mode)]TJ 0 g 0 G -/F84 9.9626 Tf 0.983 0 0 1 129.843 362.871 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 350.916 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 303.096 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 291.14 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 323.986 291.14 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 291.14 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 279.185 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 279.185 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 239.567 279.185 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 279.185 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 267.23 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ +/F84 9.9626 Tf 0.983 0 0 1 129.843 362.871 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 350.916 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 303.096 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 291.14 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 323.986 291.14 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 291.14 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 279.185 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 279.185 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 239.567 279.185 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 279.185 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 267.23 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -32.364 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ 0 g 0 G /F75 9.9626 Tf -57.485 -22.401 Td [(On)-250(Return)]TJ 0 g 0 G @@ -24043,7 +24126,7 @@ ET endstream endobj -1866 0 obj +1869 0 obj << /Length 5140 >> @@ -24055,15 +24138,15 @@ BT 0 g 0 G /F75 9.9626 Tf -24.598 -19.925 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.956 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.917 Td [(Notes)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.956 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.917 Td [(Notes)]TJ 0 g 0 G /F84 9.9626 Tf 12.453 -19.926 Td [(1.)]TJ 0 g 0 G - 0.98 0 0 1 175.303 560.674 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 193.994 560.674 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 560.674 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 548.719 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ + 0.98 0 0 1 175.303 560.674 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 193.994 560.674 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 560.674 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 548.719 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ 0 g 0 G -12.453 -19.925 Td [(2.)]TJ 0 g 0 G - 1.02 0 0 1 175.303 528.794 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 195.057 528.794 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 528.794 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 395.907 528.794 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 528.794 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 516.839 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 504.884 Tm [(the)]TJ/F145 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ + 1.02 0 0 1 175.303 528.794 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 195.057 528.794 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 528.794 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 395.907 528.794 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 528.794 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 516.839 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 504.884 Tm [(the)]TJ/F147 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -24077,7 +24160,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 188.015 482.268 Td [(call)]TJ +/F235 8.9664 Tf 188.015 482.268 Td [(call)]TJ 0 g 0 G [-525(psb_amn\050ctxt,dat,&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -24098,7 +24181,7 @@ BT 0 g 0 G /F84 9.9626 Tf -48.393 -36.164 Td [(3.)]TJ 0 g 0 G - 1.02 0 0 1 175.113 435.145 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F145 9.9626 Tf 1 0 0 1 379.88 435.145 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 435.145 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 435.145 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 435.145 Tm [(be)]TJ 1 0 0 1 175.611 423.19 Tm [(accessed)-250(between)-250(calls:)]TJ + 1.02 0 0 1 175.113 435.145 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F147 9.9626 Tf 1 0 0 1 379.88 435.145 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 435.145 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 435.145 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 435.145 Tm [(be)]TJ 1 0 0 1 175.611 423.19 Tm [(accessed)-250(between)-250(calls:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -24112,7 +24195,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 188.015 400.575 Td [(call)]TJ +/F235 8.9664 Tf 188.015 400.575 Td [(call)]TJ 0 g 0 G [-525(psb_amn\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -24135,12 +24218,12 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ +/F281 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F233 8.9664 Tf -37.658 -10.959 Td [(call)]TJ +/F235 8.9664 Tf -37.658 -10.959 Td [(call)]TJ 0 g 0 G [-525(psb_amn\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -24166,7 +24249,7 @@ ET endstream endobj -1873 0 obj +1876 0 obj << /Length 6113 >> @@ -24184,7 +24267,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(nrm2)-250(\227)-250(Global)-250(2-norm)-250(reduction)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -19.198 Td [(call)-525(psb_nrm2\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 1.014 0 0 1 114.839 664.53 Tm [(This)-246(subr)18(outine)-246(implements)-246(a)-246(2-norm)-246(value)-246(r)17(educti)1(on)-247(ope)1(ration)-247(b)1(ased)-247(on)]TJ 1 0 0 1 99.895 652.575 Tm [(the)-250(underlying)-250(communication)-250(library)111(.)]TJ +/F147 9.9626 Tf -57.098 -19.198 Td [(call)-525(psb_nrm2\050ctxt,)-525(dat)-525([,)-525(root,)-525(mode,)-525(request]\051)]TJ/F84 9.9626 Tf 1.014 0 0 1 114.839 664.53 Tm [(This)-246(subr)18(outine)-246(implements)-246(a)-246(2-norm)-246(value)-246(r)17(educti)1(on)-247(ope)1(ration)-247(b)1(ased)-247(on)]TJ 1 0 0 1 99.895 652.575 Tm [(the)-250(underlying)-250(communication)-250(library)111(.)]TJ 0 g 0 G /F75 9.9626 Tf 0 -20.288 Td [(T)90(ype:)]TJ 0 g 0 G @@ -24203,15 +24286,15 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -20.409 Td [(root)]TJ 0 g 0 G -/F84 9.9626 Tf 0.986 0 0 1 123.148 443.056 Tm [(Pr)18(ocess)-253(to)-254(hold)-253(the)-253(\002nal)-254(value,)-253(or)]TJ/F190 10.3811 Tf 1 0 0 1 270.3 443.056 Tm [(\000)]TJ/F84 9.9626 Tf 0.986 0 0 1 278.495 443.056 Tm [(1)-253(to)-254(make)-253(it)-254(available)-253(on)-253(all)-254(pr)19(ocesses.)]TJ 1 0 0 1 124.802 431.101 Tm [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F190 10.3811 Tf 131.102 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F148 10.3811 Tf 7.873 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F148 10.3811 Tf 19.923 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)-250(-1.)]TJ +/F84 9.9626 Tf 0.986 0 0 1 123.148 443.056 Tm [(Pr)18(ocess)-253(to)-254(hold)-253(the)-253(\002nal)-254(value,)-253(or)]TJ/F195 10.3811 Tf 1 0 0 1 270.3 443.056 Tm [(\000)]TJ/F84 9.9626 Tf 0.986 0 0 1 278.495 443.056 Tm [(1)-253(to)-254(make)-253(it)-254(available)-253(on)-253(all)-254(pr)19(ocesses.)]TJ 1 0 0 1 124.802 431.101 Tm [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)]TJ/F195 10.3811 Tf 131.102 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1)]TJ/F152 10.3811 Tf 7.873 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 10.986 0 Td [(r)-17(o)-35(o)-35(t)]TJ/F152 10.3811 Tf 19.923 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.132 0 Td [(1,)-250(default)-250(-1.)]TJ 0 g 0 G /F75 9.9626 Tf -254.344 -32.364 Td [(mode)]TJ 0 g 0 G -/F84 9.9626 Tf 0.983 0 0 1 129.843 362.871 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 350.916 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 303.096 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 291.14 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 323.986 291.14 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 291.14 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F145 9.9626 Tf 1 0 0 1 124.802 279.185 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 279.185 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 239.567 279.185 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 279.185 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 267.23 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ +/F84 9.9626 Tf 0.983 0 0 1 129.843 362.871 Tm [(Whether)-256(the)-255(call)-256(is)-256(started)-256(in)-255(non-blocking)-256(mode)-256(and)-256(completed)-255(later)75(,)-256(or)]TJ 1 0 0 1 124.802 350.916 Tm [(is)-250(executed)-250(synchr)18(onously)111(.)]TJ 0 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.802 303.096 Tm [(Speci\002ed)-285(as:)-383(an)-285(integer)-285(value.)-423(The)-284(action)-285(to)-285(be)-285(taken)-284(is)-285(determined)-285(by)]TJ 1.02 0 0 1 124.802 291.14 Tm [(its)-329(bit)-328(\002elds,)-350(which)-329(can)-328(be)-329(set)-329(with)-328(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 323.986 291.14 Tm [(OR)]TJ/F84 9.9626 Tf 1.02 0 0 1 334.446 291.14 Tm [(.)-329(Basic)-328(action)-329(values)-329(ar)18(e)]TJ/F147 9.9626 Tf 1 0 0 1 124.802 279.185 Tm [(psb_collective_start_)]TJ/F84 9.9626 Tf 0.98 0 0 1 234.639 279.185 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 239.567 279.185 Tm [(psb_collective_end_)]TJ/F84 9.9626 Tf 0.98 0 0 1 338.943 279.185 Tm [(.)-316(Default:)-316(both)-255(\002elds)-254(ar)18(e)]TJ 1 0 0 1 124.802 267.23 Tm [(selected)-250(\050i.e.)-310(r)18(equir)18(e)-250(synchr)18(onous)-250(completion\051.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -32.364 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.439 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ 0 g 0 G /F75 9.9626 Tf -57.485 -22.401 Td [(On)-250(Return)]TJ 0 g 0 G @@ -24226,7 +24309,7 @@ ET endstream endobj -1878 0 obj +1881 0 obj << /Length 6575 >> @@ -24238,7 +24321,7 @@ BT 0 g 0 G /F75 9.9626 Tf -24.906 -19.926 Td [(request)]TJ 0 g 0 G -/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F145 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.918 Td [(Notes)]TJ +/F84 9.9626 Tf 38.346 0 Td [(A)-250(r)18(equest)-250(variable)-250(to)-250(check)-250(for)-250(operation)-250(completion.)]TJ -13.44 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(If)]TJ/F147 9.9626 Tf 9.166 0 Td [(mode)]TJ/F84 9.9626 Tf 23.412 0 Td [(speci\002es)-250(non-blocking)-250(action,)-250(then)-250(this)-250(variable)-250(must)-250(be)-250(pr)18(esent.)]TJ/F75 11.9552 Tf -57.484 -21.918 Td [(Notes)]TJ 0 g 0 G /F84 9.9626 Tf 12.453 -19.926 Td [(1.)]TJ 0 g 0 G @@ -24246,22 +24329,22 @@ BT 0 g 0 G -12.453 -19.925 Td [(2.)]TJ 0 g 0 G - 0.999 0 0 1 175.611 540.749 Tm [(Denoting)-251(by)]TJ/F78 9.9626 Tf 1 0 0 1 232.93 540.749 Tm [(d)-40(a)-25(t)]TJ/F78 7.5716 Tf 13.536 -1.96 Td [(i)]TJ/F84 9.9626 Tf 0.999 0 0 1 251.713 540.749 Tm [(the)-251(value)-251(of)-250(the)-251(variable)]TJ/F78 9.9626 Tf 1 0 0 1 360.51 540.749 Tm [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 0.999 0 0 1 376.501 540.749 Tm [(on)-251(pr)18(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 425.568 540.749 Tm [(i)]TJ/F84 9.9626 Tf 0.999 0 0 1 428.532 540.749 Tm [(,)-251(the)-251(output)]TJ/F78 9.9626 Tf 1 0 0 1 482.247 540.749 Tm [(r)-17(e)-25(s)]TJ/F84 9.9626 Tf -306.636 -11.955 Td [(is)-250(equivalent)-250(to)-250(the)-250(computation)-250(of)]TJ/F78 9.9626 Tf 124.797 -25.467 Td [(r)-17(e)-25(s)]TJ/F192 10.3811 Tf 15.061 0 Td [(=)]TJ/F17 9.9626 Tf 11.086 10.922 Td [(r)]TJ + 0.999 0 0 1 175.611 540.749 Tm [(Denoting)-251(by)]TJ/F78 9.9626 Tf 1 0 0 1 232.93 540.749 Tm [(d)-40(a)-25(t)]TJ/F78 7.5716 Tf 13.536 -1.96 Td [(i)]TJ/F84 9.9626 Tf 0.999 0 0 1 251.713 540.749 Tm [(the)-251(value)-251(of)-250(the)-251(variable)]TJ/F78 9.9626 Tf 1 0 0 1 360.51 540.749 Tm [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 0.999 0 0 1 376.501 540.749 Tm [(on)-251(pr)18(ocess)]TJ/F78 9.9626 Tf 1 0 0 1 425.568 540.749 Tm [(i)]TJ/F84 9.9626 Tf 0.999 0 0 1 428.532 540.749 Tm [(,)-251(the)-251(output)]TJ/F78 9.9626 Tf 1 0 0 1 482.247 540.749 Tm [(r)-17(e)-25(s)]TJ/F84 9.9626 Tf -306.636 -11.955 Td [(is)-250(equivalent)-250(to)-250(the)-250(computation)-250(of)]TJ/F78 9.9626 Tf 124.797 -25.467 Td [(r)-17(e)-25(s)]TJ/F197 10.3811 Tf 15.061 0 Td [(=)]TJ/F17 9.9626 Tf 11.086 10.922 Td [(r)]TJ ET q 1 0 0 1 336.642 514.443 cm []0 d 0 J 0.389 w 0 0 m 30.512 0 l S Q BT -/F243 13.9477 Tf 336.766 501.255 Td [(\345)]TJ/F78 7.5716 Tf 4.245 -8.765 Td [(i)]TJ/F78 9.9626 Tf 8.365 10.837 Td [(d)-40(a)-25(t)]TJ/F84 7.5716 Tf 13.494 3.472 Td [(2)]TJ/F78 7.5716 Tf 0.042 -7.026 Td [(i)]TJ/F84 9.9626 Tf 4.242 3.554 Td [(,)]TJ -191.961 -30.807 Td [(with)-250(car)18(e)-250(taken)-250(to)-250(avoid)-250(unnecessary)-250(over\003ow)92(.)]TJ +/F241 13.9477 Tf 336.766 501.255 Td [(\345)]TJ/F78 7.5716 Tf 4.245 -8.765 Td [(i)]TJ/F78 9.9626 Tf 8.365 10.837 Td [(d)-40(a)-25(t)]TJ/F84 7.5716 Tf 13.494 3.472 Td [(2)]TJ/F78 7.5716 Tf 0.042 -7.026 Td [(i)]TJ/F84 9.9626 Tf 4.242 3.554 Td [(,)]TJ -191.961 -30.807 Td [(with)-250(car)18(e)-250(taken)-250(to)-250(avoid)-250(unnecessary)-250(over\003ow)92(.)]TJ 0 g 0 G -12.035 -19.925 Td [(3.)]TJ 0 g 0 G - 0.98 0 0 1 175.303 452.595 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 193.994 452.595 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 452.595 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 440.64 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ + 0.98 0 0 1 175.303 452.595 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 193.994 452.595 Tm [(dat)]TJ/F84 9.9626 Tf 0.98 0 0 1 212.032 452.595 Tm [(ar)18(gument)-240(is)-240(both)-241(input)-240(and)-241(output,)-243(and)-240(its)-241(value)-240(may)-240(be)-241(changed)]TJ 1 0 0 1 175.611 440.64 Tm [(even)-250(on)-250(pr)18(ocesses)-250(dif)18(fer)18(ent)-250(fr)18(om)-250(the)-250(\002nal)-250(r)18(esult)-250(destination.)]TJ 0 g 0 G -12.453 -19.926 Td [(4.)]TJ 0 g 0 G - 1.02 0 0 1 175.303 420.714 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 195.057 420.714 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 420.714 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F145 9.9626 Tf 1 0 0 1 395.907 420.714 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 420.714 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 408.759 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 396.804 Tm [(the)]TJ/F145 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ + 1.02 0 0 1 175.303 420.714 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 195.057 420.714 Tm [(mode)]TJ/F84 9.9626 Tf 1.02 0 0 1 218.722 420.714 Tm [(ar)18(gument)-270(can)-270(be)-270(built)-270(with)-270(the)-270(bitwise)]TJ/F147 9.9626 Tf 1 0 0 1 395.907 420.714 Tm [(IOR\050\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.803 420.714 Tm [(operator;)-282(in)-270(the)]TJ 0.988 0 0 1 175.611 408.759 Tm [(following)-254(example,)-255(the)-254(ar)18(gument)-254(is)-255(for)18(cing)-254(immediate)-254(completion,)-255(hence)]TJ 1 0 0 1 175.611 396.804 Tm [(the)]TJ/F147 9.9626 Tf 16.309 0 Td [(request)]TJ/F84 9.9626 Tf 39.103 0 Td [(ar)18(gument)-250(needs)-250(not)-250(be)-250(speci\002ed:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -24275,7 +24358,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 188.015 374.189 Td [(call)]TJ +/F235 8.9664 Tf 188.015 374.189 Td [(call)]TJ 0 g 0 G [-525(psb_nrm2\050ctxt,dat,&)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -24296,7 +24379,7 @@ BT 0 g 0 G /F84 9.9626 Tf -48.393 -36.164 Td [(5.)]TJ 0 g 0 G - 1.02 0 0 1 175.113 327.066 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F145 9.9626 Tf 1 0 0 1 379.88 327.066 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 327.066 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 327.066 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 327.066 Tm [(be)]TJ 1 0 0 1 175.611 315.11 Tm [(accessed)-250(between)-250(calls:)]TJ + 1.02 0 0 1 175.113 327.066 Tm [(When)-250(splitting)-250(the)-250(operation)-250(in)-250(two)-250(c)1(alls,)-252(the)]TJ/F147 9.9626 Tf 1 0 0 1 379.88 327.066 Tm [(dat)]TJ/F84 9.9626 Tf 1.02 0 0 1 398.111 327.066 Tm [(ar)18(gument)]TJ/F78 9.9626 Tf 1.02 0 0 1 444.411 327.066 Tm [(must)-250(not)]TJ/F84 9.9626 Tf 1.02 0 0 1 483.929 327.066 Tm [(be)]TJ 1 0 0 1 175.611 315.11 Tm [(accessed)-250(between)-250(calls:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -24308,7 +24391,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 178.6 292.495 Td [(call)]TJ +/F235 8.9664 Tf 178.6 292.495 Td [(call)]TJ 0 g 0 G [-525(psb_nrm2\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -24331,12 +24414,12 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ +/F281 8.9664 Tf 37.658 0 Td [(!)-525(Do)-525(not)-525(access)-525(dat)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F233 8.9664 Tf -37.658 -10.959 Td [(call)]TJ +/F235 8.9664 Tf -37.658 -10.959 Td [(call)]TJ 0 g 0 G [-525(psb_nrm2\050ctxt,dat,mode)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -24362,7 +24445,7 @@ ET endstream endobj -1888 0 obj +1891 0 obj << /Length 5618 >> @@ -24380,7 +24463,7 @@ BT /F75 11.9552 Tf 156.993 706.129 Td [(snd)-250(\227)-250(Send)-250(data)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_snd\050ctxt,)-525(dat,)-525(dst,)-525(m\051)]TJ/F84 9.9626 Tf 14.944 -21.918 Td [(This)-250(subr)18(outine)-250(sends)-250(a)-250(packet)-250(of)-250(data)-250(to)-250(a)-250(destination.)]TJ +/F147 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_snd\050ctxt,)-525(dat,)-525(dst,)-525(m\051)]TJ/F84 9.9626 Tf 14.944 -21.918 Td [(This)-250(subr)18(outine)-250(sends)-250(a)-250(packet)-250(of)-250(data)-250(to)-250(a)-250(destination.)]TJ 0 g 0 G /F75 9.9626 Tf -14.944 -19.925 Td [(T)90(ype:)]TJ 0 g 0 G @@ -24399,11 +24482,11 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -19.925 Td [(dst)]TJ 0 g 0 G -/F84 9.9626 Tf 18.81 0 Td [(Destination)-250(pr)18(ocess.)]TJ 6.097 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)-250(0)]TJ/F148 10.3811 Tf 138.85 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(d)-25(s)-25(t)]TJ/F148 10.3811 Tf 15.689 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1.)]TJ +/F84 9.9626 Tf 18.81 0 Td [(Destination)-250(pr)18(ocess.)]TJ 6.097 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -66.072 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)-250(0)]TJ/F152 10.3811 Tf 138.85 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(d)-25(s)-25(t)]TJ/F152 10.3811 Tf 15.689 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.503 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1.)]TJ 0 g 0 G /F75 9.9626 Tf -241.89 -31.88 Td [(m)]TJ 0 g 0 G -/F84 9.9626 Tf 13.838 0 Td [(Number)-250(of)-250(r)18(ows.)]TJ 11.069 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(Optional)]TJ/F84 9.9626 Tf 40.946 0 Td [(.)]TJ -67.725 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)-250(0)]TJ/F148 10.3811 Tf 138.85 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(m)]TJ/F148 10.3811 Tf 10.767 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(s)-18(i)-32(z)-25(e)]TJ/F192 10.3811 Tf 15.94 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 13.494 0 Td [(,)-167(1)]TJ/F192 10.3811 Tf 9.257 0 Td [(\051)]TJ/F84 9.9626 Tf 4.15 0 Td [(.)]TJ 1.02 0 0 1 124.304 294.637 Tm [(When)]TJ/F78 9.9626 Tf 1 0 0 1 153.769 294.637 Tm [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 1.02 0 0 1 169.747 294.637 Tm [(is)-244(a)-245(rank)-244(2)-245(array)109(,)-244(speci\002es)-245(the)-244(number)-244(of)-245(r)18(ows)-244(to)-245(be)-244(sent)-245(inde-)]TJ 0.98 0 0 1 124.503 282.682 Tm [(pendently)-236(of)-236(the)-236(leading)-236(dimension)]TJ/F78 9.9626 Tf 1 0 0 1 280.369 282.682 Tm [(s)-18(i)-32(z)-25(e)]TJ/F192 10.3811 Tf 15.94 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 0.98 0 0 1 314.077 282.682 Tm [(,)-170(1)]TJ/F192 10.3811 Tf 1 0 0 1 323.185 282.682 Tm [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 327.334 282.682 Tm [(;)-242(must)-236(have)-236(the)-236(same)-236(value)]TJ 1 0 0 1 124.802 270.727 Tm [(on)-250(sending)-250(and)-250(r)18(eceiving)-250(pr)18(ocesses.)]TJ +/F84 9.9626 Tf 13.838 0 Td [(Number)-250(of)-250(r)18(ows.)]TJ 11.069 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.523 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(Optional)]TJ/F84 9.9626 Tf 40.946 0 Td [(.)]TJ -67.725 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)-250(0)]TJ/F152 10.3811 Tf 138.85 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(m)]TJ/F152 10.3811 Tf 10.767 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(s)-18(i)-32(z)-25(e)]TJ/F197 10.3811 Tf 15.94 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 13.494 0 Td [(,)-167(1)]TJ/F197 10.3811 Tf 9.257 0 Td [(\051)]TJ/F84 9.9626 Tf 4.15 0 Td [(.)]TJ 1.02 0 0 1 124.304 294.637 Tm [(When)]TJ/F78 9.9626 Tf 1 0 0 1 153.769 294.637 Tm [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 1.02 0 0 1 169.747 294.637 Tm [(is)-244(a)-245(rank)-244(2)-245(array)109(,)-244(speci\002es)-245(the)-244(number)-244(of)-245(r)18(ows)-244(to)-245(be)-244(sent)-245(inde-)]TJ 0.98 0 0 1 124.503 282.682 Tm [(pendently)-236(of)-236(the)-236(leading)-236(dimension)]TJ/F78 9.9626 Tf 1 0 0 1 280.369 282.682 Tm [(s)-18(i)-32(z)-25(e)]TJ/F197 10.3811 Tf 15.94 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 0.98 0 0 1 314.077 282.682 Tm [(,)-170(1)]TJ/F197 10.3811 Tf 1 0 0 1 323.185 282.682 Tm [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 327.334 282.682 Tm [(;)-242(must)-236(have)-236(the)-236(same)-236(value)]TJ 1 0 0 1 124.802 270.727 Tm [(on)-250(sending)-250(and)-250(r)18(eceiving)-250(pr)18(ocesses.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -21.918 Td [(On)-250(Return)]TJ 0 g 0 G @@ -24419,7 +24502,7 @@ ET endstream endobj -1893 0 obj +1896 0 obj << /Length 5630 >> @@ -24437,7 +24520,7 @@ BT /F75 11.9552 Tf 207.803 706.129 Td [(rcv)-250(\227)-250(Receive)-250(data)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_rcv\050ctxt,)-525(dat,)-525(src,)-525(m\051)]TJ/F84 9.9626 Tf 14.944 -21.918 Td [(This)-250(subr)18(outine)-250(r)18(eceives)-250(a)-250(packet)-250(of)-250(data)-250(to)-250(a)-250(destination.)]TJ +/F147 9.9626 Tf -57.098 -18.964 Td [(call)-525(psb_rcv\050ctxt,)-525(dat,)-525(src,)-525(m\051)]TJ/F84 9.9626 Tf 14.944 -21.918 Td [(This)-250(subr)18(outine)-250(r)18(eceives)-250(a)-250(packet)-250(of)-250(data)-250(to)-250(a)-250(destination.)]TJ 0 g 0 G /F75 9.9626 Tf -14.944 -19.925 Td [(T)90(ype:)]TJ 0 g 0 G @@ -24452,11 +24535,11 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -19.926 Td [(src)]TJ 0 g 0 G -/F84 9.9626 Tf 17.703 0 Td [(Sour)18(ce)-250(pr)18(ocess.)]TJ 7.204 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -66.071 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)-250(0)]TJ/F148 10.3811 Tf 138.85 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(s)-15(r)-17(c)]TJ/F148 10.3811 Tf 15.14 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F190 10.3811 Tf 13.504 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1.)]TJ +/F84 9.9626 Tf 17.703 0 Td [(Sour)18(ce)-250(pr)18(ocess.)]TJ 7.204 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -66.071 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)-250(0)]TJ/F152 10.3811 Tf 138.85 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(s)-15(r)-17(c)]TJ/F152 10.3811 Tf 15.14 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(n)-80(p)]TJ/F195 10.3811 Tf 13.504 0 Td [(\000)]TJ/F84 9.9626 Tf 10.131 0 Td [(1.)]TJ 0 g 0 G /F75 9.9626 Tf -241.342 -31.881 Td [(m)]TJ 0 g 0 G -/F84 9.9626 Tf 13.838 0 Td [(Number)-250(of)-250(r)18(ows.)]TJ 11.069 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(Optional)]TJ/F84 9.9626 Tf 40.946 0 Td [(.)]TJ -67.725 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)-250(0)]TJ/F148 10.3811 Tf 138.85 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(m)]TJ/F148 10.3811 Tf 10.767 0 Td [(<)]TJ/F192 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(s)-18(i)-32(z)-25(e)]TJ/F192 10.3811 Tf 15.94 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 13.494 0 Td [(,)-167(1)]TJ/F192 10.3811 Tf 9.257 0 Td [(\051)]TJ/F84 9.9626 Tf 4.149 0 Td [(.)]TJ 1.02 0 0 1 175.113 398.249 Tm [(When)]TJ/F78 9.9626 Tf 1 0 0 1 204.579 398.249 Tm [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 1.02 0 0 1 220.557 398.249 Tm [(is)-244(a)-245(rank)-244(2)-244(array)108(,)-244(speci\002es)-245(the)-244(number)-244(of)-245(r)18(ows)-244(to)-245(be)-244(sent)-244(inde-)]TJ 0.98 0 0 1 175.313 386.293 Tm [(pendently)-236(of)-236(the)-236(leading)-236(dimension)]TJ/F78 9.9626 Tf 1 0 0 1 331.178 386.293 Tm [(s)-18(i)-32(z)-25(e)]TJ/F192 10.3811 Tf 15.94 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 0.98 0 0 1 364.887 386.293 Tm [(,)-170(1)]TJ/F192 10.3811 Tf 1 0 0 1 373.994 386.293 Tm [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 378.144 386.293 Tm [(;)-242(must)-236(have)-236(the)-236(same)-236(value)]TJ 1 0 0 1 175.611 374.338 Tm [(on)-250(sending)-250(and)-250(r)18(eceiving)-250(pr)18(ocesses.)]TJ +/F84 9.9626 Tf 13.838 0 Td [(Number)-250(of)-250(r)18(ows.)]TJ 11.069 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(global)]TJ/F84 9.9626 Tf 28.782 0 Td [(.)]TJ -60.522 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(Optional)]TJ/F84 9.9626 Tf 40.946 0 Td [(.)]TJ -67.725 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value)-250(0)]TJ/F152 10.3811 Tf 138.85 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(m)]TJ/F152 10.3811 Tf 10.767 0 Td [(<)]TJ/F197 10.3811 Tf 8.319 0 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(s)-18(i)-32(z)-25(e)]TJ/F197 10.3811 Tf 15.94 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 13.494 0 Td [(,)-167(1)]TJ/F197 10.3811 Tf 9.257 0 Td [(\051)]TJ/F84 9.9626 Tf 4.149 0 Td [(.)]TJ 1.02 0 0 1 175.113 398.249 Tm [(When)]TJ/F78 9.9626 Tf 1 0 0 1 204.579 398.249 Tm [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 1.02 0 0 1 220.557 398.249 Tm [(is)-244(a)-245(rank)-244(2)-244(array)108(,)-244(speci\002es)-245(the)-244(number)-244(of)-245(r)18(ows)-244(to)-245(be)-244(sent)-244(inde-)]TJ 0.98 0 0 1 175.313 386.293 Tm [(pendently)-236(of)-236(the)-236(leading)-236(dimension)]TJ/F78 9.9626 Tf 1 0 0 1 331.178 386.293 Tm [(s)-18(i)-32(z)-25(e)]TJ/F197 10.3811 Tf 15.94 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(d)-40(a)-25(t)]TJ/F84 9.9626 Tf 0.98 0 0 1 364.887 386.293 Tm [(,)-170(1)]TJ/F197 10.3811 Tf 1 0 0 1 373.994 386.293 Tm [(\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 378.144 386.293 Tm [(;)-242(must)-236(have)-236(the)-236(same)-236(value)]TJ 1 0 0 1 175.611 374.338 Tm [(on)-250(sending)-250(and)-250(r)18(eceiving)-250(pr)18(ocesses.)]TJ 0 g 0 G /F75 9.9626 Tf -24.906 -21.918 Td [(On)-250(Return)]TJ 0 g 0 G @@ -24475,23 +24558,23 @@ ET endstream endobj -1900 0 obj +1903 0 obj << -/Length 6870 +/Length 6890 >> stream 0 g 0 G 0 g 0 G BT -/F75 14.3462 Tf 99.895 705.784 Td [(8)-1000(Error)-250(handling)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 683.082 Tm [(The)-317(PSBLAS)-317(library)-317(err)17(or)-317(handling)-317(policy)-317(has)-317(been)-317(completely)-318(r)18(ewritten)-317(in)]TJ 1.02 0 0 1 99.616 671.127 Tm [(version)-315(2.0.)-514(The)-314(idea)-315(behind)-315(the)-315(design)-315(of)-315(this)-315(new)-315(err)17(or)-314(handling)-315(strategy)]TJ 1.02 0 0 1 99.895 659.172 Tm [(is)-261(to)-260(keep)-261(err)17(or)-260(messages)-261(on)-261(a)-260(stack)-261(allowing)-261(the)-260(user)-261(to)-261(trace)-261(back)-260(up)-261(to)-261(the)]TJ 1.02 0 0 1 99.596 647.217 Tm [(point)-270(wher)17(e)-270(the)-271(\002rst)-270(err)17(or)-270(message)-270(has)-271(been)-270(generated.)-380(Every)-271(r)18(outine)-271(in)-270(the)]TJ 0.98 0 0 1 99.895 635.261 Tm [(PSBLAS-2.0)-245(library)-245(has,)-247(as)-245(last)-245(non-optional)-245(ar)18(gument,)-247(an)-245(integer)]TJ/F145 9.9626 Tf 1 0 0 1 384.203 635.261 Tm [(info)]TJ/F84 9.9626 Tf 0.98 0 0 1 407.517 635.261 Tm [(variable;)]TJ 1 0 0 1 99.477 623.306 Tm [(whenever)74(,)-251(inside)-250(the)-251(r)18(outine,)-250(an)-251(err)18(or)-250(is)-251(detected,)-250(this)-251(variable)-250(is)-251(set)-250(to)-251(a)-250(value)]TJ 1.02 0 0 1 99.895 611.351 Tm [(corr)18(esponding)-337(to)-336(a)-337(speci\002c)-336(err)17(or)-336(code.)-578(Then)-337(this)-336(err)17(or)-336(code)-337(is)-336(also)-337(pushed)]TJ 1.02 0 0 1 99.895 599.396 Tm [(on)-299(the)-299(err)17(or)-299(stack)-299(and)-299(then)-299(either)-299(contr)17(ol)-299(is)-299(r)18(eturned)-299(to)-300(the)-299(caller)-299(r)18(outine)-299(or)]TJ 1.005 0 0 1 99.895 587.441 Tm [(the)-249(execution)-249(is)-249(aborted,)-249(depending)-249(on)-250(the)-249(users)-249(choice.)-309(At)-249(the)-249(time)-249(when)-250(the)]TJ 0.98 0 0 1 99.895 575.486 Tm [(execution)-218(is)-218(aborted,)-226(an)-218(err)18(or)-218(message)-218(is)-218(printed)-218(on)-218(standar)18(d)-218(output)-218(with)-218(a)-218(level)]TJ 0.98 0 0 1 99.895 563.53 Tm [(of)-247(verbosity)-247(than)-246(can)-247(be)-247(chosen)-247(by)-247(the)-246(user)75(.)-313(If)-247(the)-247(execution)-247(is)-247(not)-246(aborted,)-249(then,)]TJ 0.98 0 0 1 99.895 551.575 Tm [(the)-256(caller)-256(r)18(outine)-256(checks)-256(the)-256(value)-256(r)18(eturned)-256(in)-256(the)]TJ/F145 9.9626 Tf 1 0 0 1 316.265 551.575 Tm [(info)]TJ/F84 9.9626 Tf 0.98 0 0 1 339.687 551.575 Tm [(variable)-256(and,)-256(if)-257(not)-256(zer)19(o,)]TJ 1.02 0 0 1 99.895 539.62 Tm [(an)-247(err)17(or)-247(condition)-247(is)-247(raised.)-311(This)-247(pr)18(ocess)-247(continues)-248(on)-247(all)-247(the)-247(levels)-248(o)1(f)-248(nested)]TJ 1 0 0 1 99.895 527.665 Tm [(calls)-250(until)-250(the)-250(level)-250(wher)18(e)-250(the)-250(user)-250(decides)-250(to)-250(abort)-250(the)-250(pr)18(ogram)-250(execution.)]TJ 1.018 0 0 1 114.839 515.71 Tm [(Figur)18(e)]TJ +/F75 14.3462 Tf 99.895 705.784 Td [(8)-1000(Error)-250(handling)]TJ/F84 9.9626 Tf 0.996 0 0 1 99.587 683.082 Tm [(The)-250(PSBLAS)-251(library)-250(err)18(or)-251(handli)1(ng)-251(policy)-250(has)-251(been)-250(de\002ned)-251(at)-250(the)-250(time)-251(version)]TJ 0.98 0 0 1 99.895 671.127 Tm [(2.0)-240(was)-240(written.)-311(The)-240(idea)-240(behind)-240(the)-240(design)-240(of)-240(err)18(or)-240(handling)-240(strategy)-240(is)-240(to)-240(keep)]TJ 0.99 0 0 1 99.895 659.172 Tm [(err)18(or)-253(messages)-254(on)-253(a)-254(stack)-253(allowing)-254(the)-253(user)-254(to)-253(trace)-254(back)-253(up)-253(to)-254(the)-253(point)-254(wher)18(e)]TJ 0.983 0 0 1 99.895 647.217 Tm [(the)-253(\002rst)-254(err)19(or)-254(message)-253(has)-254(been)-253(generated.)-315(Every)-253(r)18(outine)-253(in)-254(the)-253(PSBLAS)-254(lib)1(rary)]TJ 1.005 0 0 1 99.895 635.261 Tm [(has,)-247(as)-248(last)-247(non-optional)-247(ar)18(gument,)-247(an)-247(integer)]TJ/F147 9.9626 Tf 1 0 0 1 304.383 635.261 Tm [(info)]TJ/F84 9.9626 Tf 1.005 0 0 1 327.779 635.261 Tm [(variable;)-248(whenever)74(,)-247(inside)]TJ 0.997 0 0 1 99.895 623.306 Tm [(the)-251(r)18(outine,)-251(an)-251(err)18(or)-250(is)-251(detected,)-251(this)-251(variable)-251(is)-251(set)-251(to)-250(a)-251(value)-251(corr)18(esponding)-251(to)]TJ 0.994 0 0 1 99.895 611.351 Tm [(a)-251(speci\002c)-250(err)18(or)-251(code.)-312(Then)-250(this)-251(err)18(or)-251(code)-250(is)-251(also)-251(pushed)-251(on)-250(the)-251(err)18(or)-251(stack)-250(and)]TJ 1.011 0 0 1 99.895 599.396 Tm [(then)-247(either)-248(contr)18(ol)-247(is)-248(r)18(eturned)-247(to)-248(the)-247(caller)-247(r)17(outine)-247(or)-247(the)-248(execution)-247(is)-247(aborted,)]TJ 1.015 0 0 1 99.895 587.441 Tm [(depending)-247(on)-246(the)-247(users)-246(choice.)-307(At)-246(the)-247(time)-246(when)-247(the)-247(execu)1(tion)-247(is)-247(aborted,)-246(an)]TJ 0.98 0 0 1 99.895 575.486 Tm [(err)18(or)-214(message)-215(is)-214(printed)-215(on)-215(standar)19(d)-215(output)-214(with)-215(a)-214(level)-215(of)-215(verbosit)1(y)-215(than)-215(can)-214(be)]TJ 0.98 0 0 1 99.895 563.53 Tm [(chosen)-228(by)-229(t)1(he)-229(user)76(.)-308(If)-228(the)-228(execution)-228(is)-229(not)-228(aborted,)-233(then,)-234(the)-228(caller)-228(r)18(outine)-228(checks)]TJ 1.02 0 0 1 99.895 551.575 Tm [(the)-276(v)1(alue)-276(r)18(eturned)-276(in)-275(the)]TJ/F147 9.9626 Tf 1 0 0 1 214.874 551.575 Tm [(info)]TJ/F84 9.9626 Tf 1.02 0 0 1 238.594 551.575 Tm [(variable)-275(and,)-284(if)-275(not)-276(zer)18(o,)-283(an)-275(err)17(or)-275(condition)-276(is)]TJ 1.02 0 0 1 99.895 539.62 Tm [(raised.)-445(This)-292(pr)17(oce)1(ss)-293(continues)-292(on)-292(all)-292(the)-292(levels)-292(of)-292(nested)-292(calls)-293(unt)1(il)-293(the)-292(level)]TJ 1 0 0 1 99.477 527.665 Tm [(wher)18(e)-250(the)-250(user)-250(decides)-250(to)-250(abort)-250(the)-250(pr)18(ogram)-250(execution.)]TJ 1.018 0 0 1 114.839 515.71 Tm [(Figur)18(e)]TJ 0 0 1 rg 0 0 1 RG [-246(5)]TJ 0 g 0 G - [-246(shows)-245(the)-246(layout)-246(of)-245(a)-246(generic)]TJ/F145 9.9626 Tf 1 0 0 1 286.762 515.71 Tm [(psb_foo)]TJ/F84 9.9626 Tf 1.018 0 0 1 325.866 515.71 Tm [(r)18(outine)-246(with)-246(r)18(espect)-246(to)-245(the)]TJ 1.004 0 0 1 99.895 503.755 Tm [(PSBLAS-2.0)-250(err)18(or)-250(handling)-250(policy)111(.)-311(It)-250(is)-250(possible)-250(to)-250(see)-249(how)91(,)-250(whenever)-250(an)-250(err)18(or)]TJ 1.02 0 0 1 99.895 491.799 Tm [(condition)-246(is)-247(det)1(ected,)-247(the)]TJ/F145 9.9626 Tf 1 0 0 1 214.838 491.799 Tm [(info)]TJ/F84 9.9626 Tf 1.02 0 0 1 238.262 491.799 Tm [(variable)-246(is)-246(set)-247(to)-246(the)-246(corr)17(esponding)-246(err)18(or)-246(code)]TJ 1.02 0 0 1 99.477 479.844 Tm [(which)-277(is,)-285(then,)-285(pushed)-277(on)-277(top)-277(of)-277(the)-277(stack)-277(by)-277(means)-277(of)-277(the)]TJ/F145 9.9626 Tf 1 0 0 1 365.652 479.844 Tm [(psb_errpush)]TJ/F84 9.9626 Tf 1.02 0 0 1 423.186 479.844 Tm [(.)-400(An)]TJ 0.992 0 0 1 99.895 467.889 Tm [(err)18(or)-251(condition)-251(may)-251(be)-251(dir)18(ectly)-251(detected)-251(inside)-251(a)-251(r)18(outine)-251(or)-252(i)1(ndir)18(ectly)-251(checking)]TJ 1.02 0 0 1 99.895 455.934 Tm [(the)-333(err)18(or)-333(code)-333(r)17(eturned)-333(r)18(eturned)-333(by)-333(a)-333(called)-333(r)18(outine.)-568(Whene)1(ver)-333(an)-333(err)17(or)-333(is)]TJ 0.98 0 0 1 99.895 443.979 Tm [(encounter)18(ed,)-240(after)-238(it)-237(has)-237(been)-237(pushed)-238(on)-237(stack,)-241(the)-237(pr)19(ogram)-238(execution)-237(skips)-237(to)-237(a)]TJ 0.98 0 0 1 99.596 432.024 Tm [(point)-252(wher)19(e)-252(the)-251(err)18(or)-251(condition)-252(is)-251(handled;)-253(the)-252(err)19(or)-252(condition)-251(is)-252(handled)-251(either)]TJ 1.015 0 0 1 99.895 420.068 Tm [(by)-246(r)18(eturning)-245(contr)17(ol)-245(to)-246(t)1(he)-246(caller)-245(r)17(outine)-245(or)-246(by)-245(calling)-246(the)]TJ/F145 9.9626 Tf 1 0 0 1 356.419 420.068 Tm [(psb\134_error)]TJ/F84 9.9626 Tf 1.015 0 0 1 411.205 420.068 Tm [(r)18(outine)]TJ 1.02 0 0 1 99.477 408.113 Tm [(which)-255(prints)-254(the)-255(content)-255(of)-255(the)-254(err)17(or)-254(stack)-255(and)-255(aborts)-255(the)-254(pr)17(ogram)-254(execution,)]TJ 0.98 0 0 1 99.895 396.158 Tm [(accor)18(ding)-242(to)-242(the)-242(choice)-241(made)-242(by)-242(the)-242(user)-242(with)]TJ/F145 9.9626 Tf 1 0 0 1 299.812 396.158 Tm [(psb_set_erraction)]TJ/F84 9.9626 Tf 0.98 0 0 1 388.728 396.158 Tm [(.)-312(The)-242(default)]TJ 1.02 0 0 1 99.895 384.203 Tm [(is)-314(to)-314(print)-314(the)-313(err)17(or)-314(and)-313(terminate)-314(the)-314(pr)18(ogram,)-331(but)-314(the)-314(user)-314(may)-314(choose)-314(to)]TJ 1 0 0 1 99.895 372.248 Tm [(handle)-250(the)-250(err)18(or)-250(explicitly)111(.)]TJ 0.98 0 0 1 114.839 360.293 Tm [(Figur)18(e)]TJ + [-246(shows)-245(the)-246(layout)-246(of)-245(a)-246(generic)]TJ/F147 9.9626 Tf 1 0 0 1 286.762 515.71 Tm [(psb_foo)]TJ/F84 9.9626 Tf 1.018 0 0 1 325.866 515.71 Tm [(r)18(outine)-246(with)-246(r)18(espect)-246(to)-245(the)]TJ 1.02 0 0 1 99.895 503.755 Tm [(PSBLAS)-322(err)17(or)-322(handling)-322(policy)109(.)-536(It)-322(is)-322(possible)-323(to)-322(see)-322(how)90(,)-341(whenever)-323(an)-322(err)18(or)]TJ 1.02 0 0 1 99.895 491.799 Tm [(condition)-246(is)-247(det)1(ected,)-247(the)]TJ/F147 9.9626 Tf 1 0 0 1 214.838 491.799 Tm [(info)]TJ/F84 9.9626 Tf 1.02 0 0 1 238.262 491.799 Tm [(variable)-246(is)-246(set)-247(to)-246(the)-246(corr)17(esponding)-246(err)18(or)-246(code)]TJ 1.02 0 0 1 99.477 479.844 Tm [(which)-277(is,)-285(then,)-285(pushed)-277(on)-277(top)-277(of)-277(the)-277(stack)-277(by)-277(means)-277(of)-277(the)]TJ/F147 9.9626 Tf 1 0 0 1 365.652 479.844 Tm [(psb_errpush)]TJ/F84 9.9626 Tf 1.02 0 0 1 423.186 479.844 Tm [(.)-400(An)]TJ 0.992 0 0 1 99.895 467.889 Tm [(err)18(or)-251(condition)-251(may)-251(be)-251(dir)18(ectly)-251(detected)-251(inside)-251(a)-251(r)18(outine)-251(or)-252(i)1(ndir)18(ectly)-251(checking)]TJ 1.02 0 0 1 99.895 455.934 Tm [(the)-333(err)18(or)-333(code)-333(r)17(eturned)-333(r)18(eturned)-333(by)-333(a)-333(called)-333(r)18(outine.)-568(Whene)1(ver)-333(an)-333(err)17(or)-333(is)]TJ 0.98 0 0 1 99.895 443.979 Tm [(encounter)18(ed,)-240(after)-238(it)-237(has)-237(been)-237(pushed)-238(on)-237(stack,)-241(the)-237(pr)19(ogram)-238(execution)-237(skips)-237(to)-237(a)]TJ 0.98 0 0 1 99.596 432.024 Tm [(point)-252(wher)19(e)-252(the)-251(err)18(or)-251(condition)-252(is)-251(handled;)-253(the)-252(err)19(or)-252(condition)-251(is)-252(handled)-251(either)]TJ 1.015 0 0 1 99.895 420.068 Tm [(by)-246(r)18(eturning)-245(contr)17(ol)-245(to)-246(t)1(he)-246(caller)-245(r)17(outine)-245(or)-246(by)-245(calling)-246(the)]TJ/F147 9.9626 Tf 1 0 0 1 356.419 420.068 Tm [(psb\134_error)]TJ/F84 9.9626 Tf 1.015 0 0 1 411.205 420.068 Tm [(r)18(outine)]TJ 1.02 0 0 1 99.477 408.113 Tm [(which)-255(prints)-254(the)-255(content)-255(of)-255(the)-254(err)17(or)-254(stack)-255(and)-255(aborts)-255(the)-254(pr)17(ogram)-254(execution,)]TJ 0.98 0 0 1 99.895 396.158 Tm [(accor)18(ding)-242(to)-242(the)-242(choice)-241(made)-242(by)-242(the)-242(user)-242(with)]TJ/F147 9.9626 Tf 1 0 0 1 299.812 396.158 Tm [(psb_set_erraction)]TJ/F84 9.9626 Tf 0.98 0 0 1 388.728 396.158 Tm [(.)-312(The)-242(default)]TJ 1.02 0 0 1 99.895 384.203 Tm [(is)-314(to)-314(print)-314(the)-313(err)17(or)-314(and)-313(terminate)-314(the)-314(pr)18(ogram,)-331(but)-314(the)-314(user)-314(may)-314(choose)-314(to)]TJ 1 0 0 1 99.895 372.248 Tm [(handle)-250(the)-250(err)18(or)-250(explicitly)111(.)]TJ 1.02 0 0 1 114.839 360.293 Tm [(Figur)18(e)]TJ 0 0 1 rg 0 0 1 RG - [-224(6)]TJ + [-248(6)]TJ 0 g 0 G - [-225(r)18(e)1(ports)-225(a)-225(sample)-224(err)18(or)-225(message)-224(generated)-225(by)-224(the)-225(PSBLAS-2.0)-224(library)113(.)]TJ 1.02 0 0 1 99.587 348.337 Tm [(This)-253(err)18(or)-254(has)-253(been)-253(generated)-253(by)-253(the)-253(fact)-253(that)-253(the)-254(user)-253(has)-253(chosen)-253(the)-253(invalid)]TJ 0.98 0 0 1 98.401 336.382 Tm [(\223FOO\224)-255(storage)-254(format)-255(to)-254(r)18(epr)19(esent)-255(the)-254(sparse)-255(matrix.)-316(Fr)18(om)-254(this)-255(err)19(or)-255(message)-254(it)]TJ 0.98 0 0 1 99.895 324.427 Tm [(is)-217(possible)-218(to)-217(see)-217(that)-218(the)-217(err)18(or)-217(has)-217(been)-218(detected)-217(inside)-217(the)]TJ/F145 9.9626 Tf 1 0 0 1 352.938 324.427 Tm [(psb_cest)]TJ/F84 9.9626 Tf 0.98 0 0 1 396.903 324.427 Tm [(subr)18(outine)]TJ 1 0 0 1 99.895 312.472 Tm [(called)-250(by)]TJ/F145 9.9626 Tf 42.092 0 Td [(psb_spasb)]TJ/F84 9.9626 Tf 49.564 0 Td [(...)-310(by)-250(pr)18(ocess)-250(0)-250(\050i.e.)-310(the)-250(r)18(oot)-250(pr)18(ocess\051.)]TJ + [-247(r)18(eports)-247(a)-248(sample)-247(err)18(or)-247(message)-248(generated)-247(by)-247(the)-247(PSBLAS)-248(libr)1(ary)108(.)]TJ 1.02 0 0 1 99.587 348.337 Tm [(This)-253(err)18(or)-254(has)-253(been)-253(generated)-253(by)-253(the)-253(fact)-253(that)-253(the)-254(user)-253(has)-253(chosen)-253(the)-253(invalid)]TJ 0.98 0 0 1 98.401 336.382 Tm [(\223FOO\224)-255(storage)-254(format)-255(to)-254(r)18(epr)19(esent)-255(the)-254(sparse)-255(matrix.)-316(Fr)18(om)-254(this)-255(err)19(or)-255(message)-254(it)]TJ 0.98 0 0 1 99.895 324.427 Tm [(is)-217(possible)-218(to)-217(see)-217(that)-218(the)-217(err)18(or)-217(has)-217(been)-218(detected)-217(inside)-217(the)]TJ/F147 9.9626 Tf 1 0 0 1 352.938 324.427 Tm [(psb_cest)]TJ/F84 9.9626 Tf 0.98 0 0 1 396.903 324.427 Tm [(subr)18(outine)]TJ 1 0 0 1 99.895 312.472 Tm [(called)-250(by)]TJ/F147 9.9626 Tf 42.092 0 Td [(psb_spasb)]TJ/F84 9.9626 Tf 49.564 0 Td [(...)-310(by)-250(pr)18(ocess)-250(0)-250(\050i.e.)-310(the)-250(r)18(oot)-250(pr)18(ocess\051.)]TJ 0 g 0 G 72.728 -222.034 Td [(137)]TJ 0 g 0 G @@ -24499,9 +24582,9 @@ ET endstream endobj -1906 0 obj +1909 0 obj << -/Length 10395 +/Length 10391 >> stream 0 g 0 G @@ -24517,7 +24600,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F145 9.9626 Tf 153.694 698.757 Td [(subroutine)]TJ +/F147 9.9626 Tf 153.694 698.757 Td [(subroutine)]TJ 0 g 0 G [-525(psb_foo\050some)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -24529,12 +24612,12 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 9.9626 Tf 15.691 -11.956 Td [(!...)]TJ +/F281 9.9626 Tf 15.691 -11.956 Td [(!...)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 0 -11.955 Td [(if)]TJ +/F147 9.9626 Tf 0 -11.955 Td [(if)]TJ 0 g 0 G [(\050error)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -24583,12 +24666,12 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 9.9626 Tf 0 -11.956 Td [(!...)]TJ +/F281 9.9626 Tf 0 -11.956 Td [(!...)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 0 -11.955 Td [(call)]TJ +/F147 9.9626 Tf 0 -11.955 Td [(call)]TJ 0 g 0 G [-525(psb_bar\050some)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -24652,10 +24735,10 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 9.9626 Tf 0 -11.955 Td [(!...)]TJ +/F281 9.9626 Tf 0 -11.955 Td [(!...)]TJ 0 g 0 G 0.25 0.63 0.44 rg 0.25 0.63 0.44 RG -/F145 9.9626 Tf -15.691 -11.955 Td [(9999)]TJ +/F147 9.9626 Tf -15.691 -11.955 Td [(9999)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G @@ -24704,17 +24787,17 @@ BT 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0 g 0 G 0 g 0 G -/F84 9.9626 Tf 1.018 0 0 1 150.705 382.059 Tm [(Listing)-246(5:)-306(The)-247(layout)-246(of)-246(a)-247(generic)]TJ/F145 9.9626 Tf 1 0 0 1 299.955 382.059 Tm [(psb)]TJ +/F84 9.9626 Tf 1.018 0 0 1 150.705 382.059 Tm [(Listing)-246(5:)-306(The)-247(layout)-246(of)-246(a)-247(generic)]TJ/F147 9.9626 Tf 1 0 0 1 299.955 382.059 Tm [(psb)]TJ ET q 1 0 0 1 316.274 382.258 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 319.412 382.059 Td [(foo)]TJ/F84 9.9626 Tf 1.018 0 0 1 337.602 382.059 Tm [(r)18(outine)-247(with)-246(r)18(espect)-247(to)-246(PSBLAS-2.0)]TJ 1 0 0 1 150.705 370.104 Tm [(err)18(or)-250(handling)-250(policy)111(.)]TJ +/F147 9.9626 Tf 319.412 382.059 Td [(foo)]TJ/F84 9.9626 Tf 1.018 0 0 1 337.602 382.059 Tm [(r)18(outine)-247(with)-246(r)18(espect)-247(to)-246(PSBLAS-2.0)]TJ 1 0 0 1 150.705 370.104 Tm [(err)18(or)-250(handling)-250(policy)111(.)]TJ 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG -/F145 9.9626 Tf 0 -19.609 Td [(==========================================================)]TJ +/F147 9.9626 Tf 0 -19.609 Td [(==========================================================)]TJ 0 g 0 G 0 -11.955 Td [(Process:)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -24935,22 +25018,22 @@ BT 0 g 0 G 0 -11.955 Td [(Aborting...)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 150.705 165.681 Tm [(Listing)-316(6:)-445(A)-316(sample)-316(PSBLAS-3.0)-316(err)18(or)-316(message.)-516(Pr)18(ocess)-316(0)-316(detected)-316(an)-316(err)18(or)]TJ 1 0 0 1 150.705 153.726 Tm [(condition)-250(inside)-250(the)-250(psb)]TJ +/F84 9.9626 Tf 0.98 0 0 1 150.705 165.681 Tm [(Listing)-195(6:)-286(A)-195(sample)-195(PSBLAS)-195(err)19(or)-195(message.)-296(Pr)18(ocess)-195(0)-195(detected)-195(an)-195(err)19(or)-195(condition)]TJ 1 0 0 1 150.705 153.726 Tm [(inside)-250(the)-250(psb)]TJ ET q -1 0 0 1 257.025 153.925 cm +1 0 0 1 212.502 153.925 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F84 9.9626 Tf 260.013 153.726 Td [(cest)-250(subr)18(outine)]TJ +/F84 9.9626 Tf 215.491 153.726 Td [(cest)-250(subr)18(outine)]TJ 0 g 0 G - 55.075 -63.288 Td [(138)]TJ + 99.597 -63.288 Td [(138)]TJ 0 g 0 G ET endstream endobj -1910 0 obj +1913 0 obj << /Length 3566 >> @@ -25061,7 +25144,7 @@ ET endstream endobj -1917 0 obj +1920 0 obj << /Length 1379 >> @@ -25104,7 +25187,7 @@ ET endstream endobj -1923 0 obj +1926 0 obj << /Length 1583 >> @@ -25161,7 +25244,7 @@ ET endstream endobj -1929 0 obj +1932 0 obj << /Length 2082 >> @@ -25224,7 +25307,7 @@ Q BT /F75 9.9626 Tf 167.023 599.494 Td [(act)]TJ 0 g 0 G -/F84 9.9626 Tf 17.704 0 Td [(the)-250(type)-250(of)-250(action.)]TJ -9.116 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(.)-310(Possible)-250(values:)]TJ/F145 9.9626 Tf 179.117 0 Td [(psb_act_ret)]TJ/F84 9.9626 Tf 57.533 0 Td [(,)]TJ/F145 9.9626 Tf 4.982 0 Td [(psb_act_abort)]TJ/F84 9.9626 Tf 67.994 0 Td [(.)]TJ +/F84 9.9626 Tf 17.704 0 Td [(the)-250(type)-250(of)-250(action.)]TJ -9.116 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)74(.)-310(Possible)-250(values:)]TJ/F147 9.9626 Tf 179.117 0 Td [(psb_act_ret)]TJ/F84 9.9626 Tf 57.533 0 Td [(,)]TJ/F147 9.9626 Tf 4.982 0 Td [(psb_act_abort)]TJ/F84 9.9626 Tf 67.994 0 Td [(.)]TJ 0 g 0 G -170.149 -461.235 Td [(142)]TJ 0 g 0 G @@ -25232,7 +25315,7 @@ ET endstream endobj -1935 0 obj +1938 0 obj << /Length 535 >> @@ -25240,7 +25323,7 @@ stream 0 g 0 G 0 g 0 G BT -/F75 14.3462 Tf 99.895 705.784 Td [(9)-1000(Utilities)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.397 683.082 Tm [(W)90(e)-272(have)-272(some)-272(utilities)-272(available)-272(for)-272(input)-272(and)-272(output)-272(of)-272(sparse)-272(matrices;)-286(the)]TJ 1 0 0 1 99.895 671.127 Tm [(interfaces)-250(to)-250(these)-250(r)18(outines)-250(ar)18(e)-250(available)-250(in)-250(the)-250(module)]TJ/F145 9.9626 Tf 242.01 0 Td [(psb_util_mod)]TJ/F84 9.9626 Tf 62.764 0 Td [(.)]TJ +/F75 14.3462 Tf 99.895 705.784 Td [(9)-1000(Utilities)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.397 683.082 Tm [(W)90(e)-272(have)-272(some)-272(utilities)-272(available)-272(for)-272(input)-272(and)-272(output)-272(of)-272(sparse)-272(matrices;)-286(the)]TJ 1 0 0 1 99.895 671.127 Tm [(interfaces)-250(to)-250(these)-250(r)18(outines)-250(ar)18(e)-250(available)-250(in)-250(the)-250(module)]TJ/F147 9.9626 Tf 242.01 0 Td [(psb_util_mod)]TJ/F84 9.9626 Tf 62.764 0 Td [(.)]TJ 0 g 0 G -140.39 -580.689 Td [(143)]TJ 0 g 0 G @@ -25248,342 +25331,351 @@ ET endstream endobj -1829 0 obj +1828 0 obj << /Type /ObjStm /N 100 /First 973 -/Length 9417 ->> -stream -1826 0 1828 118 469 176 1825 233 1831 384 1833 502 1834 561 1835 620 1836 679 1830 738 -1838 876 1840 994 473 1052 1837 1109 1843 1260 1845 1378 1846 1437 1847 1496 1848 1555 1842 1614 -1850 1752 1852 1870 477 1928 1849 1985 1854 2136 1856 2254 1857 2313 1858 2372 1859 2430 1853 2488 -1861 2626 1863 2744 481 2802 1860 2859 1865 3010 1867 3128 1868 3187 1869 3246 1870 3305 1864 3364 -1872 3502 1874 3620 485 3678 1871 3735 1877 3886 1879 4004 1880 4063 1881 4122 1883 4180 1884 4239 -1885 4298 1876 4357 1887 4538 1889 4656 489 4714 1890 4771 1886 4829 1892 4980 1894 5098 493 5157 -1895 5215 1891 5274 1899 5425 1896 5573 1897 5721 1901 5869 497 5927 1898 5984 1905 6079 1907 6197 -1902 6256 1903 6315 1904 6374 1909 6471 1911 6589 501 6647 1912 6704 1913 6762 1908 6820 1916 6901 -1918 7019 505 7078 1919 7136 1920 7194 1915 7253 1922 7334 1924 7452 509 7510 1925 7567 1926 7625 -1921 7683 1928 7764 1930 7882 513 7941 1931 7999 1932 8057 1927 8116 1934 8211 1936 8329 517 8387 -% 1826 0 obj +/Length 9498 +>> +stream +1827 0 1821 58 1830 196 1832 314 469 372 1829 429 1834 580 1836 698 1837 757 1838 816 +1839 875 1833 934 1841 1072 1843 1190 473 1248 1840 1305 1846 1456 1848 1574 1849 1633 1850 1692 +1851 1751 1845 1810 1853 1948 1855 2066 477 2124 1852 2181 1857 2332 1859 2450 1860 2509 1861 2568 +1862 2626 1856 2684 1864 2822 1866 2940 481 2998 1863 3055 1868 3206 1870 3324 1871 3383 1872 3442 +1873 3501 1867 3560 1875 3698 1877 3816 485 3874 1874 3931 1880 4082 1882 4200 1883 4259 1884 4318 +1886 4376 1887 4435 1888 4494 1879 4553 1890 4734 1892 4852 489 4910 1893 4967 1889 5025 1895 5176 +1897 5294 493 5353 1898 5411 1894 5470 1902 5621 1899 5769 1900 5917 1904 6065 497 6123 1901 6180 +1908 6275 1910 6393 1905 6452 1906 6511 1907 6570 1912 6667 1914 6785 501 6843 1915 6900 1916 6958 +1911 7016 1919 7097 1921 7215 505 7274 1922 7332 1923 7390 1918 7449 1925 7530 1927 7648 509 7706 +1928 7763 1929 7821 1924 7879 1931 7960 1933 8078 513 8137 1934 8195 1935 8253 1930 8312 1937 8407 +% 1827 0 obj +<< +/D [1822 0 R /XYZ 150.705 463.04 null] +>> +% 1821 0 obj +<< +/Font << /F84 687 0 R /F75 685 0 R /F147 941 0 R /F235 1045 0 R /F78 686 0 R /F281 1816 0 R >> +/ProcSet [ /PDF /Text ] +>> +% 1830 0 obj << /Type /Page -/Contents 1827 0 R -/Resources 1825 0 R +/Contents 1831 0 R +/Resources 1829 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1805 0 R +/Parent 1808 0 R >> -% 1828 0 obj +% 1832 0 obj << -/D [1826 0 R /XYZ 98.895 753.953 null] +/D [1830 0 R /XYZ 98.895 753.953 null] >> % 469 0 obj << -/D [1826 0 R /XYZ 99.895 716.092 null] +/D [1830 0 R /XYZ 99.895 716.092 null] >> -% 1825 0 obj +% 1829 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F195 942 0 R /F152 1491 0 R /F197 943 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1831 0 obj +% 1834 0 obj << /Type /Page -/Contents 1832 0 R -/Resources 1830 0 R +/Contents 1835 0 R +/Resources 1833 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1805 0 R +/Parent 1808 0 R >> -% 1833 0 obj +% 1836 0 obj << -/D [1831 0 R /XYZ 149.705 753.953 null] +/D [1834 0 R /XYZ 149.705 753.953 null] >> -% 1834 0 obj +% 1837 0 obj << -/D [1831 0 R /XYZ 150.705 576.399 null] +/D [1834 0 R /XYZ 150.705 576.399 null] >> -% 1835 0 obj +% 1838 0 obj << -/D [1831 0 R /XYZ 150.705 541.925 null] +/D [1834 0 R /XYZ 150.705 541.925 null] >> -% 1836 0 obj +% 1839 0 obj << -/D [1831 0 R /XYZ 150.705 451.085 null] +/D [1834 0 R /XYZ 150.705 451.085 null] >> -% 1830 0 obj +% 1833 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1813 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F147 941 0 R /F235 1045 0 R /F78 686 0 R /F281 1816 0 R >> /ProcSet [ /PDF /Text ] >> -% 1838 0 obj +% 1841 0 obj << /Type /Page -/Contents 1839 0 R -/Resources 1837 0 R +/Contents 1842 0 R +/Resources 1840 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1841 0 R +/Parent 1844 0 R >> -% 1840 0 obj +% 1843 0 obj << -/D [1838 0 R /XYZ 98.895 753.953 null] +/D [1841 0 R /XYZ 98.895 753.953 null] >> % 473 0 obj << -/D [1838 0 R /XYZ 99.895 716.092 null] +/D [1841 0 R /XYZ 99.895 716.092 null] >> -% 1837 0 obj +% 1840 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F195 942 0 R /F152 1491 0 R /F197 943 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1843 0 obj +% 1846 0 obj << /Type /Page -/Contents 1844 0 R -/Resources 1842 0 R +/Contents 1847 0 R +/Resources 1845 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1841 0 R +/Parent 1844 0 R >> -% 1845 0 obj +% 1848 0 obj << -/D [1843 0 R /XYZ 149.705 753.953 null] +/D [1846 0 R /XYZ 149.705 753.953 null] >> -% 1846 0 obj +% 1849 0 obj << -/D [1843 0 R /XYZ 150.705 576.399 null] +/D [1846 0 R /XYZ 150.705 576.399 null] >> -% 1847 0 obj +% 1850 0 obj << -/D [1843 0 R /XYZ 150.705 541.925 null] +/D [1846 0 R /XYZ 150.705 541.925 null] >> -% 1848 0 obj +% 1851 0 obj << -/D [1843 0 R /XYZ 150.705 451.085 null] +/D [1846 0 R /XYZ 150.705 451.085 null] >> -% 1842 0 obj +% 1845 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1813 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F147 941 0 R /F235 1045 0 R /F78 686 0 R /F281 1816 0 R >> /ProcSet [ /PDF /Text ] >> -% 1850 0 obj +% 1853 0 obj << /Type /Page -/Contents 1851 0 R -/Resources 1849 0 R +/Contents 1854 0 R +/Resources 1852 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1841 0 R +/Parent 1844 0 R >> -% 1852 0 obj +% 1855 0 obj << -/D [1850 0 R /XYZ 98.895 753.953 null] +/D [1853 0 R /XYZ 98.895 753.953 null] >> % 477 0 obj << -/D [1850 0 R /XYZ 99.895 716.092 null] +/D [1853 0 R /XYZ 99.895 716.092 null] >> -% 1849 0 obj +% 1852 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F195 942 0 R /F152 1491 0 R /F197 943 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1854 0 obj +% 1857 0 obj << /Type /Page -/Contents 1855 0 R -/Resources 1853 0 R +/Contents 1858 0 R +/Resources 1856 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1841 0 R +/Parent 1844 0 R >> -% 1856 0 obj +% 1859 0 obj << -/D [1854 0 R /XYZ 149.705 753.953 null] +/D [1857 0 R /XYZ 149.705 753.953 null] >> -% 1857 0 obj +% 1860 0 obj << -/D [1854 0 R /XYZ 150.705 588.355 null] +/D [1857 0 R /XYZ 150.705 588.355 null] >> -% 1858 0 obj +% 1861 0 obj << -/D [1854 0 R /XYZ 150.705 553.88 null] +/D [1857 0 R /XYZ 150.705 553.88 null] >> -% 1859 0 obj +% 1862 0 obj << -/D [1854 0 R /XYZ 150.705 463.04 null] +/D [1857 0 R /XYZ 150.705 463.04 null] >> -% 1853 0 obj +% 1856 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1813 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F147 941 0 R /F235 1045 0 R /F78 686 0 R /F281 1816 0 R >> /ProcSet [ /PDF /Text ] >> -% 1861 0 obj +% 1864 0 obj << /Type /Page -/Contents 1862 0 R -/Resources 1860 0 R +/Contents 1865 0 R +/Resources 1863 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1841 0 R +/Parent 1844 0 R >> -% 1863 0 obj +% 1866 0 obj << -/D [1861 0 R /XYZ 98.895 753.953 null] +/D [1864 0 R /XYZ 98.895 753.953 null] >> % 481 0 obj << -/D [1861 0 R /XYZ 99.895 716.092 null] +/D [1864 0 R /XYZ 99.895 716.092 null] >> -% 1860 0 obj +% 1863 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F195 942 0 R /F152 1491 0 R /F197 943 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1865 0 obj +% 1868 0 obj << /Type /Page -/Contents 1866 0 R -/Resources 1864 0 R +/Contents 1869 0 R +/Resources 1867 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1841 0 R +/Parent 1844 0 R >> -% 1867 0 obj +% 1870 0 obj << -/D [1865 0 R /XYZ 149.705 753.953 null] +/D [1868 0 R /XYZ 149.705 753.953 null] >> -% 1868 0 obj +% 1871 0 obj << -/D [1865 0 R /XYZ 150.705 576.399 null] +/D [1868 0 R /XYZ 150.705 576.399 null] >> -% 1869 0 obj +% 1872 0 obj << -/D [1865 0 R /XYZ 150.705 541.925 null] +/D [1868 0 R /XYZ 150.705 541.925 null] >> -% 1870 0 obj +% 1873 0 obj << -/D [1865 0 R /XYZ 150.705 451.085 null] +/D [1868 0 R /XYZ 150.705 451.085 null] >> -% 1864 0 obj +% 1867 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F233 1044 0 R /F78 686 0 R /F279 1813 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F147 941 0 R /F235 1045 0 R /F78 686 0 R /F281 1816 0 R >> /ProcSet [ /PDF /Text ] >> -% 1872 0 obj +% 1875 0 obj << /Type /Page -/Contents 1873 0 R -/Resources 1871 0 R +/Contents 1876 0 R +/Resources 1874 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1875 0 R +/Parent 1878 0 R >> -% 1874 0 obj +% 1877 0 obj << -/D [1872 0 R /XYZ 98.895 753.953 null] +/D [1875 0 R /XYZ 98.895 753.953 null] >> % 485 0 obj << -/D [1872 0 R /XYZ 99.895 716.092 null] +/D [1875 0 R /XYZ 99.895 716.092 null] >> -% 1871 0 obj +% 1874 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F190 941 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F195 942 0 R /F152 1491 0 R /F197 943 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 1877 0 obj +% 1880 0 obj << /Type /Page -/Contents 1878 0 R -/Resources 1876 0 R +/Contents 1881 0 R +/Resources 1879 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1875 0 R +/Parent 1878 0 R >> -% 1879 0 obj +% 1882 0 obj << -/D [1877 0 R /XYZ 149.705 753.953 null] +/D [1880 0 R /XYZ 149.705 753.953 null] >> -% 1880 0 obj +% 1883 0 obj << -/D [1877 0 R /XYZ 150.705 588.355 null] +/D [1880 0 R /XYZ 150.705 588.355 null] >> -% 1881 0 obj +% 1884 0 obj << -/D [1877 0 R /XYZ 150.705 553.88 null] +/D [1880 0 R /XYZ 150.705 553.88 null] >> -% 1883 0 obj +% 1886 0 obj << -/D [1877 0 R /XYZ 150.705 465.726 null] +/D [1880 0 R /XYZ 150.705 465.726 null] >> -% 1884 0 obj +% 1887 0 obj << -/D [1877 0 R /XYZ 150.705 433.845 null] +/D [1880 0 R /XYZ 150.705 433.845 null] >> -% 1885 0 obj +% 1888 0 obj << -/D [1877 0 R /XYZ 150.705 343.006 null] +/D [1880 0 R /XYZ 150.705 343.006 null] >> -% 1876 0 obj +% 1879 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R /F17 1882 0 R /F243 1285 0 R /F233 1044 0 R /F279 1813 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F147 941 0 R /F78 686 0 R /F197 943 0 R /F17 1885 0 R /F241 1286 0 R /F235 1045 0 R /F281 1816 0 R >> /ProcSet [ /PDF /Text ] >> -% 1887 0 obj +% 1890 0 obj << /Type /Page -/Contents 1888 0 R -/Resources 1886 0 R +/Contents 1891 0 R +/Resources 1889 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1875 0 R +/Parent 1878 0 R >> -% 1889 0 obj +% 1892 0 obj << -/D [1887 0 R /XYZ 98.895 753.953 null] +/D [1890 0 R /XYZ 98.895 753.953 null] >> % 489 0 obj << -/D [1887 0 R /XYZ 99.895 716.092 null] +/D [1890 0 R /XYZ 99.895 716.092 null] >> -% 1890 0 obj +% 1893 0 obj << -/D [1887 0 R /XYZ 99.895 222.691 null] +/D [1890 0 R /XYZ 99.895 222.691 null] >> -% 1886 0 obj +% 1889 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F148 1490 0 R /F192 942 0 R /F190 941 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R /F152 1491 0 R /F197 943 0 R /F195 942 0 R >> /ProcSet [ /PDF /Text ] >> -% 1892 0 obj +% 1895 0 obj << /Type /Page -/Contents 1893 0 R -/Resources 1891 0 R +/Contents 1896 0 R +/Resources 1894 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1875 0 R +/Parent 1878 0 R >> -% 1894 0 obj +% 1897 0 obj << -/D [1892 0 R /XYZ 149.705 753.953 null] +/D [1895 0 R /XYZ 149.705 753.953 null] >> % 493 0 obj << -/D [1892 0 R /XYZ 150.705 716.092 null] +/D [1895 0 R /XYZ 150.705 716.092 null] >> -% 1895 0 obj +% 1898 0 obj << -/D [1892 0 R /XYZ 150.705 222.691 null] +/D [1895 0 R /XYZ 150.705 222.691 null] >> -% 1891 0 obj +% 1894 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F148 1490 0 R /F192 942 0 R /F78 686 0 R /F190 941 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F152 1491 0 R /F197 943 0 R /F78 686 0 R /F195 942 0 R >> /ProcSet [ /PDF /Text ] >> -% 1899 0 obj +% 1902 0 obj << /Type /Page -/Contents 1900 0 R -/Resources 1898 0 R +/Contents 1903 0 R +/Resources 1901 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1875 0 R -/Annots [ 1896 0 R 1897 0 R ] +/Parent 1878 0 R +/Annots [ 1899 0 R 1900 0 R ] >> -% 1896 0 obj +% 1899 0 obj << /Type /Annot /Subtype /Link @@ -25591,188 +25683,180 @@ stream /Rect [145.364 511.904 152.427 523.964] /A << /S /GoTo /D (listing.5) >> >> -% 1897 0 obj +% 1900 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [143.975 356.487 150.849 368.547] +/Rect [145.442 356.487 152.515 368.547] /A << /S /GoTo /D (listing.6) >> >> -% 1901 0 obj +% 1904 0 obj << -/D [1899 0 R /XYZ 98.895 753.953 null] +/D [1902 0 R /XYZ 98.895 753.953 null] >> % 497 0 obj << -/D [1899 0 R /XYZ 99.895 716.092 null] +/D [1902 0 R /XYZ 99.895 716.092 null] >> -% 1898 0 obj +% 1901 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1905 0 obj +% 1908 0 obj << /Type /Page -/Contents 1906 0 R -/Resources 1904 0 R +/Contents 1909 0 R +/Resources 1907 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1875 0 R +/Parent 1878 0 R >> -% 1907 0 obj +% 1910 0 obj << -/D [1905 0 R /XYZ 149.705 753.953 null] +/D [1908 0 R /XYZ 149.705 753.953 null] >> -% 1902 0 obj +% 1905 0 obj << -/D [1905 0 R /XYZ 150.705 411.235 null] +/D [1908 0 R /XYZ 150.705 411.235 null] >> -% 1903 0 obj +% 1906 0 obj << -/D [1905 0 R /XYZ 150.705 182.902 null] +/D [1908 0 R /XYZ 150.705 182.902 null] >> -% 1904 0 obj +% 1907 0 obj << -/Font << /F145 940 0 R /F279 1813 0 R /F84 687 0 R >> +/Font << /F147 941 0 R /F281 1816 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1909 0 obj +% 1912 0 obj << /Type /Page -/Contents 1910 0 R -/Resources 1908 0 R +/Contents 1913 0 R +/Resources 1911 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1914 0 R +/Parent 1917 0 R >> -% 1911 0 obj +% 1914 0 obj << -/D [1909 0 R /XYZ 98.895 753.953 null] +/D [1912 0 R /XYZ 98.895 753.953 null] >> % 501 0 obj << -/D [1909 0 R /XYZ 99.895 716.092 null] +/D [1912 0 R /XYZ 99.895 716.092 null] >> -% 1912 0 obj +% 1915 0 obj << -/D [1909 0 R /XYZ 99.895 690.058 null] +/D [1912 0 R /XYZ 99.895 690.058 null] >> -% 1913 0 obj +% 1916 0 obj << -/D [1909 0 R /XYZ 99.895 693.143 null] +/D [1912 0 R /XYZ 99.895 693.143 null] >> -% 1908 0 obj +% 1911 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1916 0 obj +% 1919 0 obj << /Type /Page -/Contents 1917 0 R -/Resources 1915 0 R +/Contents 1920 0 R +/Resources 1918 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1914 0 R +/Parent 1917 0 R >> -% 1918 0 obj +% 1921 0 obj << -/D [1916 0 R /XYZ 149.705 753.953 null] +/D [1919 0 R /XYZ 149.705 753.953 null] >> % 505 0 obj << -/D [1916 0 R /XYZ 150.705 716.092 null] +/D [1919 0 R /XYZ 150.705 716.092 null] >> -% 1919 0 obj +% 1922 0 obj << -/D [1916 0 R /XYZ 150.705 678.98 null] +/D [1919 0 R /XYZ 150.705 678.98 null] >> -% 1920 0 obj +% 1923 0 obj << -/D [1916 0 R /XYZ 150.705 679.195 null] +/D [1919 0 R /XYZ 150.705 679.195 null] >> -% 1915 0 obj +% 1918 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1922 0 obj +% 1925 0 obj << /Type /Page -/Contents 1923 0 R -/Resources 1921 0 R +/Contents 1926 0 R +/Resources 1924 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1914 0 R +/Parent 1917 0 R >> -% 1924 0 obj +% 1927 0 obj << -/D [1922 0 R /XYZ 98.895 753.953 null] +/D [1925 0 R /XYZ 98.895 753.953 null] >> % 509 0 obj << -/D [1922 0 R /XYZ 99.895 716.092 null] +/D [1925 0 R /XYZ 99.895 716.092 null] >> -% 1925 0 obj +% 1928 0 obj << -/D [1922 0 R /XYZ 99.895 689.963 null] +/D [1925 0 R /XYZ 99.895 689.963 null] >> -% 1926 0 obj +% 1929 0 obj << -/D [1922 0 R /XYZ 99.895 693.143 null] +/D [1925 0 R /XYZ 99.895 693.143 null] >> -% 1921 0 obj +% 1924 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1928 0 obj +% 1931 0 obj << /Type /Page -/Contents 1929 0 R -/Resources 1927 0 R +/Contents 1932 0 R +/Resources 1930 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1914 0 R +/Parent 1917 0 R >> -% 1930 0 obj +% 1933 0 obj << -/D [1928 0 R /XYZ 149.705 753.953 null] +/D [1931 0 R /XYZ 149.705 753.953 null] >> % 513 0 obj << -/D [1928 0 R /XYZ 150.705 716.092 null] +/D [1931 0 R /XYZ 150.705 716.092 null] >> -% 1931 0 obj +% 1934 0 obj << -/D [1928 0 R /XYZ 150.705 678.98 null] +/D [1931 0 R /XYZ 150.705 678.98 null] >> -% 1932 0 obj +% 1935 0 obj << -/D [1928 0 R /XYZ 150.705 679.195 null] +/D [1931 0 R /XYZ 150.705 679.195 null] >> -% 1927 0 obj +% 1930 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1934 0 obj +% 1937 0 obj << /Type /Page -/Contents 1935 0 R -/Resources 1933 0 R +/Contents 1938 0 R +/Resources 1936 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1914 0 R ->> -% 1936 0 obj -<< -/D [1934 0 R /XYZ 98.895 753.953 null] ->> -% 517 0 obj -<< -/D [1934 0 R /XYZ 99.895 716.092 null] +/Parent 1917 0 R >> endstream endobj -1941 0 obj +1944 0 obj << /Length 4752 >> @@ -25807,11 +25891,11 @@ BT 0 g 0 G 0 -19.925 Td [(\002lename)]TJ 0 g 0 G -/F84 9.9626 Tf 43.965 0 Td [(The)-250(name)-250(of)-250(the)-250(\002le)-250(to)-250(be)-250(r)18(ead.)]TJ -19.367 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 1.02 0 0 1 175.611 575.584 Tm [(Speci\002ed)-313(as:)-440(a)-313(character)-314(variable)-313(containing)-313(a)-313(valid)-313(\002le)-313(name,)-331(or)]TJ/F145 9.9626 Tf 1 0 0 1 474.418 575.584 Tm [(-)]TJ/F84 9.9626 Tf 1.02 0 0 1 479.649 575.584 Tm [(,)-330(in)]TJ 1.003 0 0 1 175.193 563.628 Tm [(which)-250(case)-250(the)-250(default)-250(input)-250(unit)-250(5)-250(\050i.e.)-311(standar)18(d)-250(input)-250(in)-250(Unix)-250(jar)18(gon\051)-250(is)]TJ 1 0 0 1 175.611 551.673 Tm [(used.)-310(Default:)]TJ/F145 9.9626 Tf 65.185 0 Td [(-)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ +/F84 9.9626 Tf 43.965 0 Td [(The)-250(name)-250(of)-250(the)-250(\002le)-250(to)-250(be)-250(r)18(ead.)]TJ -19.367 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 1.02 0 0 1 175.611 575.584 Tm [(Speci\002ed)-313(as:)-440(a)-313(character)-314(variable)-313(containing)-313(a)-313(valid)-313(\002le)-313(name,)-331(or)]TJ/F147 9.9626 Tf 1 0 0 1 474.418 575.584 Tm [(-)]TJ/F84 9.9626 Tf 1.02 0 0 1 479.649 575.584 Tm [(,)-330(in)]TJ 1.003 0 0 1 175.193 563.628 Tm [(which)-250(case)-250(the)-250(default)-250(input)-250(unit)-250(5)-250(\050i.e.)-311(standar)18(d)-250(input)-250(in)-250(Unix)-250(jar)18(gon\051)-250(is)]TJ 1 0 0 1 175.611 551.673 Tm [(used.)-310(Default:)]TJ/F147 9.9626 Tf 65.185 0 Td [(-)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -95.322 -19.925 Td [(iunit)]TJ 0 g 0 G -/F84 9.9626 Tf 26.799 0 Td [(The)-250(Fortran)-250(\002le)-250(unit)-250(number)74(.)]TJ -2.201 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(Only)-250(meaningful)-250(if)-250(\002lename)-250(is)-250(not)]TJ/F145 9.9626 Tf 287.758 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ +/F84 9.9626 Tf 26.799 0 Td [(The)-250(Fortran)-250(\002le)-250(unit)-250(number)74(.)]TJ -2.201 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(Only)-250(meaningful)-250(if)-250(\002lename)-250(is)-250(not)]TJ/F147 9.9626 Tf 287.758 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -317.894 -21.918 Td [(On)-250(Return)]TJ 0 g 0 G @@ -25820,21 +25904,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(the)-250(sparse)-250(matrix)-250(r)18(ead)-250(fr)18(om)-250(\002le.)]TJ 14.636 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 442.283 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 442.084 Td [(Tspmat)]TJ +/F147 9.9626 Tf 363.206 442.084 Td [(Tspmat)]TJ ET q 1 0 0 1 395.216 442.283 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 398.354 442.084 Td [(type)]TJ +/F147 9.9626 Tf 398.354 442.084 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -25856,7 +25940,7 @@ ET endstream endobj -1948 0 obj +1951 0 obj << /Length 5153 >> @@ -25893,21 +25977,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(sparse)-250(matrix)-250(to)-250(be)-250(written.)]TJ 14.635 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(required)]TJ/F84 9.9626 Tf 39.292 0 Td [(.)]TJ -62.983 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 575.783 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 575.584 Td [(Tspmat)]TJ +/F147 9.9626 Tf 312.397 575.584 Td [(Tspmat)]TJ ET q 1 0 0 1 344.406 575.783 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 347.544 575.584 Td [(type)]TJ +/F147 9.9626 Tf 347.544 575.584 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -25917,11 +26001,11 @@ BT 0 g 0 G /F75 9.9626 Tf -24.907 -19.926 Td [(\002lename)]TJ 0 g 0 G -/F84 9.9626 Tf 43.965 0 Td [(The)-250(name)-250(of)-250(the)-250(\002le)-250(to)-250(be)-250(written)-250(to.)]TJ -19.367 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ 1.02 0 0 1 124.802 464.002 Tm [(Speci\002ed)-313(as:)-440(a)-313(character)-314(variable)-313(containing)-313(a)-313(valid)-313(\002le)-313(name,)-331(or)]TJ/F145 9.9626 Tf 1 0 0 1 423.609 464.002 Tm [(-)]TJ/F84 9.9626 Tf 1.02 0 0 1 428.839 464.002 Tm [(,)-330(in)]TJ 0.999 0 0 1 124.384 452.047 Tm [(which)-249(case)-249(the)-249(default)-249(output)-250(unit)-249(6)-249(\050i.e.)-310(standar)18(d)-249(output)-249(in)-249(Unix)-249(jar)18(gon\051)]TJ 1 0 0 1 124.802 440.092 Tm [(is)-250(used.)-310(Default:)]TJ/F145 9.9626 Tf 74.799 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ +/F84 9.9626 Tf 43.965 0 Td [(The)-250(name)-250(of)-250(the)-250(\002le)-250(to)-250(be)-250(written)-250(to.)]TJ -19.367 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ 1.02 0 0 1 124.802 464.002 Tm [(Speci\002ed)-313(as:)-440(a)-313(character)-314(variable)-313(containing)-313(a)-313(valid)-313(\002le)-313(name,)-331(or)]TJ/F147 9.9626 Tf 1 0 0 1 423.609 464.002 Tm [(-)]TJ/F84 9.9626 Tf 1.02 0 0 1 428.839 464.002 Tm [(,)-330(in)]TJ 0.999 0 0 1 124.384 452.047 Tm [(which)-249(case)-249(the)-249(default)-249(output)-250(unit)-249(6)-249(\050i.e.)-310(standar)18(d)-249(output)-249(in)-249(Unix)-249(jar)18(gon\051)]TJ 1 0 0 1 124.802 440.092 Tm [(is)-250(used.)-310(Default:)]TJ/F147 9.9626 Tf 74.799 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -104.936 -19.926 Td [(iunit)]TJ 0 g 0 G -/F84 9.9626 Tf 26.8 0 Td [(The)-250(Fortran)-250(\002le)-250(unit)-250(number)74(.)]TJ -2.202 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(Only)-250(meaningful)-250(if)-250(\002lename)-250(is)-250(not)]TJ/F145 9.9626 Tf 287.757 0 Td [(-)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ +/F84 9.9626 Tf 26.8 0 Td [(The)-250(Fortran)-250(\002le)-250(unit)-250(number)74(.)]TJ -2.202 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(Only)-250(meaningful)-250(if)-250(\002lename)-250(is)-250(not)]TJ/F147 9.9626 Tf 287.757 0 Td [(-)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -317.895 -19.925 Td [(key)]TJ 0 g 0 G @@ -25944,7 +26028,7 @@ ET endstream endobj -1956 0 obj +1959 0 obj << /Length 3684 >> @@ -25993,11 +26077,11 @@ BT 0 g 0 G 0 -19.925 Td [(\002lename)]TJ 0 g 0 G -/F84 9.9626 Tf 43.965 0 Td [(The)-250(name)-250(of)-250(the)-250(\002le)-250(to)-250(be)-250(r)18(ead.)]TJ -19.367 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 1.02 0 0 1 175.611 575.584 Tm [(Speci\002ed)-313(as:)-440(a)-313(character)-314(variable)-313(containing)-313(a)-313(valid)-313(\002le)-313(name,)-331(or)]TJ/F145 9.9626 Tf 1 0 0 1 474.418 575.584 Tm [(-)]TJ/F84 9.9626 Tf 1.02 0 0 1 479.649 575.584 Tm [(,)-330(in)]TJ 1.003 0 0 1 175.193 563.628 Tm [(which)-250(case)-250(the)-250(default)-250(input)-250(unit)-250(5)-250(\050i.e.)-311(standar)18(d)-250(input)-250(in)-250(Unix)-250(jar)18(gon\051)-250(is)]TJ 1 0 0 1 175.611 551.673 Tm [(used.)-310(Default:)]TJ/F145 9.9626 Tf 65.185 0 Td [(-)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ +/F84 9.9626 Tf 43.965 0 Td [(The)-250(name)-250(of)-250(the)-250(\002le)-250(to)-250(be)-250(r)18(ead.)]TJ -19.367 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 1.02 0 0 1 175.611 575.584 Tm [(Speci\002ed)-313(as:)-440(a)-313(character)-314(variable)-313(containing)-313(a)-313(valid)-313(\002le)-313(name,)-331(or)]TJ/F147 9.9626 Tf 1 0 0 1 474.418 575.584 Tm [(-)]TJ/F84 9.9626 Tf 1.02 0 0 1 479.649 575.584 Tm [(,)-330(in)]TJ 1.003 0 0 1 175.193 563.628 Tm [(which)-250(case)-250(the)-250(default)-250(input)-250(unit)-250(5)-250(\050i.e.)-311(standar)18(d)-250(input)-250(in)-250(Unix)-250(jar)18(gon\051)-250(is)]TJ 1 0 0 1 175.611 551.673 Tm [(used.)-310(Default:)]TJ/F147 9.9626 Tf 65.185 0 Td [(-)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -95.322 -19.925 Td [(iunit)]TJ 0 g 0 G -/F84 9.9626 Tf 26.799 0 Td [(The)-250(Fortran)-250(\002le)-250(unit)-250(number)74(.)]TJ -2.201 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(Only)-250(meaningful)-250(if)-250(\002lename)-250(is)-250(not)]TJ/F145 9.9626 Tf 287.758 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ +/F84 9.9626 Tf 26.799 0 Td [(The)-250(Fortran)-250(\002le)-250(unit)-250(number)74(.)]TJ -2.201 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(Only)-250(meaningful)-250(if)-250(\002lename)-250(is)-250(not)]TJ/F147 9.9626 Tf 287.758 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -317.894 -21.918 Td [(On)-250(Return)]TJ 0 g 0 G @@ -26006,21 +26090,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(the)-250(sparse)-250(matrix)-250(r)18(ead)-250(fr)18(om)-250(\002le.)]TJ 14.636 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.984 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 442.283 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 442.084 Td [(Tspmat)]TJ +/F147 9.9626 Tf 363.206 442.084 Td [(Tspmat)]TJ ET q 1 0 0 1 395.216 442.283 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 398.354 442.084 Td [(type)]TJ +/F147 9.9626 Tf 398.354 442.084 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -26034,7 +26118,7 @@ ET endstream endobj -1963 0 obj +1966 0 obj << /Length 4361 >> @@ -26083,11 +26167,11 @@ BT 0 g 0 G 0 -19.925 Td [(\002lename)]TJ 0 g 0 G -/F84 9.9626 Tf 43.965 0 Td [(The)-250(name)-250(of)-250(the)-250(\002le)-250(to)-250(be)-250(r)18(ead.)]TJ -19.367 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ 1.02 0 0 1 124.802 575.584 Tm [(Speci\002ed)-313(as:)-440(a)-313(character)-314(variable)-313(containing)-313(a)-313(valid)-313(\002le)-313(name,)-331(or)]TJ/F145 9.9626 Tf 1 0 0 1 423.609 575.584 Tm [(-)]TJ/F84 9.9626 Tf 1.02 0 0 1 428.839 575.584 Tm [(,)-330(in)]TJ 1.003 0 0 1 124.384 563.628 Tm [(which)-250(case)-250(the)-250(default)-250(input)-250(unit)-250(5)-250(\050i.e.)-311(standar)18(d)-250(input)-250(in)-250(Unix)-250(jar)18(gon\051)-250(is)]TJ 1 0 0 1 124.802 551.673 Tm [(used.)-310(Default:)]TJ/F145 9.9626 Tf 65.185 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ +/F84 9.9626 Tf 43.965 0 Td [(The)-250(name)-250(of)-250(the)-250(\002le)-250(to)-250(be)-250(r)18(ead.)]TJ -19.367 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ 1.02 0 0 1 124.802 575.584 Tm [(Speci\002ed)-313(as:)-440(a)-313(character)-314(variable)-313(containing)-313(a)-313(valid)-313(\002le)-313(name,)-331(or)]TJ/F147 9.9626 Tf 1 0 0 1 423.609 575.584 Tm [(-)]TJ/F84 9.9626 Tf 1.02 0 0 1 428.839 575.584 Tm [(,)-330(in)]TJ 1.003 0 0 1 124.384 563.628 Tm [(which)-250(case)-250(the)-250(default)-250(input)-250(unit)-250(5)-250(\050i.e.)-311(standar)18(d)-250(input)-250(in)-250(Unix)-250(jar)18(gon\051)-250(is)]TJ 1 0 0 1 124.802 551.673 Tm [(used.)-310(Default:)]TJ/F147 9.9626 Tf 65.185 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -95.322 -19.925 Td [(iunit)]TJ 0 g 0 G -/F84 9.9626 Tf 26.8 0 Td [(The)-250(Fortran)-250(\002le)-250(unit)-250(number)74(.)]TJ -2.202 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(Only)-250(meaningful)-250(if)-250(\002lename)-250(is)-250(not)]TJ/F145 9.9626 Tf 287.757 0 Td [(-)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ +/F84 9.9626 Tf 26.8 0 Td [(The)-250(Fortran)-250(\002le)-250(unit)-250(number)74(.)]TJ -2.202 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(Only)-250(meaningful)-250(if)-250(\002lename)-250(is)-250(not)]TJ/F147 9.9626 Tf 287.757 0 Td [(-)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -317.895 -21.918 Td [(On)-250(Return)]TJ 0 g 0 G @@ -26096,28 +26180,28 @@ BT 0 g 0 G /F84 9.9626 Tf 11.069 0 Td [(Rigth)-250(hand)-250(side\050s\051.)]TJ 13.529 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 1.02 0 0 1 124.413 442.084 Tm [(An)-368(array)-368(of)-367(type)-368(r)18(eal)-368(or)-368(complex,)-398(rank)-368(1)-368(or)-368(2)-367(and)-368(having)-368(the)-368(ALLO-)]TJ 1.005 0 0 1 124.802 430.129 Tm [(CA)74(T)73(ABLE)-248(at)1(tribute,)-248(or)-248(an)-248(object)-248(of)-248(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 302.957 430.129 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 302.957 430.129 Tm [(psb)]TJ ET q 1 0 0 1 319.275 430.328 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 322.414 430.129 Td [(T)]TJ +/F147 9.9626 Tf 322.414 430.129 Td [(T)]TJ ET q 1 0 0 1 328.272 430.328 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 331.41 430.129 Td [(vect)]TJ +/F147 9.9626 Tf 331.41 430.129 Td [(vect)]TJ ET q 1 0 0 1 352.959 430.328 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 356.097 430.129 Td [(type)]TJ +/F147 9.9626 Tf 356.097 430.129 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 1.005 0 0 1 377.018 430.129 Tm [(,)-248(of)-248(type)-248(r)18(eal)-247(or)]TJ 1 0 0 1 124.802 418.174 Tm [(complex.)]TJ 1.019 0 0 1 124.304 406.219 Tm [(W)54(ill)-245(be)-245(allocated)-245(and)-245(\002lled)-245(in)-245(if)-245(the)-245(input)-244(\002le)-245(contains)-245(a)-245(right)-245(hand)-245(side,)]TJ 1 0 0 1 124.802 394.263 Tm [(otherwise)-250(will)-250(be)-250(left)-250(in)-250(the)-250(UNALLOCA)74(TED)-250(state.)]TJ 0 g 0 G @@ -26131,7 +26215,7 @@ ET endstream endobj -1970 0 obj +1973 0 obj << /Length 7544 >> @@ -26182,21 +26266,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(sparse)-250(matrix)-250(to)-250(be)-250(written.)]TJ 14.635 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(required)]TJ/F84 9.9626 Tf 39.293 0 Td [(.)]TJ -62.983 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.137 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.137 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 578.783 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 578.584 Td [(Tspmat)]TJ +/F147 9.9626 Tf 363.206 578.584 Td [(Tspmat)]TJ ET q 1 0 0 1 395.216 578.783 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 398.354 578.584 Td [(type)]TJ +/F147 9.9626 Tf 398.354 578.584 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -26206,11 +26290,11 @@ BT 0 g 0 G /F75 9.9626 Tf -24.906 -19.464 Td [(\002lename)]TJ 0 g 0 G -/F84 9.9626 Tf 43.965 0 Td [(The)-250(name)-250(of)-250(the)-250(\002le)-250(to)-250(be)-250(written)-250(to.)]TJ -19.367 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 1.02 0 0 1 175.611 479.881 Tm [(Speci\002ed)-313(as:)-440(a)-313(character)-314(variable)-313(containing)-313(a)-313(valid)-313(\002le)-313(name,)-331(or)]TJ/F145 9.9626 Tf 1 0 0 1 474.418 479.881 Tm [(-)]TJ/F84 9.9626 Tf 1.02 0 0 1 479.649 479.881 Tm [(,)-330(in)]TJ 0.999 0 0 1 175.193 467.926 Tm [(which)-249(case)-249(the)-249(default)-250(outp)1(ut)-250(unit)-249(6)-249(\050i.e.)-310(standar)18(d)-249(output)-249(in)-249(Unix)-249(jar)18(gon\051)]TJ 1 0 0 1 175.611 455.97 Tm [(is)-250(used.)-310(Default:)]TJ/F145 9.9626 Tf 74.799 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ +/F84 9.9626 Tf 43.965 0 Td [(The)-250(name)-250(of)-250(the)-250(\002le)-250(to)-250(be)-250(written)-250(to.)]TJ -19.367 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 1.02 0 0 1 175.611 479.881 Tm [(Speci\002ed)-313(as:)-440(a)-313(character)-314(variable)-313(containing)-313(a)-313(valid)-313(\002le)-313(name,)-331(or)]TJ/F147 9.9626 Tf 1 0 0 1 474.418 479.881 Tm [(-)]TJ/F84 9.9626 Tf 1.02 0 0 1 479.649 479.881 Tm [(,)-330(in)]TJ 0.999 0 0 1 175.193 467.926 Tm [(which)-249(case)-249(the)-249(default)-250(outp)1(ut)-250(unit)-249(6)-249(\050i.e.)-310(standar)18(d)-249(output)-249(in)-249(Unix)-249(jar)18(gon\051)]TJ 1 0 0 1 175.611 455.97 Tm [(is)-250(used.)-310(Default:)]TJ/F147 9.9626 Tf 74.799 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -104.935 -19.463 Td [(iunit)]TJ 0 g 0 G -/F84 9.9626 Tf 26.799 0 Td [(The)-250(Fortran)-250(\002le)-250(unit)-250(number)74(.)]TJ -2.201 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(Only)-250(meaningful)-250(if)-250(\002lename)-250(is)-250(not)]TJ/F145 9.9626 Tf 287.758 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ +/F84 9.9626 Tf 26.799 0 Td [(The)-250(Fortran)-250(\002le)-250(unit)-250(number)74(.)]TJ -2.201 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 23.999 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -61.878 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(Only)-250(meaningful)-250(if)-250(\002lename)-250(is)-250(not)]TJ/F147 9.9626 Tf 287.758 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -317.894 -20.764 Td [(On)-250(Return)]TJ 0 g 0 G @@ -26232,7 +26316,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 153.694 250.747 Td [(type)]TJ +/F235 8.9664 Tf 153.694 250.747 Td [(type)]TJ 0 g 0 G [(\050psb_ldspmat_type\051)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -26285,7 +26369,7 @@ BT [-525(info\051)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0 g 0 G -/F84 9.9626 Tf -3.298 -23.747 Td [(T)92(o)-250(simplify)-250(this)-250(pr)18(ocedur)18(e)-250(in)]TJ/F145 9.9626 Tf 129.513 0 Td [(C)]TJ/F84 9.9626 Tf 5.23 0 Td [(,)-250(ther)18(e)-250(is)-250(a)-250(utility)-250(function)]TJ +/F84 9.9626 Tf -3.298 -23.747 Td [(T)92(o)-250(simplify)-250(this)-250(pr)18(ocedur)18(e)-250(in)]TJ/F147 9.9626 Tf 129.513 0 Td [(C)]TJ/F84 9.9626 Tf 5.23 0 Td [(,)-250(ther)18(e)-250(is)-250(a)-250(utility)-250(function)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -26296,7 +26380,7 @@ Q 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0 g 0 G BT -/F233 8.9664 Tf 153.694 144.073 Td [(psb_i_t)]TJ +/F235 8.9664 Tf 153.694 144.073 Td [(psb_i_t)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G [-525(psb_c_)]TJ @@ -26318,7 +26402,7 @@ ET endstream endobj -1977 0 obj +1980 0 obj << /Length 7395 >> @@ -26369,28 +26453,28 @@ BT 0 g 0 G /F84 9.9626 Tf 11.069 0 Td [(Rigth)-250(hand)-250(side\050s\051.)]TJ 13.529 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 0.98 0 0 1 124.413 578.396 Tm [(An)-194(array)-194(of)-194(type)-194(r)19(eal)-194(or)-194(complex,)-206(rank)-194(1)-194(or)-194(2,)-206(or)-194(an)-193(object)-194(of)-194(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 397.211 578.396 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 397.211 578.396 Tm [(psb)]TJ ET q 1 0 0 1 413.53 578.595 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 416.668 578.396 Td [(T)]TJ +/F147 9.9626 Tf 416.668 578.396 Td [(T)]TJ ET q 1 0 0 1 422.526 578.595 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 425.664 578.396 Td [(vect)]TJ +/F147 9.9626 Tf 425.664 578.396 Td [(vect)]TJ ET q 1 0 0 1 447.213 578.595 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 450.351 578.396 Td [(type)]TJ +/F147 9.9626 Tf 450.351 578.396 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 0.98 0 0 1 471.273 578.396 Tm [(,)]TJ 1 0 0 1 124.802 566.441 Tm [(of)-250(type)-250(r)18(eal)-250(or)-250(complex;)-250(its)-250(contents)-250(will)-250(be)-250(written)-250(to)-250(disk.)]TJ 0 g 0 G @@ -26400,11 +26484,11 @@ BT 0 g 0 G /F75 9.9626 Tf -43.965 -31.448 Td [(vtitle)]TJ 0 g 0 G -/F84 9.9626 Tf 28.772 0 Td [(Matrix)-250(title.)]TJ -4.174 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 0.98 0 0 1 124.413 479.635 Tm [(A)-214(charachter)-213(variable)-214(holding)-213(a)-214(descriptive)-214(t)1(itle)-214(for)-214(the)-213(vector)-214(to)-213(be)-214(written)]TJ 1 0 0 1 124.802 467.68 Tm [(to)-250(\002le.)-310(T)90(ype:)]TJ/F75 9.9626 Tf 54.455 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 1.02 0 0 1 124.802 455.725 Tm [(Speci\002ed)-313(as:)-440(a)-313(character)-314(variable)-313(containing)-313(a)-313(valid)-313(\002le)-313(name,)-331(or)]TJ/F145 9.9626 Tf 1 0 0 1 423.609 455.725 Tm [(-)]TJ/F84 9.9626 Tf 1.02 0 0 1 428.839 455.725 Tm [(,)-330(in)]TJ 1.003 0 0 1 124.384 443.77 Tm [(which)-250(case)-250(the)-250(default)-250(input)-250(unit)-250(5)-250(\050i.e.)-311(standar)18(d)-250(input)-250(in)-250(Unix)-250(jar)18(gon\051)-250(is)]TJ 1 0 0 1 124.802 431.814 Tm [(used.)-310(Default:)]TJ/F145 9.9626 Tf 65.185 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ +/F84 9.9626 Tf 28.772 0 Td [(Matrix)-250(title.)]TJ -4.174 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf 0.98 0 0 1 124.413 479.635 Tm [(A)-214(charachter)-213(variable)-214(holding)-213(a)-214(descriptive)-214(t)1(itle)-214(for)-214(the)-213(vector)-214(to)-213(be)-214(written)]TJ 1 0 0 1 124.802 467.68 Tm [(to)-250(\002le.)-310(T)90(ype:)]TJ/F75 9.9626 Tf 54.455 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ 1.02 0 0 1 124.802 455.725 Tm [(Speci\002ed)-313(as:)-440(a)-313(character)-314(variable)-313(containing)-313(a)-313(valid)-313(\002le)-313(name,)-331(or)]TJ/F147 9.9626 Tf 1 0 0 1 423.609 455.725 Tm [(-)]TJ/F84 9.9626 Tf 1.02 0 0 1 428.839 455.725 Tm [(,)-330(in)]TJ 1.003 0 0 1 124.384 443.77 Tm [(which)-250(case)-250(the)-250(default)-250(input)-250(unit)-250(5)-250(\050i.e.)-311(standar)18(d)-250(input)-250(in)-250(Unix)-250(jar)18(gon\051)-250(is)]TJ 1 0 0 1 124.802 431.814 Tm [(used.)-310(Default:)]TJ/F147 9.9626 Tf 65.185 0 Td [(-)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -95.322 -19.492 Td [(iunit)]TJ 0 g 0 G -/F84 9.9626 Tf 26.8 0 Td [(The)-250(Fortran)-250(\002le)-250(unit)-250(number)74(.)]TJ -2.202 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(Only)-250(meaningful)-250(if)-250(\002lename)-250(is)-250(not)]TJ/F145 9.9626 Tf 287.757 0 Td [(-)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ +/F84 9.9626 Tf 26.8 0 Td [(The)-250(Fortran)-250(\002le)-250(unit)-250(number)74(.)]TJ -2.202 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 24 0 Td [(optional)]TJ/F84 9.9626 Tf 38.186 0 Td [(.)]TJ -61.877 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(value.)-310(Only)-250(meaningful)-250(if)-250(\002lename)-250(is)-250(not)]TJ/F147 9.9626 Tf 287.757 0 Td [(-)]TJ/F84 9.9626 Tf 5.231 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -317.895 -20.836 Td [(On)-250(Return)]TJ 0 g 0 G @@ -26426,7 +26510,7 @@ Q 0 g 0 G 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG BT -/F233 8.9664 Tf 102.884 221.378 Td [(real)]TJ +/F235 8.9664 Tf 102.884 221.378 Td [(real)]TJ 0 g 0 G [(\050psb_dpk_\051,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -26487,7 +26571,7 @@ BT [(info\051)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0 g 0 G -/F84 9.9626 Tf -3.297 -23.777 Td [(T)92(o)-250(simplify)-250(this)-250(pr)18(ocedur)18(e)-250(in)]TJ/F145 9.9626 Tf 129.512 0 Td [(C)]TJ/F84 9.9626 Tf 5.231 0 Td [(,)-250(ther)18(e)-250(is)-250(a)-250(utility)-250(function)]TJ +/F84 9.9626 Tf -3.297 -23.777 Td [(T)92(o)-250(simplify)-250(this)-250(pr)18(ocedur)18(e)-250(in)]TJ/F147 9.9626 Tf 129.512 0 Td [(C)]TJ/F84 9.9626 Tf 5.231 0 Td [(,)-250(ther)18(e)-250(is)-250(a)-250(utility)-250(function)]TJ 0 g 0 G 29.949 -41.41 Td [(149)]TJ 0 g 0 G @@ -26495,7 +26579,7 @@ ET endstream endobj -1983 0 obj +1986 0 obj << /Length 656 >> @@ -26511,7 +26595,7 @@ Q 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0 g 0 G BT -/F233 8.9664 Tf 153.694 701.446 Td [(psb_i_t)]TJ +/F235 8.9664 Tf 153.694 701.446 Td [(psb_i_t)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G [-525(psb_c_)]TJ @@ -26533,7 +26617,7 @@ ET endstream endobj -1987 0 obj +1990 0 obj << /Length 1399 >> @@ -26553,7 +26637,7 @@ BT 0 g 0 G 0 -19.925 Td [(\225)]TJ 0 g 0 G - [-500(Block)-250(Jacobi)-250(with)-250(an)-250(appr)18(oximate)-250(inverse)]TJ 1.02 0 0 1 99.587 591.426 Tm [(The)-312(supporting)-312(data)-312(type)-312(and)-312(subr)18(outine)-312(interfaces)-312(ar)17(e)-312(de\002ned)-312(in)-312(the)-312(mod-)]TJ 1.011 0 0 1 99.895 579.471 Tm [(ule)]TJ/F145 9.9626 Tf 1 0 0 1 116.209 579.471 Tm [(psb_prec_mod)]TJ/F84 9.9626 Tf 1.011 0 0 1 178.973 579.471 Tm [(.)-306(The)-247(old)-247(interfaces)]TJ/F145 9.9626 Tf 1 0 0 1 266.312 579.471 Tm [(psb_precinit)]TJ/F84 9.9626 Tf 1.011 0 0 1 331.561 579.471 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 351.097 579.471 Tm [(psb_precbld)]TJ/F84 9.9626 Tf 1.011 0 0 1 411.115 579.471 Tm [(ar)18(e)-247(still)]TJ 1 0 0 1 99.895 567.515 Tm [(supported)-250(for)-250(backwar)18(d)-250(compatibility)]TJ + [-500(Block)-250(Jacobi)-250(with)-250(an)-250(appr)18(oximate)-250(inverse)]TJ 1.02 0 0 1 99.587 591.426 Tm [(The)-312(supporting)-312(data)-312(type)-312(and)-312(subr)18(outine)-312(interfaces)-312(ar)17(e)-312(de\002ned)-312(in)-312(the)-312(mod-)]TJ 1.011 0 0 1 99.895 579.471 Tm [(ule)]TJ/F147 9.9626 Tf 1 0 0 1 116.209 579.471 Tm [(psb_prec_mod)]TJ/F84 9.9626 Tf 1.011 0 0 1 178.973 579.471 Tm [(.)-306(The)-247(old)-247(interfaces)]TJ/F147 9.9626 Tf 1 0 0 1 266.312 579.471 Tm [(psb_precinit)]TJ/F84 9.9626 Tf 1.011 0 0 1 331.561 579.471 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 351.097 579.471 Tm [(psb_precbld)]TJ/F84 9.9626 Tf 1.011 0 0 1 411.115 579.471 Tm [(ar)18(e)-247(still)]TJ 1 0 0 1 99.895 567.515 Tm [(supported)-250(for)-250(backwar)18(d)-250(compatibility)]TJ 0 g 0 G 164.384 -477.077 Td [(151)]TJ 0 g 0 G @@ -26561,7 +26645,7 @@ ET endstream endobj -1995 0 obj +1998 0 obj << /Length 5053 >> @@ -26572,7 +26656,7 @@ BT /F75 11.9552 Tf 150.705 706.129 Td [(10.1)-1000(init)-250(\227)-250(Initialize)-250(a)-250(preconditioner)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 0 -18.964 Td [(call)-525(prec%init\050icontxt,ptype,)-525(info\051)]TJ +/F147 9.9626 Tf 0 -18.964 Td [(call)-525(prec%init\050icontxt,ptype,)-525(info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -26596,21 +26680,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.349 0 Td [(Scope:)]TJ/F75 9.9626 Tf 31.431 0 Td [(local)]TJ/F84 9.9626 Tf -31.182 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.148 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(pr)18(econditioner)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 196.51 0 Td [(psb)]TJ +/F147 9.9626 Tf 196.51 0 Td [(psb)]TJ ET q 1 0 0 1 388.441 446.268 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 391.579 446.069 Td [(Tprec)]TJ +/F147 9.9626 Tf 391.579 446.069 Td [(Tprec)]TJ ET q 1 0 0 1 418.358 446.268 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 421.497 446.069 Td [(type)]TJ +/F147 9.9626 Tf 421.497 446.069 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -26653,7 +26737,7 @@ ET endstream endobj -2006 0 obj +2009 0 obj << /Length 4359 >> @@ -26665,9 +26749,9 @@ BT 0 g 0 G 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 107 -18.964 Td [(call)]TJ +/F147 9.9626 Tf 107 -18.964 Td [(call)]TJ 0 g 0 G - [-525(p%set\050what,val,info\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 665.247 Tm [(This)-384(method)-385(sets)-384(the)-385(parameters)-384(de\002ning)-385(the)-385(sub)1(domain)-385(solver)-385(whe)1(n)-385(the)]TJ 0.987 0 0 1 99.596 653.292 Tm [(pr)18(econditioner)-253(type)-253(is)]TJ/F145 9.9626 Tf 1 0 0 1 197.784 653.292 Tm [(BJAC)]TJ/F84 9.9626 Tf 0.987 0 0 1 218.705 653.292 Tm [(.)-253(Mor)18(e)-253(pr)19(ecisely)112(,)-253(the)-253(parameter)-253(identi\002ed)-252(by)]TJ/F145 9.9626 Tf 1 0 0 1 413.168 653.292 Tm [(what)]TJ/F84 9.9626 Tf 0.987 0 0 1 436.576 653.292 Tm [(is)]TJ 1 0 0 1 99.895 641.337 Tm [(assigned)-250(the)-250(value)-250(contained)-250(in)]TJ/F145 9.9626 Tf 141.229 0 Td [(val)]TJ/F84 9.9626 Tf 15.691 0 Td [(.)]TJ/F75 11.9552 Tf -157.386 -29.888 Td [(Arguments)]TJ/F145 9.9626 Tf 21.126 -15.534 Td [(what)]TJ + [-525(p%set\050what,val,info\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 665.247 Tm [(This)-384(method)-385(sets)-384(the)-385(parameters)-384(de\002ning)-385(the)-385(sub)1(domain)-385(solver)-385(whe)1(n)-385(the)]TJ 0.987 0 0 1 99.596 653.292 Tm [(pr)18(econditioner)-253(type)-253(is)]TJ/F147 9.9626 Tf 1 0 0 1 197.784 653.292 Tm [(BJAC)]TJ/F84 9.9626 Tf 0.987 0 0 1 218.705 653.292 Tm [(.)-253(Mor)18(e)-253(pr)19(ecisely)112(,)-253(the)-253(parameter)-253(identi\002ed)-252(by)]TJ/F147 9.9626 Tf 1 0 0 1 413.168 653.292 Tm [(what)]TJ/F84 9.9626 Tf 0.987 0 0 1 436.576 653.292 Tm [(is)]TJ 1 0 0 1 99.895 641.337 Tm [(assigned)-250(the)-250(value)-250(contained)-250(in)]TJ/F147 9.9626 Tf 141.229 0 Td [(val)]TJ/F84 9.9626 Tf 15.691 0 Td [(.)]TJ/F75 11.9552 Tf -157.386 -29.888 Td [(Arguments)]TJ/F147 9.9626 Tf 21.126 -15.534 Td [(what)]TJ 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG [-2541(character)]TJ 0 g 0 G @@ -26682,7 +26766,7 @@ BT 0 0 1 rg 0 0 1 RG [-250(21)]TJ 0 g 0 G - [(.)]TJ/F145 9.9626 Tf -46.233 -11.955 Td [(val)]TJ + [(.)]TJ/F147 9.9626 Tf -46.233 -11.955 Td [(val)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG @@ -26690,7 +26774,7 @@ BT 0 g 0 G /F78 9.9626 Tf 1.02 0 0 1 211.187 560.05 Tm [(or)]TJ 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG -/F145 9.9626 Tf 1 0 0 1 227.438 560.05 Tm [(character)]TJ +/F147 9.9626 Tf 1 0 0 1 227.438 560.05 Tm [(character)]TJ 0 g 0 G [(\050)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG @@ -26701,15 +26785,15 @@ BT 0 g 0 G [(\051)]TJ/F78 9.9626 Tf 1.02 0 0 1 318.911 560.05 Tm [(or)]TJ 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG -/F145 9.9626 Tf 1 0 0 1 335.162 560.05 Tm [(real)]TJ +/F147 9.9626 Tf 1 0 0 1 335.162 560.05 Tm [(real)]TJ 0 g 0 G [(\050psb_spk_\051)]TJ/F78 9.9626 Tf 1.02 0 0 1 416.174 560.05 Tm [(or)]TJ 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG -/F145 9.9626 Tf 1 0 0 1 432.425 560.05 Tm [(real)]TJ +/F147 9.9626 Tf 1 0 0 1 432.425 560.05 Tm [(real)]TJ 0 g 0 G [(\050psb_dpk_\051)]TJ/F84 9.9626 Tf 1.02 0 0 1 505.65 560.05 Tm [(,)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 1 0 0 1 166.788 548.095 Tm [(intent)]TJ +/F147 9.9626 Tf 1 0 0 1 166.788 548.095 Tm [(intent)]TJ 0 g 0 G [(\050in\051)]TJ/F84 9.9626 Tf 52.303 0 Td [(.)]TJ 1.02 0 0 1 166.479 536.14 Tm [(The)-390(value)-390(of)-390(the)-389(parameter)-390(to)-390(be)-390(set.)-738(The)-390(list)-390(of)-390(allowed)-390(values)-389(and)-390(the)]TJ 1.02 0 0 1 166.788 524.184 Tm [(corr)18(esponding)-365(data)-364(types)-365(is)-364(given)-365(in)-364(T)90(able)]TJ 0 0 1 rg 0 0 1 RG @@ -26717,7 +26801,7 @@ BT 0 g 0 G [(.)-663(When)-364(the)-365(valu)1(e)-365(is)-364(of)-365(type)]TJ 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG -/F145 9.9626 Tf 1 0 0 1 166.788 512.229 Tm [(character)]TJ +/F147 9.9626 Tf 1 0 0 1 166.788 512.229 Tm [(character)]TJ 0 g 0 G [(\050)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG @@ -26726,7 +26810,7 @@ BT 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG [(=*)]TJ 0 g 0 G - [(\051)]TJ/F84 9.9626 Tf 83.685 0 Td [(,)-250(it)-250(is)-250(also)-250(tr)18(eated)-250(as)-250(case)-250(insensitive.)]TJ/F145 9.9626 Tf -129.656 -11.955 Td [(info)]TJ + [(\051)]TJ/F84 9.9626 Tf 83.685 0 Td [(,)-250(it)-250(is)-250(also)-250(tr)18(eated)-250(as)-250(case)-250(insensitive.)]TJ/F147 9.9626 Tf -129.656 -11.955 Td [(info)]TJ 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG [-2514(integer)]TJ 0 g 0 G @@ -26752,7 +26836,7 @@ ET endstream endobj -2010 0 obj +2013 0 obj << /Length 13651 >> @@ -26776,7 +26860,7 @@ q Q 1 0 0 1 -322.56 -716.092 cm BT -/F233 8.9664 Tf 335.209 875.945 Td [(what)]TJ +/F235 8.9664 Tf 335.209 875.945 Td [(what)]TJ ET q 1 0 0 1 432.13 872.657 cm @@ -26790,7 +26874,7 @@ q []0 d 0 J 0.398 w 0 0 m 0 10.959 l S Q BT -/F233 8.9664 Tf 543.974 875.945 Td [(val)]TJ +/F235 8.9664 Tf 543.974 875.945 Td [(val)]TJ ET q 1 0 0 1 623.888 872.657 cm @@ -26820,7 +26904,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 335.444 864.587 Td [(\015SUB_SOLVE\015)]TJ +/F235 8.9664 Tf 335.444 864.587 Td [(\015SUB_SOLVE\015)]TJ 0 g 0 G ET q @@ -26829,7 +26913,7 @@ q Q 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG BT -/F233 8.9664 Tf 438.108 864.587 Td [(character)]TJ +/F235 8.9664 Tf 438.108 864.587 Td [(character)]TJ 0 g 0 G [(\050)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG @@ -26846,7 +26930,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 544.209 864.587 Td [(\015ILU\015)]TJ +/F235 8.9664 Tf 544.209 864.587 Td [(\015ILU\015)]TJ 0 g 0 G 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG 0 -10.959 Td [(\015ILUT\015)]TJ @@ -26890,7 +26974,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 335.444 787.476 Td [(\015SUB_FILLIN\015)]TJ +/F235 8.9664 Tf 335.444 787.476 Td [(\015SUB_FILLIN\015)]TJ 0 g 0 G ET q @@ -26899,7 +26983,7 @@ q Q 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG BT -/F233 8.9664 Tf 438.108 787.476 Td [(integer)]TJ +/F235 8.9664 Tf 438.108 787.476 Td [(integer)]TJ 0 g 0 G ET q @@ -26907,7 +26991,7 @@ q []0 d 0 J 0.398 w 0 0 m 0 21.918 l S Q BT -/F84 8.9664 Tf 543.859 787.476 Td [(Any)-250(integer)]TJ 0.35 -10.959 Td [(number)]TJ/F190 9.343 Tf 33.691 0 Td [(\025)]TJ/F84 8.9664 Tf 9.865 0 Td [(0)]TJ +/F84 8.9664 Tf 543.859 787.476 Td [(Any)-250(integer)]TJ 0.35 -10.959 Td [(number)]TJ/F195 9.343 Tf 33.691 0 Td [(\025)]TJ/F84 8.9664 Tf 9.865 0 Td [(0)]TJ ET q 1 0 0 1 623.888 773.23 cm @@ -26937,7 +27021,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 335.444 765.16 Td [(\015SUB_ILUTHRS\015)]TJ +/F235 8.9664 Tf 335.444 765.16 Td [(\015SUB_ILUTHRS\015)]TJ 0 g 0 G ET q @@ -26946,7 +27030,7 @@ q Q 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG BT -/F233 8.9664 Tf 438.108 765.16 Td [(real)]TJ +/F235 8.9664 Tf 438.108 765.16 Td [(real)]TJ 0 g 0 G [(\050kind_parameter\051)]TJ ET @@ -26955,7 +27039,7 @@ q []0 d 0 J 0.398 w 0 0 m 0 21.918 l S Q BT -/F84 8.9664 Tf 1.02 0 0 1 543.859 765.16 Tm [(Any)-1148(r)18(eal)-1148(num-)]TJ 1 0 0 1 544.209 754.201 Tm [(ber)]TJ/F190 9.343 Tf 15.148 0 Td [(\025)]TJ/F84 8.9664 Tf 9.866 0 Td [(0)]TJ +/F84 8.9664 Tf 1.02 0 0 1 543.859 765.16 Tm [(Any)-1148(r)18(eal)-1148(num-)]TJ 1 0 0 1 544.209 754.201 Tm [(ber)]TJ/F195 9.343 Tf 15.148 0 Td [(\025)]TJ/F84 8.9664 Tf 9.866 0 Td [(0)]TJ ET q 1 0 0 1 623.888 750.913 cm @@ -26985,7 +27069,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 335.444 742.844 Td [(\015ILU_ALG\015)]TJ +/F235 8.9664 Tf 335.444 742.844 Td [(\015ILU_ALG\015)]TJ 0 g 0 G ET q @@ -26994,7 +27078,7 @@ q Q 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG BT -/F233 8.9664 Tf 438.108 742.844 Td [(character)]TJ +/F235 8.9664 Tf 438.108 742.844 Td [(character)]TJ 0 g 0 G [(\050)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG @@ -27011,7 +27095,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 544.209 742.844 Td [(\015MILU\015)]TJ +/F235 8.9664 Tf 544.209 742.844 Td [(\015MILU\015)]TJ 0 g 0 G ET q @@ -27020,7 +27104,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 629.865 742.844 Td [(\015NONE\015)]TJ +/F235 8.9664 Tf 629.865 742.844 Td [(\015NONE\015)]TJ 0 g 0 G ET q @@ -27044,7 +27128,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 335.444 731.486 Td [(\015ILUT_SCALE\015)]TJ +/F235 8.9664 Tf 335.444 731.486 Td [(\015ILUT_SCALE\015)]TJ 0 g 0 G ET q @@ -27053,7 +27137,7 @@ q Q 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG BT -/F233 8.9664 Tf 438.108 731.486 Td [(character)]TJ +/F235 8.9664 Tf 438.108 731.486 Td [(character)]TJ 0 g 0 G [(\050)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG @@ -27070,7 +27154,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 544.209 731.486 Td [(\015MAXVAL\015)]TJ +/F235 8.9664 Tf 544.209 731.486 Td [(\015MAXVAL\015)]TJ 0 g 0 G 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG 0 -10.959 Td [(\015DIAG\015)]TJ @@ -27094,7 +27178,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 629.865 731.486 Td [(\015NONE\015)]TJ +/F235 8.9664 Tf 629.865 731.486 Td [(\015NONE\015)]TJ 0 g 0 G ET q @@ -27118,7 +27202,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 335.444 665.334 Td [(\015INV_FILLIN\015)]TJ +/F235 8.9664 Tf 335.444 665.334 Td [(\015INV_FILLIN\015)]TJ 0 g 0 G ET q @@ -27127,7 +27211,7 @@ q Q 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG BT -/F233 8.9664 Tf 438.108 665.334 Td [(integer)]TJ +/F235 8.9664 Tf 438.108 665.334 Td [(integer)]TJ 0 g 0 G ET q @@ -27135,7 +27219,7 @@ q []0 d 0 J 0.398 w 0 0 m 0 21.918 l S Q BT -/F84 8.9664 Tf 543.859 665.334 Td [(Any)-250(integer)]TJ 0.35 -10.959 Td [(number)]TJ/F190 9.343 Tf 33.691 0 Td [(\025)]TJ/F84 8.9664 Tf 9.865 0 Td [(0)]TJ +/F84 8.9664 Tf 543.859 665.334 Td [(Any)-250(integer)]TJ 0.35 -10.959 Td [(number)]TJ/F195 9.343 Tf 33.691 0 Td [(\025)]TJ/F84 8.9664 Tf 9.865 0 Td [(0)]TJ ET q 1 0 0 1 623.888 651.088 cm @@ -27165,7 +27249,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 335.444 643.018 Td [(\015INV_ILUTHRS\015)]TJ +/F235 8.9664 Tf 335.444 643.018 Td [(\015INV_ILUTHRS\015)]TJ 0 g 0 G ET q @@ -27174,7 +27258,7 @@ q Q 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG BT -/F233 8.9664 Tf 438.108 643.018 Td [(real)]TJ +/F235 8.9664 Tf 438.108 643.018 Td [(real)]TJ 0 g 0 G [(\050kind_parameter\051)]TJ ET @@ -27183,7 +27267,7 @@ q []0 d 0 J 0.398 w 0 0 m 0 21.918 l S Q BT -/F84 8.9664 Tf 1.02 0 0 1 543.859 643.018 Tm [(Any)-1148(r)18(eal)-1148(num-)]TJ 1 0 0 1 544.209 632.059 Tm [(ber)]TJ/F190 9.343 Tf 15.148 0 Td [(\025)]TJ/F84 8.9664 Tf 9.866 0 Td [(0)]TJ +/F84 8.9664 Tf 1.02 0 0 1 543.859 643.018 Tm [(Any)-1148(r)18(eal)-1148(num-)]TJ 1 0 0 1 544.209 632.059 Tm [(ber)]TJ/F195 9.343 Tf 15.148 0 Td [(\025)]TJ/F84 8.9664 Tf 9.866 0 Td [(0)]TJ ET q 1 0 0 1 623.888 628.771 cm @@ -27213,7 +27297,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 335.444 620.702 Td [(\015AINV_ALG\015)]TJ +/F235 8.9664 Tf 335.444 620.702 Td [(\015AINV_ALG\015)]TJ 0 g 0 G ET q @@ -27222,7 +27306,7 @@ q Q 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG BT -/F233 8.9664 Tf 438.108 620.702 Td [(character)]TJ +/F235 8.9664 Tf 438.108 620.702 Td [(character)]TJ 0 g 0 G [(\050)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG @@ -27239,7 +27323,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 544.209 620.702 Td [(\015LLK\015)]TJ +/F235 8.9664 Tf 544.209 620.702 Td [(\015LLK\015)]TJ 0 g 0 G 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG 0 -10.959 Td [(\015SYM-LLK\015)]TJ @@ -27257,7 +27341,7 @@ q Q 0.25 0.44 0.63 rg 0.25 0.44 0.63 RG BT -/F233 8.9664 Tf 629.865 620.702 Td [(\015LLK\015)]TJ +/F235 8.9664 Tf 629.865 620.702 Td [(\015LLK\015)]TJ 0 g 0 G ET q @@ -27293,7 +27377,7 @@ ET endstream endobj -2019 0 obj +2022 0 obj << /Length 7660 >> @@ -27304,7 +27388,7 @@ BT /F75 11.9552 Tf 99.895 706.129 Td [(10.3)-1000(build)-250(\227)-250(Builds)-250(a)-250(preconditioner)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 0 -20.364 Td [(call)-525(prec%build\050a,)-525(desc_a,)-525(info[,amold,vmold,imold]\051)]TJ +/F147 9.9626 Tf 0 -20.364 Td [(call)-525(prec%build\050a,)-525(desc_a,)-525(info[,amold,vmold,imold]\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -24.086 Td [(T)90(ype:)]TJ 0 g 0 G @@ -27317,21 +27401,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(system)-250(sparse)-250(matrix.)-310(Scope:)]TJ/F75 9.9626 Tf 146.23 0 Td [(local)]TJ/F84 9.9626 Tf -131.595 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(,)-250(tar)18(get.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(sparse)-250(matrix)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 190.872 0 Td [(psb)]TJ +/F147 9.9626 Tf 190.872 0 Td [(psb)]TJ ET q 1 0 0 1 331.993 580.382 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 335.131 580.183 Td [(Tspmat)]TJ +/F147 9.9626 Tf 335.131 580.183 Td [(Tspmat)]TJ ET q 1 0 0 1 367.141 580.382 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 370.279 580.183 Td [(type)]TJ +/F147 9.9626 Tf 370.279 580.183 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -27339,21 +27423,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.349 0 Td [(the)-250(pr)18(econditioner)74(.)]TJ 0.558 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ 0.98 0 0 1 124.802 509.547 Tm [(Speci\002ed)-194(as:)-286(an)-193(alr)18(eady)-194(initialized)-194(pr)19(econdtioner)-194(data)-194(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 1 0 0 1 396.852 509.547 Tm [(psb)]TJ +/F147 9.9626 Tf 1 0 0 1 396.852 509.547 Tm [(psb)]TJ ET q 1 0 0 1 413.17 509.746 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 416.309 509.547 Td [(Tprec)]TJ +/F147 9.9626 Tf 416.309 509.547 Td [(Tprec)]TJ ET q 1 0 0 1 443.088 509.746 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 446.226 509.547 Td [(type)]TJ +/F147 9.9626 Tf 446.226 509.547 Td [(type)]TJ 0 g 0 G 0 g 0 G /F75 9.9626 Tf -346.331 -34.771 Td [(desc)]TJ @@ -27367,119 +27451,119 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(pr)18(oblem)-250(communication)-250(descriptor)74(.)-310(Scope:)]TJ/F75 9.9626 Tf 208.625 0 Td [(local)]TJ/F84 9.9626 Tf -217.492 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(,)-250(tar)18(get.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(communication)-250(descriptor)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 247.648 0 Td [(psb)]TJ +/F147 9.9626 Tf 247.648 0 Td [(psb)]TJ ET q 1 0 0 1 388.769 439.11 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 391.907 438.911 Td [(desc)]TJ +/F147 9.9626 Tf 391.907 438.911 Td [(desc)]TJ ET q 1 0 0 1 413.456 439.11 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 416.594 438.911 Td [(type)]TJ +/F147 9.9626 Tf 416.594 438.911 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -337.621 -22.816 Td [(amold)]TJ 0 g 0 G -/F84 9.9626 Tf 33.455 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(matrix)-250(storage.)]TJ -8.548 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(a)-250(class)-250(derived)-250(fr)18(om)]TJ/F145 9.9626 Tf 201.393 0 Td [(psb)]TJ +/F84 9.9626 Tf 33.455 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(matrix)-250(storage.)]TJ -8.548 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(a)-250(class)-250(derived)-250(fr)18(om)]TJ/F147 9.9626 Tf 201.393 0 Td [(psb)]TJ ET q 1 0 0 1 342.513 368.474 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 345.652 368.275 Td [(T)]TJ +/F147 9.9626 Tf 345.652 368.275 Td [(T)]TJ ET q 1 0 0 1 351.51 368.474 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 354.648 368.275 Td [(base)]TJ +/F147 9.9626 Tf 354.648 368.275 Td [(base)]TJ ET q 1 0 0 1 376.197 368.474 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 379.335 368.275 Td [(sparse)]TJ +/F147 9.9626 Tf 379.335 368.275 Td [(sparse)]TJ ET q 1 0 0 1 411.345 368.474 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 414.483 368.275 Td [(mat)]TJ/F84 9.9626 Tf 15.691 0 Td [(.)]TJ +/F147 9.9626 Tf 414.483 368.275 Td [(mat)]TJ/F84 9.9626 Tf 15.691 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -330.279 -22.816 Td [(vmold)]TJ 0 g 0 G -/F84 9.9626 Tf 34.013 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(vector)-250(storage.)]TJ -9.106 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(a)-250(class)-250(derived)-250(fr)18(om)]TJ/F145 9.9626 Tf 201.393 0 Td [(psb)]TJ +/F84 9.9626 Tf 34.013 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(vector)-250(storage.)]TJ -9.106 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(a)-250(class)-250(derived)-250(fr)18(om)]TJ/F147 9.9626 Tf 201.393 0 Td [(psb)]TJ ET q 1 0 0 1 342.513 297.838 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 345.652 297.638 Td [(T)]TJ +/F147 9.9626 Tf 345.652 297.638 Td [(T)]TJ ET q 1 0 0 1 351.51 297.838 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 354.648 297.638 Td [(base)]TJ +/F147 9.9626 Tf 354.648 297.638 Td [(base)]TJ ET q 1 0 0 1 376.197 297.838 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 379.335 297.638 Td [(vect)]TJ +/F147 9.9626 Tf 379.335 297.638 Td [(vect)]TJ ET q 1 0 0 1 400.884 297.838 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 404.022 297.638 Td [(type)]TJ/F84 9.9626 Tf 20.922 0 Td [(.)]TJ +/F147 9.9626 Tf 404.022 297.638 Td [(type)]TJ/F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -325.049 -22.815 Td [(imold)]TJ 0 g 0 G -/F84 9.9626 Tf 31.791 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(integer)-250(vector)-250(storage.)]TJ -6.884 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 227.002 Tm [(Speci\002ed)-194(as:)-286(an)-193(object)-194(of)-194(a)-194(class)-194(derived)-194(fr)19(om)-194(\050integer\051)]TJ/F145 9.9626 Tf 1 0 0 1 356.282 227.002 Tm [(psb)]TJ +/F84 9.9626 Tf 31.791 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(integer)-250(vector)-250(storage.)]TJ -6.884 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 0.98 0 0 1 124.802 227.002 Tm [(Speci\002ed)-194(as:)-286(an)-193(object)-194(of)-194(a)-194(class)-194(derived)-194(fr)19(om)-194(\050integer\051)]TJ/F147 9.9626 Tf 1 0 0 1 356.282 227.002 Tm [(psb)]TJ ET q 1 0 0 1 372.601 227.202 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 375.739 227.002 Td [(T)]TJ +/F147 9.9626 Tf 375.739 227.002 Td [(T)]TJ ET q 1 0 0 1 381.597 227.202 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 384.735 227.002 Td [(base)]TJ +/F147 9.9626 Tf 384.735 227.002 Td [(base)]TJ ET q 1 0 0 1 406.284 227.202 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 409.422 227.002 Td [(vect)]TJ +/F147 9.9626 Tf 409.422 227.002 Td [(vect)]TJ ET q 1 0 0 1 430.971 227.202 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 434.11 227.002 Td [(type)]TJ/F84 9.9626 Tf 0.98 0 0 1 455.031 227.002 Tm [(.)]TJ +/F147 9.9626 Tf 434.11 227.002 Td [(type)]TJ/F84 9.9626 Tf 0.98 0 0 1 455.031 227.002 Tm [(.)]TJ 0 g 0 G /F75 9.9626 Tf 1 0 0 1 99.895 202.917 Tm [(On)-250(Return)]TJ 0 g 0 G @@ -27488,21 +27572,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.349 0 Td [(the)-250(pr)18(econditioner)74(.)]TJ 0.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(pr)18(econdtioner)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 193.612 0 Td [(psb)]TJ +/F147 9.9626 Tf 193.612 0 Td [(psb)]TJ ET q 1 0 0 1 334.732 132.48 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.871 132.281 Td [(Tprec)]TJ +/F147 9.9626 Tf 337.871 132.281 Td [(Tprec)]TJ ET q 1 0 0 1 364.65 132.48 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 367.788 132.281 Td [(type)]TJ +/F147 9.9626 Tf 367.788 132.281 Td [(type)]TJ 0 g 0 G 0 g 0 G /F84 9.9626 Tf -103.509 -41.843 Td [(155)]TJ @@ -27511,7 +27595,7 @@ ET endstream endobj -2023 0 obj +2026 0 obj << /Length 1133 >> @@ -27522,7 +27606,7 @@ stream BT /F75 9.9626 Tf 150.705 706.129 Td [(info)]TJ 0 g 0 G -/F84 9.9626 Tf 23.8 0 Td [(Err)18(or)-250(code.)]TJ 1.106 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -47.133 -11.955 Td [(An)-250(integer)-250(value;)-250(0)-250(means)-250(no)-250(err)18(or)-250(has)-250(been)-250(detected.)]TJ 1.02 0 0 1 150.396 636.39 Tm [(The)]TJ/F145 9.9626 Tf 1 0 0 1 170.746 636.39 Tm [(amold)]TJ/F84 9.9626 Tf 1.02 0 0 1 196.898 636.39 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 202.989 636.39 Tm [(vmold)]TJ/F84 9.9626 Tf 1.02 0 0 1 232.48 636.39 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 253.023 636.39 Tm [(imold)]TJ/F84 9.9626 Tf 1.02 0 0 1 282.514 636.39 Tm [(ar)18(guments)-329(may)-328(be)-329(employed)-329(to)-328(interface)-329(with)]TJ 1 0 0 1 150.705 624.435 Tm [(special)-250(devices,)-250(such)-250(as)-250(GPUs)-250(and)-250(other)-250(accelerators.)]TJ +/F84 9.9626 Tf 23.8 0 Td [(Err)18(or)-250(code.)]TJ 1.106 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(out)]TJ/F84 9.9626 Tf 14.944 0 Td [(.)]TJ -47.133 -11.955 Td [(An)-250(integer)-250(value;)-250(0)-250(means)-250(no)-250(err)18(or)-250(has)-250(been)-250(detected.)]TJ 1.02 0 0 1 150.396 636.39 Tm [(The)]TJ/F147 9.9626 Tf 1 0 0 1 170.746 636.39 Tm [(amold)]TJ/F84 9.9626 Tf 1.02 0 0 1 196.898 636.39 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 202.989 636.39 Tm [(vmold)]TJ/F84 9.9626 Tf 1.02 0 0 1 232.48 636.39 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 253.023 636.39 Tm [(imold)]TJ/F84 9.9626 Tf 1.02 0 0 1 282.514 636.39 Tm [(ar)18(guments)-329(may)-328(be)-329(employed)-329(to)-328(interface)-329(with)]TJ 1 0 0 1 150.705 624.435 Tm [(special)-250(devices,)-250(such)-250(as)-250(GPUs)-250(and)-250(other)-250(accelerators.)]TJ 0 g 0 G 164.383 -533.997 Td [(156)]TJ 0 g 0 G @@ -27530,7 +27614,7 @@ ET endstream endobj -2032 0 obj +2035 0 obj << /Length 6132 >> @@ -27541,7 +27625,7 @@ BT /F75 11.9552 Tf 99.895 706.129 Td [(10.4)-1000(apply)-250(\227)-250(Preconditioner)-250(application)-250(routine)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 0 -18.964 Td [(call)-525(prec%apply\050x,y,desc_a,info,trans,work\051)]TJ 0 -11.955 Td [(call)-525(prec%apply\050x,desc_a,info,trans\051)]TJ +/F147 9.9626 Tf 0 -18.964 Td [(call)-525(prec%apply\050x,y,desc_a,info,trans,work\051)]TJ 0 -11.955 Td [(call)-525(prec%apply\050x,desc_a,info,trans\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -27554,21 +27638,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.349 0 Td [(the)-250(pr)18(econditioner)74(.)-310(Scope:)]TJ/F75 9.9626 Tf 117.836 0 Td [(local)]TJ/F84 9.9626 Tf -117.587 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(pr)18(econditioner)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 196.511 0 Td [(psb)]TJ +/F147 9.9626 Tf 196.511 0 Td [(psb)]TJ ET q 1 0 0 1 337.631 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 340.77 577.576 Td [(Tprec)]TJ +/F147 9.9626 Tf 340.77 577.576 Td [(Tprec)]TJ ET q 1 0 0 1 367.549 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 370.687 577.576 Td [(type)]TJ +/F147 9.9626 Tf 370.687 577.576 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -27576,28 +27660,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(sour)18(ce)-250(vector)74(.)-310(Scope:)]TJ/F75 9.9626 Tf 111.142 0 Td [(local)]TJ/F84 9.9626 Tf -96.507 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(array)-250(or)-250(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 218.688 0 Td [(psb)]TJ +/F147 9.9626 Tf 218.688 0 Td [(psb)]TJ ET q 1 0 0 1 359.808 521.985 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 362.947 521.785 Td [(T)]TJ +/F147 9.9626 Tf 362.947 521.785 Td [(T)]TJ ET q 1 0 0 1 368.804 521.985 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 371.943 521.785 Td [(vect)]TJ +/F147 9.9626 Tf 371.943 521.785 Td [(vect)]TJ ET q 1 0 0 1 393.492 521.985 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 396.63 521.785 Td [(type)]TJ +/F147 9.9626 Tf 396.63 521.785 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -27612,21 +27696,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(the)-250(pr)18(oblem)-250(communication)-250(descriptor)74(.)-310(Scope:)]TJ/F75 9.9626 Tf 208.625 0 Td [(local)]TJ/F84 9.9626 Tf -217.492 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(communication)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 200.207 0 Td [(psb)]TJ +/F147 9.9626 Tf 200.207 0 Td [(psb)]TJ ET q 1 0 0 1 341.328 466.194 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 344.466 465.994 Td [(desc)]TJ +/F147 9.9626 Tf 344.466 465.994 Td [(desc)]TJ ET q 1 0 0 1 366.015 466.194 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 369.153 465.994 Td [(type)]TJ +/F147 9.9626 Tf 369.153 465.994 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -27645,28 +27729,28 @@ BT 0 g 0 G /F84 9.9626 Tf 10.521 0 Td [(the)-250(destination)-250(vector)74(.)-310(Scope:)]TJ/F75 9.9626 Tf 131.913 0 Td [(local)]TJ/F84 9.9626 Tf -117.836 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(array)-250(or)-250(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 218.688 0 Td [(psb)]TJ +/F147 9.9626 Tf 218.688 0 Td [(psb)]TJ ET q 1 0 0 1 359.808 276.904 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 362.947 276.704 Td [(T)]TJ +/F147 9.9626 Tf 362.947 276.704 Td [(T)]TJ ET q 1 0 0 1 368.804 276.904 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 371.943 276.704 Td [(vect)]TJ +/F147 9.9626 Tf 371.943 276.704 Td [(vect)]TJ ET q 1 0 0 1 393.492 276.904 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 396.63 276.704 Td [(type)]TJ +/F147 9.9626 Tf 396.63 276.704 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -27684,7 +27768,7 @@ ET endstream endobj -2038 0 obj +2041 0 obj << /Length 3490 >> @@ -27695,7 +27779,7 @@ BT /F75 11.9552 Tf 150.705 706.129 Td [(10.5)-1000(descr)-250(\227)-250(Prints)-250(a)-250(description)-250(of)-250(current)-250(preconditioner)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 0 -18.964 Td [(call)-525(prec%descr\050info\051)]TJ 0 -11.955 Td [(call)-525(prec%descr\050info,iout,)-525(root\051)]TJ +/F147 9.9626 Tf 0 -18.964 Td [(call)-525(prec%descr\050info\051)]TJ 0 -11.955 Td [(call)-525(prec%descr\050info,iout,)-525(root\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -27708,21 +27792,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.348 0 Td [(the)-250(pr)18(econditioner)74(.)-310(Scope:)]TJ/F75 9.9626 Tf 117.837 0 Td [(local)]TJ/F84 9.9626 Tf -117.587 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(pr)18(econditioner)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 196.511 0 Td [(psb)]TJ +/F147 9.9626 Tf 196.511 0 Td [(psb)]TJ ET q 1 0 0 1 388.441 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 391.579 577.576 Td [(Tprec)]TJ +/F147 9.9626 Tf 391.579 577.576 Td [(Tprec)]TJ ET q 1 0 0 1 418.358 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 421.497 577.576 Td [(type)]TJ +/F147 9.9626 Tf 421.497 577.576 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -27732,7 +27816,7 @@ BT 0 g 0 G /F75 9.9626 Tf -24.906 -19.925 Td [(root)]TJ 0 g 0 G -/F84 9.9626 Tf 23.252 0 Td [(Pr)18(ocess)-250(fr)18(om)-250(which)-250(to)-250(print)-250(Scope:)]TJ/F75 9.9626 Tf 155.834 0 Td [(local)]TJ/F84 9.9626 Tf -154.488 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ 1.02 0 0 1 175.611 465.994 Tm [(Speci\002ed)-342(as:)-498(an)-341(integer)-342(number)-342(between)-342(0)-342(and)]TJ/F78 9.9626 Tf 1 0 0 1 396.349 465.994 Tm [(n)-80(p)]TJ/F190 10.3811 Tf 13.868 0 Td [(\000)]TJ/F84 9.9626 Tf 1.02 0 0 1 420.713 465.994 Tm [(1,)-366(in)-342(which)-342(case)]TJ 1.02 0 0 1 175.611 454.039 Tm [(the)-264(speci\002ed)-265(pr)18(ocess)-265(will)-264(print)-264(the)-265(description,)-269(or)]TJ/F190 10.3811 Tf 1 0 0 1 401.395 454.039 Tm [(\000)]TJ/F84 9.9626 Tf 1.02 0 0 1 409.589 454.039 Tm [(1,)-269(in)-265(which)-264(case)-265(all)]TJ 1 0 0 1 175.313 442.084 Tm [(pr)18(ocesses)-250(will)-250(print.)-310(Default:)-310(0.)]TJ +/F84 9.9626 Tf 23.252 0 Td [(Pr)18(ocess)-250(fr)18(om)-250(which)-250(to)-250(print)-250(Scope:)]TJ/F75 9.9626 Tf 155.834 0 Td [(local)]TJ/F84 9.9626 Tf -154.488 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ 1.02 0 0 1 175.611 465.994 Tm [(Speci\002ed)-342(as:)-498(an)-341(integer)-342(number)-342(between)-342(0)-342(and)]TJ/F78 9.9626 Tf 1 0 0 1 396.349 465.994 Tm [(n)-80(p)]TJ/F195 10.3811 Tf 13.868 0 Td [(\000)]TJ/F84 9.9626 Tf 1.02 0 0 1 420.713 465.994 Tm [(1,)-366(in)-342(which)-342(case)]TJ 1.02 0 0 1 175.611 454.039 Tm [(the)-264(speci\002ed)-265(pr)18(ocess)-265(will)-264(print)-264(the)-265(description,)-269(or)]TJ/F195 10.3811 Tf 1 0 0 1 401.395 454.039 Tm [(\000)]TJ/F84 9.9626 Tf 1.02 0 0 1 409.589 454.039 Tm [(1,)-269(in)-265(which)-264(case)-265(all)]TJ 1 0 0 1 175.313 442.084 Tm [(pr)18(ocesses)-250(will)-250(print.)-310(Default:)-310(0.)]TJ 0 g 0 G /F75 9.9626 Tf -24.608 -19.925 Td [(On)-250(Return)]TJ 0 g 0 G @@ -27747,7 +27831,7 @@ ET endstream endobj -2042 0 obj +2045 0 obj << /Length 973 >> @@ -27758,7 +27842,7 @@ BT /F75 11.9552 Tf 99.895 706.129 Td [(10.6)-1000(clone)-250(\227)-250(clone)-250(current)-250(preconditioner)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 0 -18.964 Td [(call)-1050(prec%clone\050precout,info\051)]TJ +/F147 9.9626 Tf 0 -18.964 Td [(call)-1050(prec%clone\050precout,info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -27788,39 +27872,47 @@ ET endstream endobj -1937 0 obj +1940 0 obj << /Type /ObjStm /N 100 -/First 973 -/Length 10967 ->> -stream -1933 0 1940 95 1938 234 1942 379 521 438 1943 496 1944 555 1939 614 1947 709 1945 848 -1949 993 525 1051 1950 1108 1951 1166 1946 1224 1955 1319 1953 1458 1957 1603 529 1662 1958 1720 -1959 1778 1954 1837 1962 1932 1960 2071 1964 2215 533 2273 1965 2330 1966 2387 1961 2445 1969 2540 -1967 2679 1971 2824 537 2883 1972 2941 1973 3000 1968 3059 1976 3182 1974 3321 1978 3463 541 3521 -1979 3578 1980 3636 1975 3694 1982 3817 1984 3935 1981 3994 1986 4077 1988 4195 545 4253 1985 4310 -1994 4405 1990 4562 1991 4709 1992 4857 1996 5004 549 5063 1997 5121 1993 5179 2005 5287 1999 5453 -2000 5600 2001 5747 2002 5895 2007 6042 553 6100 2004 6157 2009 6265 2003 6404 2011 6567 1998 6626 -2008 6686 2018 6796 2013 6962 2014 7107 2015 7254 2016 7401 2020 7548 557 7606 2017 7663 2022 7758 -2024 7876 2021 7935 2031 8030 2025 8205 2026 8350 2027 8493 2028 8640 2029 8784 2033 8933 561 8991 -2030 9048 2037 9143 2035 9282 2039 9427 565 9486 2036 9544 2041 9666 2043 9784 569 9842 2040 9899 -% 1933 0 obj +/First 972 +/Length 10929 +>> +stream +1939 0 517 58 1936 115 1943 210 1941 349 1945 494 521 553 1946 611 1947 670 1942 729 +1950 824 1948 963 1952 1108 525 1166 1953 1223 1954 1281 1949 1339 1958 1434 1956 1573 1960 1718 +529 1777 1961 1835 1962 1893 1957 1952 1965 2047 1963 2186 1967 2330 533 2388 1968 2445 1969 2502 +1964 2560 1972 2655 1970 2794 1974 2939 537 2998 1975 3056 1976 3115 1971 3174 1979 3297 1977 3436 +1981 3578 541 3636 1982 3693 1983 3751 1978 3809 1985 3932 1987 4050 1984 4109 1989 4192 1991 4310 +545 4368 1988 4425 1997 4520 1993 4677 1994 4824 1995 4972 1999 5119 549 5178 2000 5236 1996 5294 +2008 5402 2002 5568 2003 5715 2004 5862 2005 6010 2010 6157 553 6215 2007 6272 2012 6380 2006 6519 +2014 6682 2001 6741 2011 6801 2021 6911 2016 7077 2017 7222 2018 7369 2019 7516 2023 7663 557 7721 +2020 7778 2025 7873 2027 7991 2024 8050 2034 8145 2028 8320 2029 8465 2030 8608 2031 8755 2032 8899 +2036 9048 561 9106 2033 9163 2040 9258 2038 9397 2042 9542 565 9601 2039 9659 2044 9781 2046 9899 +% 1939 0 obj +<< +/D [1937 0 R /XYZ 98.895 753.953 null] +>> +% 517 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/D [1937 0 R /XYZ 99.895 716.092 null] +>> +% 1936 0 obj +<< +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1940 0 obj +% 1943 0 obj << /Type /Page -/Contents 1941 0 R -/Resources 1939 0 R +/Contents 1944 0 R +/Resources 1942 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1914 0 R -/Annots [ 1938 0 R ] +/Parent 1917 0 R +/Annots [ 1941 0 R ] >> -% 1938 0 obj +% 1941 0 obj << /Type /Annot /Subtype /Link @@ -27828,37 +27920,37 @@ stream /Rect [342.753 438.278 420.271 450.338] /A << /S /GoTo /D (spdata) >> >> -% 1942 0 obj +% 1945 0 obj << -/D [1940 0 R /XYZ 149.705 753.953 null] +/D [1943 0 R /XYZ 149.705 753.953 null] >> % 521 0 obj << -/D [1940 0 R /XYZ 150.705 716.092 null] +/D [1943 0 R /XYZ 150.705 716.092 null] >> -% 1943 0 obj +% 1946 0 obj << -/D [1940 0 R /XYZ 150.705 676.015 null] +/D [1943 0 R /XYZ 150.705 676.015 null] >> -% 1944 0 obj +% 1947 0 obj << -/D [1940 0 R /XYZ 150.705 679.195 null] +/D [1943 0 R /XYZ 150.705 679.195 null] >> -% 1939 0 obj +% 1942 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1947 0 obj +% 1950 0 obj << /Type /Page -/Contents 1948 0 R -/Resources 1946 0 R +/Contents 1951 0 R +/Resources 1949 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1952 0 R -/Annots [ 1945 0 R ] +/Parent 1955 0 R +/Annots [ 1948 0 R ] >> -% 1945 0 obj +% 1948 0 obj << /Type /Annot /Subtype /Link @@ -27866,37 +27958,37 @@ stream /Rect [291.943 571.778 369.462 583.837] /A << /S /GoTo /D (spdata) >> >> -% 1949 0 obj +% 1952 0 obj << -/D [1947 0 R /XYZ 98.895 753.953 null] +/D [1950 0 R /XYZ 98.895 753.953 null] >> % 525 0 obj << -/D [1947 0 R /XYZ 99.895 716.092 null] +/D [1950 0 R /XYZ 99.895 716.092 null] >> -% 1950 0 obj +% 1953 0 obj << -/D [1947 0 R /XYZ 99.895 676.015 null] +/D [1950 0 R /XYZ 99.895 676.015 null] >> -% 1951 0 obj +% 1954 0 obj << -/D [1947 0 R /XYZ 99.895 679.195 null] +/D [1950 0 R /XYZ 99.895 679.195 null] >> -% 1946 0 obj +% 1949 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1955 0 obj +% 1958 0 obj << /Type /Page -/Contents 1956 0 R -/Resources 1954 0 R +/Contents 1959 0 R +/Resources 1957 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1952 0 R -/Annots [ 1953 0 R ] +/Parent 1955 0 R +/Annots [ 1956 0 R ] >> -% 1953 0 obj +% 1956 0 obj << /Type /Annot /Subtype /Link @@ -27904,37 +27996,37 @@ stream /Rect [342.753 438.278 420.271 450.338] /A << /S /GoTo /D (spdata) >> >> -% 1957 0 obj +% 1960 0 obj << -/D [1955 0 R /XYZ 149.705 753.953 null] +/D [1958 0 R /XYZ 149.705 753.953 null] >> % 529 0 obj << -/D [1955 0 R /XYZ 150.705 716.092 null] +/D [1958 0 R /XYZ 150.705 716.092 null] >> -% 1958 0 obj +% 1961 0 obj << -/D [1955 0 R /XYZ 150.705 678.98 null] +/D [1958 0 R /XYZ 150.705 678.98 null] >> -% 1959 0 obj +% 1962 0 obj << -/D [1955 0 R /XYZ 150.705 679.195 null] +/D [1958 0 R /XYZ 150.705 679.195 null] >> -% 1954 0 obj +% 1957 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1962 0 obj +% 1965 0 obj << /Type /Page -/Contents 1963 0 R -/Resources 1961 0 R +/Contents 1966 0 R +/Resources 1964 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1952 0 R -/Annots [ 1960 0 R ] +/Parent 1955 0 R +/Annots [ 1963 0 R ] >> -% 1960 0 obj +% 1963 0 obj << /Type /Annot /Subtype /Link @@ -27942,37 +28034,37 @@ stream /Rect [301.961 426.323 378.015 438.383] /A << /S /GoTo /D (vdata) >> >> -% 1964 0 obj +% 1967 0 obj << -/D [1962 0 R /XYZ 98.895 753.953 null] +/D [1965 0 R /XYZ 98.895 753.953 null] >> % 533 0 obj << -/D [1962 0 R /XYZ 99.895 716.092 null] +/D [1965 0 R /XYZ 99.895 716.092 null] >> -% 1965 0 obj +% 1968 0 obj << -/D [1962 0 R /XYZ 99.895 678.98 null] +/D [1965 0 R /XYZ 99.895 678.98 null] >> -% 1966 0 obj +% 1969 0 obj << -/D [1962 0 R /XYZ 99.895 679.195 null] +/D [1965 0 R /XYZ 99.895 679.195 null] >> -% 1961 0 obj +% 1964 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1969 0 obj +% 1972 0 obj << /Type /Page -/Contents 1970 0 R -/Resources 1968 0 R +/Contents 1973 0 R +/Resources 1971 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1952 0 R -/Annots [ 1967 0 R ] +/Parent 1955 0 R +/Annots [ 1970 0 R ] >> -% 1967 0 obj +% 1970 0 obj << /Type /Annot /Subtype /Link @@ -27980,37 +28072,37 @@ stream /Rect [342.753 574.778 420.271 586.838] /A << /S /GoTo /D (spdata) >> >> -% 1971 0 obj +% 1974 0 obj << -/D [1969 0 R /XYZ 149.705 753.953 null] +/D [1972 0 R /XYZ 149.705 753.953 null] >> % 537 0 obj << -/D [1969 0 R /XYZ 150.705 716.092 null] +/D [1972 0 R /XYZ 150.705 716.092 null] >> -% 1972 0 obj +% 1975 0 obj << -/D [1969 0 R /XYZ 150.705 679.441 null] +/D [1972 0 R /XYZ 150.705 679.441 null] >> -% 1973 0 obj +% 1976 0 obj << -/D [1969 0 R /XYZ 150.705 679.657 null] +/D [1972 0 R /XYZ 150.705 679.657 null] >> -% 1968 0 obj +% 1971 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F233 1044 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F78 686 0 R /F235 1045 0 R >> /ProcSet [ /PDF /Text ] >> -% 1976 0 obj +% 1979 0 obj << /Type /Page -/Contents 1977 0 R -/Resources 1975 0 R +/Contents 1980 0 R +/Resources 1978 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1952 0 R -/Annots [ 1974 0 R ] +/Parent 1955 0 R +/Annots [ 1977 0 R ] >> -% 1974 0 obj +% 1977 0 obj << /Type /Annot /Subtype /Link @@ -28018,75 +28110,75 @@ stream /Rect [396.215 574.59 472.269 586.65] /A << /S /GoTo /D (vdata) >> >> -% 1978 0 obj +% 1981 0 obj << -/D [1976 0 R /XYZ 98.895 753.953 null] +/D [1979 0 R /XYZ 98.895 753.953 null] >> % 541 0 obj << -/D [1976 0 R /XYZ 99.895 716.092 null] +/D [1979 0 R /XYZ 99.895 716.092 null] >> -% 1979 0 obj +% 1982 0 obj << -/D [1976 0 R /XYZ 99.895 679.413 null] +/D [1979 0 R /XYZ 99.895 679.413 null] >> -% 1980 0 obj +% 1983 0 obj << -/D [1976 0 R /XYZ 99.895 679.628 null] +/D [1979 0 R /XYZ 99.895 679.628 null] >> -% 1975 0 obj +% 1978 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F233 1044 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F78 686 0 R /F235 1045 0 R >> /ProcSet [ /PDF /Text ] >> -% 1982 0 obj +% 1985 0 obj << /Type /Page -/Contents 1983 0 R -/Resources 1981 0 R +/Contents 1986 0 R +/Resources 1984 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1952 0 R +/Parent 1955 0 R >> -% 1984 0 obj +% 1987 0 obj << -/D [1982 0 R /XYZ 149.705 753.953 null] +/D [1985 0 R /XYZ 149.705 753.953 null] >> -% 1981 0 obj +% 1984 0 obj << -/Font << /F233 1044 0 R /F84 687 0 R >> +/Font << /F235 1045 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 1986 0 obj +% 1989 0 obj << /Type /Page -/Contents 1987 0 R -/Resources 1985 0 R +/Contents 1990 0 R +/Resources 1988 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1989 0 R +/Parent 1992 0 R >> -% 1988 0 obj +% 1991 0 obj << -/D [1986 0 R /XYZ 98.895 753.953 null] +/D [1989 0 R /XYZ 98.895 753.953 null] >> % 545 0 obj << -/D [1986 0 R /XYZ 99.895 716.092 null] +/D [1989 0 R /XYZ 99.895 716.092 null] >> -% 1985 0 obj +% 1988 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 1994 0 obj +% 1997 0 obj << /Type /Page -/Contents 1995 0 R -/Resources 1993 0 R +/Contents 1998 0 R +/Resources 1996 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1989 0 R -/Annots [ 1990 0 R 1991 0 R 1992 0 R ] +/Parent 1992 0 R +/Annots [ 1993 0 R 1994 0 R 1995 0 R ] >> -% 1990 0 obj +% 1993 0 obj << /Type /Annot /Subtype /Link @@ -28094,7 +28186,7 @@ stream /Rect [371.126 442.264 443.414 454.323] /A << /S /GoTo /D (precdata) >> >> -% 1991 0 obj +% 1994 0 obj << /Type /Annot /Subtype /Link @@ -28102,7 +28194,7 @@ stream /Rect [222.066 352.6 228.343 366.303] /A << /S /GoTo /D (Hfootnote.4) >> >> -% 1992 0 obj +% 1995 0 obj << /Type /Annot /Subtype /Link @@ -28110,33 +28202,33 @@ stream /Rect [221.319 235.698 233.275 245.108] /A << /S /GoTo /D (table.21) >> >> -% 1996 0 obj +% 1999 0 obj << -/D [1994 0 R /XYZ 149.705 753.953 null] +/D [1997 0 R /XYZ 149.705 753.953 null] >> % 549 0 obj << -/D [1994 0 R /XYZ 150.705 716.092 null] +/D [1997 0 R /XYZ 150.705 716.092 null] >> -% 1997 0 obj +% 2000 0 obj << -/D [1994 0 R /XYZ 165.051 129.79 null] +/D [1997 0 R /XYZ 165.051 129.79 null] >> -% 1993 0 obj +% 1996 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2005 0 obj +% 2008 0 obj << /Type /Page -/Contents 2006 0 R -/Resources 2004 0 R +/Contents 2009 0 R +/Resources 2007 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1989 0 R -/Annots [ 1999 0 R 2000 0 R 2001 0 R 2002 0 R ] +/Parent 1992 0 R +/Annots [ 2002 0 R 2003 0 R 2004 0 R 2005 0 R ] >> -% 1999 0 obj +% 2002 0 obj << /Type /Annot /Subtype /Link @@ -28144,7 +28236,7 @@ stream /Rect [283.359 567.422 295.314 580.259] /A << /S /GoTo /D (table.21) >> >> -% 2000 0 obj +% 2003 0 obj << /Type /Annot /Subtype /Link @@ -28152,7 +28244,7 @@ stream /Rect [366.137 520.379 378.292 532.438] /A << /S /GoTo /D (table.21) >> >> -% 2001 0 obj +% 2004 0 obj << /Type /Annot /Subtype /Link @@ -28160,7 +28252,7 @@ stream /Rect [379.319 483.736 386.292 496.573] /A << /S /GoTo /D (section.8) >> >> -% 2002 0 obj +% 2005 0 obj << /Type /Annot /Subtype /Link @@ -28168,29 +28260,29 @@ stream /Rect [136.757 451.412 148.712 460.822] /A << /S /GoTo /D (table.21) >> >> -% 2007 0 obj +% 2010 0 obj << -/D [2005 0 R /XYZ 98.895 753.953 null] +/D [2008 0 R /XYZ 98.895 753.953 null] >> % 553 0 obj << -/D [2005 0 R /XYZ 99.895 716.092 null] +/D [2008 0 R /XYZ 99.895 716.092 null] >> -% 2004 0 obj +% 2007 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2009 0 obj +% 2012 0 obj << /Type /Page -/Contents 2010 0 R -/Resources 2008 0 R +/Contents 2013 0 R +/Resources 2011 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1989 0 R -/Annots [ 2003 0 R ] +/Parent 1992 0 R +/Annots [ 2006 0 R ] >> -% 2003 0 obj +% 2006 0 obj << /Type /Annot /Subtype /Link @@ -28198,29 +28290,29 @@ stream /Rect [404.253 212.933 412.423 220.405] /A << /S /GoTo /D (cite.BERTACCINIFILIPPONE) >> >> -% 2011 0 obj +% 2014 0 obj << -/D [2009 0 R /XYZ 149.705 753.953 null] +/D [2012 0 R /XYZ 149.705 753.953 null] >> -% 1998 0 obj +% 2001 0 obj << -/D [2009 0 R /XYZ -3900.052 719.08 null] +/D [2012 0 R /XYZ -3900.052 719.08 null] >> -% 2008 0 obj +% 2011 0 obj << -/Font << /F233 1044 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R >> +/Font << /F235 1045 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R >> /ProcSet [ /PDF /Text ] >> -% 2018 0 obj +% 2021 0 obj << /Type /Page -/Contents 2019 0 R -/Resources 2017 0 R +/Contents 2022 0 R +/Resources 2020 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1989 0 R -/Annots [ 2013 0 R 2014 0 R 2015 0 R 2016 0 R ] +/Parent 1992 0 R +/Annots [ 2016 0 R 2017 0 R 2018 0 R 2019 0 R ] >> -% 2013 0 obj +% 2016 0 obj << /Type /Annot /Subtype /Link @@ -28228,7 +28320,7 @@ stream /Rect [314.678 576.377 392.197 588.437] /A << /S /GoTo /D (spdata) >> >> -% 2014 0 obj +% 2017 0 obj << /Type /Annot /Subtype /Link @@ -28236,7 +28328,7 @@ stream /Rect [395.856 505.741 468.144 517.801] /A << /S /GoTo /D (precdata) >> >> -% 2015 0 obj +% 2018 0 obj << /Type /Annot /Subtype /Link @@ -28244,7 +28336,7 @@ stream /Rect [371.454 435.105 438.512 447.165] /A << /S /GoTo /D (descdata) >> >> -% 2016 0 obj +% 2019 0 obj << /Type /Annot /Subtype /Link @@ -28252,46 +28344,46 @@ stream /Rect [317.418 128.475 389.706 140.535] /A << /S /GoTo /D (precdata) >> >> -% 2020 0 obj +% 2023 0 obj << -/D [2018 0 R /XYZ 98.895 753.953 null] +/D [2021 0 R /XYZ 98.895 753.953 null] >> % 557 0 obj << -/D [2018 0 R /XYZ 99.895 716.092 null] +/D [2021 0 R /XYZ 99.895 716.092 null] >> -% 2017 0 obj +% 2020 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2022 0 obj +% 2025 0 obj << /Type /Page -/Contents 2023 0 R -/Resources 2021 0 R +/Contents 2026 0 R +/Resources 2024 0 R /MediaBox [0 0 595.276 841.89] -/Parent 1989 0 R +/Parent 1992 0 R >> -% 2024 0 obj +% 2027 0 obj << -/D [2022 0 R /XYZ 149.705 753.953 null] +/D [2025 0 R /XYZ 149.705 753.953 null] >> -% 2021 0 obj +% 2024 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 2031 0 obj +% 2034 0 obj << /Type /Page -/Contents 2032 0 R -/Resources 2030 0 R +/Contents 2035 0 R +/Resources 2033 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2034 0 R -/Annots [ 2025 0 R 2026 0 R 2027 0 R 2028 0 R 2029 0 R ] +/Parent 2037 0 R +/Annots [ 2028 0 R 2029 0 R 2030 0 R 2031 0 R 2032 0 R ] >> -% 2025 0 obj +% 2028 0 obj << /Type /Annot /Subtype /Link @@ -28299,7 +28391,7 @@ stream /Rect [320.317 573.77 392.605 585.83] /A << /S /GoTo /D (precdata) >> >> -% 2026 0 obj +% 2029 0 obj << /Type /Annot /Subtype /Link @@ -28307,7 +28399,7 @@ stream /Rect [342.493 517.98 418.548 530.039] /A << /S /GoTo /D (vdata) >> >> -% 2027 0 obj +% 2030 0 obj << /Type /Annot /Subtype /Link @@ -28315,7 +28407,7 @@ stream /Rect [324.013 462.189 391.071 474.248] /A << /S /GoTo /D (descdata) >> >> -% 2028 0 obj +% 2031 0 obj << /Type /Annot /Subtype /Link @@ -28323,7 +28415,7 @@ stream /Rect [342.493 272.899 418.548 284.958] /A << /S /GoTo /D (vdata) >> >> -% 2029 0 obj +% 2032 0 obj << /Type /Annot /Subtype /Link @@ -28331,29 +28423,29 @@ stream /Rect [431.552 183.235 443.387 196.238] /A << /S /GoTo /D (section.11) >> >> -% 2033 0 obj +% 2036 0 obj << -/D [2031 0 R /XYZ 98.895 753.953 null] +/D [2034 0 R /XYZ 98.895 753.953 null] >> % 561 0 obj << -/D [2031 0 R /XYZ 99.895 716.092 null] +/D [2034 0 R /XYZ 99.895 716.092 null] >> -% 2030 0 obj +% 2033 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2037 0 obj +% 2040 0 obj << /Type /Page -/Contents 2038 0 R -/Resources 2036 0 R +/Contents 2041 0 R +/Resources 2039 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2034 0 R -/Annots [ 2035 0 R ] +/Parent 2037 0 R +/Annots [ 2038 0 R ] >> -% 2035 0 obj +% 2038 0 obj << /Type /Annot /Subtype /Link @@ -28361,44 +28453,35 @@ stream /Rect [371.126 573.77 443.414 585.83] /A << /S /GoTo /D (precdata) >> >> -% 2039 0 obj +% 2042 0 obj << -/D [2037 0 R /XYZ 149.705 753.953 null] +/D [2040 0 R /XYZ 149.705 753.953 null] >> % 565 0 obj << -/D [2037 0 R /XYZ 150.705 716.092 null] +/D [2040 0 R /XYZ 150.705 716.092 null] >> -% 2036 0 obj +% 2039 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R /F78 686 0 R /F190 941 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R /F78 686 0 R /F195 942 0 R >> /ProcSet [ /PDF /Text ] >> -% 2041 0 obj +% 2044 0 obj << /Type /Page -/Contents 2042 0 R -/Resources 2040 0 R +/Contents 2045 0 R +/Resources 2043 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2034 0 R ->> -% 2043 0 obj -<< -/D [2041 0 R /XYZ 98.895 753.953 null] ->> -% 569 0 obj -<< -/D [2041 0 R /XYZ 99.895 716.092 null] +/Parent 2037 0 R >> -% 2040 0 obj +% 2046 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> -/ProcSet [ /PDF /Text ] +/D [2044 0 R /XYZ 98.895 753.953 null] >> endstream endobj -2048 0 obj +2052 0 obj << /Length 2715 >> @@ -28409,7 +28492,7 @@ BT /F75 11.9552 Tf 150.705 706.129 Td [(10.7)-1000(free)-250(\227)-250(Free)-250(a)-250(preconditioner)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf 0 -18.964 Td [(call)-525(prec%free\050info\051)]TJ +/F147 9.9626 Tf 0 -18.964 Td [(call)-525(prec%free\050info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -28422,21 +28505,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.348 0 Td [(the)-250(pr)18(econditioner)74(.)]TJ 0.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(pr)18(econditioner)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 196.511 0 Td [(psb)]TJ +/F147 9.9626 Tf 196.511 0 Td [(psb)]TJ ET q 1 0 0 1 388.441 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 391.579 577.576 Td [(Tprec)]TJ +/F147 9.9626 Tf 391.579 577.576 Td [(Tprec)]TJ ET q 1 0 0 1 418.358 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 421.497 577.576 Td [(type)]TJ +/F147 9.9626 Tf 421.497 577.576 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -28447,21 +28530,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.348 0 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.182 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(pr)18(econditioner)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 196.511 0 Td [(psb)]TJ +/F147 9.9626 Tf 196.511 0 Td [(psb)]TJ ET q 1 0 0 1 388.441 502.059 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 391.579 501.86 Td [(Tprec)]TJ +/F147 9.9626 Tf 391.579 501.86 Td [(Tprec)]TJ ET q 1 0 0 1 418.358 502.059 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 421.497 501.86 Td [(type)]TJ +/F147 9.9626 Tf 421.497 501.86 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -28475,7 +28558,7 @@ ET endstream endobj -2057 0 obj +2060 0 obj << /Length 6107 >> @@ -28493,7 +28576,7 @@ BT /F75 11.9552 Tf 178.907 706.129 Td [(wrk)-250(\227)-250(preconditioner)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -79.012 -18.964 Td [(call)-525(prec%allocate_wrk\050info[,vmold]\051)]TJ +/F147 9.9626 Tf -79.012 -18.964 Td [(call)-525(prec%allocate_wrk\050info[,vmold]\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -28506,55 +28589,55 @@ BT 0 g 0 G /F84 9.9626 Tf 24.349 0 Td [(the)-250(pr)18(econditioner)74(.)]TJ 0.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(pr)18(econditioner)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 196.511 0 Td [(psb)]TJ +/F147 9.9626 Tf 196.511 0 Td [(psb)]TJ ET q 1 0 0 1 337.631 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 340.77 577.576 Td [(Tprec)]TJ +/F147 9.9626 Tf 340.77 577.576 Td [(Tprec)]TJ ET q 1 0 0 1 367.549 577.775 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 370.687 577.576 Td [(type)]TJ +/F147 9.9626 Tf 370.687 577.576 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -291.714 -19.925 Td [(vmold)]TJ 0 g 0 G -/F84 9.9626 Tf 34.013 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(vector)-250(storage.)]TJ -9.106 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(a)-250(class)-250(derived)-250(fr)18(om)]TJ/F145 9.9626 Tf 201.393 0 Td [(psb)]TJ +/F84 9.9626 Tf 34.013 0 Td [(The)-250(desir)18(ed)-250(dynamic)-250(type)-250(for)-250(the)-250(internal)-250(vector)-250(storage.)]TJ -9.106 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(object)-250(of)-250(a)-250(class)-250(derived)-250(fr)18(om)]TJ/F147 9.9626 Tf 201.393 0 Td [(psb)]TJ ET q 1 0 0 1 342.513 510.029 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 345.652 509.83 Td [(T)]TJ +/F147 9.9626 Tf 345.652 509.83 Td [(T)]TJ ET q 1 0 0 1 351.51 510.029 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 354.648 509.83 Td [(base)]TJ +/F147 9.9626 Tf 354.648 509.83 Td [(base)]TJ ET q 1 0 0 1 376.197 510.029 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 379.335 509.83 Td [(vect)]TJ +/F147 9.9626 Tf 379.335 509.83 Td [(vect)]TJ ET q 1 0 0 1 400.884 510.029 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 404.022 509.83 Td [(type)]TJ/F84 9.9626 Tf 20.922 0 Td [(.)]TJ +/F147 9.9626 Tf 404.022 509.83 Td [(type)]TJ/F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -325.049 -19.925 Td [(On)-250(Exit)]TJ 0 g 0 G @@ -28563,21 +28646,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.349 0 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.183 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(pr)18(econditioner)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 196.511 0 Td [(psb)]TJ +/F147 9.9626 Tf 196.511 0 Td [(psb)]TJ ET q 1 0 0 1 337.631 434.313 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 340.77 434.114 Td [(Tprec)]TJ +/F147 9.9626 Tf 340.77 434.114 Td [(Tprec)]TJ ET q 1 0 0 1 367.549 434.313 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 370.687 434.114 Td [(type)]TJ +/F147 9.9626 Tf 370.687 434.114 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -28591,7 +28674,7 @@ BT 0 0 1 rg 0 0 1 RG [-495(13)]TJ 0 g 0 G - [(,)-249(memor)1(y)-248(allocation)-248(and)-248(deallocation)-248(usually)-248(have)-248(a)-247(much)]TJ 1.005 0 0 1 99.895 296.63 Tm [(lar)18(ger)-247(over)18(head,)-248(signi\002cantly)-247(af)18(fecting)-247(performance.)-308(T)92(o)-247(alleviate)-247(this)-247(pr)17(oblem)]TJ 1.02 0 0 1 99.477 284.674 Tm [(we)-301(de\002ne)-300(this)-301(method)-300(that)-301(pr)18(eallocates)-301(internal)-300(storage;)-329(it)-300(is)-301(intended)-300(to)-301(be)]TJ 0.98 0 0 1 99.895 272.719 Tm [(invoked)-245(p)1(rior)-245(to)-244(the)-245(iterative)-244(solver)-245(method,)-246(so)-245(that)-244(the)-245(necessary)-244(internal)-245(work)]TJ 1 0 0 1 99.895 260.764 Tm [(storage)-250(is)-250(available)-250(thr)18(oughout)-250(the)-250(iterative)-250(method)-250(application.)]TJ 1.002 0 0 1 114.839 248.809 Tm [(When)-250(using)-251(GPUs)-250(or)-251(other)-250(specialized)-250(devices,)-251(the)]TJ/F145 9.9626 Tf 1 0 0 1 342.254 248.809 Tm [(vmold)]TJ/F84 9.9626 Tf 1.002 0 0 1 370.906 248.809 Tm [(ar)18(gument)-250(is)-251(also)]TJ 1.019 0 0 1 99.895 236.854 Tm [(necessary)-246(to)-246(ensur)17(e)-246(the)-246(internal)-246(work)-246(vectors)-247(ar)18(e)-246(of)-246(the)-246(appr)17(opriate)-246(dynamic)]TJ 1 0 0 1 99.895 224.899 Tm [(type)-250(to)-250(exploit)-250(the)-250(accelerator)-250(har)18(dwar)18(e.)]TJ + [(,)-249(memor)1(y)-248(allocation)-248(and)-248(deallocation)-248(usually)-248(have)-248(a)-247(much)]TJ 1.005 0 0 1 99.895 296.63 Tm [(lar)18(ger)-247(over)18(head,)-248(signi\002cantly)-247(af)18(fecting)-247(performance.)-308(T)92(o)-247(alleviate)-247(this)-247(pr)17(oblem)]TJ 1.02 0 0 1 99.477 284.674 Tm [(we)-301(de\002ne)-300(this)-301(method)-300(that)-301(pr)18(eallocates)-301(internal)-300(storage;)-329(it)-300(is)-301(intended)-300(to)-301(be)]TJ 0.98 0 0 1 99.895 272.719 Tm [(invoked)-245(p)1(rior)-245(to)-244(the)-245(iterative)-244(solver)-245(method,)-246(so)-245(that)-244(the)-245(necessary)-244(internal)-245(work)]TJ 1 0 0 1 99.895 260.764 Tm [(storage)-250(is)-250(available)-250(thr)18(oughout)-250(the)-250(iterative)-250(method)-250(application.)]TJ 1.002 0 0 1 114.839 248.809 Tm [(When)-250(using)-251(GPUs)-250(or)-251(other)-250(specialized)-250(devices,)-251(the)]TJ/F147 9.9626 Tf 1 0 0 1 342.254 248.809 Tm [(vmold)]TJ/F84 9.9626 Tf 1.002 0 0 1 370.906 248.809 Tm [(ar)18(gument)-250(is)-251(also)]TJ 1.019 0 0 1 99.895 236.854 Tm [(necessary)-246(to)-246(ensur)17(e)-246(the)-246(internal)-246(work)-246(vectors)-247(ar)18(e)-246(of)-246(the)-246(appr)17(opriate)-246(dynamic)]TJ 1 0 0 1 99.895 224.899 Tm [(type)-250(to)-250(exploit)-250(the)-250(accelerator)-250(har)18(dwar)18(e.)]TJ 0 g 0 G 164.384 -134.461 Td [(161)]TJ 0 g 0 G @@ -28599,7 +28682,7 @@ ET endstream endobj -2064 0 obj +2067 0 obj << /Length 3194 >> @@ -28617,7 +28700,7 @@ BT /F75 11.9552 Tf 242.998 706.129 Td [(wrk)-250(\227)-250(preconditioner)]TJ 0 g 0 G 0 g 0 G -/F145 9.9626 Tf -92.293 -18.964 Td [(call)-525(prec%allocate_wrk\050info\051)]TJ 0 -11.955 Td [(call)-525(prec%free_wrk\050info\051)]TJ +/F147 9.9626 Tf -92.293 -18.964 Td [(call)-525(prec%allocate_wrk\050info\051)]TJ 0 -11.955 Td [(call)-525(prec%free_wrk\050info\051)]TJ 0 g 0 G /F75 9.9626 Tf 0 -21.918 Td [(T)90(ype:)]TJ 0 g 0 G @@ -28630,21 +28713,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.348 0 Td [(the)-250(pr)18(econditioner)74(.)]TJ 0.558 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.319 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(pr)18(econditioner)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 196.511 0 Td [(psb)]TJ +/F147 9.9626 Tf 196.511 0 Td [(psb)]TJ ET q 1 0 0 1 388.441 565.82 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 391.579 565.621 Td [(Tprec)]TJ +/F147 9.9626 Tf 391.579 565.621 Td [(Tprec)]TJ ET q 1 0 0 1 418.358 565.82 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 421.497 565.621 Td [(type)]TJ +/F147 9.9626 Tf 421.497 565.621 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -28655,21 +28738,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.348 0 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.182 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(pr)18(econditioner)-250(data)-250(str)8(uctur)18(e)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 196.511 0 Td [(psb)]TJ +/F147 9.9626 Tf 196.511 0 Td [(psb)]TJ ET q 1 0 0 1 388.441 490.104 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 391.579 489.905 Td [(Tprec)]TJ +/F147 9.9626 Tf 391.579 489.905 Td [(Tprec)]TJ ET q 1 0 0 1 418.358 490.104 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 421.497 489.905 Td [(type)]TJ +/F147 9.9626 Tf 421.497 489.905 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -28687,7 +28770,7 @@ ET endstream endobj -2068 0 obj +2071 0 obj << /Length 607 >> @@ -28695,7 +28778,7 @@ stream 0 g 0 G 0 g 0 G BT -/F75 14.3462 Tf 99.895 705.784 Td [(11)-1000(Iterative)-250(Methods)]TJ/F84 9.9626 Tf 1.006 0 0 1 99.895 683.082 Tm [(In)-249(this)-250(chapter)-249(we)-250(pr)18(ovide)-249(r)18(outines)-250(for)-249(pr)18(econditioners)-250(and)-249(iterative)-249(methods.)]TJ 0.98 0 0 1 99.587 671.127 Tm [(The)-194(interfaces)-194(for)-194(it)1(erative)-194(methods)-194(ar)18(e)-194(available)-194(in)-193(the)-194(module)]TJ/F145 9.9626 Tf 1 0 0 1 369.457 671.127 Tm [(psb_linsolve_mod)]TJ/F84 9.9626 Tf 0.98 0 0 1 453.142 671.127 Tm [(.)]TJ +/F75 14.3462 Tf 99.895 705.784 Td [(11)-1000(Iterative)-250(Methods)]TJ/F84 9.9626 Tf 1.006 0 0 1 99.895 683.082 Tm [(In)-249(this)-250(chapter)-249(we)-250(pr)18(ovide)-249(r)18(outines)-250(for)-249(pr)18(econditioners)-250(and)-249(iterative)-249(methods.)]TJ 0.98 0 0 1 99.587 671.127 Tm [(The)-194(interfaces)-194(for)-194(it)1(erative)-194(methods)-194(ar)18(e)-194(available)-194(in)-193(the)-194(module)]TJ/F147 9.9626 Tf 1 0 0 1 369.457 671.127 Tm [(psb_linsolve_mod)]TJ/F84 9.9626 Tf 0.98 0 0 1 453.142 671.127 Tm [(.)]TJ 0 g 0 G 1 0 0 1 264.279 90.438 Tm [(163)]TJ 0 g 0 G @@ -28703,7 +28786,7 @@ ET endstream endobj -2076 0 obj +2079 0 obj << /Length 8466 >> @@ -28722,36 +28805,36 @@ BT 0 g 0 G /F75 9.9626 Tf -14.944 -18.774 Td [(1)]TJ 0 g 0 G -/F84 9.9626 Tf 0.99 0 0 1 160.667 644.481 Tm [(normwise)-253(backwar)19(d)-253(err)18(or)-252(in)-253(the)-252(in\002nity)-253(norm;)-252(the)-253(iteration)-252(is)-253(stopped)-252(when)]TJ/F78 9.9626 Tf 1 0 0 1 269.703 617.617 Tm [(e)-15(r)-25(r)]TJ/F192 10.3811 Tf 15.141 0 Td [(=)]TJ/F190 10.3811 Tf 40.619 6.745 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F78 7.5716 Tf 4.042 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(k)]TJ +/F84 9.9626 Tf 0.99 0 0 1 160.667 644.481 Tm [(normwise)-253(backwar)19(d)-253(err)18(or)-252(in)-253(the)-252(in\002nity)-253(norm;)-252(the)-253(iteration)-252(is)-253(stopped)-252(when)]TJ/F78 9.9626 Tf 1 0 0 1 269.703 617.617 Tm [(e)-15(r)-25(r)]TJ/F197 10.3811 Tf 15.141 0 Td [(=)]TJ/F195 10.3811 Tf 40.619 6.745 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F78 7.5716 Tf 4.042 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(k)]TJ ET q 1 0 0 1 297.001 620.108 cm []0 d 0 J 0.398 w 0 0 m 74.372 0 l S Q BT -/F192 10.3811 Tf 297.125 610.783 Td [(\050)]TJ/F190 10.3811 Tf 4.274 0 Td [(k)]TJ/F78 9.9626 Tf 5.938 0 Td [(A)]TJ/F190 10.3811 Tf 7.442 0 Td [(k)-24(k)]TJ/F78 9.9626 Tf 11.048 0 Td [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(k)]TJ/F192 10.3811 Tf 7.377 0 Td [(+)]TJ/F190 10.3811 Tf 10.255 0 Td [(k)]TJ/F78 9.9626 Tf 5.44 0 Td [(b)]TJ/F190 10.3811 Tf 4.862 0 Td [(k)]TJ/F192 10.3811 Tf 5.439 0 Td [(\051)]TJ/F148 10.3811 Tf 8.237 6.834 Td [(<)]TJ/F78 9.9626 Tf 11.086 0 Td [(e)-80(p)-25(s)]TJ +/F197 10.3811 Tf 297.125 610.783 Td [(\050)]TJ/F195 10.3811 Tf 4.274 0 Td [(k)]TJ/F78 9.9626 Tf 5.938 0 Td [(A)]TJ/F195 10.3811 Tf 7.442 0 Td [(k)-24(k)]TJ/F78 9.9626 Tf 11.048 0 Td [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(k)]TJ/F197 10.3811 Tf 7.377 0 Td [(+)]TJ/F195 10.3811 Tf 10.255 0 Td [(k)]TJ/F78 9.9626 Tf 5.44 0 Td [(b)]TJ/F195 10.3811 Tf 4.862 0 Td [(k)]TJ/F197 10.3811 Tf 5.439 0 Td [(\051)]TJ/F152 10.3811 Tf 8.237 6.834 Td [(<)]TJ/F78 9.9626 Tf 11.086 0 Td [(e)-80(p)-25(s)]TJ 0 g 0 G /F75 9.9626 Tf -235.841 -29.908 Td [(2)]TJ 0 g 0 G -/F84 9.9626 Tf 9.963 0 Td [(Relative)-250(r)18(esidual)-250(in)-250(the)-250(2-norm;)-250(the)-250(iteration)-250(is)-250(stopped)-250(when)]TJ/F78 9.9626 Tf 136.209 -26.865 Td [(e)-15(r)-25(r)]TJ/F192 10.3811 Tf 15.14 0 Td [(=)]TJ/F190 10.3811 Tf 13.446 6.745 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F78 7.5716 Tf 4.042 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(k)]TJ +/F84 9.9626 Tf 9.963 0 Td [(Relative)-250(r)18(esidual)-250(in)-250(the)-250(2-norm;)-250(the)-250(iteration)-250(is)-250(stopped)-250(when)]TJ/F78 9.9626 Tf 136.209 -26.865 Td [(e)-15(r)-25(r)]TJ/F197 10.3811 Tf 15.14 0 Td [(=)]TJ/F195 10.3811 Tf 13.446 6.745 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F78 7.5716 Tf 4.042 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(k)]TJ ET q 1 0 0 1 324.174 563.335 cm []0 d 0 J 0.398 w 0 0 m 20.025 0 l S Q BT -/F190 10.3811 Tf 324.299 554.01 Td [(k)]TJ/F78 9.9626 Tf 5.439 0 Td [(b)]TJ/F190 10.3811 Tf 4.862 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.744 Td [(2)]TJ/F148 10.3811 Tf 8.371 8.578 Td [(<)]TJ/F78 9.9626 Tf 11.086 0 Td [(e)-80(p)-25(s)]TJ +/F195 10.3811 Tf 324.299 554.01 Td [(k)]TJ/F78 9.9626 Tf 5.439 0 Td [(b)]TJ/F195 10.3811 Tf 4.862 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.744 Td [(2)]TJ/F152 10.3811 Tf 8.371 8.578 Td [(<)]TJ/F78 9.9626 Tf 11.086 0 Td [(e)-80(p)-25(s)]TJ 0 g 0 G /F75 9.9626 Tf -208.667 -29.848 Td [(3)]TJ 0 g 0 G -/F84 9.9626 Tf 9.962 0 Td [(Relative)-250(r)18(esidual)-250(r)18(eduction)-250(in)-250(the)-250(2-norm;)-250(the)-250(iteration)-250(is)-250(stopped)-250(when)]TJ/F78 9.9626 Tf 134.486 -26.865 Td [(e)-15(r)-25(r)]TJ/F192 10.3811 Tf 15.141 0 Td [(=)]TJ/F190 10.3811 Tf 15.169 6.745 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F78 7.5716 Tf 4.042 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(k)]TJ +/F84 9.9626 Tf 9.962 0 Td [(Relative)-250(r)18(esidual)-250(r)18(eduction)-250(in)-250(the)-250(2-norm;)-250(the)-250(iteration)-250(is)-250(stopped)-250(when)]TJ/F78 9.9626 Tf 134.486 -26.865 Td [(e)-15(r)-25(r)]TJ/F197 10.3811 Tf 15.141 0 Td [(=)]TJ/F195 10.3811 Tf 15.169 6.745 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F78 7.5716 Tf 4.042 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(k)]TJ ET q 1 0 0 1 322.451 506.622 cm []0 d 0 J 0.398 w 0 0 m 23.472 0 l S Q BT -/F190 10.3811 Tf 322.575 497.297 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F84 7.5716 Tf 4 -1.744 Td [(0)]TJ/F190 10.3811 Tf 4.409 1.744 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.744 Td [(2)]TJ/F148 10.3811 Tf 8.371 8.578 Td [(<)]TJ/F78 9.9626 Tf 11.086 0 Td [(e)-80(p)-25(s)]TJ/F84 9.9626 Tf 1.02 0 0 1 150.396 474.283 Tm [(The)-333(behaviour)-333(is)-333(contr)18(olled)-333(by)-333(the)-333(istop)-333(ar)18(gument)-333(\050see)-333(later\051.)-567(In)-333(the)-333(above)]TJ 0.98 0 0 1 150.705 462.327 Tm [(formulae,)]TJ/F78 9.9626 Tf 1 0 0 1 194.836 462.327 Tm [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F84 9.9626 Tf 0.98 0 0 1 204.675 462.327 Tm [(is)-199(the)-199(tentative)-198(solution)-199(and)]TJ/F78 9.9626 Tf 1 0 0 1 324.514 462.327 Tm [(r)]TJ/F78 7.5716 Tf 4.042 -1.96 Td [(i)]TJ/F192 10.3811 Tf 5.642 1.96 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(b)]TJ/F190 10.3811 Tf 6.29 0 Td [(\000)]TJ/F78 9.9626 Tf 10.245 0 Td [(A)-42(x)]TJ/F78 7.5716 Tf 12.759 -1.96 Td [(i)]TJ/F84 9.9626 Tf 0.98 0 0 1 379.269 462.327 Tm [(the)-199(corr)19(esponding)-199(r)18(esidual)]TJ 1 0 0 1 150.705 450.372 Tm [(at)-250(the)]TJ/F78 9.9626 Tf 27.083 0 Td [(i)]TJ/F84 9.9626 Tf 2.964 0 Td [(-th)-250(iteration.)]TJ -28.306 -17.357 Td [(c)-175(a)-175(l)-174(l)-880(p)-105(s)-105(b)]TJ +/F195 10.3811 Tf 322.575 497.297 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F84 7.5716 Tf 4 -1.744 Td [(0)]TJ/F195 10.3811 Tf 4.409 1.744 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.744 Td [(2)]TJ/F152 10.3811 Tf 8.371 8.578 Td [(<)]TJ/F78 9.9626 Tf 11.086 0 Td [(e)-80(p)-25(s)]TJ/F84 9.9626 Tf 1.02 0 0 1 150.396 474.283 Tm [(The)-333(behaviour)-333(is)-333(contr)18(olled)-333(by)-333(the)-333(istop)-333(ar)18(gument)-333(\050see)-333(later\051.)-567(In)-333(the)-333(above)]TJ 0.98 0 0 1 150.705 462.327 Tm [(formulae,)]TJ/F78 9.9626 Tf 1 0 0 1 194.836 462.327 Tm [(x)]TJ/F78 7.5716 Tf 5.148 -1.96 Td [(i)]TJ/F84 9.9626 Tf 0.98 0 0 1 204.675 462.327 Tm [(is)-199(the)-199(tentative)-198(solution)-199(and)]TJ/F78 9.9626 Tf 1 0 0 1 324.514 462.327 Tm [(r)]TJ/F78 7.5716 Tf 4.042 -1.96 Td [(i)]TJ/F197 10.3811 Tf 5.642 1.96 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(b)]TJ/F195 10.3811 Tf 6.29 0 Td [(\000)]TJ/F78 9.9626 Tf 10.245 0 Td [(A)-42(x)]TJ/F78 7.5716 Tf 12.759 -1.96 Td [(i)]TJ/F84 9.9626 Tf 0.98 0 0 1 379.269 462.327 Tm [(the)-199(corr)19(esponding)-199(r)18(esidual)]TJ 1 0 0 1 150.705 450.372 Tm [(at)-250(the)]TJ/F78 9.9626 Tf 27.083 0 Td [(i)]TJ/F84 9.9626 Tf 2.964 0 Td [(-th)-250(iteration.)]TJ -28.306 -17.357 Td [(c)-175(a)-175(l)-174(l)-880(p)-105(s)-105(b)]TJ ET q 1 0 0 1 201.089 433.215 cm @@ -28820,21 +28903,21 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(sparse)-250(matrix)]TJ/F78 9.9626 Tf 178.414 0 Td [(A)]TJ/F84 9.9626 Tf 7.318 0 Td [(.)]TJ -170.788 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 138.701 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 138.501 Td [(Tspmat)]TJ +/F147 9.9626 Tf 363.206 138.501 Td [(Tspmat)]TJ ET q 1 0 0 1 395.216 138.701 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 398.354 138.501 Td [(type)]TJ +/F147 9.9626 Tf 398.354 138.501 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -28844,7 +28927,7 @@ q []0 d 0 J 0.398 w 0 0 m 137.482 0 l S Q BT -/F84 5.9776 Tf 161.564 123.219 Td [(5)]TJ/F84 7.9701 Tf 3.487 -2.893 Td [(Note:)-310(the)-250(implementation)-250(is)-250(for)]TJ/F78 7.9701 Tf 113.298 0 Td [(F)-31(C)-45(G)]TJ/F192 8.3049 Tf 16.386 0 Td [(\050)]TJ/F84 7.9701 Tf 3.32 0 Td [(1)]TJ/F192 8.3049 Tf 4.085 0 Td [(\051)]TJ/F84 7.9701 Tf 3.319 0 Td [(.)]TJ +/F84 5.9776 Tf 161.564 123.219 Td [(5)]TJ/F84 7.9701 Tf 3.487 -2.893 Td [(Note:)-310(the)-250(implementation)-250(is)-250(for)]TJ/F78 7.9701 Tf 113.298 0 Td [(F)-31(C)-45(G)]TJ/F197 8.3049 Tf 16.386 0 Td [(\050)]TJ/F84 7.9701 Tf 3.32 0 Td [(1)]TJ/F197 8.3049 Tf 4.085 0 Td [(\051)]TJ/F84 7.9701 Tf 3.319 0 Td [(.)]TJ 0 g 0 G 0 g 0 G /F84 9.9626 Tf 9.629 -29.888 Td [(164)]TJ @@ -28853,7 +28936,7 @@ ET endstream endobj -2087 0 obj +2090 0 obj << /Length 7173 >> @@ -28866,21 +28949,21 @@ BT 0 g 0 G /F84 9.9626 Tf 24.04 0 Td [(The)-250(data)-250(str)8(uctur)18(e)-250(containing)-250(the)-250(pr)18(econditioner)74(.)]TJ 0.867 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 658.507 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 658.308 Td [(Tprec)]TJ +/F147 9.9626 Tf 312.397 658.308 Td [(Tprec)]TJ ET q 1 0 0 1 339.176 658.507 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 342.314 658.308 Td [(type)]TJ +/F147 9.9626 Tf 342.314 658.308 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -28888,28 +28971,28 @@ BT 0 g 0 G /F84 9.9626 Tf 10.76 0 Td [(The)-250(RHS)-250(vector)74(.)]TJ 14.147 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(array)-250(or)-250(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 218.688 0 Td [(psb)]TJ +/F147 9.9626 Tf 218.688 0 Td [(psb)]TJ ET q 1 0 0 1 359.808 588.484 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 362.947 588.285 Td [(T)]TJ +/F147 9.9626 Tf 362.947 588.285 Td [(T)]TJ ET q 1 0 0 1 368.804 588.484 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 371.943 588.285 Td [(vect)]TJ +/F147 9.9626 Tf 371.943 588.285 Td [(vect)]TJ ET q 1 0 0 1 393.492 588.484 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 396.63 588.285 Td [(type)]TJ +/F147 9.9626 Tf 396.63 588.285 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -28917,28 +29000,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(initial)-250(guess.)]TJ 15.253 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(inout)]TJ/F84 9.9626 Tf 24.349 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(array)-250(or)-250(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 218.688 0 Td [(psb)]TJ +/F147 9.9626 Tf 218.688 0 Td [(psb)]TJ ET q 1 0 0 1 359.808 518.461 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 362.947 518.262 Td [(T)]TJ +/F147 9.9626 Tf 362.947 518.262 Td [(T)]TJ ET q 1 0 0 1 368.804 518.461 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 371.943 518.262 Td [(vect)]TJ +/F147 9.9626 Tf 371.943 518.262 Td [(vect)]TJ ET q 1 0 0 1 393.492 518.461 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 396.63 518.262 Td [(type)]TJ +/F147 9.9626 Tf 396.63 518.262 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -28957,35 +29040,35 @@ BT 0 g 0 G /F84 9.9626 Tf 9.963 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 309.258 378.415 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 378.216 Td [(desc)]TJ +/F147 9.9626 Tf 312.397 378.216 Td [(desc)]TJ ET q 1 0 0 1 333.945 378.415 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 337.084 378.216 Td [(type)]TJ +/F147 9.9626 Tf 337.084 378.216 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -258.11 -22.203 Td [(itmax)]TJ 0 g 0 G -/F84 9.9626 Tf 30.127 0 Td [(The)-250(maximum)-250(number)-250(of)-250(iterations)-250(to)-250(perform.)]TJ -5.22 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F78 9.9626 Tf 38.57 0 Td [(i)-32(t)-25(m)-40(a)-42(x)]TJ/F192 10.3811 Tf 27.743 0 Td [(=)]TJ/F84 9.9626 Tf 10.962 0 Td [(1000.)]TJ -77.275 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(variable)]TJ/F78 9.9626 Tf 142.349 0 Td [(i)-32(t)-25(m)-40(a)-42(x)]TJ/F190 10.3811 Tf 27.744 0 Td [(\025)]TJ/F84 9.9626 Tf 10.961 0 Td [(1.)]TJ +/F84 9.9626 Tf 30.127 0 Td [(The)-250(maximum)-250(number)-250(of)-250(iterations)-250(to)-250(perform.)]TJ -5.22 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F78 9.9626 Tf 38.57 0 Td [(i)-32(t)-25(m)-40(a)-42(x)]TJ/F197 10.3811 Tf 27.743 0 Td [(=)]TJ/F84 9.9626 Tf 10.962 0 Td [(1000.)]TJ -77.275 -11.956 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(variable)]TJ/F78 9.9626 Tf 142.349 0 Td [(i)-32(t)-25(m)-40(a)-42(x)]TJ/F195 10.3811 Tf 27.744 0 Td [(\025)]TJ/F84 9.9626 Tf 10.961 0 Td [(1.)]TJ 0 g 0 G /F75 9.9626 Tf -205.961 -22.202 Td [(itrace)]TJ 0 g 0 G -/F84 9.9626 Tf 0.98 0 0 1 129.773 274.035 Tm [(If)]TJ/F148 10.3811 Tf 1 0 0 1 138.672 274.035 Tm [(>)]TJ/F84 9.9626 Tf 0.98 0 0 1 149.634 274.035 Tm [(0)-229(print)-228(out)-229(an)-229(informational)-228(message)-229(about)-229(conver)19(gence)-229(every)]TJ/F78 9.9626 Tf 1 0 0 1 419.702 274.035 Tm [(i)-32(t)-15(r)-50(a)-25(c)-25(e)]TJ/F84 9.9626 Tf -294.9 -11.955 Td [(iterations.)-310(If)]TJ/F192 10.3811 Tf 56.313 0 Td [(=)]TJ/F84 9.9626 Tf 10.962 0 Td [(0)-250(print)-250(a)-250(message)-250(in)-250(case)-250(of)-250(conver)18(gence)-250(failur)18(e.)]TJ -67.275 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F78 9.9626 Tf 38.57 0 Td [(i)-32(t)-15(r)-50(a)-25(c)-25(e)]TJ/F192 10.3811 Tf 26.797 0 Td [(=)]TJ/F190 10.3811 Tf 11.086 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1.)]TJ +/F84 9.9626 Tf 0.98 0 0 1 129.773 274.035 Tm [(If)]TJ/F152 10.3811 Tf 1 0 0 1 138.672 274.035 Tm [(>)]TJ/F84 9.9626 Tf 0.98 0 0 1 149.634 274.035 Tm [(0)-229(print)-228(out)-229(an)-229(informational)-228(message)-229(about)-229(conver)19(gence)-229(every)]TJ/F78 9.9626 Tf 1 0 0 1 419.702 274.035 Tm [(i)-32(t)-15(r)-50(a)-25(c)-25(e)]TJ/F84 9.9626 Tf -294.9 -11.955 Td [(iterations.)-310(If)]TJ/F197 10.3811 Tf 56.313 0 Td [(=)]TJ/F84 9.9626 Tf 10.962 0 Td [(0)-250(print)-250(a)-250(message)-250(in)-250(case)-250(of)-250(conver)18(gence)-250(failur)18(e.)]TJ -67.275 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F78 9.9626 Tf 38.57 0 Td [(i)-32(t)-15(r)-50(a)-25(c)-25(e)]TJ/F197 10.3811 Tf 26.797 0 Td [(=)]TJ/F195 10.3811 Tf 11.086 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1.)]TJ 0 g 0 G /F75 9.9626 Tf -109.554 -34.158 Td [(irst)]TJ 0 g 0 G -/F84 9.9626 Tf 19.527 0 Td [(An)-250(integer)-250(specifying)-250(the)-250(r)18(estart)-250(parameter)74(.)]TJ 5.38 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.443 132.281 Tm [(V)90(alues:)]TJ/F78 9.9626 Tf 1 0 0 1 162.528 132.281 Tm [(i)-22(r)-35(s)-25(t)]TJ/F148 10.3811 Tf 20.115 0 Td [(>)]TJ/F84 9.9626 Tf 1.02 0 0 1 196.049 132.281 Tm [(0.)-694(Th)1(is)-375(is)-375(employed)-375(for)-375(the)-375(BiCGST)72(ABL)-375(or)-374(RGMRES)]TJ 1 0 0 1 124.802 120.326 Tm [(methods,)-250(otherwise)-250(it)-250(is)-250(ignor)18(ed.)]TJ +/F84 9.9626 Tf 19.527 0 Td [(An)-250(integer)-250(specifying)-250(the)-250(r)18(estart)-250(parameter)74(.)]TJ 5.38 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.02 0 0 1 124.443 132.281 Tm [(V)90(alues:)]TJ/F78 9.9626 Tf 1 0 0 1 162.528 132.281 Tm [(i)-22(r)-35(s)-25(t)]TJ/F152 10.3811 Tf 20.115 0 Td [(>)]TJ/F84 9.9626 Tf 1.02 0 0 1 196.049 132.281 Tm [(0.)-694(Th)1(is)-375(is)-375(employed)-375(for)-375(the)-375(BiCGST)72(ABL)-375(or)-374(RGMRES)]TJ 1 0 0 1 124.802 120.326 Tm [(methods,)-250(otherwise)-250(it)-250(is)-250(ignor)18(ed.)]TJ 0 g 0 G 139.477 -29.888 Td [(165)]TJ 0 g 0 G @@ -28993,7 +29076,7 @@ ET endstream endobj -2092 0 obj +2095 0 obj << /Length 4580 >> @@ -29013,28 +29096,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(computed)-250(solution.)]TJ 15.252 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(array)-250(or)-250(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 218.688 0 Td [(psb)]TJ +/F147 9.9626 Tf 218.688 0 Td [(psb)]TJ ET q 1 0 0 1 410.618 558.881 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 413.756 558.682 Td [(T)]TJ +/F147 9.9626 Tf 413.756 558.682 Td [(T)]TJ ET q 1 0 0 1 419.614 558.881 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.752 558.682 Td [(vect)]TJ +/F147 9.9626 Tf 422.752 558.682 Td [(vect)]TJ ET q 1 0 0 1 444.301 558.881 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 447.439 558.682 Td [(type)]TJ +/F147 9.9626 Tf 447.439 558.682 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -29060,9 +29143,9 @@ ET endstream endobj -2100 0 obj +2104 0 obj << -/Length 8759 +/Length 8778 >> stream 0 g 0 G @@ -29075,134 +29158,138 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 156.993 706.129 Td [(richardson)-250(\227)-250(Richardson)-250(Iteration)-250(Driver)-250(Routine)]TJ/F84 9.9626 Tf -57.406 -19.209 Td [(This)-250(subr)18(outine)-250(is)-250(a)-250(driver)-250(implementig)-250(a)-250(Richar)18(dson)-250(iteration)]TJ/F78 9.9626 Tf 111.157 -22.171 Td [(x)]TJ/F78 7.5716 Tf 5.2 -2.085 Td [(k)]TJ/F192 7.8896 Tf 3.589 0 Td [(+)]TJ/F84 7.5716 Tf 6.228 0 Td [(1)]TJ/F192 10.3811 Tf 7.176 2.085 Td [(=)]TJ/F78 9.9626 Tf 11.534 0 Td [(M)]TJ/F190 7.8896 Tf 9.674 4.115 Td [(\000)]TJ/F84 9.9626 Tf 6.726 -4.115 Td [(1)]TJ/F192 10.3811 Tf 5.105 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(b)]TJ/F190 10.3811 Tf 6.799 0 Td [(\000)]TJ/F78 9.9626 Tf 10.754 0 Td [(A)-42(x)]TJ/F78 7.5716 Tf 12.812 -2.085 Td [(k)]TJ/F192 10.3811 Tf 4.117 2.085 Td [(\051)-209(+)]TJ/F78 9.9626 Tf 16.636 0 Td [(x)]TJ/F78 7.5716 Tf 5.201 -2.085 Td [(k)]TJ/F84 9.9626 Tf 3.992 2.085 Td [(,)]TJ -231.084 -22.17 Td [(with)-250(the)-250(pr)18(econditioner)-250(operator)]TJ/F78 9.9626 Tf 147.599 0 Td [(M)]TJ/F84 9.9626 Tf 12.07 0 Td [(de\002ned)-250(in)-250(the)-250(pr)18(evious)-250(section.)]TJ -144.307 -12.082 Td [(The)-250(stopping)-250(criterion)-250(can)-250(take)-250(the)-250(following)-250(values:)]TJ +/F75 11.9552 Tf 156.993 706.129 Td [(richardson)-250(\227)-250(Richardson)-250(Iteration)-250(Driver)-250(Routine)]TJ/F84 9.9626 Tf -57.406 -19.162 Td [(This)-250(subr)18(outine)-250(is)-250(a)-250(driver)-250(implementig)-250(a)-250(Richar)18(dson)-250(iteration)]TJ/F78 9.9626 Tf 111.755 -23.373 Td [(x)]TJ/F78 7.5716 Tf 5.2 -2.085 Td [(k)]TJ/F197 7.8896 Tf 3.589 0 Td [(+)]TJ/F84 7.5716 Tf 6.228 0 Td [(1)]TJ/F197 10.3811 Tf 7.176 2.085 Td [(=)]TJ/F78 9.9626 Tf 11.534 0 Td [(M)]TJ/F195 7.8896 Tf 9.674 4.115 Td [(\000)]TJ/F84 7.5716 Tf 6.227 0 Td [(1)]TJ/F197 10.3811 Tf 4.409 -4.115 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(b)]TJ/F195 10.3811 Tf 6.798 0 Td [(\000)]TJ/F78 9.9626 Tf 10.754 0 Td [(A)-42(x)]TJ/F78 7.5716 Tf 12.812 -2.085 Td [(k)]TJ/F197 10.3811 Tf 4.117 2.085 Td [(\051)-209(+)]TJ/F78 9.9626 Tf 16.636 0 Td [(x)]TJ/F78 7.5716 Tf 5.201 -2.085 Td [(k)]TJ/F84 9.9626 Tf 3.992 2.085 Td [(,)]TJ -230.486 -22.122 Td [(with)-250(the)-250(pr)18(econditioner)-250(operator)]TJ/F78 9.9626 Tf 147.599 0 Td [(M)]TJ/F84 9.9626 Tf 12.07 0 Td [(de\002ned)-250(in)-250(section)]TJ +0 0 1 rg 0 0 1 RG + [-250(10)]TJ +0 g 0 G + [(.)]TJ -144.307 -12.058 Td [(The)-250(stopping)-250(criterion)-250(can)-250(take)-250(the)-250(following)-250(values:)]TJ 0 g 0 G -/F75 9.9626 Tf -14.944 -20.304 Td [(1)]TJ +/F75 9.9626 Tf -14.944 -20.232 Td [(1)]TJ 0 g 0 G -/F84 9.9626 Tf 0.99 0 0 1 109.858 610.193 Tm [(normwise)-252(backwar)18(d)-253(err)18(or)-252(in)-253(the)-252(in\002nity)-253(norm;)-252(the)-253(iteration)-252(is)-253(stopped)-252(when)]TJ/F78 9.9626 Tf 1 0 0 1 218.894 581.636 Tm [(e)-15(r)-25(r)]TJ/F192 10.3811 Tf 15.14 0 Td [(=)]TJ/F190 10.3811 Tf 40.62 6.745 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F78 7.5716 Tf 4.041 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(k)]TJ +/F84 9.9626 Tf 0.99 0 0 1 109.858 609.182 Tm [(normwise)-252(backwar)18(d)-253(err)18(or)-252(in)-253(the)-252(in\002nity)-253(norm;)-252(the)-253(iteration)-252(is)-253(stopped)-252(when)]TJ/F78 9.9626 Tf 1 0 0 1 218.894 580.673 Tm [(e)-15(r)-25(r)]TJ/F197 10.3811 Tf 15.14 0 Td [(=)]TJ/F195 10.3811 Tf 40.62 6.745 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F78 7.5716 Tf 4.041 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(k)]TJ ET q -1 0 0 1 246.191 584.127 cm +1 0 0 1 246.191 583.164 cm []0 d 0 J 0.398 w 0 0 m 74.372 0 l S Q BT -/F192 10.3811 Tf 246.316 574.802 Td [(\050)]TJ/F190 10.3811 Tf 4.274 0 Td [(k)]TJ/F78 9.9626 Tf 5.938 0 Td [(A)]TJ/F190 10.3811 Tf 7.442 0 Td [(k)-24(k)]TJ/F78 9.9626 Tf 11.048 0 Td [(x)]TJ/F78 7.5716 Tf 5.147 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.876 1.96 Td [(k)]TJ/F192 10.3811 Tf 7.376 0 Td [(+)]TJ/F190 10.3811 Tf 10.256 0 Td [(k)]TJ/F78 9.9626 Tf 5.44 0 Td [(b)]TJ/F190 10.3811 Tf 4.861 0 Td [(k)]TJ/F192 10.3811 Tf 5.44 0 Td [(\051)]TJ/F148 10.3811 Tf 8.236 6.834 Td [(<)]TJ/F78 9.9626 Tf 11.087 0 Td [(e)-80(p)-25(s)]TJ +/F197 10.3811 Tf 246.316 573.839 Td [(\050)]TJ/F195 10.3811 Tf 4.274 0 Td [(k)]TJ/F78 9.9626 Tf 5.938 0 Td [(A)]TJ/F195 10.3811 Tf 7.442 0 Td [(k)-24(k)]TJ/F78 9.9626 Tf 11.048 0 Td [(x)]TJ/F78 7.5716 Tf 5.147 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.876 1.96 Td [(k)]TJ/F197 10.3811 Tf 7.376 0 Td [(+)]TJ/F195 10.3811 Tf 10.256 0 Td [(k)]TJ/F78 9.9626 Tf 5.44 0 Td [(b)]TJ/F195 10.3811 Tf 4.861 0 Td [(k)]TJ/F197 10.3811 Tf 5.44 0 Td [(\051)]TJ/F152 10.3811 Tf 8.236 6.834 Td [(<)]TJ/F78 9.9626 Tf 11.087 0 Td [(e)-80(p)-25(s)]TJ 0 g 0 G -/F75 9.9626 Tf -235.842 -32.142 Td [(2)]TJ +/F75 9.9626 Tf -235.842 -32.045 Td [(2)]TJ 0 g 0 G -/F84 9.9626 Tf 9.963 0 Td [(Relative)-250(r)18(esidual)-250(in)-250(the)-250(2-norm;)-250(the)-250(iteration)-250(is)-250(stopped)-250(when)]TJ/F78 9.9626 Tf 136.209 -28.557 Td [(e)-15(r)-25(r)]TJ/F192 10.3811 Tf 15.141 0 Td [(=)]TJ/F190 10.3811 Tf 13.446 6.745 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F78 7.5716 Tf 4.041 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(k)]TJ +/F84 9.9626 Tf 9.963 0 Td [(Relative)-250(r)18(esidual)-250(in)-250(the)-250(2-norm;)-250(the)-250(iteration)-250(is)-250(stopped)-250(when)]TJ/F78 9.9626 Tf 136.209 -28.509 Td [(e)-15(r)-25(r)]TJ/F197 10.3811 Tf 15.141 0 Td [(=)]TJ/F195 10.3811 Tf 13.446 6.745 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F78 7.5716 Tf 4.041 -1.96 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.96 Td [(k)]TJ ET q -1 0 0 1 273.365 523.428 cm +1 0 0 1 273.365 522.61 cm []0 d 0 J 0.398 w 0 0 m 20.025 0 l S Q BT -/F190 10.3811 Tf 273.49 514.103 Td [(k)]TJ/F78 9.9626 Tf 5.439 0 Td [(b)]TJ/F190 10.3811 Tf 4.862 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.744 Td [(2)]TJ/F148 10.3811 Tf 8.371 8.578 Td [(<)]TJ/F78 9.9626 Tf 11.086 0 Td [(e)-80(p)-25(s)]TJ +/F195 10.3811 Tf 273.49 513.285 Td [(k)]TJ/F78 9.9626 Tf 5.439 0 Td [(b)]TJ/F195 10.3811 Tf 4.862 0 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.744 Td [(2)]TJ/F152 10.3811 Tf 8.371 8.578 Td [(<)]TJ/F78 9.9626 Tf 11.086 0 Td [(e)-80(p)-25(s)]TJ 0 g 0 G -/F75 9.9626 Tf -208.668 -32.082 Td [(3)]TJ +/F75 9.9626 Tf -208.668 -31.986 Td [(3)]TJ 0 g 0 G -/F84 9.9626 Tf 9.963 0 Td [(Relative)-250(r)18(esidual)-250(r)18(eduction)-250(in)-250(the)-250(2-norm;)-250(the)-250(iteration)-250(is)-250(stopped)-250(when)]TJ/F78 9.9626 Tf 134.486 -28.556 Td [(e)-15(r)-25(r)]TJ/F192 10.3811 Tf 15.14 0 Td [(=)]TJ/F190 10.3811 Tf 15.17 6.744 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F78 7.5716 Tf 4.041 -1.96 Td [(i)]TJ/F190 10.3811 Tf 2.875 1.96 Td [(k)]TJ +/F84 9.9626 Tf 9.963 0 Td [(Relative)-250(r)18(esidual)-250(r)18(eduction)-250(in)-250(the)-250(2-norm;)-250(the)-250(iteration)-250(is)-250(stopped)-250(when)]TJ/F78 9.9626 Tf 134.486 -28.508 Td [(e)-15(r)-25(r)]TJ/F197 10.3811 Tf 15.14 0 Td [(=)]TJ/F195 10.3811 Tf 15.17 6.745 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F78 7.5716 Tf 4.041 -1.961 Td [(i)]TJ/F195 10.3811 Tf 2.875 1.961 Td [(k)]TJ ET q -1 0 0 1 271.641 462.789 cm +1 0 0 1 271.641 462.115 cm []0 d 0 J 0.398 w 0 0 m 23.472 0 l S Q BT -/F190 10.3811 Tf 271.766 453.464 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F84 7.5716 Tf 4 -1.744 Td [(0)]TJ/F190 10.3811 Tf 4.408 1.744 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.744 Td [(2)]TJ/F148 10.3811 Tf 8.371 8.579 Td [(<)]TJ/F78 9.9626 Tf 11.086 0 Td [(e)-80(p)-25(s)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 428.217 Tm [(The)-333(behaviour)-333(is)-333(contr)18(olled)-333(by)-333(the)-333(istop)-333(ar)18(gument)-333(\050see)-333(later\051.)-567(In)-333(the)-333(above)]TJ 0.98 0 0 1 99.895 416.261 Tm [(formulae,)]TJ/F78 9.9626 Tf 1 0 0 1 144.027 416.261 Tm [(x)]TJ/F78 7.5716 Tf 5.147 -1.96 Td [(i)]TJ/F84 9.9626 Tf 0.98 0 0 1 153.866 416.261 Tm [(is)-199(the)-199(tentat)1(ive)-199(solution)-199(and)]TJ/F78 9.9626 Tf 1 0 0 1 273.705 416.261 Tm [(r)]TJ/F78 7.5716 Tf 4.041 -1.96 Td [(i)]TJ/F192 10.3811 Tf 5.643 1.96 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(b)]TJ/F190 10.3811 Tf 6.29 0 Td [(\000)]TJ/F78 9.9626 Tf 10.245 0 Td [(A)-42(x)]TJ/F78 7.5716 Tf 12.758 -1.96 Td [(i)]TJ/F84 9.9626 Tf 0.98 0 0 1 328.46 416.261 Tm [(the)-199(corr)19(esponding)-199(r)18(esidual)]TJ 1 0 0 1 99.895 404.306 Tm [(at)-250(the)]TJ/F78 9.9626 Tf 27.083 0 Td [(i)]TJ/F84 9.9626 Tf 2.964 0 Td [(-th)-250(iteration.)]TJ -28.305 -18.185 Td [(c)-175(a)-175(l)-174(l)-888(p)-113(s)-113(b)]TJ +/F195 10.3811 Tf 271.766 452.79 Td [(k)]TJ/F78 9.9626 Tf 5.34 0 Td [(r)]TJ/F84 7.5716 Tf 4 -1.744 Td [(0)]TJ/F195 10.3811 Tf 4.408 1.744 Td [(k)]TJ/F84 7.5716 Tf 5.315 -1.744 Td [(2)]TJ/F152 10.3811 Tf 8.371 8.579 Td [(<)]TJ/F78 9.9626 Tf 11.086 0 Td [(e)-80(p)-25(s)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.587 427.639 Tm [(The)-333(behaviour)-333(is)-333(contr)18(olled)-333(by)-333(the)-333(istop)-333(ar)18(gument)-333(\050see)-333(later\051.)-567(In)-333(the)-333(above)]TJ 0.98 0 0 1 99.895 415.684 Tm [(formulae,)]TJ/F78 9.9626 Tf 1 0 0 1 144.027 415.684 Tm [(x)]TJ/F78 7.5716 Tf 5.147 -1.96 Td [(i)]TJ/F84 9.9626 Tf 0.98 0 0 1 153.866 415.684 Tm [(is)-199(the)-199(tentat)1(ive)-199(solution)-199(and)]TJ/F78 9.9626 Tf 1 0 0 1 273.705 415.684 Tm [(r)]TJ/F78 7.5716 Tf 4.041 -1.96 Td [(i)]TJ/F197 10.3811 Tf 5.643 1.96 Td [(=)]TJ/F78 9.9626 Tf 11.086 0 Td [(b)]TJ/F195 10.3811 Tf 6.29 0 Td [(\000)]TJ/F78 9.9626 Tf 10.245 0 Td [(A)-42(x)]TJ/F78 7.5716 Tf 12.758 -1.96 Td [(i)]TJ/F84 9.9626 Tf 0.98 0 0 1 328.46 415.684 Tm [(the)-199(corr)19(esponding)-199(r)18(esidual)]TJ 1 0 0 1 99.895 403.729 Tm [(at)-250(the)]TJ/F78 9.9626 Tf 27.083 0 Td [(i)]TJ/F84 9.9626 Tf 2.964 0 Td [(-th)-250(iteration.)]TJ -28.305 -18.138 Td [(c)-175(a)-175(l)-174(l)-888(p)-113(s)-113(b)]TJ ET q -1 0 0 1 150.598 386.32 cm +1 0 0 1 150.598 385.79 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F84 9.9626 Tf 154.71 386.121 Td [(r)-113(i)-113(c)-112(h)-113(a)-113(r)-113(d)-113(s)-113(o)-112(n)-247(\050)-166(a)-242(,)-255(p)-80(r)-81(e)-80(c)-335(,)-191(b)-206(,)-203(x)-231(,)-234(e)-60(p)-59(s)-293(,)-273(d)-98(e)-98(s)-97(c)]TJ +/F84 9.9626 Tf 154.71 385.591 Td [(r)-113(i)-113(c)-112(h)-113(a)-113(r)-113(d)-113(s)-113(o)-112(n)-247(\050)-166(a)-242(,)-255(p)-80(r)-81(e)-80(c)-335(,)-191(b)-206(,)-203(x)-231(,)-234(e)-60(p)-59(s)-293(,)-273(d)-98(e)-98(s)-97(c)]TJ ET q -1 0 0 1 334.087 386.32 cm +1 0 0 1 334.087 385.79 cm []0 d 0 J 0.398 w 0 0 m 2.989 0 l S Q BT -/F84 9.9626 Tf 338.05 386.121 Td [(a)-370(,)-283(i)-108(n)-109(f)-108(o)-273(,)-57(&)]TJ -209.153 -11.956 Td [(&)-580(i)-69(t)-69(m)-70(a)-69(x)-313(,)-327(i)-151(t)-152(e)-151(r)-478(,)-281(e)-107(r)-106(r)-387(,)-321(i)-145(t)-146(r)-146(a)-145(c)-146(e)-466(,)-311(i)-135(s)-135(t)-136(o)-135(p)-269(\051)]TJ +/F84 9.9626 Tf 338.05 385.591 Td [(a)-370(,)-283(i)-108(n)-109(f)-108(o)-273(,)-57(&)]TJ -209.153 -11.955 Td [(&)-580(i)-69(t)-69(m)-70(a)-69(x)-313(,)-327(i)-151(t)-152(e)-151(r)-478(,)-281(e)-107(r)-106(r)-387(,)-321(i)-145(t)-146(r)-146(a)-145(c)-146(e)-466(,)-311(i)-135(s)-135(t)-136(o)-135(p)-269(\051)]TJ 0 g 0 G 0 g 0 G 0 g 0 G -/F75 9.9626 Tf -29.002 -28.653 Td [(T)90(ype:)]TJ +/F75 9.9626 Tf -29.002 -28.51 Td [(T)90(ype:)]TJ 0 g 0 G /F84 9.9626 Tf 29.828 0 Td [(Synchr)18(onous.)]TJ 0 g 0 G -/F75 9.9626 Tf -29.828 -20.431 Td [(On)-250(Entry)]TJ +/F75 9.9626 Tf -29.828 -20.334 Td [(On)-250(Entry)]TJ 0 g 0 G 0 g 0 G - 0 -20.431 Td [(a)]TJ + 0 -20.335 Td [(a)]TJ 0 g 0 G -/F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(sparse)-250(matrix)]TJ/F78 9.9626 Tf 178.414 0 Td [(A)]TJ/F84 9.9626 Tf 7.317 0 Td [(.)]TJ -170.787 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ +/F84 9.9626 Tf 9.963 0 Td [(the)-250(local)-250(portion)-250(of)-250(global)-250(sparse)-250(matrix)]TJ/F78 9.9626 Tf 178.414 0 Td [(A)]TJ/F84 9.9626 Tf 7.317 0 Td [(.)]TJ -170.787 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q -1 0 0 1 309.258 257.028 cm +1 0 0 1 309.258 256.836 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 256.829 Td [(Tspmat)]TJ +/F147 9.9626 Tf 312.397 256.636 Td [(Tspmat)]TJ ET q -1 0 0 1 344.406 257.028 cm +1 0 0 1 344.406 256.836 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 347.544 256.829 Td [(type)]TJ +/F147 9.9626 Tf 347.544 256.636 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -268.571 -20.431 Td [(prec)]TJ +/F75 9.9626 Tf -268.571 -20.334 Td [(prec)]TJ 0 g 0 G -/F84 9.9626 Tf 24.04 0 Td [(The)-250(data)-250(str)8(uctur)18(e)-250(containing)-250(the)-250(pr)18(econditioner)74(.)]TJ 0.867 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ +/F84 9.9626 Tf 24.04 0 Td [(The)-250(data)-250(str)8(uctur)18(e)-250(containing)-250(the)-250(pr)18(econditioner)74(.)]TJ 0.867 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.956 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q -1 0 0 1 309.258 188.777 cm +1 0 0 1 309.258 188.68 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 312.397 188.577 Td [(Tprec)]TJ +/F147 9.9626 Tf 312.397 188.481 Td [(Tprec)]TJ ET q -1 0 0 1 339.176 188.777 cm +1 0 0 1 339.176 188.68 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 342.314 188.577 Td [(type)]TJ +/F147 9.9626 Tf 342.314 188.481 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G -/F75 9.9626 Tf -263.34 -20.431 Td [(b)]TJ +/F75 9.9626 Tf -263.34 -20.335 Td [(b)]TJ 0 g 0 G /F84 9.9626 Tf 10.76 0 Td [(The)-250(RHS)-250(vector)74(.)]TJ 14.147 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.741 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.779 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(array)-250(or)-250(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 218.688 0 Td [(psb)]TJ +/F147 9.9626 Tf 218.688 0 Td [(psb)]TJ ET q 1 0 0 1 359.808 120.525 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 362.947 120.326 Td [(T)]TJ +/F147 9.9626 Tf 362.947 120.326 Td [(T)]TJ ET q 1 0 0 1 368.804 120.525 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 371.943 120.326 Td [(vect)]TJ +/F147 9.9626 Tf 371.943 120.326 Td [(vect)]TJ ET q 1 0 0 1 393.492 120.525 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 396.63 120.326 Td [(type)]TJ +/F147 9.9626 Tf 396.63 120.326 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G @@ -29212,7 +29299,7 @@ ET endstream endobj -2109 0 obj +2113 0 obj << /Length 6806 >> @@ -29225,28 +29312,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(initial)-250(guess.)]TJ 15.252 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.956 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(array)-250(or)-250(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 218.688 0 Td [(psb)]TJ +/F147 9.9626 Tf 218.688 0 Td [(psb)]TJ ET q 1 0 0 1 410.618 658.507 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 413.756 658.308 Td [(T)]TJ +/F147 9.9626 Tf 413.756 658.308 Td [(T)]TJ ET q 1 0 0 1 419.614 658.507 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.752 658.308 Td [(vect)]TJ +/F147 9.9626 Tf 422.752 658.308 Td [(vect)]TJ ET q 1 0 0 1 444.301 658.507 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 447.439 658.308 Td [(type)]TJ +/F147 9.9626 Tf 447.439 658.308 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -29265,31 +29352,31 @@ BT 0 g 0 G /F84 9.9626 Tf 9.962 0 Td [(contains)-250(data)-250(str)8(uctur)18(es)-250(for)-250(communications.)]TJ -8.558 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Speci\002ed)-250(as:)-310(a)-250(str)8(uctur)18(ed)-250(data)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 168.138 0 Td [(psb)]TJ +/F147 9.9626 Tf 168.138 0 Td [(psb)]TJ ET q 1 0 0 1 360.068 524.012 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 363.206 523.813 Td [(desc)]TJ +/F147 9.9626 Tf 363.206 523.813 Td [(desc)]TJ ET q 1 0 0 1 384.755 524.012 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 387.893 523.813 Td [(type)]TJ +/F147 9.9626 Tf 387.893 523.813 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -258.11 -19.428 Td [(itmax)]TJ 0 g 0 G -/F84 9.9626 Tf 30.127 0 Td [(The)-250(maximum)-250(number)-250(of)-250(iterations)-250(to)-250(perform.)]TJ -5.221 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F78 9.9626 Tf 38.57 0 Td [(i)-32(t)-25(m)-40(a)-42(x)]TJ/F192 10.3811 Tf 27.744 0 Td [(=)]TJ/F84 9.9626 Tf 10.961 0 Td [(1000.)]TJ -77.275 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(variable)]TJ/F78 9.9626 Tf 142.35 0 Td [(i)-32(t)-25(m)-40(a)-42(x)]TJ/F190 10.3811 Tf 27.743 0 Td [(\025)]TJ/F84 9.9626 Tf 10.962 0 Td [(1.)]TJ +/F84 9.9626 Tf 30.127 0 Td [(The)-250(maximum)-250(number)-250(of)-250(iterations)-250(to)-250(perform.)]TJ -5.221 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F78 9.9626 Tf 38.57 0 Td [(i)-32(t)-25(m)-40(a)-42(x)]TJ/F197 10.3811 Tf 27.744 0 Td [(=)]TJ/F84 9.9626 Tf 10.961 0 Td [(1000.)]TJ -77.275 -11.955 Td [(Speci\002ed)-250(as:)-310(an)-250(integer)-250(variable)]TJ/F78 9.9626 Tf 142.35 0 Td [(i)-32(t)-25(m)-40(a)-42(x)]TJ/F195 10.3811 Tf 27.743 0 Td [(\025)]TJ/F84 9.9626 Tf 10.962 0 Td [(1.)]TJ 0 g 0 G /F75 9.9626 Tf -205.961 -19.428 Td [(itrace)]TJ 0 g 0 G -/F84 9.9626 Tf 0.98 0 0 1 180.583 425.182 Tm [(If)]TJ/F148 10.3811 Tf 1 0 0 1 189.481 425.182 Tm [(>)]TJ/F84 9.9626 Tf 0.98 0 0 1 200.443 425.182 Tm [(0)-229(print)-228(out)-229(an)-229(informational)-228(message)-229(about)-229(conver)19(gence)-229(every)]TJ/F78 9.9626 Tf 1 0 0 1 470.511 425.182 Tm [(i)-32(t)-15(r)-50(a)-25(c)-25(e)]TJ/F84 9.9626 Tf -294.9 -11.955 Td [(iterations.)-310(If)]TJ/F192 10.3811 Tf 56.313 0 Td [(=)]TJ/F84 9.9626 Tf 10.962 0 Td [(0)-250(print)-250(a)-250(message)-250(in)-250(case)-250(of)-250(conver)18(gence)-250(failur)18(e.)]TJ -67.275 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F78 9.9626 Tf 38.57 0 Td [(i)-32(t)-15(r)-50(a)-25(c)-25(e)]TJ/F192 10.3811 Tf 26.797 0 Td [(=)]TJ/F190 10.3811 Tf 11.086 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1.)]TJ +/F84 9.9626 Tf 0.98 0 0 1 180.583 425.182 Tm [(If)]TJ/F152 10.3811 Tf 1 0 0 1 189.481 425.182 Tm [(>)]TJ/F84 9.9626 Tf 0.98 0 0 1 200.443 425.182 Tm [(0)-229(print)-228(out)-229(an)-229(informational)-228(message)-229(about)-229(conver)19(gence)-229(every)]TJ/F78 9.9626 Tf 1 0 0 1 470.511 425.182 Tm [(i)-32(t)-15(r)-50(a)-25(c)-25(e)]TJ/F84 9.9626 Tf -294.9 -11.955 Td [(iterations.)-310(If)]TJ/F197 10.3811 Tf 56.313 0 Td [(=)]TJ/F84 9.9626 Tf 10.962 0 Td [(0)-250(print)-250(a)-250(message)-250(in)-250(case)-250(of)-250(conver)18(gence)-250(failur)18(e.)]TJ -67.275 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(global)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(in)]TJ/F84 9.9626 Tf 9.404 0 Td [(.)]TJ -41.205 -11.955 Td [(Default:)]TJ/F78 9.9626 Tf 38.57 0 Td [(i)-32(t)-15(r)-50(a)-25(c)-25(e)]TJ/F197 10.3811 Tf 26.797 0 Td [(=)]TJ/F195 10.3811 Tf 11.086 0 Td [(\000)]TJ/F84 9.9626 Tf 8.194 0 Td [(1.)]TJ 0 g 0 G /F75 9.9626 Tf -109.553 -31.383 Td [(istop)]TJ 0 g 0 G @@ -29302,28 +29389,28 @@ BT 0 g 0 G /F84 9.9626 Tf 9.654 0 Td [(The)-250(computed)-250(solution.)]TJ 15.252 -11.955 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf -31.74 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(required)]TJ/F84 9.9626 Tf -26.78 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.801 0 Td [(inout)]TJ/F84 9.9626 Tf 24.348 0 Td [(.)]TJ -56.149 -11.956 Td [(Speci\002ed)-250(as:)-310(a)-250(rank)-250(one)-250(array)-250(or)-250(an)-250(object)-250(of)-250(type)]TJ 0 0 1 rg 0 0 1 RG -/F145 9.9626 Tf 218.688 0 Td [(psb)]TJ +/F147 9.9626 Tf 218.688 0 Td [(psb)]TJ ET q 1 0 0 1 410.618 187.773 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 413.756 187.573 Td [(T)]TJ +/F147 9.9626 Tf 413.756 187.573 Td [(T)]TJ ET q 1 0 0 1 419.614 187.773 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 422.752 187.573 Td [(vect)]TJ +/F147 9.9626 Tf 422.752 187.573 Td [(vect)]TJ ET q 1 0 0 1 444.301 187.773 cm []0 d 0 J 0.398 w 0 0 m 3.138 0 l S Q BT -/F145 9.9626 Tf 447.439 187.573 Td [(type)]TJ +/F147 9.9626 Tf 447.439 187.573 Td [(type)]TJ 0 g 0 G /F84 9.9626 Tf 20.922 0 Td [(.)]TJ 0 g 0 G @@ -29337,7 +29424,7 @@ ET endstream endobj -2113 0 obj +2117 0 obj << /Length 1090 >> @@ -29360,7 +29447,7 @@ ET endstream endobj -2124 0 obj +2128 0 obj << /Length 8172 >> @@ -29374,14 +29461,14 @@ BT 0 g 0 G /F84 9.9626 Tf 1.02 0 0 1 189.997 640.328 Tm [(a)-255(CUDA)-255(library)-255(originally)-254(published)-255(as)]TJ 0 1 0 0 k 0 1 0 0 K -/F145 9.9626 Tf 1 0 0 1 369.934 640.328 Tm [(https://code.google.com/)]TJ -194.323 -11.955 Td [(p/spgpu/)]TJ +/F147 9.9626 Tf 1 0 0 1 369.934 640.328 Tm [(https://code.google.com/)]TJ -194.323 -11.955 Td [(p/spgpu/)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 221.323 628.373 Tm [(and)-381(now)-380(included)-381(in)-381(the)]TJ/F145 9.9626 Tf 1 0 0 1 340.526 628.373 Tm [(cuda)]TJ/F84 9.9626 Tf 1.02 0 0 1 365.316 628.373 Tm [(subdir)73(,)-415(for)-381(computations)-380(on)]TJ 1 0 0 1 175.611 616.418 Tm [(NVIDIA)-250(GPUs;)]TJ +/F84 9.9626 Tf 1.02 0 0 1 221.323 628.373 Tm [(and)-381(now)-380(included)-381(in)-381(the)]TJ/F147 9.9626 Tf 1 0 0 1 340.526 628.373 Tm [(cuda)]TJ/F84 9.9626 Tf 1.02 0 0 1 365.316 628.373 Tm [(subdir)73(,)-415(for)-381(computations)-380(on)]TJ 1 0 0 1 175.611 616.418 Tm [(NVIDIA)-250(GPUs;)]TJ 0 g 0 G /F75 9.9626 Tf -24.906 -19.514 Td [(LIBRSB)]TJ 0 g 0 G 0 1 0 0 k 0 1 0 0 K -/F145 9.9626 Tf 41.514 0 Td [(http://sourceforge.net/projects/librsb/)]TJ +/F147 9.9626 Tf 41.514 0 Td [(http://sourceforge.net/projects/librsb/)]TJ 0 g 0 G /F84 9.9626 Tf 1.02 0 0 1 396.202 596.904 Tm [(,)-324(for)-309(computations)-308(on)]TJ 1 0 0 1 175.611 584.949 Tm [(multicor)18(e)-250(parallel)-250(machines.)]TJ 1.02 0 0 1 150.396 565.847 Tm [(The)-350(infrastr)8(uctur)18(e)-350(laid)-350(out)-350(in)-349(the)-350(base)-350(library)-350(to)-350(allow)-349(for)-350(these)-350(extensions)]TJ 1.02 0 0 1 150.705 553.891 Tm [(is)-306(detailed)-306(in)-306(the)-306(r)18(efer)17(ences)-306([)]TJ 1 0 0 rg 1 0 0 RG @@ -29403,11 +29490,11 @@ BT 0 g 0 G 13.888 -19.102 Td [(\225)]TJ 0 g 0 G -/F145 9.9626 Tf 11.018 0 Td [(USE)]TJ/F84 9.9626 Tf 18.182 0 Td [(the)-250(appr)18(opriat)-250(modules)-250(\050)]TJ/F145 9.9626 Tf 110.036 0 Td [(psb_ext_mod)]TJ/F84 9.9626 Tf 57.534 0 Td [(,)]TJ/F145 9.9626 Tf 4.981 0 Td [(psb_cuda_mod)]TJ/F84 9.9626 Tf 62.764 0 Td [(\051;)]TJ +/F147 9.9626 Tf 11.018 0 Td [(USE)]TJ/F84 9.9626 Tf 18.182 0 Td [(the)-250(appr)18(opriat)-250(modules)-250(\050)]TJ/F147 9.9626 Tf 110.036 0 Td [(psb_ext_mod)]TJ/F84 9.9626 Tf 57.534 0 Td [(,)]TJ/F147 9.9626 Tf 4.981 0 Td [(psb_cuda_mod)]TJ/F84 9.9626 Tf 62.764 0 Td [(\051;)]TJ 0 g 0 G -264.515 -19.514 Td [(\225)]TJ 0 g 0 G - 0.98 0 0 1 175.611 443.461 Tm [(Declar)18(e)-214(a)]TJ/F78 9.9626 Tf 0.98 0 0 1 217.329 443.461 Tm [(mold)]TJ/F84 9.9626 Tf 0.98 0 0 1 238.952 443.461 Tm [(variable)-215(of)-214(the)-215(necessary)-214(type)-215(\050e.g.)]TJ/F145 9.9626 Tf 1 0 0 1 388.614 443.461 Tm [(psb_d_ell_sparse_mat)]TJ/F84 9.9626 Tf 0.98 0 0 1 493.22 443.461 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 175.611 431.506 Tm [(psb_d_hlg_sparse_mat)]TJ/F84 9.9626 Tf 104.607 0 Td [(,)]TJ/F145 9.9626 Tf 4.982 0 Td [(psb_d_vect_cuda)]TJ/F84 9.9626 Tf 78.455 0 Td [(\051;)]TJ + 0.98 0 0 1 175.611 443.461 Tm [(Declar)18(e)-214(a)]TJ/F78 9.9626 Tf 0.98 0 0 1 217.329 443.461 Tm [(mold)]TJ/F84 9.9626 Tf 0.98 0 0 1 238.952 443.461 Tm [(variable)-215(of)-214(the)-215(necessary)-214(type)-215(\050e.g.)]TJ/F147 9.9626 Tf 1 0 0 1 388.614 443.461 Tm [(psb_d_ell_sparse_mat)]TJ/F84 9.9626 Tf 0.98 0 0 1 493.22 443.461 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 175.611 431.506 Tm [(psb_d_hlg_sparse_mat)]TJ/F84 9.9626 Tf 104.607 0 Td [(,)]TJ/F147 9.9626 Tf 4.982 0 Td [(psb_d_vect_cuda)]TJ/F84 9.9626 Tf 78.455 0 Td [(\051;)]TJ 0 g 0 G -199.062 -19.513 Td [(\225)]TJ 0 g 0 G @@ -29423,7 +29510,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 153.694 334.821 Td [(program)]TJ +/F235 8.9664 Tf 153.694 334.821 Td [(program)]TJ 0 g 0 G [-525(my_cuda_test)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -29594,7 +29681,7 @@ ET endstream endobj -2138 0 obj +2142 0 obj << /Length 9201 >> @@ -29613,12 +29700,12 @@ Q 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG BT -/F279 8.9664 Tf 112.299 701.446 Td [(!)-525(My)-525(own)-525(home-grown)-525(matrix)-525(generator)]TJ +/F281 8.9664 Tf 112.299 701.446 Td [(!)-525(My)-525(own)-525(home-grown)-525(matrix)-525(generator)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F233 8.9664 Tf 0 -10.958 Td [(call)]TJ +/F235 8.9664 Tf 0 -10.958 Td [(call)]TJ 0 g 0 G [-525(gen_matrix\050ctxt,)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG @@ -29727,12 +29814,12 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 8.9664 Tf 0 -21.918 Td [(!)-525(Do)-525(sparse)-525(MV)]TJ +/F281 8.9664 Tf 0 -21.918 Td [(!)-525(Do)-525(sparse)-525(MV)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F233 8.9664 Tf 0 -10.958 Td [(call)]TJ +/F235 8.9664 Tf 0 -10.958 Td [(call)]TJ 0 g 0 G [-525(psb_spmm\050done,agpu,xg,dzero,bg,desc_a,info\051)]TJ 0.25 0.63 0.44 rg 0.25 0.63 0.44 RG @@ -29831,7 +29918,7 @@ BT [-525(my_cuda_test)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 114.839 403.191 Tm [(A)-337(full)-338(example)-337(of)-337(this)-338(strategy)-337(can)-338(be)-337(seen)-337(in)-338(the)]TJ/F145 9.9626 Tf 1 0 0 1 344.519 403.191 Tm [(test/ext/kernel)]TJ/F84 9.9626 Tf 1.02 0 0 1 426.402 403.191 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 99.895 391.236 Tm [(test/cuda/kernel)]TJ/F84 9.9626 Tf 1.008 0 0 1 186.064 391.236 Tm [(subdir)18(ectories,)-248(wher)18(e)-247(we)-247(pr)18(ovide)-248(sample)-247(pr)18(ograms)-247(to)-248(test)]TJ 1.003 0 0 1 99.895 379.281 Tm [(the)-250(speed)-249(of)-250(the)-250(sparse)-249(matrix-vector)-250(pr)18(oduct)-249(with)-250(the)-250(various)-249(data)-250(str)8(uctur)18(es)]TJ 1 0 0 1 99.895 367.325 Tm [(included)-250(in)-250(the)-250(library)111(.)]TJ/F75 11.9552 Tf 0 -29.238 Td [(12.2)-1000(Extensions')-250(Data)-250(Structures)]TJ/F84 9.9626 Tf 0.995 0 0 1 99.507 319.088 Tm [(Access)-250(to)-250(the)-250(facilities)-250(pr)18(ovided)-250(by)-250(the)-250(EXT)-250(library)-251(is)-250(mainly)-250(achieved)-250(thr)18(ough)]TJ 1.02 0 0 1 99.895 307.133 Tm [(the)-335(data)-336(types)-335(that)-335(ar)18(e)-336(pr)18(ovided)-335(within.)-575(The)-335(data)-335(classes)-335(ar)17(e)-335(derived)-335(fr)17(om)]TJ 1.004 0 0 1 99.895 295.178 Tm [(the)-250(base)-249(classes)-250(in)-249(PSBLAS,)-250(thr)18(ough)-249(the)-250(Fortran)-249(2003)-250(mechanism)-249(of)]TJ/F78 9.9626 Tf 1.004 0 0 1 400.534 295.178 Tm [(type)-250(exten-)]TJ 1 0 0 1 99.895 283.222 Tm [(sion)]TJ/F84 9.9626 Tf 19.098 0 Td [([)]TJ +/F84 9.9626 Tf 1.02 0 0 1 114.839 403.191 Tm [(A)-337(full)-338(example)-337(of)-337(this)-338(strategy)-337(can)-338(be)-337(seen)-337(in)-338(the)]TJ/F147 9.9626 Tf 1 0 0 1 344.519 403.191 Tm [(test/ext/kernel)]TJ/F84 9.9626 Tf 1.02 0 0 1 426.402 403.191 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 99.895 391.236 Tm [(test/cuda/kernel)]TJ/F84 9.9626 Tf 1.008 0 0 1 186.064 391.236 Tm [(subdir)18(ectories,)-248(wher)18(e)-247(we)-247(pr)18(ovide)-248(sample)-247(pr)18(ograms)-247(to)-248(test)]TJ 1.003 0 0 1 99.895 379.281 Tm [(the)-250(speed)-249(of)-250(the)-250(sparse)-249(matrix-vector)-250(pr)18(oduct)-249(with)-250(the)-250(various)-249(data)-250(str)8(uctur)18(es)]TJ 1 0 0 1 99.895 367.325 Tm [(included)-250(in)-250(the)-250(library)111(.)]TJ/F75 11.9552 Tf 0 -29.238 Td [(12.2)-1000(Extensions')-250(Data)-250(Structures)]TJ/F84 9.9626 Tf 0.995 0 0 1 99.507 319.088 Tm [(Access)-250(to)-250(the)-250(facilities)-250(pr)18(ovided)-250(by)-250(the)-250(EXT)-250(library)-251(is)-250(mainly)-250(achieved)-250(thr)18(ough)]TJ 1.02 0 0 1 99.895 307.133 Tm [(the)-335(data)-336(types)-335(that)-335(ar)18(e)-336(pr)18(ovided)-335(within.)-575(The)-335(data)-335(classes)-335(ar)17(e)-335(derived)-335(fr)17(om)]TJ 1.004 0 0 1 99.895 295.178 Tm [(the)-250(base)-249(classes)-250(in)-249(PSBLAS,)-250(thr)18(ough)-249(the)-250(Fortran)-249(2003)-250(mechanism)-249(of)]TJ/F78 9.9626 Tf 1.004 0 0 1 400.534 295.178 Tm [(type)-250(exten-)]TJ 1 0 0 1 99.895 283.222 Tm [(sion)]TJ/F84 9.9626 Tf 19.098 0 Td [([)]TJ 1 0 0 rg 1 0 0 RG [(18)]TJ 0 g 0 G @@ -29843,7 +29930,7 @@ BT 0 0 1 rg 0 0 1 RG [-194(6)]TJ 0 g 0 G - [(\051)-194(comprises)-194(two)-193(2-dimensional)]TJ 1.02 0 0 1 99.895 168.146 Tm [(arrays)]TJ/F145 9.9626 Tf 1 0 0 1 130.767 168.146 Tm [(AS)]TJ/F84 9.9626 Tf 1.02 0 0 1 143.951 168.146 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 163.879 168.146 Tm [(JA)]TJ/F84 9.9626 Tf 1.02 0 0 1 177.063 168.146 Tm [(with)]TJ/F145 9.9626 Tf 1 0 0 1 200.445 168.146 Tm [(M)]TJ/F84 9.9626 Tf 1.02 0 0 1 208.399 168.146 Tm [(r)18(ows)-268(and)]TJ/F145 9.9626 Tf 1 0 0 1 253.216 168.146 Tm [(MAXNZR)]TJ/F84 9.9626 Tf 1.02 0 0 1 287.322 168.146 Tm [(columns,)-274(wher)18(e)]TJ/F145 9.9626 Tf 1 0 0 1 361.667 168.146 Tm [(MAXNZR)]TJ/F84 9.9626 Tf 1.02 0 0 1 395.772 168.146 Tm [(is)-268(the)-268(max-)]TJ 1.02 0 0 1 99.895 156.191 Tm [(imum)-289(number)-288(of)-289(nonzer)17(os)-288(in)-289(any)-289(r)18(ow)-289([)]TJ/F75 9.9626 Tf 1 0 0 1 279.688 156.191 Tm [(?)]TJ/F84 9.9626 Tf 1.02 0 0 1 284.111 156.191 Tm [(].)-435(Each)-289(r)18(ow)-289(of)-288(the)-289(arrays)]TJ/F145 9.9626 Tf 1 0 0 1 399.875 156.191 Tm [(AS)]TJ/F84 9.9626 Tf 1.02 0 0 1 413.269 156.191 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 433.407 156.191 Tm [(JA)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.895 144.236 Tm [(contains)-357(the)-358(coef)18(\002cients)-357(and)-357(column)-358(indices;)-413(r)17(ows)-357(shorter)-357(than)]TJ/F145 9.9626 Tf 1 0 0 1 394.811 144.236 Tm [(MAXNZR)]TJ/F84 9.9626 Tf 1.02 0 0 1 429.823 144.236 Tm [(ar)18(e)]TJ 0.98 0 0 1 99.596 132.281 Tm [(padded)-229(with)-229(zer)19(o)-229(coef)18(\002cients)-229(and)-229(appr)19(opriate)-229(column)-229(indices,)-234(e.g.)-307(the)-229(last)-229(valid)]TJ 1 0 0 1 99.895 120.326 Tm [(one)-250(found)-250(in)-250(the)-250(same)-250(r)18(ow)92(.)]TJ + [(\051)-194(comprises)-194(two)-193(2-dimensional)]TJ 1.02 0 0 1 99.895 168.146 Tm [(arrays)]TJ/F147 9.9626 Tf 1 0 0 1 130.767 168.146 Tm [(AS)]TJ/F84 9.9626 Tf 1.02 0 0 1 143.951 168.146 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 163.879 168.146 Tm [(JA)]TJ/F84 9.9626 Tf 1.02 0 0 1 177.063 168.146 Tm [(with)]TJ/F147 9.9626 Tf 1 0 0 1 200.445 168.146 Tm [(M)]TJ/F84 9.9626 Tf 1.02 0 0 1 208.399 168.146 Tm [(r)18(ows)-268(and)]TJ/F147 9.9626 Tf 1 0 0 1 253.216 168.146 Tm [(MAXNZR)]TJ/F84 9.9626 Tf 1.02 0 0 1 287.322 168.146 Tm [(columns,)-274(wher)18(e)]TJ/F147 9.9626 Tf 1 0 0 1 361.667 168.146 Tm [(MAXNZR)]TJ/F84 9.9626 Tf 1.02 0 0 1 395.772 168.146 Tm [(is)-268(the)-268(max-)]TJ 1.02 0 0 1 99.895 156.191 Tm [(imum)-289(number)-288(of)-289(nonzer)17(os)-288(in)-289(any)-289(r)18(ow)-289([)]TJ/F75 9.9626 Tf 1 0 0 1 279.688 156.191 Tm [(?)]TJ/F84 9.9626 Tf 1.02 0 0 1 284.111 156.191 Tm [(].)-435(Each)-289(r)18(ow)-289(of)-288(the)-289(arrays)]TJ/F147 9.9626 Tf 1 0 0 1 399.875 156.191 Tm [(AS)]TJ/F84 9.9626 Tf 1.02 0 0 1 413.269 156.191 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 433.407 156.191 Tm [(JA)]TJ/F84 9.9626 Tf 1.02 0 0 1 99.895 144.236 Tm [(contains)-357(the)-358(coef)18(\002cients)-357(and)-357(column)-358(indices;)-413(r)17(ows)-357(shorter)-357(than)]TJ/F147 9.9626 Tf 1 0 0 1 394.811 144.236 Tm [(MAXNZR)]TJ/F84 9.9626 Tf 1.02 0 0 1 429.823 144.236 Tm [(ar)18(e)]TJ 0.98 0 0 1 99.596 132.281 Tm [(padded)-229(with)-229(zer)19(o)-229(coef)18(\002cients)-229(and)-229(appr)19(opriate)-229(column)-229(indices,)-234(e.g.)-307(the)-229(last)-229(valid)]TJ 1 0 0 1 99.895 120.326 Tm [(one)-250(found)-250(in)-250(the)-250(same)-250(r)18(ow)92(.)]TJ 0 g 0 G 164.384 -29.888 Td [(171)]TJ 0 g 0 G @@ -29851,7 +29938,7 @@ ET endstream endobj -2147 0 obj +2151 0 obj << /Length 4837 >> @@ -29900,11 +29987,11 @@ BT /F84 9.9626 Tf 245.769 373.573 Td [(Figur)18(e)-250(5:)-310(Example)-250(of)-250(sparse)-250(matrix)]TJ 0 g 0 G 0 g 0 G - 0.98 0 0 1 165.649 339.81 Tm [(The)-252(matrix-vector)-252(pr)19(oduct)]TJ/F78 9.9626 Tf 1 0 0 1 282.309 339.81 Tm [(y)]TJ/F192 10.3811 Tf 7.997 0 Td [(=)]TJ/F78 9.9626 Tf 11.584 0 Td [(A)-42(x)]TJ/F84 9.9626 Tf 0.98 0 0 1 317.166 339.81 Tm [(can)-252(be)-252(computed)-251(with)-252(the)-252(code)-252(shown)-252(in)]TJ 1.003 0 0 1 150.316 327.855 Tm [(Alg.)]TJ + 0.98 0 0 1 165.649 339.81 Tm [(The)-252(matrix-vector)-252(pr)19(oduct)]TJ/F78 9.9626 Tf 1 0 0 1 282.309 339.81 Tm [(y)]TJ/F197 10.3811 Tf 7.997 0 Td [(=)]TJ/F78 9.9626 Tf 11.584 0 Td [(A)-42(x)]TJ/F84 9.9626 Tf 0.98 0 0 1 317.166 339.81 Tm [(can)-252(be)-252(computed)-251(with)-252(the)-252(code)-252(shown)-252(in)]TJ 1.003 0 0 1 150.316 327.855 Tm [(Alg.)]TJ 0 0 1 rg 0 0 1 RG [-250(1)]TJ 0 g 0 G - [(;)-250(it)-250(costs)-250(one)-250(memory)-251(wri)1(te)-251(pe)1(r)-251(oute)1(r)-251(ite)1(ration,)-251(plus)-250(thr)18(ee)-250(memory)-250(r)18(eads)]TJ 1 0 0 1 150.705 315.9 Tm [(and)-250(two)-250(\003oating-point)-250(operations)-250(per)-250(inner)-250(iteration.)]TJ 1.02 0 0 1 165.649 303.412 Tm [(Unless)-327(all)-327(r)18(ows)-327(have)-327(exactly)-326(the)-327(same)-327(number)-327(of)-327(nonzer)18(os,)-347(some)-327(of)-327(the)]TJ 1.02 0 0 1 150.705 291.457 Tm [(coef)18(\002cients)-388(in)-387(the)]TJ/F145 9.9626 Tf 1 0 0 1 235.636 291.457 Tm [(AS)]TJ/F84 9.9626 Tf 1.02 0 0 1 250.035 291.457 Tm [(array)-388(will)-387(be)-388(zer)18(os;)-459(ther)18(efor)17(e)-387(this)-388(data)-388(str)8(uctur)18(e)-388(will)]TJ 1.02 0 0 1 150.705 279.501 Tm [(have)-270(an)-269(over)17(head)-269(both)-270(in)-270(ter)1(ms)-270(of)-270(memory)-269(space)-270(and)-270(r)18(edundant)-270(operations)]TJ 1 0 0 1 150.376 267.546 Tm [(\050multiplications)-250(by)-250(zer)18(o\051.)-310(The)-250(over)18(head)-250(can)-250(be)-250(acceptable)-250(if:)]TJ + [(;)-250(it)-250(costs)-250(one)-250(memory)-251(wri)1(te)-251(pe)1(r)-251(oute)1(r)-251(ite)1(ration,)-251(plus)-250(thr)18(ee)-250(memory)-250(r)18(eads)]TJ 1 0 0 1 150.705 315.9 Tm [(and)-250(two)-250(\003oating-point)-250(operations)-250(per)-250(inner)-250(iteration.)]TJ 1.02 0 0 1 165.649 303.412 Tm [(Unless)-327(all)-327(r)18(ows)-327(have)-327(exactly)-326(the)-327(same)-327(number)-327(of)-327(nonzer)18(os,)-347(some)-327(of)-327(the)]TJ 1.02 0 0 1 150.705 291.457 Tm [(coef)18(\002cients)-388(in)-387(the)]TJ/F147 9.9626 Tf 1 0 0 1 235.636 291.457 Tm [(AS)]TJ/F84 9.9626 Tf 1.02 0 0 1 250.035 291.457 Tm [(array)-388(will)-387(be)-388(zer)18(os;)-459(ther)18(efor)17(e)-387(this)-388(data)-388(str)8(uctur)18(e)-388(will)]TJ 1.02 0 0 1 150.705 279.501 Tm [(have)-270(an)-269(over)17(head)-269(both)-270(in)-270(ter)1(ms)-270(of)-270(memory)-269(space)-270(and)-270(r)18(edundant)-270(operations)]TJ 1 0 0 1 150.376 267.546 Tm [(\050multiplications)-250(by)-250(zer)18(o\051.)-310(The)-250(over)18(head)-250(can)-250(be)-250(acceptable)-250(if:)]TJ 0 g 0 G 12.782 -21.523 Td [(1.)]TJ 0 g 0 G @@ -29912,7 +29999,7 @@ BT 0 g 0 G -12.453 -22.056 Td [(2.)]TJ 0 g 0 G - 0.98 0 0 1 175.303 212.011 Tm [(The)-243(r)19(egularity)-243(of)-243(th)1(e)-243(data)-243(str)8(uctur)19(e)-243(allows)-243(for)-242(faster)-243(code,)-245(e.g.)-312(by)-243(allowing)]TJ 1 0 0 1 175.333 200.056 Tm [(vectorization,)-250(ther)18(eby)-250(of)18(fsetting)-250(the)-250(additional)-250(storage)-250(r)18(equir)18(ements.)]TJ 1.02 0 0 1 150.705 178.532 Tm [(In)-323(the)-323(extr)18(eme)-324(case)-323(wher)18(e)-323(the)-323(input)-323(matrix)-323(has)-323(one)-323(full)-323(r)17(ow)91(,)-343(the)-323(ELLP)90(ACK)]TJ 1.01 0 0 1 150.705 166.577 Tm [(str)8(uctur)18(e)-246(would)-246(r)18(equir)17(e)-246(mor)18(e)-246(memory)-246(than)-246(the)-246(normal)-246(2D)-246(array)-246(storage.)-307(The)]TJ 1.02 0 0 1 150.705 154.621 Tm [(ELLP)90(ACK)-246(storage)-245(format)-246(was)-246(very)-246(popular)-245(in)-246(the)-246(vector)-246(computing)-245(days;)-247(in)]TJ 0.98 0 0 1 150.705 142.666 Tm [(modern)-231(CPUs)-231(it)-231(is)-231(not)-231(quite)-231(as)-231(popular)75(,)-236(but)-231(it)-231(is)-231(the)-231(basis)-231(for)-231(many)-231(GPU)-231(formats.)]TJ 1 0 0 1 165.649 130.178 Tm [(The)-250(r)18(elevant)-250(data)-250(type)-250(is)]TJ/F145 9.9626 Tf 110.952 0 Td [(psb_T_ell_sparse_mat)]TJ/F84 9.9626 Tf 104.607 0 Td [(:)]TJ + 0.98 0 0 1 175.303 212.011 Tm [(The)-243(r)19(egularity)-243(of)-243(th)1(e)-243(data)-243(str)8(uctur)19(e)-243(allows)-243(for)-242(faster)-243(code,)-245(e.g.)-312(by)-243(allowing)]TJ 1 0 0 1 175.333 200.056 Tm [(vectorization,)-250(ther)18(eby)-250(of)18(fsetting)-250(the)-250(additional)-250(storage)-250(r)18(equir)18(ements.)]TJ 1.02 0 0 1 150.705 178.532 Tm [(In)-323(the)-323(extr)18(eme)-324(case)-323(wher)18(e)-323(the)-323(input)-323(matrix)-323(has)-323(one)-323(full)-323(r)17(ow)91(,)-343(the)-323(ELLP)90(ACK)]TJ 1.01 0 0 1 150.705 166.577 Tm [(str)8(uctur)18(e)-246(would)-246(r)18(equir)17(e)-246(mor)18(e)-246(memory)-246(than)-246(the)-246(normal)-246(2D)-246(array)-246(storage.)-307(The)]TJ 1.02 0 0 1 150.705 154.621 Tm [(ELLP)90(ACK)-246(storage)-245(format)-246(was)-246(very)-246(popular)-245(in)-246(the)-246(vector)-246(computing)-245(days;)-247(in)]TJ 0.98 0 0 1 150.705 142.666 Tm [(modern)-231(CPUs)-231(it)-231(is)-231(not)-231(quite)-231(as)-231(popular)75(,)-236(but)-231(it)-231(is)-231(the)-231(basis)-231(for)-231(many)-231(GPU)-231(formats.)]TJ 1 0 0 1 165.649 130.178 Tm [(The)-250(r)18(elevant)-250(data)-250(type)-250(is)]TJ/F147 9.9626 Tf 110.952 0 Td [(psb_T_ell_sparse_mat)]TJ/F84 9.9626 Tf 104.607 0 Td [(:)]TJ 0 g 0 G -66.12 -39.74 Td [(172)]TJ 0 g 0 G @@ -29920,21 +30007,21 @@ ET endstream endobj -2131 0 obj +2135 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/mat.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2152 0 R +/PTEX.InfoDict 2156 0 R /BBox [0 0 438 395] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << -/R7 2153 0 R +/R7 2157 0 R >>/XObject << -/R8 2154 0 R +/R8 2158 0 R >>>> /Length 3551 /Filter /FlateDecode @@ -29963,7 +30050,7 @@ r JXxC[ S^zݰ.F$ 5`2. L 0 # Z(DSj*'f;?buRr* ݁"@ai(o^/o*o endstream endobj -2154 0 obj +2158 0 obj << /Subtype /Image /ColorSpace /DeviceGray @@ -29982,211 +30069,43 @@ stream &@ endstream endobj -2158 0 obj +2047 0 obj << -/Length 7547 ->> -stream -0 g 0 G -0 g 0 G -0 g 0 G -1 0 0 1 154.285 609.491 cm -q -.52 0 0 .52 0 0 cm -q -1 0 0 1 0 0 cm -/Im7 Do -Q -Q -0 g 0 G -1 0 0 1 -154.285 -609.491 cm -BT -/F84 9.9626 Tf 152.938 587.573 Td [(Figur)18(e)-250(6:)-310(ELLP)92(ACK)-250(compr)18(ession)-250(of)-250(matrix)-250(in)-250(Figur)18(e)]TJ -0 0 1 rg 0 0 1 RG - [-250(5)]TJ -0 g 0 G -0 g 0 G -0 g 0 G -0 g 0 G -0 g 0 G -/F75 8.9664 Tf -16.48 -31.498 Td [(d)-11(o)]TJ/F84 8.9664 Tf 17.426 0 Td [(i)-243(=)-89(1)-178(,)-98(n)]TJ -5.537 -10.959 Td [(t)-168(=)-32(0)]TJ/F75 8.9664 Tf -1.13 -10.958 Td [(d)-11(o)]TJ/F84 8.9664 Tf 17.682 0 Td [(j)-272(=)-89(1)-177(,)-121(m)-32(a)-32(x)-32(n)-32(z)-32(r)]TJ -5.792 -10.959 Td [(t)-734(=)-734(t)-734(+)-1289(a)-92(s)-226(\050)-236(i)-381(,)-358(j)-342(\051)]TJ 85.313 -2.332 Td [(*)]TJ 5.293 2.332 Td [(x)-176(\050)-288(j)-156(a)-289(\050)-236(i)-381(,)-358(j)-361(\051)-178(\051)]TJ/F75 8.9664 Tf -102.419 -10.959 Td [(e)-19(n)-20(d)-630(d)-11(o)]TJ/F84 8.9664 Tf 0.022 -10.959 Td [(y)-156(\050)-288(i)-288(\051)-730(=)-734(t)]TJ/F75 8.9664 Tf -10.782 -10.959 Td [(e)-19(n)-20(d)-630(d)-12(o)]TJ -0 g 0 G -0 g 0 G -0 g 0 G -0 g 0 G -0 g 0 G -/F75 9.9626 Tf 16.498 -17.519 Td [(Algorithm)-250(1:)]TJ/F84 9.9626 Tf 60.055 0 Td [(Matrix-V)111(ector)-250(pr)18(oduct)-250(in)-250(ELL)-250(format)]TJ -0 g 0 G -0 g 0 G -0 g 0 G -0.95 0.95 0.95 rg 0.95 0.95 0.95 RG -0.95 0.95 0.95 rg 0.95 0.95 0.95 RG -ET -q -1 0 0 1 99.895 316.473 cm -0 0 343.711 126.526 re f -Q -0.95 0.95 0.95 rg 0.95 0.95 0.95 RG -0 g 0 G -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -BT -/F233 8.9664 Tf 112.299 432.339 Td [(type)]TJ -0 g 0 G - [(,)]TJ -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.00 0.44 0.13 rg 0.00 0.44 0.13 RG - [-525(extends)]TJ -0 g 0 G - [(\050psb_d_base_sparse_mat\051)]TJ -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.00 0.44 0.13 rg 0.00 0.44 0.13 RG - [-525(::)]TJ -0 g 0 G -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G - [-525(psb_d_ell_sparse_mat)]TJ -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 8.9664 Tf 9.414 -10.959 Td [(!)]TJ -0 g 0 G -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.38 0.63 0.69 rg 0.38 0.63 0.69 RG - 0 -10.959 Td [(!)-525(ITPACK/ELL)-525(format,)-525(extended.)]TJ -0 g 0 G -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.38 0.63 0.69 rg 0.38 0.63 0.69 RG - 0 -10.959 Td [(!)]TJ -0 g 0 G -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.56 0.13 0.00 rg 0.56 0.13 0.00 RG -/F233 8.9664 Tf 0 -21.918 Td [(integer)]TJ -0 g 0 G - [(\050psb_ipk_\051,)]TJ -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.00 0.44 0.13 rg 0.00 0.44 0.13 RG - [-525(allocatable)]TJ -0 g 0 G -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.00 0.44 0.13 rg 0.00 0.44 0.13 RG - [-525(::)]TJ -0 g 0 G -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G - [-525(irn\050:\051,)]TJ -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G - [-525(ja\050:,:\051,)]TJ -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G - [-525(idiag\050:\051)]TJ -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.56 0.13 0.00 rg 0.56 0.13 0.00 RG - 0 -10.959 Td [(real)]TJ -0 g 0 G - [(\050psb_dpk_\051,)]TJ -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.00 0.44 0.13 rg 0.00 0.44 0.13 RG - [-525(allocatable)]TJ -0 g 0 G -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.00 0.44 0.13 rg 0.00 0.44 0.13 RG - [-525(::)]TJ -0 g 0 G -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G - [-525(val\050:,:\051)]TJ -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.00 0.44 0.13 rg 0.00 0.44 0.13 RG - -9.414 -21.918 Td [(contains)]TJ -0 g 0 G -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G - 9.414 -10.959 Td [(....)]TJ -0.73 0.73 0.73 rg 0.73 0.73 0.73 RG -0 g 0 G -0.00 0.44 0.13 rg 0.00 0.44 0.13 RG - -9.414 -10.958 Td [(end)-525(type)]TJ -0 g 0 G - [-525(psb_d_ell_sparse_mat)]TJ -0.95 0.95 0.95 rg 0.95 0.95 0.95 RG -0 g 0 G -/F75 9.9626 Tf -12.404 -39.81 Td [(Hacked)-250(ELLP)74(ACK)]TJ/F84 9.9626 Tf 0.98 0 0 1 99.587 263.883 Tm [(The)]TJ/F78 9.9626 Tf 0.98 0 0 1 118.234 263.883 Tm [(hacked)-236(ELLP)132(ACK)]TJ/F84 9.9626 Tf 0.98 0 0 1 190.781 263.883 Tm [(\050)]TJ/F75 9.9626 Tf 0.98 0 0 1 194.032 263.883 Tm [(HLL)]TJ/F84 9.9626 Tf 0.98 0 0 1 214.096 263.883 Tm [(\051)-236(format)-236(alleviates)-236(the)-236(main)-236(pr)19(oblem)-236(of)-236(the)-236(ELLP)94(ACK)]TJ 0.989 0 0 1 99.895 251.928 Tm [(format,)-252(that)-253(is,)-252(the)-252(amount)-253(of)-252(memory)-252(r)18(equir)18(ed)-252(by)-252(padding)-252(for)-253(sparse)-252(matrices)]TJ 1 0 0 1 99.895 239.973 Tm [(in)-250(which)-250(the)-250(maximum)-250(r)18(ow)-250(length)-250(is)-250(lar)18(ger)-250(than)-250(the)-250(average.)]TJ 1.02 0 0 1 114.839 227.97 Tm [(The)-421(number)-421(of)-422(elements)-421(allocated)-421(to)-421(padding)-421(is)]TJ/F192 10.3811 Tf 1 0 0 1 345.511 227.97 Tm [([)-24(\050)]TJ/F78 9.9626 Tf 7.403 0 Td [(m)]TJ/F190 10.3811 Tf 10.6 0 Td [(\003)]TJ/F78 9.9626 Tf 8.039 0 Td [(m)-40(a)-42(x)-70(N)-76(R)]TJ/F192 10.3811 Tf 34.072 0 Td [(\051)]TJ/F190 10.3811 Tf 6.874 0 Td [(\000)]TJ/F192 10.3811 Tf 10.919 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(m)]TJ/F190 10.3811 Tf 10.6 0 Td [(\003)]TJ/F78 9.9626 Tf -338.123 -11.955 Td [(a)-25(v)-47(g)-60(N)-76(R)]TJ/F192 10.3811 Tf 31.104 0 Td [(\051)-537(=)]TJ/F78 9.9626 Tf 23.266 0 Td [(m)]TJ/F190 10.3811 Tf 10.451 0 Td [(\003)]TJ/F192 10.3811 Tf 7.891 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(m)-40(a)-42(x)-70(N)-76(R)]TJ/F190 10.3811 Tf 36.523 0 Td [(\000)]TJ/F78 9.9626 Tf 10.919 0 Td [(a)-25(v)-47(g)-60(N)-76(R)]TJ/F192 10.3811 Tf 31.103 0 Td [(\051)-23(])]TJ/F84 9.9626 Tf 1.02 0 0 1 266.856 216.015 Tm [(for)-382(both)]TJ/F145 9.9626 Tf 1 0 0 1 307.954 216.015 Tm [(AS)]TJ/F84 9.9626 Tf 1.02 0 0 1 322.291 216.015 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 343.374 216.015 Tm [(JA)]TJ/F84 9.9626 Tf 1.02 0 0 1 357.711 216.015 Tm [(arrays,)-416(wher)18(e)]TJ/F78 9.9626 Tf 1 0 0 1 424.587 216.015 Tm [(m)]TJ/F84 9.9626 Tf 1.02 0 0 1 436.341 216.015 Tm [(is)]TJ 0.995 0 0 1 99.895 204.06 Tm [(equal)-252(to)-252(the)-252(number)-252(of)-252(r)18(ows)-252(of)-252(the)-252(matrix)1(,)]TJ/F78 9.9626 Tf 1 0 0 1 287.784 204.06 Tm [(m)-40(a)-42(x)-70(N)-76(R)]TJ/F84 9.9626 Tf 0.995 0 0 1 324.229 204.06 Tm [(is)-252(the)-252(maximum)-252(number)-252(of)]TJ 0.998 0 0 1 99.895 192.104 Tm [(nonzer)18(o)-251(elements)-251(in)-251(every)-251(r)18(ow)-252(and)]TJ/F78 9.9626 Tf 1 0 0 1 257.847 192.104 Tm [(a)-25(v)-47(g)-60(N)-76(R)]TJ/F84 9.9626 Tf 0.998 0 0 1 291.322 192.104 Tm [(is)-251(the)-251(average)-251(number)-252(of)-251(nonzer)18(os.)]TJ 1.017 0 0 1 99.587 180.149 Tm [(Ther)18(efor)17(e)-245(a)-246(single)-245(densely)-246(populated)-245(r)17(ow)-245(can)-246(seriously)-246(af)18(fec)1(t)-246(the)-246(total)-245(size)-246(of)]TJ 1 0 0 1 99.895 168.194 Tm [(the)-250(allocation.)]TJ 1.02 0 0 1 114.839 156.191 Tm [(T)90(o)-335(limit)-336(this)-335(ef)18(fect,)-358(in)-336(t)1(he)-336(HLL)-335(format)-336(we)-335(br)18(eak)-336(the)-335(original)-336(matrix)-335(into)]TJ 0.985 0 0 1 99.895 144.236 Tm [(equally)-254(sized)-253(gr)18(oups)-253(of)-254(r)18(ows)-253(\050called)]TJ/F78 9.9626 Tf 0.985 0 0 1 259.082 144.236 Tm [(hacks)]TJ/F84 9.9626 Tf 0.985 0 0 1 280.514 144.236 Tm [(\051,)-254(and)-253(then)-254(stor)19(e)-254(these)-253(gr)18(oups)-254(as)-253(inde-)]TJ 1.02 0 0 1 99.596 132.281 Tm [(pendent)-249(matrices)-249(in)-249(ELLP)90(ACK)-249(format.)-315(The)-249(gr)18(oups)-249(can)-249(be)-249(arranged)-249(selecting)]TJ 1.02 0 0 1 99.895 120.326 Tm [(r)18(ows)-332(in)-331(an)-331(arbitrarily)-331(manner;)-374(indeed,)-353(if)-331(the)-331(r)18(ows)-332(ar)18(e)-331(sorted)-331(by)-331(decr)17(easing)]TJ -0 g 0 G - 1 0 0 1 264.279 90.438 Tm [(173)]TJ -0 g 0 G -ET - -endstream -endobj -2133 0 obj +/Type /ObjStm +/N 100 +/First 987 +/Length 12111 +>> +stream +569 0 2043 57 2051 152 2048 300 2049 445 2053 592 573 651 2050 709 2059 804 2054 970 +2055 1115 2056 1262 2057 1416 2061 1565 577 1623 2058 1680 2066 1775 2062 1932 2063 2079 2064 2226 +2068 2380 581 2439 2065 2497 2070 2592 2072 2710 585 2768 2069 2825 2078 2920 2074 3068 2075 3218 +2080 3363 589 3422 2081 3480 2082 3539 2083 3598 2084 3657 2077 3715 2089 3866 2076 4032 2085 4179 +2086 4323 2087 4467 2091 4612 2088 4670 2094 4821 2092 4960 2096 5104 2093 5163 2103 5271 2097 5437 +2098 5586 2099 5730 2100 5877 2105 6019 593 6077 2106 6134 2107 6192 2108 6250 2102 6308 2112 6459 +2101 6616 2109 6760 2110 6907 2114 7051 2111 7110 2116 7261 2118 7379 2115 7437 2127 7518 2120 7711 +2130 7887 2121 8062 2122 8245 2123 8397 2124 8552 2125 8704 2129 8858 597 8917 601 8975 2126 9033 +2141 9156 2133 9313 2134 9462 2136 9609 2143 9756 606 9814 610 9871 2144 9928 2145 9986 2140 10044 +2150 10182 2156 10321 2157 10501 2139 10544 2152 10691 2147 10750 2153 10809 2154 10868 2155 10927 2149 10986 +% 569 0 obj << -/Type /XObject -/Subtype /Form -/FormType 1 -/PTEX.FileName (./figures/ell.pdf) -/PTEX.PageNumber 1 -/PTEX.InfoDict 2169 0 R -/BBox [0 0 447 205] -/Resources << -/ProcSet [ /PDF /ImageC /Text ] -/ExtGState << -/R7 2170 0 R ->>/XObject << -/R8 2171 0 R ->>/Font << /R9 2172 0 R/R11 2173 0 R>> +/D [2044 0 R /XYZ 99.895 716.092 null] >> -/Length 2281 -/Filter /FlateDecode ->> -stream -xYˊ%WU~,okOý6=^! )EM3Pv)rZN8~s|9Z&vM -|-7;}Ζ)d_Dg|]]`l:H4d(f)֛d)L"bZ^3-~Ʀ%Luyf \HxPiGZb_NIIKP@``kM8ؖ8N6t%3L1V싋-5I@Ņh\ɶ!%/ 5QRŅUBk*#Hۑ?Hf[cǑ-"քNPYC&i]3D_(ԮQve3jJVggTen@in;Yi@fsa3g]FgsTAV܎ӓ+npN>.P;~R@c,S cߗ3ίޓKHNKR1 ҭ}|_i,K@4ytҔ[a>3-0'I$WPo%R*NڧK@X ʊF(9(jScA-\pCc&2k@=WZDD ND bENzUzV`T}Y@3Za_YQW5e^Mrj"K-wQU0FEX>5(!N bEZzԐ¨QŅVc1,2fɊb2/\4zK/2ome.N;z狩W04LeIG,N{PeZD>R2Ⴥ$].,-,-.uru]RNUJbϒ%ƒe](^E/""YE(:{/ȪUdr63hhk rѢ[i ҵ8 i ٮZZ9b E+#%E-. V\mhEdբ7Ryl6ky`d(T_>Ӕe+]@zcC׸l_&_64xn_'e:9F=Q/x؏_ ݾPyNhǞ(~J7+n$֭Lxxф8CySׄ ]f;XkL'/,kV@VwFjUQ/B 8Q!=ջL|LO/sbj p4b&zpLf.($}6OsXȅ_\@ *Hj`˂[^3[oM q<խ ؟! [~ UμHX`ZD .y Y*~TD%4ϴIcf QcYHC*cJRҀG ;ɿ@3~ZLkŎ8E8~xO_([zR6 -y-?Gz5O}MsAtԏ|THF -endstream -endobj -2050 0 obj +% 2043 0 obj << -/Type /ObjStm -/N 100 -/First 991 -/Length 12168 ->> -stream -2047 0 2044 148 2045 293 2049 440 573 499 2046 557 2056 652 2051 818 2052 963 2053 1110 -2054 1264 2058 1413 577 1471 2055 1528 2063 1623 2059 1780 2060 1927 2061 2074 2065 2228 581 2287 -2062 2345 2067 2440 2069 2558 585 2616 2066 2673 2075 2768 2071 2916 2072 3066 2077 3211 589 3270 -2078 3328 2079 3387 2080 3446 2081 3505 2074 3563 2086 3714 2073 3880 2082 4027 2083 4171 2084 4315 -2088 4460 2085 4518 2091 4669 2089 4808 2093 4952 2090 5011 2099 5119 2094 5276 2095 5421 2096 5568 -2101 5710 593 5768 2102 5825 2103 5883 2104 5941 2098 5999 2108 6150 2097 6307 2105 6451 2106 6598 -2110 6742 2107 6801 2112 6952 2114 7070 2111 7128 2123 7209 2116 7402 2126 7578 2117 7753 2118 7936 -2119 8088 2120 8243 2121 8395 2125 8549 597 8608 601 8666 2122 8724 2137 8847 2129 9004 2130 9153 -2132 9300 2139 9447 606 9505 610 9562 2140 9619 2141 9677 2136 9735 2146 9873 2152 10012 2153 10192 -2135 10235 2148 10382 2143 10441 2149 10500 2150 10559 2151 10618 2145 10677 2157 10815 2169 10954 2170 11134 -% 2047 0 obj +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> +/ProcSet [ /PDF /Text ] +>> +% 2051 0 obj << /Type /Page -/Contents 2048 0 R -/Resources 2046 0 R +/Contents 2052 0 R +/Resources 2050 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2034 0 R -/Annots [ 2044 0 R 2045 0 R ] +/Parent 2037 0 R +/Annots [ 2048 0 R 2049 0 R ] >> -% 2044 0 obj +% 2048 0 obj << /Type /Annot /Subtype /Link @@ -30194,7 +30113,7 @@ stream /Rect [371.126 573.77 443.414 585.83] /A << /S /GoTo /D (precdata) >> >> -% 2045 0 obj +% 2049 0 obj << /Type /Annot /Subtype /Link @@ -30202,29 +30121,29 @@ stream /Rect [371.126 498.054 443.414 510.114] /A << /S /GoTo /D (precdata) >> >> -% 2049 0 obj +% 2053 0 obj << -/D [2047 0 R /XYZ 149.705 753.953 null] +/D [2051 0 R /XYZ 149.705 753.953 null] >> % 573 0 obj << -/D [2047 0 R /XYZ 150.705 716.092 null] +/D [2051 0 R /XYZ 150.705 716.092 null] >> -% 2046 0 obj +% 2050 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2056 0 obj +% 2059 0 obj << /Type /Page -/Contents 2057 0 R -/Resources 2055 0 R +/Contents 2060 0 R +/Resources 2058 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2034 0 R -/Annots [ 2051 0 R 2052 0 R 2053 0 R 2054 0 R ] +/Parent 2037 0 R +/Annots [ 2054 0 R 2055 0 R 2056 0 R 2057 0 R ] >> -% 2051 0 obj +% 2054 0 obj << /Type /Annot /Subtype /Link @@ -30232,7 +30151,7 @@ stream /Rect [320.317 573.77 392.605 585.83] /A << /S /GoTo /D (precdata) >> >> -% 2052 0 obj +% 2055 0 obj << /Type /Annot /Subtype /Link @@ -30240,7 +30159,7 @@ stream /Rect [320.317 430.308 392.605 442.368] /A << /S /GoTo /D (precdata) >> >> -% 2053 0 obj +% 2056 0 obj << /Type /Annot /Subtype /Link @@ -30248,7 +30167,7 @@ stream /Rect [129.909 304.779 149.563 316.839] /A << /S /GoTo /D (subsection.12.4) >> >> -% 2054 0 obj +% 2057 0 obj << /Type /Annot /Subtype /Link @@ -30256,29 +30175,29 @@ stream /Rect [172.161 304.779 184.246 316.839] /A << /S /GoTo /D (section.13) >> >> -% 2058 0 obj +% 2061 0 obj << -/D [2056 0 R /XYZ 98.895 753.953 null] +/D [2059 0 R /XYZ 98.895 753.953 null] >> % 577 0 obj << -/D [2056 0 R /XYZ 99.895 716.092 null] +/D [2059 0 R /XYZ 99.895 716.092 null] >> -% 2055 0 obj +% 2058 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2063 0 obj +% 2066 0 obj << /Type /Page -/Contents 2064 0 R -/Resources 2062 0 R +/Contents 2067 0 R +/Resources 2065 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2034 0 R -/Annots [ 2059 0 R 2060 0 R 2061 0 R ] +/Parent 2037 0 R +/Annots [ 2062 0 R 2063 0 R 2064 0 R ] >> -% 2059 0 obj +% 2062 0 obj << /Type /Annot /Subtype /Link @@ -30286,7 +30205,7 @@ stream /Rect [371.126 561.815 443.414 573.875] /A << /S /GoTo /D (precdata) >> >> -% 2060 0 obj +% 2063 0 obj << /Type /Annot /Subtype /Link @@ -30294,7 +30213,7 @@ stream /Rect [371.126 486.099 443.414 498.159] /A << /S /GoTo /D (precdata) >> >> -% 2061 0 obj +% 2064 0 obj << /Type /Annot /Subtype /Link @@ -30302,50 +30221,50 @@ stream /Rect [443.742 396.435 463.169 408.495] /A << /S /GoTo /D (subsection.10.8) >> >> -% 2065 0 obj +% 2068 0 obj << -/D [2063 0 R /XYZ 149.705 753.953 null] +/D [2066 0 R /XYZ 149.705 753.953 null] >> % 581 0 obj << -/D [2063 0 R /XYZ 150.705 716.092 null] +/D [2066 0 R /XYZ 150.705 716.092 null] >> -% 2062 0 obj +% 2065 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2067 0 obj +% 2070 0 obj << /Type /Page -/Contents 2068 0 R -/Resources 2066 0 R +/Contents 2071 0 R +/Resources 2069 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2070 0 R +/Parent 2073 0 R >> -% 2069 0 obj +% 2072 0 obj << -/D [2067 0 R /XYZ 98.895 753.953 null] +/D [2070 0 R /XYZ 98.895 753.953 null] >> % 585 0 obj << -/D [2067 0 R /XYZ 99.895 716.092 null] +/D [2070 0 R /XYZ 99.895 716.092 null] >> -% 2066 0 obj +% 2069 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 2075 0 obj +% 2078 0 obj << /Type /Page -/Contents 2076 0 R -/Resources 2074 0 R +/Contents 2079 0 R +/Resources 2077 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2070 0 R -/Annots [ 2071 0 R 2072 0 R ] +/Parent 2073 0 R +/Annots [ 2074 0 R 2075 0 R ] >> -% 2071 0 obj +% 2074 0 obj << /Type /Annot /Subtype /Link @@ -30353,7 +30272,7 @@ stream /Rect [379.973 275.278 386.249 288.868] /A << /S /GoTo /D (Hfootnote.5) >> >> -% 2072 0 obj +% 2075 0 obj << /Type /Annot /Subtype /Link @@ -30361,45 +30280,45 @@ stream /Rect [342.753 134.696 420.271 146.755] /A << /S /GoTo /D (spdata) >> >> -% 2077 0 obj +% 2080 0 obj << -/D [2075 0 R /XYZ 149.705 753.953 null] +/D [2078 0 R /XYZ 149.705 753.953 null] >> % 589 0 obj << -/D [2075 0 R /XYZ 150.705 716.092 null] +/D [2078 0 R /XYZ 150.705 716.092 null] >> -% 2078 0 obj +% 2081 0 obj << -/D [2075 0 R /XYZ 150.705 444.811 null] +/D [2078 0 R /XYZ 150.705 444.811 null] >> -% 2079 0 obj +% 2082 0 obj << -/D [2075 0 R /XYZ 150.705 444.971 null] +/D [2078 0 R /XYZ 150.705 444.971 null] >> -% 2080 0 obj +% 2083 0 obj << -/D [2075 0 R /XYZ 150.705 433.015 null] +/D [2078 0 R /XYZ 150.705 433.015 null] >> -% 2081 0 obj +% 2084 0 obj << -/D [2075 0 R /XYZ 165.051 129.79 null] +/D [2078 0 R /XYZ 165.051 129.79 null] >> -% 2074 0 obj +% 2077 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F148 1490 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F152 1491 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 2086 0 obj +% 2089 0 obj << /Type /Page -/Contents 2087 0 R -/Resources 2085 0 R +/Contents 2090 0 R +/Resources 2088 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2070 0 R -/Annots [ 2073 0 R 2082 0 R 2083 0 R 2084 0 R ] +/Parent 2073 0 R +/Annots [ 2076 0 R 2085 0 R 2086 0 R 2087 0 R ] >> -% 2073 0 obj +% 2076 0 obj << /Type /Annot /Subtype /Link @@ -30407,7 +30326,7 @@ stream /Rect [291.943 654.503 364.232 666.562] /A << /S /GoTo /D (precdata) >> >> -% 2082 0 obj +% 2085 0 obj << /Type /Annot /Subtype /Link @@ -30415,7 +30334,7 @@ stream /Rect [342.493 584.479 418.548 596.539] /A << /S /GoTo /D (vdata) >> >> -% 2083 0 obj +% 2086 0 obj << /Type /Annot /Subtype /Link @@ -30423,7 +30342,7 @@ stream /Rect [342.493 514.456 418.548 526.516] /A << /S /GoTo /D (vdata) >> >> -% 2084 0 obj +% 2087 0 obj << /Type /Annot /Subtype /Link @@ -30431,25 +30350,25 @@ stream /Rect [291.943 374.41 359.001 386.47] /A << /S /GoTo /D (descdata) >> >> -% 2088 0 obj +% 2091 0 obj << -/D [2086 0 R /XYZ 98.895 753.953 null] +/D [2089 0 R /XYZ 98.895 753.953 null] >> -% 2085 0 obj +% 2088 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F148 1490 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F152 1491 0 R >> /ProcSet [ /PDF /Text ] >> -% 2091 0 obj +% 2094 0 obj << /Type /Page -/Contents 2092 0 R -/Resources 2090 0 R +/Contents 2095 0 R +/Resources 2093 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2070 0 R -/Annots [ 2089 0 R ] +/Parent 2073 0 R +/Annots [ 2092 0 R ] >> -% 2089 0 obj +% 2092 0 obj << /Type /Annot /Subtype /Link @@ -30457,41 +30376,49 @@ stream /Rect [393.303 554.876 469.357 566.936] /A << /S /GoTo /D (vdata) >> >> -% 2093 0 obj +% 2096 0 obj << -/D [2091 0 R /XYZ 149.705 753.953 null] +/D [2094 0 R /XYZ 149.705 753.953 null] >> -% 2090 0 obj +% 2093 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2099 0 obj +% 2103 0 obj << /Type /Page -/Contents 2100 0 R -/Resources 2098 0 R +/Contents 2104 0 R +/Resources 2102 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2070 0 R -/Annots [ 2094 0 R 2095 0 R 2096 0 R ] +/Parent 2073 0 R +/Annots [ 2097 0 R 2098 0 R 2099 0 R 2100 0 R ] >> -% 2094 0 obj +% 2097 0 obj +<< +/Type /Annot +/Subtype /Link +/Border[0 0 0]/H/I/C[1 0 0] +/Rect [338.667 637.666 350.622 649.726] +/A << /S /GoTo /D (section.10) >> +>> +% 2098 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [291.943 253.023 369.462 265.083] +/Rect [291.943 252.831 369.462 264.89] /A << /S /GoTo /D (spdata) >> >> -% 2095 0 obj +% 2099 0 obj << /Type /Annot /Subtype /Link /Border[0 0 0]/H/I/C[1 0 0] -/Rect [291.943 184.772 364.232 196.831] +/Rect [291.943 184.675 364.232 196.735] /A << /S /GoTo /D (precdata) >> >> -% 2096 0 obj +% 2100 0 obj << /Type /Annot /Subtype /Link @@ -30499,41 +30426,41 @@ stream /Rect [342.493 116.52 418.548 128.58] /A << /S /GoTo /D (vdata) >> >> -% 2101 0 obj +% 2105 0 obj << -/D [2099 0 R /XYZ 98.895 753.953 null] +/D [2103 0 R /XYZ 98.895 753.953 null] >> % 593 0 obj << -/D [2099 0 R /XYZ 99.895 716.092 null] +/D [2103 0 R /XYZ 99.895 716.092 null] >> -% 2102 0 obj +% 2106 0 obj << -/D [2099 0 R /XYZ 99.895 397.916 null] +/D [2103 0 R /XYZ 99.895 397.387 null] >> -% 2103 0 obj +% 2107 0 obj << -/D [2099 0 R /XYZ 99.895 398.076 null] +/D [2103 0 R /XYZ 99.895 397.546 null] >> -% 2104 0 obj +% 2108 0 obj << -/D [2099 0 R /XYZ 99.895 386.121 null] +/D [2103 0 R /XYZ 99.895 385.591 null] >> -% 2098 0 obj +% 2102 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F148 1490 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F152 1491 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 2108 0 obj +% 2112 0 obj << /Type /Page -/Contents 2109 0 R -/Resources 2107 0 R +/Contents 2113 0 R +/Resources 2111 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2070 0 R -/Annots [ 2097 0 R 2105 0 R 2106 0 R ] +/Parent 2073 0 R +/Annots [ 2101 0 R 2109 0 R 2110 0 R ] >> -% 2097 0 obj +% 2101 0 obj << /Type /Annot /Subtype /Link @@ -30541,7 +30468,7 @@ stream /Rect [393.303 654.503 469.357 666.562] /A << /S /GoTo /D (vdata) >> >> -% 2105 0 obj +% 2109 0 obj << /Type /Annot /Subtype /Link @@ -30549,7 +30476,7 @@ stream /Rect [342.753 520.007 409.811 532.067] /A << /S /GoTo /D (descdata) >> >> -% 2106 0 obj +% 2110 0 obj << /Type /Annot /Subtype /Link @@ -30557,63 +30484,63 @@ stream /Rect [393.303 183.768 469.357 195.827] /A << /S /GoTo /D (vdata) >> >> -% 2110 0 obj +% 2114 0 obj << -/D [2108 0 R /XYZ 149.705 753.953 null] +/D [2112 0 R /XYZ 149.705 753.953 null] >> -% 2107 0 obj +% 2111 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F148 1490 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F152 1491 0 R >> /ProcSet [ /PDF /Text ] >> -% 2112 0 obj +% 2116 0 obj << /Type /Page -/Contents 2113 0 R -/Resources 2111 0 R +/Contents 2117 0 R +/Resources 2115 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2115 0 R +/Parent 2119 0 R >> -% 2114 0 obj +% 2118 0 obj << -/D [2112 0 R /XYZ 98.895 753.953 null] +/D [2116 0 R /XYZ 98.895 753.953 null] >> -% 2111 0 obj +% 2115 0 obj << /Font << /F75 685 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2123 0 obj +% 2127 0 obj << /Type /Page -/Contents 2124 0 R -/Resources 2122 0 R +/Contents 2128 0 R +/Resources 2126 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2115 0 R -/Annots [ 2116 0 R 2126 0 R 2117 0 R 2118 0 R 2119 0 R 2120 0 R 2121 0 R ] +/Parent 2119 0 R +/Annots [ 2120 0 R 2130 0 R 2121 0 R 2122 0 R 2123 0 R 2124 0 R 2125 0 R ] >> -% 2116 0 obj +% 2120 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [368.938 636.522 495.412 648.582] /Subtype/Link/A<> >> -% 2126 0 obj +% 2130 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [174.615 624.567 218.45 636.627] /Subtype/Link/A<> >> -% 2117 0 obj +% 2121 0 obj << /Type /Annot /Border[0 0 0]/H/I/C[0 1 1] /Rect [191.223 593.098 397.198 605.158] /Subtype/Link/A<> >> -% 2118 0 obj +% 2122 0 obj << /Type /Annot /Subtype /Link @@ -30621,7 +30548,7 @@ stream /Rect [280.59 552.835 292.545 561.841] /A << /S /GoTo /D (cite.DesPat:11) >> >> -% 2119 0 obj +% 2123 0 obj << /Type /Annot /Subtype /Link @@ -30629,7 +30556,7 @@ stream /Rect [296.203 552.835 308.158 561.692] /A << /S /GoTo /D (cite.CaFiRo:2014) >> >> -% 2120 0 obj +% 2124 0 obj << /Type /Annot /Subtype /Link @@ -30637,7 +30564,7 @@ stream /Rect [311.815 552.835 323.771 561.841] /A << /S /GoTo /D (cite.Sparse03) >> >> -% 2121 0 obj +% 2125 0 obj << /Type /Annot /Subtype /Link @@ -30645,33 +30572,33 @@ stream /Rect [209.414 540.781 221.369 549.737] /A << /S /GoTo /D (cite.OurTechRep) >> >> -% 2125 0 obj +% 2129 0 obj << -/D [2123 0 R /XYZ 149.705 753.953 null] +/D [2127 0 R /XYZ 149.705 753.953 null] >> % 597 0 obj << -/D [2123 0 R /XYZ 150.705 716.092 null] +/D [2127 0 R /XYZ 150.705 716.092 null] >> % 601 0 obj << -/D [2123 0 R /XYZ 150.705 525.151 null] +/D [2127 0 R /XYZ 150.705 525.151 null] >> -% 2122 0 obj +% 2126 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R /F78 686 0 R /F233 1044 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R /F78 686 0 R /F235 1045 0 R >> /ProcSet [ /PDF /Text ] >> -% 2137 0 obj +% 2141 0 obj << /Type /Page -/Contents 2138 0 R -/Resources 2136 0 R +/Contents 2142 0 R +/Resources 2140 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2115 0 R -/Annots [ 2129 0 R 2130 0 R 2132 0 R ] +/Parent 2119 0 R +/Annots [ 2133 0 R 2134 0 R 2136 0 R ] >> -% 2129 0 obj +% 2133 0 obj << /Type /Annot /Subtype /Link @@ -30679,7 +30606,7 @@ stream /Rect [121.315 282.067 133.27 291.173] /A << /S /GoTo /D (cite.MRC:11) >> >> -% 2130 0 obj +% 2134 0 obj << /Type /Annot /Subtype /Link @@ -30687,7 +30614,7 @@ stream /Rect [253.836 246.183 265.791 255.592] /A << /S /GoTo /D (table.22) >> >> -% 2132 0 obj +% 2136 0 obj << /Type /Annot /Subtype /Link @@ -30695,53 +30622,53 @@ stream /Rect [310.367 176.296 317.241 188.355] /A << /S /GoTo /D (figure.6) >> >> -% 2139 0 obj +% 2143 0 obj << -/D [2137 0 R /XYZ 98.895 753.953 null] +/D [2141 0 R /XYZ 98.895 753.953 null] >> % 606 0 obj << -/D [2137 0 R /XYZ 99.895 349.244 null] +/D [2141 0 R /XYZ 99.895 349.244 null] >> % 610 0 obj << -/D [2137 0 R /XYZ 99.895 231.907 null] +/D [2141 0 R /XYZ 99.895 231.907 null] >> -% 2140 0 obj +% 2144 0 obj << -/D [2137 0 R /XYZ 99.895 211.056 null] +/D [2141 0 R /XYZ 99.895 211.056 null] >> -% 2141 0 obj +% 2145 0 obj << -/D [2137 0 R /XYZ 99.895 120.166 null] +/D [2141 0 R /XYZ 99.895 120.166 null] >> -% 2136 0 obj +% 2140 0 obj << -/Font << /F279 1813 0 R /F233 1044 0 R /F84 687 0 R /F145 940 0 R /F75 685 0 R /F78 686 0 R >> +/Font << /F281 1816 0 R /F235 1045 0 R /F84 687 0 R /F147 941 0 R /F75 685 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2146 0 obj +% 2150 0 obj << /Type /Page -/Contents 2147 0 R -/Resources 2145 0 R +/Contents 2151 0 R +/Resources 2149 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2115 0 R -/Annots [ 2135 0 R ] +/Parent 2119 0 R +/Annots [ 2139 0 R ] >> -% 2152 0 obj +% 2156 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133929+01'00') /ModDate (D:20140329133929+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2153 0 obj +% 2157 0 obj << /Type /ExtGState /OPM 1 >> -% 2135 0 obj +% 2139 0 obj << /Type /Annot /Subtype /Link @@ -30749,57 +30676,213 @@ stream /Rect [170.554 324.049 177.543 336.109] /A << /S /GoTo /D (algocf.1) >> >> -% 2148 0 obj +% 2152 0 obj << -/D [2146 0 R /XYZ 149.705 753.953 null] +/D [2150 0 R /XYZ 149.705 753.953 null] >> -% 2143 0 obj +% 2147 0 obj << -/D [2146 0 R /XYZ 150.705 716.092 null] +/D [2150 0 R /XYZ 150.705 716.092 null] >> -% 2149 0 obj +% 2153 0 obj << -/D [2146 0 R /XYZ 397.506 407.446 null] +/D [2150 0 R /XYZ 397.506 407.446 null] >> -% 2150 0 obj +% 2154 0 obj << -/D [2146 0 R /XYZ 150.705 260.219 null] +/D [2150 0 R /XYZ 150.705 260.219 null] >> -% 2151 0 obj +% 2155 0 obj << -/D [2146 0 R /XYZ 150.705 226.207 null] +/D [2150 0 R /XYZ 150.705 226.207 null] >> -% 2145 0 obj +% 2149 0 obj << -/Font << /F84 687 0 R /F78 686 0 R /F192 942 0 R /F145 940 0 R >> -/XObject << /Im6 2131 0 R >> +/Font << /F84 687 0 R /F78 686 0 R /F197 943 0 R /F147 941 0 R >> +/XObject << /Im6 2135 0 R >> /ProcSet [ /PDF /Text ] >> -% 2157 0 obj + +endstream +endobj +2162 0 obj << -/Type /Page -/Contents 2158 0 R -/Resources 2156 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 2115 0 R -/Annots [ 2134 0 R ] +/Length 7547 >> -% 2169 0 obj +stream +0 g 0 G +0 g 0 G +0 g 0 G +1 0 0 1 154.285 609.491 cm +q +.52 0 0 .52 0 0 cm +q +1 0 0 1 0 0 cm +/Im7 Do +Q +Q +0 g 0 G +1 0 0 1 -154.285 -609.491 cm +BT +/F84 9.9626 Tf 152.938 587.573 Td [(Figur)18(e)-250(6:)-310(ELLP)92(ACK)-250(compr)18(ession)-250(of)-250(matrix)-250(in)-250(Figur)18(e)]TJ +0 0 1 rg 0 0 1 RG + [-250(5)]TJ +0 g 0 G +0 g 0 G +0 g 0 G +0 g 0 G +0 g 0 G +/F75 8.9664 Tf -16.48 -31.498 Td [(d)-11(o)]TJ/F84 8.9664 Tf 17.426 0 Td [(i)-243(=)-89(1)-178(,)-98(n)]TJ -5.537 -10.959 Td [(t)-168(=)-32(0)]TJ/F75 8.9664 Tf -1.13 -10.958 Td [(d)-11(o)]TJ/F84 8.9664 Tf 17.682 0 Td [(j)-272(=)-89(1)-177(,)-121(m)-32(a)-32(x)-32(n)-32(z)-32(r)]TJ -5.792 -10.959 Td [(t)-734(=)-734(t)-734(+)-1289(a)-92(s)-226(\050)-236(i)-381(,)-358(j)-342(\051)]TJ 85.313 -2.332 Td [(*)]TJ 5.293 2.332 Td [(x)-176(\050)-288(j)-156(a)-289(\050)-236(i)-381(,)-358(j)-361(\051)-178(\051)]TJ/F75 8.9664 Tf -102.419 -10.959 Td [(e)-19(n)-20(d)-630(d)-11(o)]TJ/F84 8.9664 Tf 0.022 -10.959 Td [(y)-156(\050)-288(i)-288(\051)-730(=)-734(t)]TJ/F75 8.9664 Tf -10.782 -10.959 Td [(e)-19(n)-20(d)-630(d)-12(o)]TJ +0 g 0 G +0 g 0 G +0 g 0 G +0 g 0 G +0 g 0 G +/F75 9.9626 Tf 16.498 -17.519 Td [(Algorithm)-250(1:)]TJ/F84 9.9626 Tf 60.055 0 Td [(Matrix-V)111(ector)-250(pr)18(oduct)-250(in)-250(ELL)-250(format)]TJ +0 g 0 G +0 g 0 G +0 g 0 G +0.95 0.95 0.95 rg 0.95 0.95 0.95 RG +0.95 0.95 0.95 rg 0.95 0.95 0.95 RG +ET +q +1 0 0 1 99.895 316.473 cm +0 0 343.711 126.526 re f +Q +0.95 0.95 0.95 rg 0.95 0.95 0.95 RG +0 g 0 G +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.00 0.44 0.13 rg 0.00 0.44 0.13 RG +BT +/F235 8.9664 Tf 112.299 432.339 Td [(type)]TJ +0 g 0 G + [(,)]TJ +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.00 0.44 0.13 rg 0.00 0.44 0.13 RG + [-525(extends)]TJ +0 g 0 G + [(\050psb_d_base_sparse_mat\051)]TJ +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.00 0.44 0.13 rg 0.00 0.44 0.13 RG + [-525(::)]TJ +0 g 0 G +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G + [-525(psb_d_ell_sparse_mat)]TJ +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.38 0.63 0.69 rg 0.38 0.63 0.69 RG +/F281 8.9664 Tf 9.414 -10.959 Td [(!)]TJ +0 g 0 G +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.38 0.63 0.69 rg 0.38 0.63 0.69 RG + 0 -10.959 Td [(!)-525(ITPACK/ELL)-525(format,)-525(extended.)]TJ +0 g 0 G +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.38 0.63 0.69 rg 0.38 0.63 0.69 RG + 0 -10.959 Td [(!)]TJ +0 g 0 G +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.56 0.13 0.00 rg 0.56 0.13 0.00 RG +/F235 8.9664 Tf 0 -21.918 Td [(integer)]TJ +0 g 0 G + [(\050psb_ipk_\051,)]TJ +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.00 0.44 0.13 rg 0.00 0.44 0.13 RG + [-525(allocatable)]TJ +0 g 0 G +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.00 0.44 0.13 rg 0.00 0.44 0.13 RG + [-525(::)]TJ +0 g 0 G +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G + [-525(irn\050:\051,)]TJ +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G + [-525(ja\050:,:\051,)]TJ +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G + [-525(idiag\050:\051)]TJ +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.56 0.13 0.00 rg 0.56 0.13 0.00 RG + 0 -10.959 Td [(real)]TJ +0 g 0 G + [(\050psb_dpk_\051,)]TJ +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.00 0.44 0.13 rg 0.00 0.44 0.13 RG + [-525(allocatable)]TJ +0 g 0 G +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.00 0.44 0.13 rg 0.00 0.44 0.13 RG + [-525(::)]TJ +0 g 0 G +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G + [-525(val\050:,:\051)]TJ +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.00 0.44 0.13 rg 0.00 0.44 0.13 RG + -9.414 -21.918 Td [(contains)]TJ +0 g 0 G +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G + 9.414 -10.959 Td [(....)]TJ +0.73 0.73 0.73 rg 0.73 0.73 0.73 RG +0 g 0 G +0.00 0.44 0.13 rg 0.00 0.44 0.13 RG + -9.414 -10.958 Td [(end)-525(type)]TJ +0 g 0 G + [-525(psb_d_ell_sparse_mat)]TJ +0.95 0.95 0.95 rg 0.95 0.95 0.95 RG +0 g 0 G +/F75 9.9626 Tf -12.404 -39.81 Td [(Hacked)-250(ELLP)74(ACK)]TJ/F84 9.9626 Tf 0.98 0 0 1 99.587 263.883 Tm [(The)]TJ/F78 9.9626 Tf 0.98 0 0 1 118.234 263.883 Tm [(hacked)-236(ELLP)132(ACK)]TJ/F84 9.9626 Tf 0.98 0 0 1 190.781 263.883 Tm [(\050)]TJ/F75 9.9626 Tf 0.98 0 0 1 194.032 263.883 Tm [(HLL)]TJ/F84 9.9626 Tf 0.98 0 0 1 214.096 263.883 Tm [(\051)-236(format)-236(alleviates)-236(the)-236(main)-236(pr)19(oblem)-236(of)-236(the)-236(ELLP)94(ACK)]TJ 0.989 0 0 1 99.895 251.928 Tm [(format,)-252(that)-253(is,)-252(the)-252(amount)-253(of)-252(memory)-252(r)18(equir)18(ed)-252(by)-252(padding)-252(for)-253(sparse)-252(matrices)]TJ 1 0 0 1 99.895 239.973 Tm [(in)-250(which)-250(the)-250(maximum)-250(r)18(ow)-250(length)-250(is)-250(lar)18(ger)-250(than)-250(the)-250(average.)]TJ 1.02 0 0 1 114.839 227.97 Tm [(The)-421(number)-421(of)-422(elements)-421(allocated)-421(to)-421(padding)-421(is)]TJ/F197 10.3811 Tf 1 0 0 1 345.511 227.97 Tm [([)-24(\050)]TJ/F78 9.9626 Tf 7.403 0 Td [(m)]TJ/F195 10.3811 Tf 10.6 0 Td [(\003)]TJ/F78 9.9626 Tf 8.039 0 Td [(m)-40(a)-42(x)-70(N)-76(R)]TJ/F197 10.3811 Tf 34.072 0 Td [(\051)]TJ/F195 10.3811 Tf 6.874 0 Td [(\000)]TJ/F197 10.3811 Tf 10.919 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(m)]TJ/F195 10.3811 Tf 10.6 0 Td [(\003)]TJ/F78 9.9626 Tf -338.123 -11.955 Td [(a)-25(v)-47(g)-60(N)-76(R)]TJ/F197 10.3811 Tf 31.104 0 Td [(\051)-537(=)]TJ/F78 9.9626 Tf 23.266 0 Td [(m)]TJ/F195 10.3811 Tf 10.451 0 Td [(\003)]TJ/F197 10.3811 Tf 7.891 0 Td [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(m)-40(a)-42(x)-70(N)-76(R)]TJ/F195 10.3811 Tf 36.523 0 Td [(\000)]TJ/F78 9.9626 Tf 10.919 0 Td [(a)-25(v)-47(g)-60(N)-76(R)]TJ/F197 10.3811 Tf 31.103 0 Td [(\051)-23(])]TJ/F84 9.9626 Tf 1.02 0 0 1 266.856 216.015 Tm [(for)-382(both)]TJ/F147 9.9626 Tf 1 0 0 1 307.954 216.015 Tm [(AS)]TJ/F84 9.9626 Tf 1.02 0 0 1 322.291 216.015 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 343.374 216.015 Tm [(JA)]TJ/F84 9.9626 Tf 1.02 0 0 1 357.711 216.015 Tm [(arrays,)-416(wher)18(e)]TJ/F78 9.9626 Tf 1 0 0 1 424.587 216.015 Tm [(m)]TJ/F84 9.9626 Tf 1.02 0 0 1 436.341 216.015 Tm [(is)]TJ 0.995 0 0 1 99.895 204.06 Tm [(equal)-252(to)-252(the)-252(number)-252(of)-252(r)18(ows)-252(of)-252(the)-252(matrix)1(,)]TJ/F78 9.9626 Tf 1 0 0 1 287.784 204.06 Tm [(m)-40(a)-42(x)-70(N)-76(R)]TJ/F84 9.9626 Tf 0.995 0 0 1 324.229 204.06 Tm [(is)-252(the)-252(maximum)-252(number)-252(of)]TJ 0.998 0 0 1 99.895 192.104 Tm [(nonzer)18(o)-251(elements)-251(in)-251(every)-251(r)18(ow)-252(and)]TJ/F78 9.9626 Tf 1 0 0 1 257.847 192.104 Tm [(a)-25(v)-47(g)-60(N)-76(R)]TJ/F84 9.9626 Tf 0.998 0 0 1 291.322 192.104 Tm [(is)-251(the)-251(average)-251(number)-252(of)-251(nonzer)18(os.)]TJ 1.017 0 0 1 99.587 180.149 Tm [(Ther)18(efor)17(e)-245(a)-246(single)-245(densely)-246(populated)-245(r)17(ow)-245(can)-246(seriously)-246(af)18(fec)1(t)-246(the)-246(total)-245(size)-246(of)]TJ 1 0 0 1 99.895 168.194 Tm [(the)-250(allocation.)]TJ 1.02 0 0 1 114.839 156.191 Tm [(T)90(o)-335(limit)-336(this)-335(ef)18(fect,)-358(in)-336(t)1(he)-336(HLL)-335(format)-336(we)-335(br)18(eak)-336(the)-335(original)-336(matrix)-335(into)]TJ 0.985 0 0 1 99.895 144.236 Tm [(equally)-254(sized)-253(gr)18(oups)-253(of)-254(r)18(ows)-253(\050called)]TJ/F78 9.9626 Tf 0.985 0 0 1 259.082 144.236 Tm [(hacks)]TJ/F84 9.9626 Tf 0.985 0 0 1 280.514 144.236 Tm [(\051,)-254(and)-253(then)-254(stor)19(e)-254(these)-253(gr)18(oups)-254(as)-253(inde-)]TJ 1.02 0 0 1 99.596 132.281 Tm [(pendent)-249(matrices)-249(in)-249(ELLP)90(ACK)-249(format.)-315(The)-249(gr)18(oups)-249(can)-249(be)-249(arranged)-249(selecting)]TJ 1.02 0 0 1 99.895 120.326 Tm [(r)18(ows)-332(in)-331(an)-331(arbitrarily)-331(manner;)-374(indeed,)-353(if)-331(the)-331(r)18(ows)-332(ar)18(e)-331(sorted)-331(by)-331(decr)17(easing)]TJ +0 g 0 G + 1 0 0 1 264.279 90.438 Tm [(173)]TJ +0 g 0 G +ET + +endstream +endobj +2137 0 obj << -/Producer (GPL Ghostscript 9.10) -/CreationDate (D:20140329133928+01'00') -/ModDate (D:20140329133928+01'00') -/Creator (cairo 1.13.1 \(http://cairographics.org\)) +/Type /XObject +/Subtype /Form +/FormType 1 +/PTEX.FileName (./figures/ell.pdf) +/PTEX.PageNumber 1 +/PTEX.InfoDict 2174 0 R +/BBox [0 0 447 205] +/Resources << +/ProcSet [ /PDF /ImageC /Text ] +/ExtGState << +/R7 2175 0 R +>>/XObject << +/R8 2176 0 R +>>/Font << /R9 2177 0 R/R11 2178 0 R>> >> -% 2170 0 obj -<< -/Type /ExtGState -/OPM 1 +/Length 2281 +/Filter /FlateDecode >> - +stream +xYˊ%WU~,okOý6=^! )EM3Pv)rZN8~s|9Z&vM +|-7;}Ζ)d_Dg|]]`l:H4d(f)֛d)L"bZ^3-~Ʀ%Luyf \HxPiGZb_NIIKP@``kM8ؖ8N6t%3L1V싋-5I@Ņh\ɶ!%/ 5QRŅUBk*#Hۑ?Hf[cǑ-"քNPYC&i]3D_(ԮQve3jJVggTen@in;Yi@fsa3g]FgsTAV܎ӓ+npN>.P;~R@c,S cߗ3ίޓKHNKR1 ҭ}|_i,K@4ytҔ[a>3-0'I$WPo%R*NڧK@X ʊF(9(jScA-\pCc&2k@=WZDD ND bENzUzV`T}Y@3Za_YQW5e^Mrj"K-wQU0FEX>5(!N bEZzԐ¨QŅVc1,2fɊb2/\4zK/2ome.N;z狩W04LeIG,N{PeZD>R2Ⴥ$].,-,-.uru]RNUJbϒ%ƒe](^E/""YE(:{/ȪUdr63hhk rѢ[i ҵ8 i ٮZZ9b E+#%E-. V\mhEdբ7Ryl6ky`d(T_>Ӕe+]@zcC׸l_&_64xn_'e:9F=Q/x؏_ ݾPyNhǞ(~J7+n$֭Lxxф8CySׄ ]f;XkL'/,kV@VwFjUQ/B 8Q!=ջL|LO/sbj p4b&zpLf.($}6OsXȅ_\@ *Hj`˂[^3[oM q<խ ؟! [~ UμHX`ZD .y Y*~TD%4ϴIcf QcYHC*cJRҀG ;ɿ@3~ZLkŎ8E8~xO_([zR6 +y-?Gz5O}MsAtԏ|THF endstream endobj -2171 0 obj +2176 0 obj << /Subtype /Image /ColorSpace /DeviceGray @@ -30818,7 +30901,7 @@ stream ;Y endstream endobj -2176 0 obj +2180 0 obj << /Filter /FlateDecode /Length 171 @@ -30827,7 +30910,7 @@ stream x]M FOĸma0,;vߛ|~D. #ƪ[ q2WNyYz&GNYM9.^i'dmQtCM)Y:2D^26Y?iRt4ఆ6޹Wc,Ož=+V endstream endobj -2178 0 obj +2182 0 obj << /Filter /FlateDecode /Length 191 @@ -30837,7 +30920,7 @@ x U}uT-mǸT)uɺDyC (|i_ endstream endobj -2179 0 obj +2183 0 obj << /Filter /FlateDecode /Length1 11124 @@ -30886,7 +30969,7 @@ B endstream endobj -2180 0 obj +2184 0 obj << /Filter /FlateDecode /Length1 3512 @@ -30902,7 +30985,7 @@ a l'uoL|Ero9ߺӣ( endstream endobj -2187 0 obj +2191 0 obj << /Length 8640 >> @@ -30910,7 +30993,7 @@ stream 0 g 0 G 0 g 0 G BT -/F84 9.9626 Tf 1.002 0 0 1 150.705 706.129 Tm [(number)-250(of)-250(nonzer)18(os)-251(we)-250(obtain)-250(essentially)-250(the)-250(JAgged)-250(Diagonals)-251(format.)-311(If)-250(the)]TJ 1.02 0 0 1 150.705 694.174 Tm [(r)18(ows)-295(ar)18(e)-294(not)-294(in)-295(the)-294(original)-294(or)18(der)72(,)-306(then)-294(an)-295(additional)-294(vector)]TJ/F78 9.9626 Tf 1.02 0 0 1 423.988 694.174 Tm [(rIdx)]TJ/F84 9.9626 Tf 1.02 0 0 1 444.477 694.174 Tm [(is)-294(r)17(equir)18(ed,)]TJ 1 0 0 1 150.705 682.219 Tm [(storing)-250(the)-250(actual)-250(r)18(ow)-250(index)-250(for)-250(each)-250(r)18(ow)-250(in)-250(the)-250(data)-250(str)8(uctur)18(e.)]TJ 0.981 0 0 1 165.649 670.198 Tm [(The)-255(multiple)-255(ELLP)94(ACK-like)-255(buf)18(fers)-255(ar)18(e)-255(stac)1(ked)-255(together)-255(inside)-255(a)-255(single,)-255(one)]TJ 0.993 0 0 1 150.705 658.242 Tm [(dimensional)-252(array;)-252(an)-251(additional)-252(vector)]TJ/F78 9.9626 Tf 0.993 0 0 1 326.015 658.242 Tm [(hackOffsets)]TJ/F84 9.9626 Tf 0.993 0 0 1 374.299 658.242 Tm [(is)-252(pr)18(ovided)-251(to)-252(keep)-252(track)-252(of)]TJ 1.009 0 0 1 150.705 646.287 Tm [(the)-248(individual)-248(submatrices.)-308(All)-248(hacks)-249(have)-248(the)-248(same)-248(number)-248(of)-248(r)18(ows)]TJ/F78 9.9626 Tf 1.009 0 0 1 458.348 646.287 Tm [(hackSize)]TJ/F84 9.9626 Tf 1.009 0 0 1 493.148 646.287 Tm [(;)]TJ 0.985 0 0 1 150.705 634.332 Tm [(hence,)-255(the)]TJ/F78 9.9626 Tf 0.985 0 0 1 196.944 634.332 Tm [(hackOffsets)]TJ/F84 9.9626 Tf 0.985 0 0 1 244.865 634.332 Tm [(vector)-254(is)-255(an)-254(array)-255(of)]TJ/F192 10.3811 Tf 1 0 0 1 333.788 634.332 Tm [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(m)]TJ/F84 9.9626 Tf 8 0 Td [(/)]TJ/F78 9.9626 Tf 6.336 0 Td [(h)-40(a)-25(c)-25(k)-30(S)-18(i)-32(z)-25(e)]TJ/F192 10.3811 Tf 36.682 0 Td [(\051)-210(+)]TJ/F84 9.9626 Tf 0.985 0 0 1 405.427 634.332 Tm [(1)-254(elements,)-255(each)-254(one)]TJ 0.985 0 0 1 150.406 622.377 Tm [(pointing)-253(to)-253(the)-253(\002rst)-253(index)-253(of)-253(a)-253(submatrix)-254(ins)1(ide)-254(the)-253(stacked)]TJ/F78 9.9626 Tf 0.985 0 0 1 408.705 622.377 Tm [(cM)]TJ/F84 9.9626 Tf 0.985 0 0 1 421.963 622.377 Tm [(/)]TJ/F78 9.9626 Tf 0.985 0 0 1 427.91 622.377 Tm [(rP)]TJ/F84 9.9626 Tf 0.985 0 0 1 440.206 622.377 Tm [(buf)18(fers,)-253(plus)]TJ 1.02 0 0 1 150.705 610.422 Tm [(an)-269(additional)-269(element)-268(pointing)-269(past)-269(the)-269(end)-269(of)-268(the)-269(last)-269(block,)-275(wher)18(e)-269(the)-269(next)]TJ 1.006 0 0 1 150.705 598.467 Tm [(one)-248(would)-249(begin.)-308(W)92(e)-249(thus)-248(have)-249(the)-248(pr)18(operty)-249(that)-248(the)-249(el)1(ements)-249(of)-248(the)]TJ/F78 9.9626 Tf 1 0 0 1 456.901 598.467 Tm [(k)]TJ/F84 9.9626 Tf 1.006 0 0 1 461.498 598.467 Tm [(-th)]TJ/F78 9.9626 Tf 1.006 0 0 1 476.426 598.467 Tm [(hack)]TJ/F84 9.9626 Tf 0.995 0 0 1 150.705 586.511 Tm [(ar)18(e)-252(stor)18(ed)-251(between)]TJ/F145 9.9626 Tf 1 0 0 1 236.017 586.511 Tm [(hackOffsets[k])]TJ/F84 9.9626 Tf 0.995 0 0 1 311.738 586.511 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 331.016 586.511 Tm [(hackOffsets[k+1])]TJ/F84 9.9626 Tf 0.995 0 0 1 414.702 586.511 Tm [(,)-252(similarly)-252(to)-252(what)]TJ 1 0 0 1 150.705 574.556 Tm [(happens)-250(in)-250(the)-250(CSR)-250(format.)]TJ +/F84 9.9626 Tf 1.002 0 0 1 150.705 706.129 Tm [(number)-250(of)-250(nonzer)18(os)-251(we)-250(obtain)-250(essentially)-250(the)-250(JAgged)-250(Diagonals)-251(format.)-311(If)-250(the)]TJ 1.02 0 0 1 150.705 694.174 Tm [(r)18(ows)-295(ar)18(e)-294(not)-294(in)-295(the)-294(original)-294(or)18(der)72(,)-306(then)-294(an)-295(additional)-294(vector)]TJ/F78 9.9626 Tf 1.02 0 0 1 423.988 694.174 Tm [(rIdx)]TJ/F84 9.9626 Tf 1.02 0 0 1 444.477 694.174 Tm [(is)-294(r)17(equir)18(ed,)]TJ 1 0 0 1 150.705 682.219 Tm [(storing)-250(the)-250(actual)-250(r)18(ow)-250(index)-250(for)-250(each)-250(r)18(ow)-250(in)-250(the)-250(data)-250(str)8(uctur)18(e.)]TJ 0.981 0 0 1 165.649 670.198 Tm [(The)-255(multiple)-255(ELLP)94(ACK-like)-255(buf)18(fers)-255(ar)18(e)-255(stac)1(ked)-255(together)-255(inside)-255(a)-255(single,)-255(one)]TJ 0.993 0 0 1 150.705 658.242 Tm [(dimensional)-252(array;)-252(an)-251(additional)-252(vector)]TJ/F78 9.9626 Tf 0.993 0 0 1 326.015 658.242 Tm [(hackOffsets)]TJ/F84 9.9626 Tf 0.993 0 0 1 374.299 658.242 Tm [(is)-252(pr)18(ovided)-251(to)-252(keep)-252(track)-252(of)]TJ 1.009 0 0 1 150.705 646.287 Tm [(the)-248(individual)-248(submatrices.)-308(All)-248(hacks)-249(have)-248(the)-248(same)-248(number)-248(of)-248(r)18(ows)]TJ/F78 9.9626 Tf 1.009 0 0 1 458.348 646.287 Tm [(hackSize)]TJ/F84 9.9626 Tf 1.009 0 0 1 493.148 646.287 Tm [(;)]TJ 0.985 0 0 1 150.705 634.332 Tm [(hence,)-255(the)]TJ/F78 9.9626 Tf 0.985 0 0 1 196.944 634.332 Tm [(hackOffsets)]TJ/F84 9.9626 Tf 0.985 0 0 1 244.865 634.332 Tm [(vector)-254(is)-255(an)-254(array)-255(of)]TJ/F197 10.3811 Tf 1 0 0 1 333.788 634.332 Tm [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(m)]TJ/F84 9.9626 Tf 8 0 Td [(/)]TJ/F78 9.9626 Tf 6.336 0 Td [(h)-40(a)-25(c)-25(k)-30(S)-18(i)-32(z)-25(e)]TJ/F197 10.3811 Tf 36.682 0 Td [(\051)-210(+)]TJ/F84 9.9626 Tf 0.985 0 0 1 405.427 634.332 Tm [(1)-254(elements,)-255(each)-254(one)]TJ 0.985 0 0 1 150.406 622.377 Tm [(pointing)-253(to)-253(the)-253(\002rst)-253(index)-253(of)-253(a)-253(submatrix)-254(ins)1(ide)-254(the)-253(stacked)]TJ/F78 9.9626 Tf 0.985 0 0 1 408.705 622.377 Tm [(cM)]TJ/F84 9.9626 Tf 0.985 0 0 1 421.963 622.377 Tm [(/)]TJ/F78 9.9626 Tf 0.985 0 0 1 427.91 622.377 Tm [(rP)]TJ/F84 9.9626 Tf 0.985 0 0 1 440.206 622.377 Tm [(buf)18(fers,)-253(plus)]TJ 1.02 0 0 1 150.705 610.422 Tm [(an)-269(additional)-269(element)-268(pointing)-269(past)-269(the)-269(end)-269(of)-268(the)-269(last)-269(block,)-275(wher)18(e)-269(the)-269(next)]TJ 1.006 0 0 1 150.705 598.467 Tm [(one)-248(would)-249(begin.)-308(W)92(e)-249(thus)-248(have)-249(the)-248(pr)18(operty)-249(that)-248(the)-249(el)1(ements)-249(of)-248(the)]TJ/F78 9.9626 Tf 1 0 0 1 456.901 598.467 Tm [(k)]TJ/F84 9.9626 Tf 1.006 0 0 1 461.498 598.467 Tm [(-th)]TJ/F78 9.9626 Tf 1.006 0 0 1 476.426 598.467 Tm [(hack)]TJ/F84 9.9626 Tf 0.995 0 0 1 150.705 586.511 Tm [(ar)18(e)-252(stor)18(ed)-251(between)]TJ/F147 9.9626 Tf 1 0 0 1 236.017 586.511 Tm [(hackOffsets[k])]TJ/F84 9.9626 Tf 0.995 0 0 1 311.738 586.511 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 331.016 586.511 Tm [(hackOffsets[k+1])]TJ/F84 9.9626 Tf 0.995 0 0 1 414.702 586.511 Tm [(,)-252(similarly)-252(to)-252(what)]TJ 1 0 0 1 150.705 574.556 Tm [(happens)-250(in)-250(the)-250(CSR)-250(format.)]TJ 0 g 0 G ET 1 0 0 1 197.579 452.455 cm @@ -30930,7 +31013,7 @@ BT 0 g 0 G 0 g 0 G 0 g 0 G - 0.982 0 0 1 165.649 406.495 Tm [(W)56(ith)-254(this)-254(data)-254(str)8(uctur)19(e)-254(a)-254(very)-254(long)-254(r)18(ow)-254(only)-254(af)19(f)-1(ects)-254(one)-254(hack,)-254(and)-254(ther)19(efor)18(e)]TJ 1 0 0 1 150.705 394.54 Tm [(the)-250(additional)-250(memory)-250(is)-250(limited)-250(to)-250(the)-250(hack)-250(in)-250(which)-250(the)-250(r)18(ow)-250(appears.)]TJ 14.944 -12.021 Td [(The)-250(r)18(elevant)-250(data)-250(type)-250(is)]TJ/F145 9.9626 Tf 110.952 0 Td [(psb_T_hll_sparse_mat)]TJ/F84 9.9626 Tf 104.607 0 Td [(:)]TJ + 0.982 0 0 1 165.649 406.495 Tm [(W)56(ith)-254(this)-254(data)-254(str)8(uctur)19(e)-254(a)-254(very)-254(long)-254(r)18(ow)-254(only)-254(af)19(f)-1(ects)-254(one)-254(hack,)-254(and)-254(ther)19(efor)18(e)]TJ 1 0 0 1 150.705 394.54 Tm [(the)-250(additional)-250(memory)-250(is)-250(limited)-250(to)-250(the)-250(hack)-250(in)-250(which)-250(the)-250(r)18(ow)-250(appears.)]TJ 14.944 -12.021 Td [(The)-250(r)18(elevant)-250(data)-250(type)-250(is)]TJ/F147 9.9626 Tf 110.952 0 Td [(psb_T_hll_sparse_mat)]TJ/F84 9.9626 Tf 104.607 0 Td [(:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -30944,7 +31027,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 163.108 359.772 Td [(type)]TJ +/F235 8.9664 Tf 163.108 359.772 Td [(type)]TJ 0 g 0 G [(,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -30964,7 +31047,7 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 8.9664 Tf 9.415 -10.959 Td [(!)]TJ +/F281 8.9664 Tf 9.415 -10.959 Td [(!)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G @@ -30979,7 +31062,7 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG -/F233 8.9664 Tf 0 -10.959 Td [(integer)]TJ +/F235 8.9664 Tf 0 -10.959 Td [(integer)]TJ 0 g 0 G [(\050psb_ipk_\051)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -31018,12 +31101,12 @@ BT [-525(idiag\050:\051,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G - 18.829 -10.959 Td [(hkoffs\050:\051)]TJ/F148 5.1905 Tf -15.277 0 Td [(,)]TJ/F190 5.1905 Tf 0.61 0 Td [(!)]TJ + 18.829 -10.959 Td [(hkoffs\050:\051)]TJ/F152 5.1905 Tf -15.277 0 Td [(,)]TJ/F195 5.1905 Tf 0.61 0 Td [(!)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG -/F233 8.9664 Tf -4.162 -10.959 Td [(real)]TJ +/F235 8.9664 Tf -4.162 -10.959 Td [(real)]TJ 0 g 0 G [(\050psb_dpk_\051,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -31058,7 +31141,7 @@ BT 0 0 1 rg 0 0 1 RG [-248(8)]TJ 0 g 0 G - [(\051)-248(has)-248(a)-247(2-dimensional)-248(array)]TJ/F145 9.9626 Tf 1 0 0 1 483.955 180.167 Tm [(AS)]TJ/F84 9.9626 Tf 0.98 0 0 1 150.705 168.212 Tm [(containing)-223(in)-222(each)-223(column)-223(the)-222(coef)18(\002cients)-223(along)-223(a)-222(diagonal)-223(of)-223(the)-222(matrix,)-229(and)-223(an)]TJ 0.98 0 0 1 150.705 156.257 Tm [(integer)-254(array)]TJ/F145 9.9626 Tf 1 0 0 1 208.91 156.257 Tm [(OFFSET)]TJ/F84 9.9626 Tf 0.98 0 0 1 242.771 156.257 Tm [(that)-254(determines)-254(wher)19(e)-254(each)-254(diagonal)-254(starts.)-316(The)-253(diagonals)]TJ 1 0 0 1 150.705 144.302 Tm [(in)]TJ/F145 9.9626 Tf 11.188 0 Td [(AS)]TJ/F84 9.9626 Tf 12.951 0 Td [(ar)18(e)-250(padded)-250(with)-250(zer)18(os)-250(as)-250(necessary)111(.)]TJ 1.01 0 0 1 165.649 132.281 Tm [(The)-248(code)-248(to)-249(compute)-248(the)-248(matrix-vector)-248(pr)17(oduct)]TJ/F78 9.9626 Tf 1 0 0 1 378.488 132.281 Tm [(y)]TJ/F192 10.3811 Tf 8.011 0 Td [(=)]TJ/F78 9.9626 Tf 11.598 0 Td [(A)-42(x)]TJ/F84 9.9626 Tf 1.01 0 0 1 413.412 132.281 Tm [(is)-248(shown)-249(in)-248(Alg.)]TJ + [(\051)-248(has)-248(a)-247(2-dimensional)-248(array)]TJ/F147 9.9626 Tf 1 0 0 1 483.955 180.167 Tm [(AS)]TJ/F84 9.9626 Tf 0.98 0 0 1 150.705 168.212 Tm [(containing)-223(in)-222(each)-223(column)-223(the)-222(coef)18(\002cients)-223(along)-223(a)-222(diagonal)-223(of)-223(the)-222(matrix,)-229(and)-223(an)]TJ 0.98 0 0 1 150.705 156.257 Tm [(integer)-254(array)]TJ/F147 9.9626 Tf 1 0 0 1 208.91 156.257 Tm [(OFFSET)]TJ/F84 9.9626 Tf 0.98 0 0 1 242.771 156.257 Tm [(that)-254(determines)-254(wher)19(e)-254(each)-254(diagonal)-254(starts.)-316(The)-253(diagonals)]TJ 1 0 0 1 150.705 144.302 Tm [(in)]TJ/F147 9.9626 Tf 11.188 0 Td [(AS)]TJ/F84 9.9626 Tf 12.951 0 Td [(ar)18(e)-250(padded)-250(with)-250(zer)18(os)-250(as)-250(necessary)111(.)]TJ 1.01 0 0 1 165.649 132.281 Tm [(The)-248(code)-248(to)-249(compute)-248(the)-248(matrix-vector)-248(pr)17(oduct)]TJ/F78 9.9626 Tf 1 0 0 1 378.488 132.281 Tm [(y)]TJ/F197 10.3811 Tf 8.011 0 Td [(=)]TJ/F78 9.9626 Tf 11.598 0 Td [(A)-42(x)]TJ/F84 9.9626 Tf 1.01 0 0 1 413.412 132.281 Tm [(is)-248(shown)-249(in)-248(Alg.)]TJ 0 0 1 rg 0 0 1 RG [-248(2)]TJ 0 g 0 G @@ -31070,20 +31153,20 @@ ET endstream endobj -2181 0 obj +2185 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (../figures/hll.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2191 0 R +/PTEX.InfoDict 2195 0 R /BBox [0 0 494 214] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 2192 0 R ->>/Font << /R8 2193 0 R/R10 2194 0 R>> +/R7 2196 0 R +>>/Font << /R8 2197 0 R/R10 2198 0 R>> >> /Length 2880 /Filter /FlateDecode @@ -31105,7 +31188,7 @@ l <O?ӂ2.g9_*Ps OYTUvrƈSbzh8ѽXZ`矝@8w)akEvK|dGs%D YV@( zC׬87xVNj i3k4w(lV*|ikԦ*kK_Box:H+xi[;<+i`8= endstream endobj -2196 0 obj +2200 0 obj << /Filter /FlateDecode /Length 214 @@ -31114,7 +31197,7 @@ stream x]0 {@فLOK p#&QZ]VqA ׁ͈n G64( ~R6&{ax.[DKQ7idZ?:;> @@ -31196,7 +31279,7 @@ stream 0 g 0 G 0 g 0 G BT -/F84 9.9626 Tf 1.02 0 0 1 99.895 706.129 Tm [(memory)-286(write)-286(and)-286(two)-286(\003oating-point)-286(operations)-286(per)-286(inner)-287(iter)1(ation.)-427(The)-286(ac-)]TJ 0.984 0 0 1 99.895 694.174 Tm [(cesses)-255(to)]TJ/F145 9.9626 Tf 1 0 0 1 139.647 694.174 Tm [(AS)]TJ/F84 9.9626 Tf 0.984 0 0 1 152.603 694.174 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 171.695 694.174 Tm [(x)]TJ/F84 9.9626 Tf 0.984 0 0 1 179.42 694.174 Tm [(ar)18(e)-254(in)-255(strict)-254(sequential)-255(or)19(der)75(,)-255(ther)19(efor)18(e)-255(no)-254(indir)18(ect)-254(addr)18(essing)]TJ 1 0 0 1 99.895 682.219 Tm [(is)-250(r)18(equir)18(ed.)]TJ +/F84 9.9626 Tf 1.02 0 0 1 99.895 706.129 Tm [(memory)-286(write)-286(and)-286(two)-286(\003oating-point)-286(operations)-286(per)-286(inner)-287(iter)1(ation.)-427(The)-286(ac-)]TJ 0.984 0 0 1 99.895 694.174 Tm [(cesses)-255(to)]TJ/F147 9.9626 Tf 1 0 0 1 139.647 694.174 Tm [(AS)]TJ/F84 9.9626 Tf 0.984 0 0 1 152.603 694.174 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 171.695 694.174 Tm [(x)]TJ/F84 9.9626 Tf 0.984 0 0 1 179.42 694.174 Tm [(ar)18(e)-254(in)-255(strict)-254(sequential)-255(or)19(der)75(,)-255(ther)19(efor)18(e)-255(no)-254(indir)18(ect)-254(addr)18(essing)]TJ 1 0 0 1 99.895 682.219 Tm [(is)-250(r)18(equir)18(ed.)]TJ 0 g 0 G ET 1 0 0 1 146.769 562.733 cm @@ -31231,7 +31314,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 136.657 494.353 Td [(do)]TJ +/F235 8.9664 Tf 136.657 494.353 Td [(do)]TJ 0 g 0 G [-525(j)]TJ 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -31396,7 +31479,7 @@ BT 0 g 0 G 0 g 0 G 0 g 0 G - -97.969 -26.977 Td [(The)-250(r)18(elevant)-250(data)-250(type)-250(is)]TJ/F145 9.9626 Tf 110.953 0 Td [(psb_T_dia_sparse_mat)]TJ/F84 9.9626 Tf 104.607 0 Td [(:)]TJ + -97.969 -26.977 Td [(The)-250(r)18(elevant)-250(data)-250(type)-250(is)]TJ/F147 9.9626 Tf 110.953 0 Td [(psb_T_dia_sparse_mat)]TJ/F84 9.9626 Tf 104.607 0 Td [(:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -31410,7 +31493,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 112.299 313.591 Td [(type)]TJ +/F235 8.9664 Tf 112.299 313.591 Td [(type)]TJ 0 g 0 G [(,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -31430,7 +31513,7 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 8.9664 Tf 9.414 -10.959 Td [(!)]TJ +/F281 8.9664 Tf 9.414 -10.959 Td [(!)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G @@ -31445,7 +31528,7 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG -/F233 8.9664 Tf 0 -21.918 Td [(integer)]TJ +/F235 8.9664 Tf 0 -21.918 Td [(integer)]TJ 0 g 0 G [(\050psb_ipk_\051,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -31512,20 +31595,20 @@ ET endstream endobj -2203 0 obj +2207 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./figures/dia.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2212 0 R +/PTEX.InfoDict 2216 0 R /BBox [0 0 499 211] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << -/R7 2213 0 R ->>/Font << /R8 2214 0 R/R10 2215 0 R>> +/R7 2217 0 R +>>/Font << /R8 2218 0 R/R10 2219 0 R>> >> /Length 2502 /Filter /FlateDecode @@ -31543,7 +31626,7 @@ $ rca8zDbHd'\L/1ٌ,0Fc)T#  7,j7%ΥR6q4/ٸg]\\W\+3,mLrJ7&?9.yQQШѕ&Gsm7LϋI7=mMm/]o/vUQxT._lâQU.$Rg{cLq1><>bJ:_ƽ:dp>yov翑ӑ-u縑߿&& endstream endobj -2217 0 obj +2221 0 obj << /Filter /FlateDecode /Length 177 @@ -31553,7 +31636,7 @@ x t s1#8UlV"αCcfb/9=FpQbxCvQY endstream endobj -2219 0 obj +2223 0 obj << /Filter /FlateDecode /Length 197 @@ -31562,7 +31645,7 @@ stream x]M FmLqѦi{ ꢷ0j] #kkʳG Vn", FY^ fҁeM';3Mטy%hQBIk?={Ao3d++ĚJh ˪P* Q$ĆFCι=7[WL-asb endstream endobj -2220 0 obj +2224 0 obj << /Filter /FlateDecode /Length1 9528 @@ -31596,7 +31679,7 @@ E _ [C,0Z +ׅÿ]i ^g\oȯ'/! `?G&XI,bQ ~8߇^: Zp"'Drms#0F~6McӴBi6U Ⱦ?GN_XR=$=zC/]lQdE3ꊭi endstream endobj -2221 0 obj +2225 0 obj << /Filter /FlateDecode /Length1 4304 @@ -31622,7 +31705,7 @@ Hp }ػ.|wy endstream endobj -2226 0 obj +2230 0 obj << /Length 9674 >> @@ -31630,7 +31713,7 @@ stream 0 g 0 G 0 g 0 G BT -/F84 9.9626 Tf 1.004 0 0 1 150.705 706.129 Tm [(the)-248(amount)-247(of)-248(needed)-248(padding;)-248(mor)18(eover)74(,)-248(while)-248(the)-248(DIA)-248(code)-247(is)-248(easily)-248(vector)18(-)]TJ 0.999 0 0 1 150.705 694.174 Tm [(ized,)-249(it)-249(does)-249(not)-249(necessarily)-250(make)-249(optimal)-249(use)-249(of)-249(the)-249(memory)-249(hierar)18(chy)111(.)-310(While)]TJ 0.99 0 0 1 150.406 682.219 Tm [(pr)18(ocessing)-252(each)-252(diagonal)-252(we)-252(ar)18(e)-252(updating)-252(entries)-252(in)-252(the)-252(output)-252(vector)]TJ/F145 9.9626 Tf 1 0 0 1 457.277 682.219 Tm [(y)]TJ/F84 9.9626 Tf 0.99 0 0 1 462.508 682.219 Tm [(,)-252(which)]TJ 0.98 0 0 1 150.705 670.263 Tm [(is)-248(then)-248(accessed)-247(multiple)-248(times;)-250(if)-248(the)-248(vector)]TJ/F145 9.9626 Tf 1 0 0 1 342.631 670.263 Tm [(y)]TJ/F84 9.9626 Tf 0.98 0 0 1 350.281 670.263 Tm [(is)-248(too)-248(lar)19(ge)-248(to)-248(r)19(emain)-248(in)-248(the)-248(cache)]TJ 1 0 0 1 150.705 658.308 Tm [(memory)111(,)-250(the)-250(associated)-250(cache)-250(miss)-250(penalty)-250(is)-250(paid)-250(multiple)-250(times.)]TJ 1.02 0 0 1 165.649 646.353 Tm [(The)]TJ/F78 9.9626 Tf 1.02 0 0 1 186.392 646.353 Tm [(hacked)-367(DIA)]TJ/F84 9.9626 Tf 1.02 0 0 1 239.757 646.353 Tm [(\050)]TJ/F75 9.9626 Tf 1.02 0 0 1 243.141 646.353 Tm [(HDIA)]TJ/F84 9.9626 Tf 1.02 0 0 1 271.929 646.353 Tm [(\051)-367(format)-368(was)-367(designed)-367(to)-367(contain)-368(the)-367(amount)-367(of)]TJ 1.02 0 0 1 150.406 634.398 Tm [(padding,)-346(by)-325(br)18(eaking)-326(the)-325(original)-326(matrix)-325(into)-326(equally)-325(sized)-325(gr)17(oups)-325(of)-326(r)18(ows)]TJ 1.013 0 0 1 150.376 622.443 Tm [(\050)]TJ/F78 9.9626 Tf 1.013 0 0 1 153.737 622.443 Tm [(hacks)]TJ/F84 9.9626 Tf 1.013 0 0 1 175.778 622.443 Tm [(\051,)-246(and)-245(then)-245(storing)-246(these)-245(gr)18(oups)-246(as)-245(independent)-246(matrices)-245(in)-245(DIA)-246(format.)]TJ 1.004 0 0 1 150.396 610.488 Tm [(This)-250(appr)18(oach)-250(is)-250(similar)-250(to)-250(that)-250(of)-250(HLL,)-250(and)-250(r)18(equir)18(es)-250(using)-250(an)-250(of)17(f)1(set)-250(vector)-250(for)]TJ 1.013 0 0 1 150.705 598.532 Tm [(each)-247(submatrix.)-306(Again,)-247(similarly)-246(to)-247(HLL,)-247(the)-247(various)-247(submatrices)-246(ar)17(e)-246(stacked)]TJ 0.991 0 0 1 150.705 586.577 Tm [(inside)-253(a)-252(linear)-253(array)-253(to)-252(impr)18(ove)-253(memory)-252(management.)-314(The)-253(fact)-252(that)-253(the)-253(matrix)]TJ 0.98 0 0 1 150.705 574.622 Tm [(is)-212(accessed)-212(in)-212(slices)-212(help)1(s)-212(in)-212(r)18(educing)-212(cache)-212(misses,)-220(especially)-212(r)18(egar)19(ding)-212(accesses)]TJ 1 0 0 1 150.705 562.667 Tm [(to)-250(the)-250(vector)]TJ/F145 9.9626 Tf 57.424 0 Td [(y)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ 1.003 0 0 1 165.649 550.712 Tm [(An)-248(a)-1(ddi)1(tional)-249(vector)]TJ/F78 9.9626 Tf 1.003 0 0 1 259.673 550.712 Tm [(hackOffsets)]TJ/F84 9.9626 Tf 1.003 0 0 1 308.411 550.712 Tm [(is)-249(pr)18(ovided)-248(to)-249(complete)-248(the)-249(matrix)-248(format;)]TJ 0.999 0 0 1 150.705 538.757 Tm [(given)-250(that)]TJ/F78 9.9626 Tf 0.999 0 0 1 197.561 538.757 Tm [(hackSize)]TJ/F84 9.9626 Tf 0.999 0 0 1 234.51 538.757 Tm [(is)-250(the)-251(number)-250(of)-251(r)18(ows)-250(of)-251(each)-250(hack,)-251(the)]TJ/F78 9.9626 Tf 0.999 0 0 1 408.824 538.757 Tm [(hackOffsets)]TJ/F84 9.9626 Tf 0.999 0 0 1 457.388 538.757 Tm [(vector)-250(is)]TJ 1.013 0 0 1 150.705 526.801 Tm [(made)-246(by)-246(an)-246(array)-246(of)]TJ/F192 10.3811 Tf 1 0 0 1 242.857 526.801 Tm [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(m)]TJ/F84 9.9626 Tf 8 0 Td [(/)]TJ/F78 9.9626 Tf 6.336 0 Td [(h)-40(a)-25(c)-25(k)-30(S)-18(i)-32(z)-25(e)]TJ/F192 10.3811 Tf 36.682 0 Td [(\051)-209(+)]TJ/F84 9.9626 Tf 1.013 0 0 1 314.476 526.801 Tm [(1)-246(elements,)-246(pointing)-246(to)-246(the)-246(\002rst)-246(diagonal)]TJ 0.98 0 0 1 150.705 514.846 Tm [(of)18(fset)-215(of)-215(a)-214(submatrix)-215(inside)-215(the)-215(stacked)]TJ/F78 9.9626 Tf 0.98 0 0 1 318.648 514.846 Tm [(offsets)]TJ/F84 9.9626 Tf 0.98 0 0 1 345.153 514.846 Tm [(buf)18(fers,)-223(plus)-215(an)-214(additional)-215(element)]TJ 0.98 0 0 1 150.705 502.891 Tm [(equal)-226(to)-225(the)-226(number)-225(of)-226(nonzer)18(o)-225(diagonals)-226(in)-226(the)-225(whole)-226(matrix.)-306(W)94(e)-226(thus)-226(have)-225(the)]TJ 0.98 0 0 1 150.406 490.936 Tm [(pr)18(operty)-202(that)-202(the)-201(number)-202(of)-202(diagonals)-202(of)-202(the)]TJ/F78 9.9626 Tf 1 0 0 1 341.485 490.936 Tm [(k)]TJ/F84 9.9626 Tf 0.98 0 0 1 346.083 490.936 Tm [(-th)]TJ/F78 9.9626 Tf 0.98 0 0 1 360.171 490.936 Tm [(hack)]TJ/F84 9.9626 Tf 0.98 0 0 1 379.718 490.936 Tm [(is)-202(given)-202(by)]TJ/F78 9.9626 Tf 0.98 0 0 1 427.587 490.936 Tm [(hackOffsets[k+1])]TJ 1 0 0 1 149.709 478.981 Tm [(-)-250(hackOffsets[k])]TJ/F84 9.9626 Tf 62.983 0 Td [(.)]TJ +/F84 9.9626 Tf 1.004 0 0 1 150.705 706.129 Tm [(the)-248(amount)-247(of)-248(needed)-248(padding;)-248(mor)18(eover)74(,)-248(while)-248(the)-248(DIA)-248(code)-247(is)-248(easily)-248(vector)18(-)]TJ 0.999 0 0 1 150.705 694.174 Tm [(ized,)-249(it)-249(does)-249(not)-249(necessarily)-250(make)-249(optimal)-249(use)-249(of)-249(the)-249(memory)-249(hierar)18(chy)111(.)-310(While)]TJ 0.99 0 0 1 150.406 682.219 Tm [(pr)18(ocessing)-252(each)-252(diagonal)-252(we)-252(ar)18(e)-252(updating)-252(entries)-252(in)-252(the)-252(output)-252(vector)]TJ/F147 9.9626 Tf 1 0 0 1 457.277 682.219 Tm [(y)]TJ/F84 9.9626 Tf 0.99 0 0 1 462.508 682.219 Tm [(,)-252(which)]TJ 0.98 0 0 1 150.705 670.263 Tm [(is)-248(then)-248(accessed)-247(multiple)-248(times;)-250(if)-248(the)-248(vector)]TJ/F147 9.9626 Tf 1 0 0 1 342.631 670.263 Tm [(y)]TJ/F84 9.9626 Tf 0.98 0 0 1 350.281 670.263 Tm [(is)-248(too)-248(lar)19(ge)-248(to)-248(r)19(emain)-248(in)-248(the)-248(cache)]TJ 1 0 0 1 150.705 658.308 Tm [(memory)111(,)-250(the)-250(associated)-250(cache)-250(miss)-250(penalty)-250(is)-250(paid)-250(multiple)-250(times.)]TJ 1.02 0 0 1 165.649 646.353 Tm [(The)]TJ/F78 9.9626 Tf 1.02 0 0 1 186.392 646.353 Tm [(hacked)-367(DIA)]TJ/F84 9.9626 Tf 1.02 0 0 1 239.757 646.353 Tm [(\050)]TJ/F75 9.9626 Tf 1.02 0 0 1 243.141 646.353 Tm [(HDIA)]TJ/F84 9.9626 Tf 1.02 0 0 1 271.929 646.353 Tm [(\051)-367(format)-368(was)-367(designed)-367(to)-367(contain)-368(the)-367(amount)-367(of)]TJ 1.02 0 0 1 150.406 634.398 Tm [(padding,)-346(by)-325(br)18(eaking)-326(the)-325(original)-326(matrix)-325(into)-326(equally)-325(sized)-325(gr)17(oups)-325(of)-326(r)18(ows)]TJ 1.013 0 0 1 150.376 622.443 Tm [(\050)]TJ/F78 9.9626 Tf 1.013 0 0 1 153.737 622.443 Tm [(hacks)]TJ/F84 9.9626 Tf 1.013 0 0 1 175.778 622.443 Tm [(\051,)-246(and)-245(then)-245(storing)-246(these)-245(gr)18(oups)-246(as)-245(independent)-246(matrices)-245(in)-245(DIA)-246(format.)]TJ 1.004 0 0 1 150.396 610.488 Tm [(This)-250(appr)18(oach)-250(is)-250(similar)-250(to)-250(that)-250(of)-250(HLL,)-250(and)-250(r)18(equir)18(es)-250(using)-250(an)-250(of)17(f)1(set)-250(vector)-250(for)]TJ 1.013 0 0 1 150.705 598.532 Tm [(each)-247(submatrix.)-306(Again,)-247(similarly)-246(to)-247(HLL,)-247(the)-247(various)-247(submatrices)-246(ar)17(e)-246(stacked)]TJ 0.991 0 0 1 150.705 586.577 Tm [(inside)-253(a)-252(linear)-253(array)-253(to)-252(impr)18(ove)-253(memory)-252(management.)-314(The)-253(fact)-252(that)-253(the)-253(matrix)]TJ 0.98 0 0 1 150.705 574.622 Tm [(is)-212(accessed)-212(in)-212(slices)-212(help)1(s)-212(in)-212(r)18(educing)-212(cache)-212(misses,)-220(especially)-212(r)18(egar)19(ding)-212(accesses)]TJ 1 0 0 1 150.705 562.667 Tm [(to)-250(the)-250(vector)]TJ/F147 9.9626 Tf 57.424 0 Td [(y)]TJ/F84 9.9626 Tf 5.23 0 Td [(.)]TJ 1.003 0 0 1 165.649 550.712 Tm [(An)-248(a)-1(ddi)1(tional)-249(vector)]TJ/F78 9.9626 Tf 1.003 0 0 1 259.673 550.712 Tm [(hackOffsets)]TJ/F84 9.9626 Tf 1.003 0 0 1 308.411 550.712 Tm [(is)-249(pr)18(ovided)-248(to)-249(complete)-248(the)-249(matrix)-248(format;)]TJ 0.999 0 0 1 150.705 538.757 Tm [(given)-250(that)]TJ/F78 9.9626 Tf 0.999 0 0 1 197.561 538.757 Tm [(hackSize)]TJ/F84 9.9626 Tf 0.999 0 0 1 234.51 538.757 Tm [(is)-250(the)-251(number)-250(of)-251(r)18(ows)-250(of)-251(each)-250(hack,)-251(the)]TJ/F78 9.9626 Tf 0.999 0 0 1 408.824 538.757 Tm [(hackOffsets)]TJ/F84 9.9626 Tf 0.999 0 0 1 457.388 538.757 Tm [(vector)-250(is)]TJ 1.013 0 0 1 150.705 526.801 Tm [(made)-246(by)-246(an)-246(array)-246(of)]TJ/F197 10.3811 Tf 1 0 0 1 242.857 526.801 Tm [(\050)]TJ/F78 9.9626 Tf 4.274 0 Td [(m)]TJ/F84 9.9626 Tf 8 0 Td [(/)]TJ/F78 9.9626 Tf 6.336 0 Td [(h)-40(a)-25(c)-25(k)-30(S)-18(i)-32(z)-25(e)]TJ/F197 10.3811 Tf 36.682 0 Td [(\051)-209(+)]TJ/F84 9.9626 Tf 1.013 0 0 1 314.476 526.801 Tm [(1)-246(elements,)-246(pointing)-246(to)-246(the)-246(\002rst)-246(diagonal)]TJ 0.98 0 0 1 150.705 514.846 Tm [(of)18(fset)-215(of)-215(a)-214(submatrix)-215(inside)-215(the)-215(stacked)]TJ/F78 9.9626 Tf 0.98 0 0 1 318.648 514.846 Tm [(offsets)]TJ/F84 9.9626 Tf 0.98 0 0 1 345.153 514.846 Tm [(buf)18(fers,)-223(plus)-215(an)-214(additional)-215(element)]TJ 0.98 0 0 1 150.705 502.891 Tm [(equal)-226(to)-225(the)-226(number)-225(of)-226(nonzer)18(o)-225(diagonals)-226(in)-226(the)-225(whole)-226(matrix.)-306(W)94(e)-226(thus)-226(have)-225(the)]TJ 0.98 0 0 1 150.406 490.936 Tm [(pr)18(operty)-202(that)-202(the)-201(number)-202(of)-202(diagonals)-202(of)-202(the)]TJ/F78 9.9626 Tf 1 0 0 1 341.485 490.936 Tm [(k)]TJ/F84 9.9626 Tf 0.98 0 0 1 346.083 490.936 Tm [(-th)]TJ/F78 9.9626 Tf 0.98 0 0 1 360.171 490.936 Tm [(hack)]TJ/F84 9.9626 Tf 0.98 0 0 1 379.718 490.936 Tm [(is)-202(given)-202(by)]TJ/F78 9.9626 Tf 0.98 0 0 1 427.587 490.936 Tm [(hackOffsets[k+1])]TJ 1 0 0 1 149.709 478.981 Tm [(-)-250(hackOffsets[k])]TJ/F84 9.9626 Tf 62.983 0 Td [(.)]TJ 0 g 0 G ET 1 0 0 1 197.579 370.389 cm @@ -31650,7 +31733,7 @@ BT 0 g 0 G 0 g 0 G 0 g 0 G - -33.102 -23.941 Td [(The)-250(r)18(elevant)-250(data)-250(type)-250(is)]TJ/F145 9.9626 Tf 110.952 0 Td [(psb_T_hdia_sparse_mat)]TJ/F84 9.9626 Tf 109.837 0 Td [(:)]TJ + -33.102 -23.941 Td [(The)-250(r)18(elevant)-250(data)-250(type)-250(is)]TJ/F147 9.9626 Tf 110.952 0 Td [(psb_T_hdia_sparse_mat)]TJ/F84 9.9626 Tf 109.837 0 Td [(:)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG ET @@ -31664,7 +31747,7 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 163.108 301.945 Td [(type)]TJ +/F235 8.9664 Tf 163.108 301.945 Td [(type)]TJ 0 g 0 G [-525(pm)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -31749,7 +31832,7 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.38 0.63 0.69 rg 0.38 0.63 0.69 RG -/F279 8.9664 Tf 9.415 -10.959 Td [(!)]TJ +/F281 8.9664 Tf 9.415 -10.959 Td [(!)]TJ 0 g 0 G 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G @@ -31764,7 +31847,7 @@ BT 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F233 8.9664 Tf 0 -21.918 Td [(type)]TJ +/F235 8.9664 Tf 0 -21.918 Td [(type)]TJ 0 g 0 G [(\050pm\051,)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -31849,22 +31932,22 @@ ET endstream endobj -2222 0 obj +2226 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (../figures/hdia.pdf) /PTEX.PageNumber 1 -/PTEX.InfoDict 2229 0 R +/PTEX.InfoDict 2233 0 R /BBox [0 0 556 211] /Resources << /ProcSet [ /PDF /ImageC /Text ] /ExtGState << -/R7 2230 0 R +/R7 2234 0 R >>/XObject << -/R8 2231 0 R ->>/Font << /R9 2232 0 R/R11 2233 0 R>> +/R8 2235 0 R +>>/Font << /R9 2236 0 R/R11 2237 0 R>> >> /Length 3027 /Filter /FlateDecode @@ -31881,7 +31964,7 @@ mC WهZ1mC8?ehc57-7hhlABgĠQ YP׾Zkaf%1#YStIo`FzT#:""w+jeqA#X#͸g = 1cPD-,ZJ3k-^ZnrABqL-9|S,cphbABgĠZ lYfF]æf^g8ų7ĊlT3" ڿV)Z?f̺1ְX]]LȿYKjϢKedjP\+uUq(q|Kcth|;D8T3Y˫HNJ+QnǨ١k1*R$`j f,vU#}Jo|Yք5%sM%x?kSW-"RMXQքG|dէԄ5kšjwjtnVUne4;r!6tA Y!eB:h yJ:D#R[Da̖Is<Hed m8% P#޴ϷmxGZˑn9s#jN5cG,rum|i8PE!*] GR,_#?fCsâݴϷ}$Ǯ`LyR+Q#KzT&z)H_x6=OOgixLE8ɫKc2OOUjSJ[YE,l^ygeآo }DBt'" +}fbB͏7x6qߟ` dP۝{%^w_΅)zɎ- ʪ#O! smRa;a\=sﮆ@w}.?NC ,P{ԅJ8}Hzw׿{Uۇ}nbURA4ۃǹ@7#ׯ"W}{{~fZg)wG?4 endstream endobj -2231 0 obj +2235 0 obj << /Subtype /Image /ColorSpace /DeviceGray @@ -31900,7 +31983,7 @@ stream 0l?@ endstream endobj -2235 0 obj +2239 0 obj << /Filter /FlateDecode /Length 177 @@ -31909,7 +31992,7 @@ stream x]1 EwN 0C%]24^/8Ilm.SHA SI-iPt>^T$DeΣZ=;b``JCR~r޵v]0c1%VKUP Jv4Dojy}C*Z|Y endstream endobj -2237 0 obj +2241 0 obj << /Filter /FlateDecode /Length 213 @@ -31921,7 +32004,7 @@ e Y$c yJ l endstream endobj -2238 0 obj +2242 0 obj << /Filter /FlateDecode /Length1 10604 @@ -31955,7 +32038,7 @@ b YF. XbιKo߾ں9 ,pxgx`K)Dl;yj8[=2dqmᏓ;EP%=X endstream endobj -2239 0 obj +2243 0 obj << /Filter /FlateDecode /Length1 5080 @@ -31976,7 +32059,7 @@ Y2 p}3y.pĀq%t1ޮonbeM03kD ^ow# '?rt39#W||ADe0bx`}u%\3Ze?|Od?o2U3W )' endstream endobj -2242 0 obj +2246 0 obj << /Length 1097 >> @@ -31995,7 +32078,7 @@ Q 0 g 0 G 0.56 0.13 0.00 rg 0.56 0.13 0.00 RG BT -/F233 8.9664 Tf 121.713 701.446 Td [(integer)]TJ +/F235 8.9664 Tf 121.713 701.446 Td [(integer)]TJ 0 g 0 G [(\050psb_long_int_k_\051)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -32036,7 +32119,7 @@ ET endstream endobj -2246 0 obj +2250 0 obj << /Length 7873 >> @@ -32074,12 +32157,12 @@ Q 0 g 0 G 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG BT -/F233 8.9664 Tf 172.523 370.757 Td [(call)]TJ +/F235 8.9664 Tf 172.523 370.757 Td [(call)]TJ 0 g 0 G [-525(psb_spmm\050alpha,a,x,beta,y,desc_a,info\051)]TJ 0.95 0.95 0.95 rg 0.95 0.95 0.95 RG 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 150.286 347.275 Tm [(will)-258(transpar)18(ently)-258(and)-258(automatically)-257(be)-258(performed)-258(on)-258(the)-257(GPU)-258(whenever)-258(all)]TJ 1.014 0 0 1 150.705 335.32 Tm [(thr)18(ee)-246(data)-245(inputs)]TJ/F145 9.9626 Tf 1 0 0 1 228.932 335.32 Tm [(a)]TJ/F84 9.9626 Tf 1.014 0 0 1 234.162 335.32 Tm [(,)]TJ/F145 9.9626 Tf 1 0 0 1 239.17 335.32 Tm [(x)]TJ/F84 9.9626 Tf 1.014 0 0 1 246.88 335.32 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 266.463 335.32 Tm [(y)]TJ/F84 9.9626 Tf 1.014 0 0 1 274.173 335.32 Tm [(ar)18(e)-246(GPU-enabled.)-305(If)-246(a)-245(pr)18(ogram)-246(makes)-245(many)-246(such)]TJ 1 0 0 1 150.705 323.364 Tm [(calls)-250(sequentially)111(,)-250(then)]TJ +/F84 9.9626 Tf 1.02 0 0 1 150.286 347.275 Tm [(will)-258(transpar)18(ently)-258(and)-258(automatically)-257(be)-258(performed)-258(on)-258(the)-257(GPU)-258(whenever)-258(all)]TJ 1.014 0 0 1 150.705 335.32 Tm [(thr)18(ee)-246(data)-245(inputs)]TJ/F147 9.9626 Tf 1 0 0 1 228.932 335.32 Tm [(a)]TJ/F84 9.9626 Tf 1.014 0 0 1 234.162 335.32 Tm [(,)]TJ/F147 9.9626 Tf 1 0 0 1 239.17 335.32 Tm [(x)]TJ/F84 9.9626 Tf 1.014 0 0 1 246.88 335.32 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 266.463 335.32 Tm [(y)]TJ/F84 9.9626 Tf 1.014 0 0 1 274.173 335.32 Tm [(ar)18(e)-246(GPU-enabled.)-305(If)-246(a)-245(pr)18(ogram)-246(makes)-245(many)-246(such)]TJ 1 0 0 1 150.705 323.364 Tm [(calls)-250(sequentially)111(,)-250(then)]TJ 0 g 0 G 13.888 -18.472 Td [(\225)]TJ 0 g 0 G @@ -32087,15 +32170,15 @@ BT 0 g 0 G -104.945 -19.198 Td [(\225)]TJ 0 g 0 G - 1.02 0 0 1 175.611 261.784 Tm [(Subsequent)-308(kernel)-308(invocations)-308(involving)-307(the)-308(same)-308(vector)-308(will)-308(\002nd)-308(the)]TJ 1 0 0 1 175.611 249.828 Tm [(data)-250(on)-250(the)-250(GPU)-250(side)-250(so)-250(that)-250(they)-250(will)-250(r)8(un)-250(at)-250(full)-250(speed.)]TJ 1.016 0 0 1 150.705 231.356 Tm [(For)-246(all)-245(invocations)-246(after)-246(the)-245(\002rst)-246(the)-246(only)-245(data)-246(that)-246(will)-245(have)-246(to)-246(be)-246(transferr)18(ed)]TJ 1.02 0 0 1 150.705 219.401 Tm [(to/fr)18(om)-254(the)-254(main)-253(memory)-254(will)-254(be)-253(the)-254(scalars)]TJ/F145 9.9626 Tf 1 0 0 1 355.319 219.401 Tm [(alpha)]TJ/F84 9.9626 Tf 1.02 0 0 1 384.049 219.401 Tm [(and)]TJ/F145 9.9626 Tf 1 0 0 1 403.83 219.401 Tm [(beta)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.752 219.401 Tm [(,)-256(and)-253(the)-254(r)18(eturn)]TJ 1 0 0 1 150.705 207.446 Tm [(code)]TJ/F145 9.9626 Tf 23.213 0 Td [(info)]TJ/F84 9.9626 Tf 20.921 0 Td [(.)]TJ + 1.02 0 0 1 175.611 261.784 Tm [(Subsequent)-308(kernel)-308(invocations)-308(involving)-307(the)-308(same)-308(vector)-308(will)-308(\002nd)-308(the)]TJ 1 0 0 1 175.611 249.828 Tm [(data)-250(on)-250(the)-250(GPU)-250(side)-250(so)-250(that)-250(they)-250(will)-250(r)8(un)-250(at)-250(full)-250(speed.)]TJ 1.016 0 0 1 150.705 231.356 Tm [(For)-246(all)-245(invocations)-246(after)-246(the)-245(\002rst)-246(the)-246(only)-245(data)-246(that)-246(will)-245(have)-246(to)-246(be)-246(transferr)18(ed)]TJ 1.02 0 0 1 150.705 219.401 Tm [(to/fr)18(om)-254(the)-254(main)-253(memory)-254(will)-254(be)-253(the)-254(scalars)]TJ/F147 9.9626 Tf 1 0 0 1 355.319 219.401 Tm [(alpha)]TJ/F84 9.9626 Tf 1.02 0 0 1 384.049 219.401 Tm [(and)]TJ/F147 9.9626 Tf 1 0 0 1 403.83 219.401 Tm [(beta)]TJ/F84 9.9626 Tf 1.02 0 0 1 424.752 219.401 Tm [(,)-256(and)-253(the)-254(r)18(eturn)]TJ 1 0 0 1 150.705 207.446 Tm [(code)]TJ/F147 9.9626 Tf 23.213 0 Td [(info)]TJ/F84 9.9626 Tf 20.921 0 Td [(.)]TJ 0 g 0 G /F75 9.9626 Tf -44.134 -20.101 Td [(V)111(ectors:)]TJ 0 g 0 G -/F84 9.9626 Tf 1.003 0 0 1 191.073 187.345 Tm [(The)-248(data)-248(type)]TJ/F145 9.9626 Tf 1 0 0 1 254.2 187.345 Tm [(psb_T_vect_gpu)]TJ/F84 9.9626 Tf 1.003 0 0 1 329.904 187.345 Tm [(pr)18(ovides)-248(a)-248(GPU-enabled)-248(extension)-249(of)]TJ 1.02 0 0 1 175.611 175.39 Tm [(the)-261(inner)-261(type)]TJ/F145 9.9626 Tf 1 0 0 1 241.259 175.39 Tm [(psb_T_base_vect_type)]TJ/F84 9.9626 Tf 1.02 0 0 1 345.866 175.39 Tm [(,)-265(and)-260(must)-261(be)-261(used)-261(together)-260(with)]TJ 1.02 0 0 1 175.611 163.435 Tm [(the)-274(other)-275(inner)-274(matrix)-274(type)-275(to)-274(make)-274(full)-275(use)-274(of)-274(the)-275(G)1(PU)-275(computational)]TJ 1 0 0 1 175.611 151.479 Tm [(capabilities;)]TJ +/F84 9.9626 Tf 1.003 0 0 1 191.073 187.345 Tm [(The)-248(data)-248(type)]TJ/F147 9.9626 Tf 1 0 0 1 254.2 187.345 Tm [(psb_T_vect_gpu)]TJ/F84 9.9626 Tf 1.003 0 0 1 329.904 187.345 Tm [(pr)18(ovides)-248(a)-248(GPU-enabled)-248(extension)-249(of)]TJ 1.02 0 0 1 175.611 175.39 Tm [(the)-261(inner)-261(type)]TJ/F147 9.9626 Tf 1 0 0 1 241.259 175.39 Tm [(psb_T_base_vect_type)]TJ/F84 9.9626 Tf 1.02 0 0 1 345.866 175.39 Tm [(,)-265(and)-260(must)-261(be)-261(used)-261(together)-260(with)]TJ 1.02 0 0 1 175.611 163.435 Tm [(the)-274(other)-275(inner)-274(matrix)-274(type)-275(to)-274(make)-274(full)-275(use)-274(of)-274(the)-275(G)1(PU)-275(computational)]TJ 1 0 0 1 175.611 151.479 Tm [(capabilities;)]TJ 0 g 0 G /F75 9.9626 Tf -24.906 -19.198 Td [(CSR:)]TJ 0 g 0 G -/F84 9.9626 Tf 0.982 0 0 1 178.341 132.281 Tm [(The)-255(data)-256(type)]TJ/F145 9.9626 Tf 1 0 0 1 240.361 132.281 Tm [(psb_T_csrg_sparse_mat)]TJ/F84 9.9626 Tf 0.982 0 0 1 352.697 132.281 Tm [(pr)18(ovides)-255(an)-256(interface)-255(to)-255(the)-256(GPU)]TJ 1 0 0 1 175.333 120.326 Tm [(version)-250(of)-250(CSR)-250(available)-250(in)-250(the)-250(NVIDIA)-250(CuSP)92(ARSE)-250(library;)]TJ +/F84 9.9626 Tf 0.982 0 0 1 178.341 132.281 Tm [(The)-255(data)-256(type)]TJ/F147 9.9626 Tf 1 0 0 1 240.361 132.281 Tm [(psb_T_csrg_sparse_mat)]TJ/F84 9.9626 Tf 0.982 0 0 1 352.697 132.281 Tm [(pr)18(ovides)-255(an)-256(interface)-255(to)-255(the)-256(GPU)]TJ 1 0 0 1 175.333 120.326 Tm [(version)-250(of)-250(CSR)-250(available)-250(in)-250(the)-250(NVIDIA)-250(CuSP)92(ARSE)-250(library;)]TJ 0 g 0 G 139.755 -29.888 Td [(178)]TJ 0 g 0 G @@ -32103,7 +32186,7 @@ ET endstream endobj -2250 0 obj +2254 0 obj << /Length 5844 >> @@ -32114,19 +32197,19 @@ stream BT /F75 9.9626 Tf 99.895 706.129 Td [(HYB:)]TJ 0 g 0 G -/F84 9.9626 Tf 0.98 0 0 1 128.647 706.129 Tm [(The)-251(data)-252(type)]TJ/F145 9.9626 Tf 1 0 0 1 190.423 706.129 Tm [(psb_T_hybg_sparse_mat)]TJ/F84 9.9626 Tf 0.98 0 0 1 302.715 706.129 Tm [(pr)18(ovides)-251(an)-251(interface)-252(to)-251(the)-252(HYB)]TJ 1.02 0 0 1 124.802 694.174 Tm [(GPU)-295(storage)-296(available)-295(in)-295(the)-296(NVIDIA)-295(CuSP)90(ARSE)-295(library)109(.)-455(The)-296(internal)]TJ 1.001 0 0 1 124.802 682.219 Tm [(str)8(uctur)18(e)-249(is)-249(opaque,)-249(hence)-249(the)-250(h)1(ost)-250(side)-249(is)-249(just)-249(CSR;)-249(the)-249(HYB)-249(data)-249(format)]TJ 1 0 0 1 124.802 670.263 Tm [(is)-250(only)-250(available)-250(up)-250(to)-250(CUDA)-250(version)-250(10.)]TJ +/F84 9.9626 Tf 0.98 0 0 1 128.647 706.129 Tm [(The)-251(data)-252(type)]TJ/F147 9.9626 Tf 1 0 0 1 190.423 706.129 Tm [(psb_T_hybg_sparse_mat)]TJ/F84 9.9626 Tf 0.98 0 0 1 302.715 706.129 Tm [(pr)18(ovides)-251(an)-251(interface)-252(to)-251(the)-252(HYB)]TJ 1.02 0 0 1 124.802 694.174 Tm [(GPU)-295(storage)-296(available)-295(in)-295(the)-296(NVIDIA)-295(CuSP)90(ARSE)-295(library)109(.)-455(The)-296(internal)]TJ 1.001 0 0 1 124.802 682.219 Tm [(str)8(uctur)18(e)-249(is)-249(opaque,)-249(hence)-249(the)-250(h)1(ost)-250(side)-249(is)-249(just)-249(CSR;)-249(the)-249(HYB)-249(data)-249(format)]TJ 1 0 0 1 124.802 670.263 Tm [(is)-250(only)-250(available)-250(up)-250(to)-250(CUDA)-250(version)-250(10.)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -20.26 Td [(ELL:)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 125.32 650.003 Tm [(The)-265(data)-265(type)]TJ/F145 9.9626 Tf 1 0 0 1 190.038 650.003 Tm [(psb_T_elg_sparse_mat)]TJ/F84 9.9626 Tf 1.02 0 0 1 297.34 650.003 Tm [(pr)18(ovides)-266(an)-265(interface)-265(to)-265(the)-265(ELL-)]TJ 1 0 0 1 124.802 638.048 Tm [(P)92(ACK)-250(implementation)-250(fr)18(om)-250(SPGPU;)]TJ +/F84 9.9626 Tf 1.02 0 0 1 125.32 650.003 Tm [(The)-265(data)-265(type)]TJ/F147 9.9626 Tf 1 0 0 1 190.038 650.003 Tm [(psb_T_elg_sparse_mat)]TJ/F84 9.9626 Tf 1.02 0 0 1 297.34 650.003 Tm [(pr)18(ovides)-266(an)-265(interface)-265(to)-265(the)-265(ELL-)]TJ 1 0 0 1 124.802 638.048 Tm [(P)92(ACK)-250(implementation)-250(fr)18(om)-250(SPGPU;)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -20.261 Td [(HLL:)]TJ 0 g 0 G -/F84 9.9626 Tf 0.98 0 0 1 127.532 617.787 Tm [(The)-194(data)-194(type)]TJ/F145 9.9626 Tf 1 0 0 1 187.621 617.787 Tm [(psb_T_hlg_sparse_mat)]TJ/F84 9.9626 Tf 0.98 0 0 1 294.121 617.787 Tm [(pr)18(ovides)-193(an)-194(interface)-194(to)-194(the)-194(Hacked)]TJ 1 0 0 1 124.802 605.832 Tm [(ELLP)92(ACK)-250(implementation)-250(fr)18(om)-250(SPGPU;)]TJ +/F84 9.9626 Tf 0.98 0 0 1 127.532 617.787 Tm [(The)-194(data)-194(type)]TJ/F147 9.9626 Tf 1 0 0 1 187.621 617.787 Tm [(psb_T_hlg_sparse_mat)]TJ/F84 9.9626 Tf 0.98 0 0 1 294.121 617.787 Tm [(pr)18(ovides)-193(an)-194(interface)-194(to)-194(the)-194(Hacked)]TJ 1 0 0 1 124.802 605.832 Tm [(ELLP)92(ACK)-250(implementation)-250(fr)18(om)-250(SPGPU;)]TJ 0 g 0 G /F75 9.9626 Tf -24.907 -20.261 Td [(HDIA:)]TJ 0 g 0 G -/F84 9.9626 Tf 1.02 0 0 1 135.282 585.571 Tm [(The)-298(data)-297(type)]TJ/F145 9.9626 Tf 1 0 0 1 200.986 585.571 Tm [(psb_T_hdiag_sparse_mat)]TJ/F84 9.9626 Tf 1.02 0 0 1 319.077 585.571 Tm [(pr)18(ovides)-298(an)-298(in)1(terface)-298(to)-298(the)]TJ 1 0 0 1 124.802 573.616 Tm [(Hacked)-250(DIAgonals)-250(implementation)-250(fr)18(om)-250(SPGPU;)]TJ/F75 14.3462 Tf -24.907 -34.763 Td [(13)-1000(CUDA)-250(Environment)-250(Routines)]TJ/F75 11.9552 Tf 0 -24.857 Td [(psb)]TJ +/F84 9.9626 Tf 1.02 0 0 1 135.282 585.571 Tm [(The)-298(data)-297(type)]TJ/F147 9.9626 Tf 1 0 0 1 200.986 585.571 Tm [(psb_T_hdiag_sparse_mat)]TJ/F84 9.9626 Tf 1.02 0 0 1 319.077 585.571 Tm [(pr)18(ovides)-298(an)-298(in)1(terface)-298(to)-298(the)]TJ 1 0 0 1 124.802 573.616 Tm [(Hacked)-250(DIAgonals)-250(implementation)-250(fr)18(om)-250(SPGPU;)]TJ/F75 14.3462 Tf -24.907 -34.763 Td [(13)-1000(CUDA)-250(Environment)-250(Routines)]TJ/F75 11.9552 Tf 0 -24.857 Td [(psb)]TJ ET q 1 0 0 1 120.53 514.195 cm @@ -32142,7 +32225,7 @@ Q BT /F75 11.9552 Tf 154.315 513.996 Td [(init)-250(\227)-250(Initializes)-250(PSBLAS-CUDA)-250(environment)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -54.42 -19.126 Td [(call)]TJ +/F147 9.9626 Tf -54.42 -19.126 Td [(call)]TJ 0 g 0 G [-525(psb_cuda_init\050ctxt)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG @@ -32163,9 +32246,9 @@ BT 0 g 0 G /F84 9.9626 Tf 34.311 0 Td [(ID)-250(of)-250(CUDA)-250(device)-250(to)-250(attach)-250(to.)]TJ -9.404 -11.956 Td [(Scope:)]TJ/F75 9.9626 Tf 31.432 0 Td [(local)]TJ/F84 9.9626 Tf 21.579 0 Td [(.)]TJ -53.32 -11.955 Td [(T)90(ype:)]TJ/F75 9.9626 Tf 27.088 0 Td [(optional)]TJ/F84 9.9626 Tf 38.187 0 Td [(.)]TJ -64.966 -11.955 Td [(Intent:)]TJ/F75 9.9626 Tf 31.8 0 Td [(in)]TJ/F84 9.9626 Tf 9.405 0 Td [(.)]TJ 1.003 0 0 1 124.802 364.098 Tm [(Speci\002ed)-249(as:)-308(an)-249(integer)-248(value.)-558(Default:)-308(use)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf 1 0 0 1 317.836 364.098 Tm [(mod)]TJ +/F147 9.9626 Tf 1 0 0 1 317.836 364.098 Tm [(mod)]TJ 0 g 0 G - [(\050iam,ngpu\051)]TJ/F84 9.9626 Tf 1.003 0 0 1 388.314 364.098 Tm [(wher)18(e)]TJ/F145 9.9626 Tf 1 0 0 1 418.287 364.098 Tm [(iam)]TJ/F84 9.9626 Tf 1.003 0 0 1 436.462 364.098 Tm [(is)]TJ 1.011 0 0 1 124.802 352.143 Tm [(the)-247(calling)-248(pr)18(ocess)-247(index)-248(and)]TJ/F145 9.9626 Tf 1 0 0 1 256.205 352.143 Tm [(ngpu)]TJ/F84 9.9626 Tf 1.011 0 0 1 279.618 352.143 Tm [(is)-247(the)-248(total)-247(number)-248(of)-247(CUDA)-247(devices)]TJ 1 0 0 1 124.802 340.187 Tm [(available)-250(on)-250(the)-250(curr)18(ent)-250(node.)]TJ/F75 11.9552 Tf -24.907 -20.176 Td [(Notes)]TJ + [(\050iam,ngpu\051)]TJ/F84 9.9626 Tf 1.003 0 0 1 388.314 364.098 Tm [(wher)18(e)]TJ/F147 9.9626 Tf 1 0 0 1 418.287 364.098 Tm [(iam)]TJ/F84 9.9626 Tf 1.003 0 0 1 436.462 364.098 Tm [(is)]TJ 1.011 0 0 1 124.802 352.143 Tm [(the)-247(calling)-248(pr)18(ocess)-247(index)-248(and)]TJ/F147 9.9626 Tf 1 0 0 1 256.205 352.143 Tm [(ngpu)]TJ/F84 9.9626 Tf 1.011 0 0 1 279.618 352.143 Tm [(is)-247(the)-248(total)-247(number)-248(of)-247(CUDA)-247(devices)]TJ 1 0 0 1 124.802 340.187 Tm [(available)-250(on)-250(the)-250(curr)18(ent)-250(node.)]TJ/F75 11.9552 Tf -24.907 -20.176 Td [(Notes)]TJ 0 g 0 G /F84 9.9626 Tf 12.454 -20.177 Td [(1.)]TJ 0 g 0 G @@ -32185,7 +32268,7 @@ Q BT /F75 11.9552 Tf 154.315 270.224 Td [(exit)-250(\227)-250(Exit)-250(from)-250(PSBLAS-CUDA)-250(environment)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -54.42 -19.126 Td [(call)]TJ +/F147 9.9626 Tf -54.42 -19.126 Td [(call)]TJ 0 g 0 G [-525(psb_cuda_exit\050ctxt\051)]TJ/F84 9.9626 Tf 14.944 -22.254 Td [(This)-250(subr)18(outine)-250(exits)-250(fr)18(om)-250(the)-250(PSBLAS)-250(CUDA)-250(context.)]TJ 0 g 0 G @@ -32206,7 +32289,7 @@ ET endstream endobj -2255 0 obj +2259 0 obj << /Length 5432 >> @@ -32230,7 +32313,7 @@ Q BT /F75 11.9552 Tf 205.125 706.129 Td [(DeviceSync)-250(\227)-250(Synchronize)-250(CUDA)-250(device)]TJ 0.00 0.44 0.13 rg 0.00 0.44 0.13 RG -/F145 9.9626 Tf -54.42 -19.65 Td [(call)]TJ +/F147 9.9626 Tf -54.42 -19.65 Td [(call)]TJ 0 g 0 G [-525(psb_cuda_DeviceSync\050\051)]TJ/F84 9.9626 Tf 0.98 0 0 1 165.649 663.146 Tm [(This)-249(subr)18(out)1(ine)-249(ensur)18(es)-249(that)-249(all)-249(pr)19(eviosly)-249(invoked)-249(kernels,)-250(i.e.)-315(all)-249(invocation)]TJ 1 0 0 1 150.705 651.191 Tm [(of)-250(CUDA-side)-250(code,)-250(have)-250(completed.)]TJ/F75 11.9552 Tf 0 -31.147 Td [(psb)]TJ ET @@ -32246,7 +32329,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 205.125 620.044 Td [(getDeviceCount)]TJ/F145 9.9626 Tf -54.42 -19.65 Td [(ngpus)]TJ +/F75 11.9552 Tf 205.125 620.044 Td [(getDeviceCount)]TJ/F147 9.9626 Tf -54.42 -19.65 Td [(ngpus)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -32268,7 +32351,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 205.125 545.914 Td [(getDevice)]TJ/F145 9.9626 Tf -54.42 -19.65 Td [(dev)]TJ +/F75 11.9552 Tf 205.125 545.914 Td [(getDevice)]TJ/F147 9.9626 Tf -54.42 -19.65 Td [(dev)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -32290,7 +32373,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 205.125 471.784 Td [(setDevice)]TJ/F145 9.9626 Tf -54.42 -19.65 Td [(info)]TJ +/F75 11.9552 Tf 205.125 471.784 Td [(setDevice)]TJ/F147 9.9626 Tf -54.42 -19.65 Td [(info)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -32312,7 +32395,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 205.125 397.654 Td [(DeviceHasUV)129(A)]TJ/F145 9.9626 Tf -54.42 -19.65 Td [(hasUva)]TJ +/F75 11.9552 Tf 205.125 397.654 Td [(DeviceHasUV)129(A)]TJ/F147 9.9626 Tf -54.42 -19.65 Td [(hasUva)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -32334,7 +32417,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 205.125 311.569 Td [(W)74(arpSize)]TJ/F145 9.9626 Tf -54.42 -19.65 Td [(nw)]TJ +/F75 11.9552 Tf 205.125 311.569 Td [(W)74(arpSize)]TJ/F147 9.9626 Tf -54.42 -19.65 Td [(nw)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -32356,7 +32439,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 205.125 237.439 Td [(MultiProcessors)]TJ/F145 9.9626 Tf -54.42 -19.65 Td [(nmp)]TJ +/F75 11.9552 Tf 205.125 237.439 Td [(MultiProcessors)]TJ/F147 9.9626 Tf -54.42 -19.65 Td [(nmp)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -32378,7 +32461,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 205.125 163.309 Td [(MaxThreadsPerMP)]TJ/F145 9.9626 Tf -54.42 -19.65 Td [(nt)]TJ +/F75 11.9552 Tf 205.125 163.309 Td [(MaxThreadsPerMP)]TJ/F147 9.9626 Tf -54.42 -19.65 Td [(nt)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -32394,7 +32477,7 @@ ET endstream endobj -2259 0 obj +2263 0 obj << /Length 2725 >> @@ -32416,7 +32499,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 154.315 706.129 Td [(MaxRegistersPerBlock)]TJ/F145 9.9626 Tf -54.42 -18.964 Td [(nr)]TJ +/F75 11.9552 Tf 154.315 706.129 Td [(MaxRegistersPerBlock)]TJ/F147 9.9626 Tf -54.42 -18.964 Td [(nr)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -32438,7 +32521,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 154.315 636.114 Td [(MemoryClockRate)]TJ/F145 9.9626 Tf -54.42 -18.964 Td [(cl)]TJ +/F75 11.9552 Tf 154.315 636.114 Td [(MemoryClockRate)]TJ/F147 9.9626 Tf -54.42 -18.964 Td [(cl)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -32460,7 +32543,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 154.315 566.1 Td [(MemoryBusW)37(idth)]TJ/F145 9.9626 Tf -54.42 -18.964 Td [(nb)]TJ +/F75 11.9552 Tf 154.315 566.1 Td [(MemoryBusW)37(idth)]TJ/F147 9.9626 Tf -54.42 -18.964 Td [(nb)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -32482,7 +32565,7 @@ q []0 d 0 J 0.398 w 0 0 m 3.587 0 l S Q BT -/F75 11.9552 Tf 154.315 496.085 Td [(MemoryPeakBandwidth)]TJ/F145 9.9626 Tf -54.42 -18.964 Td [(bw)]TJ +/F75 11.9552 Tf 154.315 496.085 Td [(MemoryPeakBandwidth)]TJ/F147 9.9626 Tf -54.42 -18.964 Td [(bw)]TJ 0.73 0.73 0.73 rg 0.73 0.73 0.73 RG 0 g 0 G 0.40 0.40 0.40 rg 0.40 0.40 0.40 RG @@ -32498,7 +32581,7 @@ ET endstream endobj -2264 0 obj +2268 0 obj << /Length 81 >> @@ -32513,7 +32596,7 @@ ET endstream endobj -2268 0 obj +2272 0 obj << /Length 7303 >> @@ -32577,47 +32660,68 @@ ET endstream endobj -2174 0 obj +2173 0 obj << /Type /ObjStm /N 100 -/First 986 -/Length 11860 ->> -stream -2172 0 2173 205 2175 494 2177 715 2134 928 2159 1074 2144 1132 2160 1191 2161 1250 2162 1309 -2163 1368 2164 1427 2165 1486 2166 1545 2167 1603 2155 1662 2168 1721 2156 1779 2186 1974 2191 2131 -2192 2311 2193 2354 2194 2657 2195 2862 2197 3075 2182 3296 2183 3443 2184 3590 2188 3737 2189 3796 -2190 3854 2185 3913 2206 4123 2212 4262 2213 4442 2214 4485 2215 4686 2216 4981 2218 5202 2204 5415 -2208 5561 2201 5619 2209 5678 2202 5736 2210 5795 2205 5853 2225 6007 2229 6146 2230 6326 2232 6369 -2233 6576 2234 6877 2236 7098 2223 7311 2227 7458 2228 7517 2224 7576 2241 7758 2243 7876 2240 7934 -2245 8017 2247 8135 614 8194 2244 8252 2249 8375 2251 8493 618 8551 622 8607 2252 8664 626 8722 -2248 8779 2254 8874 2256 8992 630 9051 634 9109 638 9167 642 9225 646 9283 650 9341 654 9399 -658 9457 2253 9515 2258 9610 2260 9728 662 9786 666 9843 670 9900 674 9957 2257 10014 2263 10109 -2265 10227 2262 10286 2267 10354 2269 10472 2270 10530 2271 10588 2012 10646 958 10703 957 10760 916 10817 -% 2172 0 obj +/First 990 +/Length 12055 +>> +stream +2161 0 2174 139 2175 319 2177 362 2178 567 2179 856 2181 1077 2138 1290 2163 1436 2148 1494 +2164 1553 2165 1612 2166 1671 2167 1730 2168 1789 2169 1848 2170 1907 2171 1965 2159 2024 2172 2083 +2160 2141 2190 2336 2195 2493 2196 2673 2197 2716 2198 3019 2199 3224 2201 3437 2186 3658 2187 3805 +2188 3952 2192 4099 2193 4158 2194 4216 2189 4275 2210 4485 2216 4624 2217 4804 2218 4847 2219 5048 +2220 5343 2222 5564 2208 5777 2212 5923 2205 5981 2213 6040 2206 6098 2214 6157 2209 6215 2229 6369 +2233 6508 2234 6688 2236 6731 2237 6938 2238 7239 2240 7460 2227 7673 2231 7820 2232 7879 2228 7938 +2245 8120 2247 8238 2244 8296 2249 8379 2251 8497 614 8556 2248 8614 2253 8737 2255 8855 618 8913 +622 8969 2256 9026 626 9084 2252 9141 2258 9236 2260 9354 630 9413 634 9471 638 9529 642 9587 +646 9645 650 9703 654 9761 658 9819 2257 9877 2262 9972 2264 10090 662 10148 666 10205 670 10262 +674 10319 2261 10376 2267 10471 2269 10589 2266 10648 2271 10716 2273 10834 2274 10892 2275 10950 2015 11008 +% 2161 0 obj +<< +/Type /Page +/Contents 2162 0 R +/Resources 2160 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2119 0 R +/Annots [ 2138 0 R ] +>> +% 2174 0 obj +<< +/Producer (GPL Ghostscript 9.10) +/CreationDate (D:20140329133928+01'00') +/ModDate (D:20140329133928+01'00') +/Creator (cairo 1.13.1 \(http://cairographics.org\)) +>> +% 2175 0 obj +<< +/Type /ExtGState +/OPM 1 +>> +% 2177 0 obj << /BaseFont /YAZDUX+TimesNewRomanPSMT -/FontDescriptor 2175 0 R -/ToUnicode 2176 0 R +/FontDescriptor 2179 0 R +/ToUnicode 2180 0 R /Type /Font /FirstChar 48 /LastChar 57 /Widths [ 500 500 500 500 500 0 0 500 500 500] /Subtype /TrueType >> -% 2173 0 obj +% 2178 0 obj << /BaseFont /NDNSMY+FreeSerif -/FontDescriptor 2177 0 R -/ToUnicode 2178 0 R +/FontDescriptor 2181 0 R +/ToUnicode 2182 0 R /Type /Font /FirstChar 32 /LastChar 89 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 721 0 0 0 0 0 0 0 0 385 0 0 0 0 0 0 0 667 529 0 0 0 0 0 701] /Subtype /TrueType >> -% 2175 0 obj +% 2179 0 obj << /Type /FontDescriptor /FontName /YAZDUX+TimesNewRomanPSMT @@ -32629,9 +32733,9 @@ stream /ItalicAngle 0 /StemV 95 /MissingWidth 777 -/FontFile2 2179 0 R +/FontFile2 2183 0 R >> -% 2177 0 obj +% 2181 0 obj << /Type /FontDescriptor /FontName /NDNSMY+FreeSerif @@ -32643,9 +32747,9 @@ stream /ItalicAngle 0 /StemV 105 /MissingWidth 600 -/FontFile2 2180 0 R +/FontFile2 2184 0 R >> -% 2134 0 obj +% 2138 0 obj << /Type /Annot /Subtype /Link @@ -32653,104 +32757,104 @@ stream /Rect [384.587 583.767 391.56 595.827] /A << /S /GoTo /D (figure.5) >> >> -% 2159 0 obj +% 2163 0 obj << -/D [2157 0 R /XYZ 98.895 753.953 null] +/D [2161 0 R /XYZ 98.895 753.953 null] >> -% 2144 0 obj +% 2148 0 obj << -/D [2157 0 R /XYZ 389.217 621.446 null] +/D [2161 0 R /XYZ 389.217 621.446 null] >> -% 2160 0 obj +% 2164 0 obj << -/D [2157 0 R /XYZ 114.839 563.747 null] +/D [2161 0 R /XYZ 114.839 563.747 null] >> -% 2161 0 obj +% 2165 0 obj << -/D [2157 0 R /XYZ 114.839 567.034 null] +/D [2161 0 R /XYZ 114.839 567.034 null] >> -% 2162 0 obj +% 2166 0 obj << -/D [2157 0 R /XYZ 114.839 556.075 null] +/D [2161 0 R /XYZ 114.839 556.075 null] >> -% 2163 0 obj +% 2167 0 obj << -/D [2157 0 R /XYZ 114.839 545.116 null] +/D [2161 0 R /XYZ 114.839 545.116 null] >> -% 2164 0 obj +% 2168 0 obj << -/D [2157 0 R /XYZ 114.839 534.158 null] +/D [2161 0 R /XYZ 114.839 534.158 null] >> -% 2165 0 obj +% 2169 0 obj << -/D [2157 0 R /XYZ 114.839 523.199 null] +/D [2161 0 R /XYZ 114.839 523.199 null] >> -% 2166 0 obj +% 2170 0 obj << -/D [2157 0 R /XYZ 114.839 512.24 null] +/D [2161 0 R /XYZ 114.839 512.24 null] >> -% 2167 0 obj +% 2171 0 obj << -/D [2157 0 R /XYZ 114.839 501.281 null] +/D [2161 0 R /XYZ 114.839 501.281 null] >> -% 2155 0 obj +% 2159 0 obj << -/D [2157 0 R /XYZ 114.839 481.057 null] +/D [2161 0 R /XYZ 114.839 481.057 null] >> -% 2168 0 obj +% 2172 0 obj << -/D [2157 0 R /XYZ 99.895 294.895 null] +/D [2161 0 R /XYZ 99.895 294.895 null] >> -% 2156 0 obj +% 2160 0 obj << -/Font << /F84 687 0 R /F75 685 0 R /F233 1044 0 R /F279 1813 0 R /F78 686 0 R /F192 942 0 R /F190 941 0 R /F145 940 0 R >> -/XObject << /Im7 2133 0 R >> +/Font << /F84 687 0 R /F75 685 0 R /F235 1045 0 R /F281 1816 0 R /F78 686 0 R /F197 943 0 R /F195 942 0 R /F147 941 0 R >> +/XObject << /Im7 2137 0 R >> /ProcSet [ /PDF /Text ] >> -% 2186 0 obj +% 2190 0 obj << /Type /Page -/Contents 2187 0 R -/Resources 2185 0 R +/Contents 2191 0 R +/Resources 2189 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2115 0 R -/Annots [ 2182 0 R 2183 0 R 2184 0 R ] +/Parent 2119 0 R +/Annots [ 2186 0 R 2187 0 R 2188 0 R ] >> -% 2191 0 obj +% 2195 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133928+01'00') /ModDate (D:20140329133928+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2192 0 obj +% 2196 0 obj << /Type /ExtGState /OPM 1 >> -% 2193 0 obj +% 2197 0 obj << /BaseFont /MCSFLP+FreeSerif -/FontDescriptor 2195 0 R -/ToUnicode 2196 0 R +/FontDescriptor 2199 0 R +/ToUnicode 2200 0 R /Type /Font /FirstChar 32 /LastChar 89 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 721 0 670 0 610 564 0 714 0 385 709 0 0 0 724 0 0 667 529 606 0 0 0 0 701] /Subtype /TrueType >> -% 2194 0 obj +% 2198 0 obj << /BaseFont /AJRCAD+TimesNewRomanPSMT -/FontDescriptor 2197 0 R -/ToUnicode 2198 0 R +/FontDescriptor 2201 0 R +/ToUnicode 2202 0 R /Type /Font /FirstChar 48 /LastChar 57 /Widths [ 500 500 500 500 500 0 0 500 500 500] /Subtype /TrueType >> -% 2195 0 obj +% 2199 0 obj << /Type /FontDescriptor /FontName /MCSFLP+FreeSerif @@ -32762,9 +32866,9 @@ stream /ItalicAngle 0 /StemV 105 /MissingWidth 600 -/FontFile2 2199 0 R +/FontFile2 2203 0 R >> -% 2197 0 obj +% 2201 0 obj << /Type /FontDescriptor /FontName /AJRCAD+TimesNewRomanPSMT @@ -32776,9 +32880,9 @@ stream /ItalicAngle 0 /StemV 95 /MissingWidth 777 -/FontFile2 2200 0 R +/FontFile2 2204 0 R >> -% 2182 0 obj +% 2186 0 obj << /Type /Annot /Subtype /Link @@ -32786,7 +32890,7 @@ stream /Rect [453.687 426.731 460.661 438.791] /A << /S /GoTo /D (figure.5) >> >> -% 2183 0 obj +% 2187 0 obj << /Type /Annot /Subtype /Link @@ -32794,7 +32898,7 @@ stream /Rect [354.541 176.362 361.575 188.421] /A << /S /GoTo /D (figure.8) >> >> -% 2184 0 obj +% 2188 0 obj << /Type /Annot /Subtype /Link @@ -32802,68 +32906,68 @@ stream /Rect [487.118 128.475 494.142 140.535] /A << /S /GoTo /D (algocf.2) >> >> -% 2188 0 obj +% 2192 0 obj << -/D [2186 0 R /XYZ 149.705 753.953 null] +/D [2190 0 R /XYZ 149.705 753.953 null] >> -% 2189 0 obj +% 2193 0 obj << -/D [2186 0 R /XYZ 447.542 464.41 null] +/D [2190 0 R /XYZ 447.542 464.41 null] >> -% 2190 0 obj +% 2194 0 obj << -/D [2186 0 R /XYZ 150.705 211.214 null] +/D [2190 0 R /XYZ 150.705 211.214 null] >> -% 2185 0 obj +% 2189 0 obj << -/Font << /F84 687 0 R /F78 686 0 R /F192 942 0 R /F145 940 0 R /F233 1044 0 R /F279 1813 0 R /F148 1490 0 R /F190 941 0 R /F75 685 0 R >> -/XObject << /Im8 2181 0 R >> +/Font << /F84 687 0 R /F78 686 0 R /F197 943 0 R /F147 941 0 R /F235 1045 0 R /F281 1816 0 R /F152 1491 0 R /F195 942 0 R /F75 685 0 R >> +/XObject << /Im8 2185 0 R >> /ProcSet [ /PDF /Text ] >> -% 2206 0 obj +% 2210 0 obj << /Type /Page -/Contents 2207 0 R -/Resources 2205 0 R +/Contents 2211 0 R +/Resources 2209 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2211 0 R -/Annots [ 2204 0 R ] +/Parent 2215 0 R +/Annots [ 2208 0 R ] >> -% 2212 0 obj +% 2216 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133927+01'00') /ModDate (D:20140329133927+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2213 0 obj +% 2217 0 obj << /Type /ExtGState /OPM 1 >> -% 2214 0 obj +% 2218 0 obj << /BaseFont /BNRUAU+TimesNewRomanPSMT -/FontDescriptor 2216 0 R -/ToUnicode 2217 0 R +/FontDescriptor 2220 0 R +/ToUnicode 2221 0 R /Type /Font /FirstChar 45 /LastChar 55 /Widths [ 333 0 0 500 500 500 0 0 0 0 500] /Subtype /TrueType >> -% 2215 0 obj +% 2219 0 obj << /BaseFont /ICFUKB+FreeSerif -/FontDescriptor 2218 0 R -/ToUnicode 2219 0 R +/FontDescriptor 2222 0 R +/ToUnicode 2223 0 R /Type /Font /FirstChar 32 /LastChar 89 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 721 0 0 0 610 564 0 0 0 0 0 0 0 0 724 0 0 667 529 606 0 0 0 0 701] /Subtype /TrueType >> -% 2216 0 obj +% 2220 0 obj << /Type /FontDescriptor /FontName /BNRUAU+TimesNewRomanPSMT @@ -32875,9 +32979,9 @@ stream /ItalicAngle 0 /StemV 95 /MissingWidth 777 -/FontFile2 2220 0 R +/FontFile2 2224 0 R >> -% 2218 0 obj +% 2222 0 obj << /Type /FontDescriptor /FontName /ICFUKB+FreeSerif @@ -32889,9 +32993,9 @@ stream /ItalicAngle 0 /StemV 105 /MissingWidth 600 -/FontFile2 2221 0 R +/FontFile2 2225 0 R >> -% 2204 0 obj +% 2208 0 obj << /Type /Annot /Subtype /Link @@ -32899,76 +33003,76 @@ stream /Rect [371.292 537.01 378.265 549.069] /A << /S /GoTo /D (figure.5) >> >> -% 2208 0 obj +% 2212 0 obj << -/D [2206 0 R /XYZ 98.895 753.953 null] +/D [2210 0 R /XYZ 98.895 753.953 null] >> -% 2201 0 obj +% 2205 0 obj << -/D [2206 0 R /XYZ 396.732 574.688 null] +/D [2210 0 R /XYZ 396.732 574.688 null] >> -% 2209 0 obj +% 2213 0 obj << -/D [2206 0 R /XYZ 99.895 526.012 null] +/D [2210 0 R /XYZ 99.895 526.012 null] >> -% 2202 0 obj +% 2206 0 obj << -/D [2206 0 R /XYZ 114.839 383.469 null] +/D [2210 0 R /XYZ 114.839 383.469 null] >> -% 2210 0 obj +% 2214 0 obj << -/D [2206 0 R /XYZ 99.895 187.185 null] +/D [2210 0 R /XYZ 99.895 187.185 null] >> -% 2205 0 obj +% 2209 0 obj << -/Font << /F84 687 0 R /F145 940 0 R /F233 1044 0 R /F75 685 0 R /F279 1813 0 R >> -/XObject << /Im9 2203 0 R >> +/Font << /F84 687 0 R /F147 941 0 R /F235 1045 0 R /F75 685 0 R /F281 1816 0 R >> +/XObject << /Im9 2207 0 R >> /ProcSet [ /PDF /Text ] >> -% 2225 0 obj +% 2229 0 obj << /Type /Page -/Contents 2226 0 R -/Resources 2224 0 R +/Contents 2230 0 R +/Resources 2228 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2211 0 R -/Annots [ 2223 0 R ] +/Parent 2215 0 R +/Annots [ 2227 0 R ] >> -% 2229 0 obj +% 2233 0 obj << /Producer (GPL Ghostscript 9.10) /CreationDate (D:20140329133928+01'00') /ModDate (D:20140329133928+01'00') /Creator (cairo 1.13.1 \(http://cairographics.org\)) >> -% 2230 0 obj +% 2234 0 obj << /Type /ExtGState /OPM 1 >> -% 2232 0 obj +% 2236 0 obj << /BaseFont /PBIKKX+TimesNewRomanPSMT -/FontDescriptor 2234 0 R -/ToUnicode 2235 0 R +/FontDescriptor 2238 0 R +/ToUnicode 2239 0 R /Type /Font /FirstChar 45 /LastChar 55 /Widths [ 333 0 0 500 500 0 500 500 500 500 500] /Subtype /TrueType >> -% 2233 0 obj +% 2237 0 obj << /BaseFont /ZBHFTP+FreeSerif -/FontDescriptor 2236 0 R -/ToUnicode 2237 0 R +/FontDescriptor 2240 0 R +/ToUnicode 2241 0 R /Type /Font /FirstChar 32 /LastChar 89 /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 721 0 670 0 610 564 0 714 0 0 709 0 0 0 724 0 0 667 529 606 0 0 0 0 701] /Subtype /TrueType >> -% 2234 0 obj +% 2238 0 obj << /Type /FontDescriptor /FontName /PBIKKX+TimesNewRomanPSMT @@ -32980,9 +33084,9 @@ stream /ItalicAngle 0 /StemV 95 /MissingWidth 777 -/FontFile2 2238 0 R +/FontFile2 2242 0 R >> -% 2236 0 obj +% 2240 0 obj << /Type /FontDescriptor /FontName /ZBHFTP+FreeSerif @@ -32994,9 +33098,9 @@ stream /ItalicAngle 0 /StemV 105 /MissingWidth 600 -/FontFile2 2239 0 R +/FontFile2 2243 0 R >> -% 2223 0 obj +% 2227 0 obj << /Type /Annot /Subtype /Link @@ -33004,188 +33108,171 @@ stream /Rect [440.392 344.666 447.366 356.726] /A << /S /GoTo /D (figure.5) >> >> -% 2227 0 obj +% 2231 0 obj << -/D [2225 0 R /XYZ 149.705 753.953 null] +/D [2229 0 R /XYZ 149.705 753.953 null] >> -% 2228 0 obj +% 2232 0 obj << -/D [2225 0 R /XYZ 447.542 382.345 null] +/D [2229 0 R /XYZ 447.542 382.345 null] >> -% 2224 0 obj +% 2228 0 obj << -/Font << /F84 687 0 R /F145 940 0 R /F78 686 0 R /F75 685 0 R /F192 942 0 R /F233 1044 0 R /F279 1813 0 R >> -/XObject << /Im10 2222 0 R >> +/Font << /F84 687 0 R /F147 941 0 R /F78 686 0 R /F75 685 0 R /F197 943 0 R /F235 1045 0 R /F281 1816 0 R >> +/XObject << /Im10 2226 0 R >> /ProcSet [ /PDF /Text ] >> -% 2241 0 obj +% 2245 0 obj << /Type /Page -/Contents 2242 0 R -/Resources 2240 0 R +/Contents 2246 0 R +/Resources 2244 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2211 0 R +/Parent 2215 0 R >> -% 2243 0 obj +% 2247 0 obj << -/D [2241 0 R /XYZ 98.895 753.953 null] +/D [2245 0 R /XYZ 98.895 753.953 null] >> -% 2240 0 obj +% 2244 0 obj << -/Font << /F233 1044 0 R /F84 687 0 R >> +/Font << /F235 1045 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2245 0 obj +% 2249 0 obj << /Type /Page -/Contents 2246 0 R -/Resources 2244 0 R +/Contents 2250 0 R +/Resources 2248 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2211 0 R +/Parent 2215 0 R >> -% 2247 0 obj +% 2251 0 obj << -/D [2245 0 R /XYZ 149.705 753.953 null] +/D [2249 0 R /XYZ 149.705 753.953 null] >> % 614 0 obj << -/D [2245 0 R /XYZ 150.705 716.092 null] +/D [2249 0 R /XYZ 150.705 716.092 null] >> -% 2244 0 obj +% 2248 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F233 1044 0 R /F145 940 0 R /F78 686 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F235 1045 0 R /F147 941 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2249 0 obj +% 2253 0 obj << /Type /Page -/Contents 2250 0 R -/Resources 2248 0 R +/Contents 2254 0 R +/Resources 2252 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2211 0 R +/Parent 2215 0 R >> -% 2251 0 obj +% 2255 0 obj << -/D [2249 0 R /XYZ 98.895 753.953 null] +/D [2253 0 R /XYZ 98.895 753.953 null] >> % 618 0 obj << -/D [2249 0 R /XYZ 99.895 554.06 null] +/D [2253 0 R /XYZ 99.895 554.06 null] >> % 622 0 obj << -/D [2249 0 R /XYZ 99.895 527.944 null] +/D [2253 0 R /XYZ 99.895 527.944 null] >> -% 2252 0 obj +% 2256 0 obj << -/D [2249 0 R /XYZ 99.895 315.727 null] +/D [2253 0 R /XYZ 99.895 315.727 null] >> % 626 0 obj << -/D [2249 0 R /XYZ 99.895 284.171 null] +/D [2253 0 R /XYZ 99.895 284.171 null] >> -% 2248 0 obj +% 2252 0 obj << -/Font << /F75 685 0 R /F84 687 0 R /F145 940 0 R >> +/Font << /F75 685 0 R /F84 687 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 2254 0 obj +% 2258 0 obj << /Type /Page -/Contents 2255 0 R -/Resources 2253 0 R +/Contents 2259 0 R +/Resources 2257 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2211 0 R +/Parent 2215 0 R >> -% 2256 0 obj +% 2260 0 obj << -/D [2254 0 R /XYZ 149.705 753.953 null] +/D [2258 0 R /XYZ 149.705 753.953 null] >> % 630 0 obj << -/D [2254 0 R /XYZ 150.705 720.077 null] +/D [2258 0 R /XYZ 150.705 720.077 null] >> % 634 0 obj << -/D [2254 0 R /XYZ 150.705 633.991 null] +/D [2258 0 R /XYZ 150.705 633.991 null] >> % 638 0 obj << -/D [2254 0 R /XYZ 150.705 559.861 null] +/D [2258 0 R /XYZ 150.705 559.861 null] >> % 642 0 obj << -/D [2254 0 R /XYZ 150.705 485.732 null] +/D [2258 0 R /XYZ 150.705 485.732 null] >> % 646 0 obj << -/D [2254 0 R /XYZ 150.705 411.602 null] +/D [2258 0 R /XYZ 150.705 411.602 null] >> % 650 0 obj << -/D [2254 0 R /XYZ 150.705 325.516 null] +/D [2258 0 R /XYZ 150.705 325.516 null] >> % 654 0 obj << -/D [2254 0 R /XYZ 150.705 251.386 null] +/D [2258 0 R /XYZ 150.705 251.386 null] >> % 658 0 obj << -/D [2254 0 R /XYZ 150.705 177.256 null] +/D [2258 0 R /XYZ 150.705 177.256 null] >> -% 2253 0 obj +% 2257 0 obj << -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> -% 2258 0 obj +% 2262 0 obj << /Type /Page -/Contents 2259 0 R -/Resources 2257 0 R +/Contents 2263 0 R +/Resources 2261 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2261 0 R +/Parent 2265 0 R >> -% 2260 0 obj +% 2264 0 obj << -/D [2258 0 R /XYZ 98.895 753.953 null] +/D [2262 0 R /XYZ 98.895 753.953 null] >> % 662 0 obj << -/D [2258 0 R /XYZ 99.895 720.077 null] +/D [2262 0 R /XYZ 99.895 720.077 null] >> % 666 0 obj << -/D [2258 0 R /XYZ 99.895 650.062 null] +/D [2262 0 R /XYZ 99.895 650.062 null] >> % 670 0 obj << -/D [2258 0 R /XYZ 99.895 580.047 null] +/D [2262 0 R /XYZ 99.895 580.047 null] >> % 674 0 obj << -/D [2258 0 R /XYZ 99.895 510.033 null] ->> -% 2257 0 obj -<< -/Font << /F75 685 0 R /F145 940 0 R /F84 687 0 R >> -/ProcSet [ /PDF /Text ] ->> -% 2263 0 obj -<< -/Type /Page -/Contents 2264 0 R -/Resources 2262 0 R -/MediaBox [0 0 595.276 841.89] -/Parent 2261 0 R ->> -% 2265 0 obj -<< -/D [2263 0 R /XYZ 149.705 753.953 null] +/D [2262 0 R /XYZ 99.895 510.033 null] >> -% 2262 0 obj +% 2261 0 obj << -/Font << /F84 687 0 R >> +/Font << /F75 685 0 R /F147 941 0 R /F84 687 0 R >> /ProcSet [ /PDF /Text ] >> % 2267 0 obj @@ -33194,40 +33281,45 @@ stream /Contents 2268 0 R /Resources 2266 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2261 0 R +/Parent 2265 0 R >> % 2269 0 obj << -/D [2267 0 R /XYZ 98.895 753.953 null] +/D [2267 0 R /XYZ 149.705 753.953 null] >> -% 2270 0 obj +% 2266 0 obj << -/D [2267 0 R /XYZ 99.895 723.717 null] +/Font << /F84 687 0 R >> +/ProcSet [ /PDF /Text ] >> % 2271 0 obj << -/D [2267 0 R /XYZ 99.895 698.792 null] +/Type /Page +/Contents 2272 0 R +/Resources 2270 0 R +/MediaBox [0 0 595.276 841.89] +/Parent 2265 0 R >> -% 2012 0 obj +% 2273 0 obj << -/D [2267 0 R /XYZ 99.895 638.64 null] +/D [2271 0 R /XYZ 98.895 753.953 null] >> -% 958 0 obj +% 2274 0 obj << -/D [2267 0 R /XYZ 99.895 595.644 null] +/D [2271 0 R /XYZ 99.895 723.717 null] >> -% 957 0 obj +% 2275 0 obj << -/D [2267 0 R /XYZ 99.895 538.043 null] +/D [2271 0 R /XYZ 99.895 698.792 null] >> -% 916 0 obj +% 2015 0 obj << -/D [2267 0 R /XYZ 99.895 477.792 null] +/D [2271 0 R /XYZ 99.895 638.64 null] >> endstream endobj -2277 0 obj +2281 0 obj << /Length 6164 >> @@ -33242,7 +33334,7 @@ BT 0 g 0 G -212.051 -19.926 Td [([14])]TJ 0 g 0 G - 1.02 0 0 1 172.284 674.248 Tm [(Karypis,)-341(G.)-322(and)-322(Kumar)73(,)-341(V)126(.,)]TJ/F78 9.9626 Tf 1.02 0 0 1 299.262 674.248 Tm [(METIS:)-322(Unstructur)18(ed)-322(Graph)-322(Partitioning)-322(and)]TJ 1.02 0 0 1 172.005 662.293 Tm [(Sparse)-386(Matrix)-386(Ordering)-386(System)]TJ/F84 9.9626 Tf 1.02 0 0 1 308.549 662.293 Tm [(.)-386(Minneapolis,)-421(MN)-386(55455:)-586(University)-386(of)]TJ 1.02 0 0 1 172.284 650.338 Tm [(Minnesota,)-447(Department)-406(of)-407(Computer)-406(Science,)-447(1995.)-407(Internet)-406(Addr)17(ess:)]TJ/F145 9.9626 Tf 1 0 0 1 172.284 638.383 Tm [(http://www.cs.umn.edu/~karypis)]TJ/F84 9.9626 Tf 156.91 0 Td [(.)]TJ + 1.02 0 0 1 172.284 674.248 Tm [(Karypis,)-341(G.)-322(and)-322(Kumar)73(,)-341(V)126(.,)]TJ/F78 9.9626 Tf 1.02 0 0 1 299.262 674.248 Tm [(METIS:)-322(Unstructur)18(ed)-322(Graph)-322(Partitioning)-322(and)]TJ 1.02 0 0 1 172.005 662.293 Tm [(Sparse)-386(Matrix)-386(Ordering)-386(System)]TJ/F84 9.9626 Tf 1.02 0 0 1 308.549 662.293 Tm [(.)-386(Minneapolis,)-421(MN)-386(55455:)-586(University)-386(of)]TJ 1.02 0 0 1 172.284 650.338 Tm [(Minnesota,)-447(Department)-406(of)-407(Computer)-406(Science,)-447(1995.)-407(Internet)-406(Addr)17(ess:)]TJ/F147 9.9626 Tf 1 0 0 1 172.284 638.383 Tm [(http://www.cs.umn.edu/~karypis)]TJ/F84 9.9626 Tf 156.91 0 Td [(.)]TJ 0 g 0 G -178.489 -19.925 Td [([15])]TJ 0 g 0 G @@ -33290,7 +33382,7 @@ ET endstream endobj -2295 0 obj +2299 0 obj << /Length1 1383 /Length2 5908 @@ -33361,7 +33453,7 @@ W 6S&_!S|esUFRyYﭧN endstream endobj -2297 0 obj +2301 0 obj << /Length1 1956 /Length2 7144 @@ -33478,7 +33570,7 @@ _g\e+J`ڼu FAa.Pgvasl ZBhgǠW -BѶNh`˨[Wj)q(͌.wY$Q0] endstream endobj -2299 0 obj +2303 0 obj << /Length1 1442 /Length2 6151 @@ -33556,7 +33648,7 @@ n^ r sbVb)l 2STH+PMzjzif$DMkV ?\ټ>߈ƶa<EELD6=tE.(%Fo~6r\l;s'$ֵ>4r$2DZ~*\R Yi$=ޡk'哙.m6–tY0O$)QrUQ+ߪ4(,Qb8mөqH=,Y8i SZ6m@`7~"L7\FdN#FHRKKHpb40 2~HKε֊X endstream endobj -2301 0 obj +2305 0 obj << /Length1 1478 /Length2 6403 @@ -33637,7 +33729,7 @@ O G0+B+渞bqGYitLxRIPvhԥϋ^:nwp5>^؉R}4agl}^(t7a &)ZS8n}@f0;b.ۣEL7%3C,@7[I [1sIX<[f܌a:?y3"u/'\d Dӹ=qU kκH$ yQ7pl*mhS]AD5ƫ79 endstream endobj -2303 0 obj +2307 0 obj << /Length1 1688 /Length2 8444 @@ -33728,7 +33820,7 @@ p b|<dF.O[vOhgyQ쮗h0},:(і~6umXRV<гJVM\Fw%T6VvQnϨ: M\څU-:φ57M}!ZD s  {$Q0݄n띮 (N3[( ?ӌo9Tuҫ6nuD!qZUT!pڐV؞/\h^:'.AES6P*BYL endstream endobj -2305 0 obj +2309 0 obj << /Length1 2571 /Length2 18274 @@ -33918,7 +34010,7 @@ bvT $L`u\$y 63ra *}LONVz`N~D|!5kW ˏ[u 1H6G yDАWC%ҸV96k>lLtg)d:|\,?پd5֌#2}Ù >>Ayr5d>>:Xqa x^J^a 2PAk@AP~)ο ׫lV]$>OmK1y^џ= "YkKgt[16eധp[hNc}]#^kNoʼm, 5uy<nTAt<w&+5Oy[N[P+J $iٍ/%ֈHEPBaz`~-a+wi W=Y%b-SQ=SVuIwﮖHC8q- WR͢ݼ?҉Gg5)9 P9_Q+[nk#%J!z6:Li)YexR4̩b&-bϠeNbx+Ԃ>xr}ԁ%Sx#\/aĬ1^BIO̅ԕx_<=rTi_[-W&g!z{Ni%3s|刽66g಑doD^-@AJHSPHS[N:OR~\bj1 p endstream endobj -2311 0 obj +2315 0 obj << -/Length1 1173 -/Length2 2916 +/Length1 1191 +/Length2 3225 /Length3 0 -/Length 4089 +/Length 4416 >> stream %!PS-AdobeFont-1.0: PazoMath 001.003 @@ -34191,9 +34283,10 @@ stream /UnderlineThickness 50 def /Weight (Regular) readonly def end readonly def -/FontName /IKXQUG+PazoMath def +/FontName /ZSBXRF+PazoMath def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for +dup 87 /Omega put dup 165 /infinity put dup 229 /summation put readonly def @@ -34207,15 +34300,12 @@ currentfile eexec nAYXU12rrE^Oy";Dm{O0 {2RBiNMufLon>Gl_1#Y> ؋nׯ ,G#IJ5.FE)a" pqo-4`7}ӺWt_ceuJh>>W! A5j-v`-?R tl.e)1=kdSi!5_l< -^+bގީܖnW%yg͚3N>Vp9e.ovh; ͍fW\^yя_ܓ'1︖œ]c*" 磺@A.XcǽD&(49g6vf4J ]5(W sԘtaȝ<[EpTU!JtО ?,L?!w sg0MhB1$sy8G(b>zuݬDoeHz)^0 -9JWf'UIcei+5H,r73g03{#Y_E^n2ݥ xdR$;9(fn*eHcAI#y`%,tŁ\ )_V+7\M7A4R"З@O!1$*ϤНsp%>*Ȗ, QɥH;Eٺ~b@n sXZۖ+ , -y#/!AL98Ta/eT,ut/u6~ 1QA\SW{N?2/G?E 8ӮchbK3q$;+^B(񬼨xฉk:wMX,Ӄ~R[&h8AS #L'ɧTp#{۪>;+⭼MuU[%V0EėٲC9؅Sםu^sI2\. ->j5xBĒڪ]˸f*g|x*cfr+B!H9R2H4^Ed>>J1uz&MLLioJ$!tFo_O>y,ު+#D qW2  tE"QIՅ.e]l w,*"Mf]i/FSꂒ.s_.n1 /8,}̨ W HFPsWkn3a9`6IݐWi>| =1uŪ4ԅXHAH -$-U3# +$e1cww9B6$ʗTĶ;Z(49g6vf4J ]5(W sԘtaȝ<[EpTU!JtО ?,L?!w sg0M7sH|Пd dQ<=BRC)-a_GΜ>sAjS揝v$C /` JO.*NVhN25OC sZS^vu48,6Vl:0])hTQkﻐՎA8T:XJ+; ! ^Pk$8;x1JsJ/(^0F/ Na+J:׊oX{3a8h&=Q д~ [ps!c yov>ժI83!/ J?|i$d_(/;b49%Xealwv_̹@drp.l䧏<ɁJt~M[y 3[{ endstream endobj -2315 0 obj +2319 0 obj << /Length1 1614 /Length2 22531 @@ -34384,7 +34474,7 @@ s K=(HfUrIQ$W0Lյ8Xk߉JMz{Pԓ>$ y"jrXfyLEtnyɎQ]Ex.B;[XnUOś1Ndɸ&Ό endstream endobj -2317 0 obj +2321 0 obj << /Length1 1616 /Length2 24418 @@ -34509,7 +34599,7 @@ c51 A2C05o]}I(&* ;@ar@\-@|5JZT .1T"aJk:bĖD| endstream endobj -2319 0 obj +2323 0 obj << /Length1 1620 /Length2 18334 @@ -34618,7 +34708,7 @@ Gɽ Ͽ([[ tz|' oUcyrH+(m 8$#% endstream endobj -2321 0 obj +2325 0 obj << /Length 1007 >> @@ -34688,7 +34778,7 @@ end endstream endobj -2322 0 obj +2326 0 obj << /Length 1577 >> @@ -34803,7 +34893,7 @@ end endstream endobj -2323 0 obj +2327 0 obj << /Length 1535 >> @@ -34909,7 +34999,7 @@ end endstream endobj -2324 0 obj +2328 0 obj << /Length 1724 >> @@ -35032,7 +35122,7 @@ end endstream endobj -2325 0 obj +2329 0 obj << /Length 2050 >> @@ -35178,7 +35268,7 @@ end endstream endobj -2326 0 obj +2330 0 obj << /Length 1543 >> @@ -35291,7 +35381,7 @@ end endstream endobj -2327 0 obj +2331 0 obj << /Length 1538 >> @@ -35404,7 +35494,7 @@ end endstream endobj -2328 0 obj +2332 0 obj << /Length 1538 >> @@ -35517,7 +35607,7 @@ end endstream endobj -2329 0 obj +2333 0 obj << /Length 853 >> @@ -35575,7 +35665,7 @@ end endstream endobj -2330 0 obj +2334 0 obj << /Length 1113 >> @@ -35653,7 +35743,7 @@ end endstream endobj -2331 0 obj +2335 0 obj << /Length 1477 >> @@ -35756,7 +35846,7 @@ end endstream endobj -2332 0 obj +2336 0 obj << /Length 1477 >> @@ -35859,7 +35949,7 @@ end endstream endobj -2333 0 obj +2337 0 obj << /Length 1482 >> @@ -35962,149 +36052,161 @@ end endstream endobj -2274 0 obj +2278 0 obj << /Type /ObjStm /N 100 -/First 1012 -/Length 18437 ->> -stream -917 0 933 57 913 114 914 170 2272 227 909 285 2273 342 2266 400 2276 494 2278 612 -1074 671 945 730 915 788 912 846 908 904 2142 962 911 1021 2279 1079 910 1138 2127 1195 -2128 1254 2280 1313 2275 1372 2281 1467 2282 1487 2283 1858 2284 1961 2285 2120 2286 2143 2287 2598 -2288 2727 2289 3025 2290 3671 2292 4142 2293 4773 2294 5244 2296 5819 2298 6044 2300 6376 2302 6620 -2304 6891 2306 7239 2308 7745 2310 7979 2312 8453 2314 8679 2316 8910 2318 9389 2320 9965 2291 10383 -1882 10824 1813 10987 1490 11150 942 11311 941 11470 940 11630 1000 11791 1044 11952 1285 12113 1157 12278 -685 12448 687 12638 686 12828 688 13018 894 13131 978 13244 1052 13361 1087 13481 1117 13601 1158 13721 -1205 13841 1244 13961 1300 14081 1351 14201 1400 14321 1457 14441 1492 14561 1534 14681 1577 14801 1626 14921 -1663 15041 1698 15161 1739 15281 1780 15401 1805 15521 1841 15641 1875 15761 1914 15881 1952 16001 1989 16121 -2034 16241 2070 16361 2115 16481 2211 16601 2261 16721 2334 16823 2335 16941 2336 17062 2337 17183 2338 17304 +/First 1007 +/Length 18409 +>> +stream +959 0 958 57 916 114 917 171 934 228 913 285 914 341 2276 398 909 456 2277 513 +2270 571 2280 665 2282 783 1075 842 946 901 915 959 912 1017 908 1075 2146 1133 911 1192 +2283 1250 910 1309 2131 1366 2132 1425 2284 1484 2279 1543 2285 1638 2286 1658 2287 2029 2288 2132 +2289 2455 2290 2478 2291 2933 2292 3062 2293 3360 2294 4006 2296 4477 2297 5108 2298 5579 2300 6154 +2302 6379 2304 6711 2306 6955 2308 7226 2310 7574 2312 8080 2314 8314 2316 8788 2318 9020 2320 9251 +2322 9730 2324 10306 2295 10724 1885 11165 1816 11328 1491 11491 943 11652 942 11811 941 11971 1001 12132 +1045 12293 1286 12454 1158 12618 685 12788 687 12978 686 13168 688 13358 894 13471 979 13584 1053 13701 +1088 13821 1118 13941 1159 14061 1206 14181 1245 14301 1301 14421 1352 14541 1401 14661 1458 14781 1493 14901 +1535 15021 1578 15141 1627 15261 1664 15381 1699 15501 1740 15621 1783 15741 1808 15861 1844 15981 1878 16101 +1917 16221 1955 16341 1992 16461 2037 16581 2073 16701 2119 16821 2215 16941 2265 17061 2338 17163 2339 17281 +% 959 0 obj +<< +/D [2271 0 R /XYZ 99.895 595.644 null] +>> +% 958 0 obj +<< +/D [2271 0 R /XYZ 99.895 538.043 null] +>> +% 916 0 obj +<< +/D [2271 0 R /XYZ 99.895 477.792 null] +>> % 917 0 obj << -/D [2267 0 R /XYZ 99.895 433.422 null] +/D [2271 0 R /XYZ 99.895 433.422 null] >> -% 933 0 obj +% 934 0 obj << -/D [2267 0 R /XYZ 99.895 398.456 null] +/D [2271 0 R /XYZ 99.895 398.456 null] >> % 913 0 obj << -/D [2267 0 R /XYZ 99.895 352.81 null] +/D [2271 0 R /XYZ 99.895 352.81 null] >> % 914 0 obj << -/D [2267 0 R /XYZ 99.895 307.164 null] +/D [2271 0 R /XYZ 99.895 307.164 null] >> -% 2272 0 obj +% 2276 0 obj << -/D [2267 0 R /XYZ 99.895 261.519 null] +/D [2271 0 R /XYZ 99.895 261.519 null] >> % 909 0 obj << -/D [2267 0 R /XYZ 99.895 215.873 null] +/D [2271 0 R /XYZ 99.895 215.873 null] >> -% 2273 0 obj +% 2277 0 obj << -/D [2267 0 R /XYZ 99.895 170.895 null] +/D [2271 0 R /XYZ 99.895 170.895 null] >> -% 2266 0 obj +% 2270 0 obj << /Font << /F75 685 0 R /F84 687 0 R /F78 686 0 R >> /ProcSet [ /PDF /Text ] >> -% 2276 0 obj +% 2280 0 obj << /Type /Page -/Contents 2277 0 R -/Resources 2275 0 R +/Contents 2281 0 R +/Resources 2279 0 R /MediaBox [0 0 595.276 841.89] -/Parent 2261 0 R +/Parent 2265 0 R >> -% 2278 0 obj +% 2282 0 obj << -/D [2276 0 R /XYZ 149.705 753.953 null] +/D [2280 0 R /XYZ 149.705 753.953 null] >> -% 1074 0 obj +% 1075 0 obj << -/D [2276 0 R /XYZ 150.705 716.092 null] +/D [2280 0 R /XYZ 150.705 716.092 null] >> -% 945 0 obj +% 946 0 obj << -/D [2276 0 R /XYZ 150.705 687.379 null] +/D [2280 0 R /XYZ 150.705 687.379 null] >> % 915 0 obj << -/D [2276 0 R /XYZ 150.705 632.184 null] +/D [2280 0 R /XYZ 150.705 632.184 null] >> % 912 0 obj << -/D [2276 0 R /XYZ 150.705 590.403 null] +/D [2280 0 R /XYZ 150.705 590.403 null] >> % 908 0 obj << -/D [2276 0 R /XYZ 150.705 545.192 null] +/D [2280 0 R /XYZ 150.705 545.192 null] >> -% 2142 0 obj +% 2146 0 obj << -/D [2276 0 R /XYZ 150.705 512.037 null] +/D [2280 0 R /XYZ 150.705 512.037 null] >> % 911 0 obj << -/D [2276 0 R /XYZ 150.705 480.156 null] +/D [2280 0 R /XYZ 150.705 480.156 null] >> -% 2279 0 obj +% 2283 0 obj << -/D [2276 0 R /XYZ 150.705 448.276 null] +/D [2280 0 R /XYZ 150.705 448.276 null] >> % 910 0 obj << -/D [2276 0 R /XYZ 150.705 407.09 null] +/D [2280 0 R /XYZ 150.705 407.09 null] >> -% 2127 0 obj +% 2131 0 obj << -/D [2276 0 R /XYZ 150.705 348.649 null] +/D [2280 0 R /XYZ 150.705 348.649 null] >> -% 2128 0 obj +% 2132 0 obj << -/D [2276 0 R /XYZ 150.705 304.874 null] +/D [2280 0 R /XYZ 150.705 304.874 null] >> -% 2280 0 obj +% 2284 0 obj << -/D [2276 0 R /XYZ 150.705 260.978 null] +/D [2280 0 R /XYZ 150.705 260.978 null] >> -% 2275 0 obj +% 2279 0 obj << -/Font << /F84 687 0 R /F78 686 0 R /F145 940 0 R >> +/Font << /F84 687 0 R /F78 686 0 R /F147 941 0 R >> /ProcSet [ /PDF /Text ] >> -% 2281 0 obj +% 2285 0 obj [1000] -% 2282 0 obj +% 2286 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] -% 2283 0 obj +% 2287 0 obj [277.8 277.8 500 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 777.8 500 777.8] -% 2284 0 obj -[853 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 666 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 747 0 0 0 0 0 0 0 0 0 0 0 0 0 0 881 0 0 0 0 0 0 0 0 0 0 0 0 234 0 881 767] -% 2285 0 obj +% 2288 0 obj +[831 660 753 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 500 0 0 0 0 853 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 666 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 747 0 0 0 0 0 0 0 0 0 0 0 0 0 0 881 0 0 0 0 0 0 0 0 0 0 0 0 234 0 881 767] +% 2289 0 obj [528 542] -% 2286 0 obj +% 2290 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] -% 2287 0 obj +% 2291 0 obj [531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3 531.3] -% 2288 0 obj +% 2292 0 obj [388.9 388.9 500 777.8 277.8 333.3 277.8 500 500 500 500 500 500 500 500 500 500 500 277.8 277.8 277.8 777.8 472.2 472.2 777.8 750 708.3 722.2 763.9 680.6 652.8 784.7 750 361.1 513.9 777.8 625 916.7 750 777.8 680.6 777.8 736.1 555.6 722.2 750 750 1027.8 750 750 611.1 277.8 500 277.8] -% 2289 0 obj +% 2293 0 obj [777.8 277.8 777.8 500 777.8 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 500 500 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 777.8 1000 1000 777.8 777.8 1000 1000 500 500 1000 1000 1000 777.8 1000 1000 611.1 611.1 1000 1000 1000 777.8 275 1000 666.7 666.7 888.9 888.9 0 0 555.6 555.6 666.7 500 722.2 722.2 777.8 777.8 611.1 798.5 656.8 526.5 771.4 527.8 718.7 594.9 844.5 544.5 677.8 761.9 689.7 1200.9 820.5 796.1 695.6 816.7 847.5 605.6 544.6 625.8 612.8 987.8 713.3 668.3 724.7 666.7 666.7 666.7 666.7 666.7 611.1 611.1 444.4 444.4 444.4 444.4 500 500 388.9 388.9 277.8 500 500 611.1 500 277.8 833.3] -% 2290 0 obj +% 2294 0 obj [525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525] -% 2292 0 obj +% 2296 0 obj [605 608 167 380 611 291 313 333 0 333 606 0 667 500 333 287 0 0 0 0 0 0 0 0 0 0 0 0 333 208 250 278 371 500 500 840 778 278 333 333 389 606 250 333 250 606 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 444 747 778 611 709 774 611 556 763 832 337 333 726 611 946 831 786 604 786 668 525 613 778 722 1000 667 667 667 333 606 333 606 500 278 500 553 444 611 479 333 556 582 291 234 556 291 883 582 546 601 560 395 424 326 603 565 834 516 556 500 333 606 333 606 0 0 0 278 500 500 1000 500 500 333 1144 525 331 998 0 0 0 0 0 0 500 500 606 500 1000 333 979 424 331 827 0 0 667 0 278 500 500 500 500 606 500] -% 2293 0 obj +% 2297 0 obj [528 545 167 333 556 278 333 333 0 333 606 0 667 444 333 278 0 0 0 0 0 0 0 0 0 0 0 0 333 333 250 333 500 500 500 889 778 278 333 333 389 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 500 747 722 611 667 778 611 556 722 778 333 333 667 556 944 778 778 611 778 667 556 611 778 722 944 722 667 667 333 606 333 606 500 278 444 463 407 500 389 278 500 500 278 278 444 278 778 556 444 500 463 389 389 333 556 500 722 500 500 444] -% 2294 0 obj +% 2298 0 obj [611 611 167 333 611 333 333 333 0 333 606 0 667 500 333 333 0 0 0 0 0 0 0 0 0 0 0 0 333 227 250 278 402 500 500 889 833 278 333 333 444 606 250 333 250 296 500 500 500 500 500 500 500 500 500 500 250 250 606 606 606 444 747 778 667 722 833 611 556 833 833 389 389 778 611 1000 833 833 611 833 722 611 667 778 778 1000 667 667 667 333 606 333 606 500 278 500 611 444 611 500 389 556 611 333 333 611 333 889 611 556 611 611 389 444 333 611 556 833 500 556 500 310 606 310 606 0 0 0 333 500 500 1000 500 500 333 1000 611 389 1000 0 0 0 0 0 0 500 500 606 500 1000] -% 2296 0 obj +% 2300 0 obj << /Type /FontDescriptor /FontName /MNPEHI+CMEX10 @@ -36117,9 +36219,9 @@ stream /StemV 47 /XHeight 431 /CharSet (/radicalbigg) -/FontFile 2295 0 R +/FontFile 2299 0 R >> -% 2298 0 obj +% 2302 0 obj << /Type /FontDescriptor /FontName /SFGIZH+CMITT10 @@ -36132,9 +36234,9 @@ stream /StemV 69 /XHeight 431 /CharSet (/A/C/D/E/H/I/K/L/M/P/T/V/a/c/comma/d/e/exclam/f/g/h/hyphen/i/k/m/n/o/p/parenleft/parenright/period/r/s/slash/t/w/x/y) -/FontFile 2297 0 R +/FontFile 2301 0 R >> -% 2300 0 obj +% 2304 0 obj << /Type /FontDescriptor /FontName /TPELEW+CMMI10 @@ -36147,9 +36249,9 @@ stream /StemV 72 /XHeight 431 /CharSet (/arrowhookleft/greater/less) -/FontFile 2299 0 R +/FontFile 2303 0 R >> -% 2302 0 obj +% 2306 0 obj << /Type /FontDescriptor /FontName /SOSTRQ+CMR10 @@ -36162,9 +36264,9 @@ stream /StemV 69 /XHeight 431 /CharSet (/bracketleft/bracketright/equal/parenleft/parenright/plus) -/FontFile 2301 0 R +/FontFile 2305 0 R >> -% 2304 0 obj +% 2308 0 obj << /Type /FontDescriptor /FontName /VKSUEJ+CMSY10 @@ -36177,9 +36279,9 @@ stream /StemV 40 /XHeight 431 /CharSet (/B/H/I/arrowleft/arrowright/asteriskmath/bar/bardbl/braceleft/braceright/element/greaterequal/lessequal/minus/negationslash/radical) -/FontFile 2303 0 R +/FontFile 2307 0 R >> -% 2306 0 obj +% 2310 0 obj << /Type /FontDescriptor /FontName /XIQVGP+CMTT10 @@ -36192,9 +36294,9 @@ stream /StemV 69 /XHeight 431 /CharSet (/A/B/C/D/E/F/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/a/ampersand/asciitilde/asterisk/b/backslash/bracketleft/bracketright/c/colon/comma/d/e/equal/f/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/quotesingle/r/s/six/slash/t/three/two/u/underscore/v/w/x/y/z/zero) -/FontFile 2305 0 R +/FontFile 2309 0 R >> -% 2308 0 obj +% 2312 0 obj << /Type /FontDescriptor /FontName /KPZRIA+CMTT8 @@ -36207,9 +36309,9 @@ stream /StemV 76 /XHeight 431 /CharSet (/b/c/d/e/i/l/n/p/r/s/t) -/FontFile 2307 0 R +/FontFile 2311 0 R >> -% 2310 0 obj +% 2314 0 obj << /Type /FontDescriptor /FontName /FYMOSO+CMTT9 @@ -36222,12 +36324,12 @@ stream /StemV 74 /XHeight 431 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/a/ampersand/asterisk/b/c/colon/comma/d/e/equal/f/four/g/greater/h/hyphen/i/j/k/l/less/m/n/nine/o/one/p/parenleft/parenright/percent/period/plus/q/quotesingle/r/s/semicolon/six/slash/t/two/u/underscore/v/w/x/y/z/zero) -/FontFile 2309 0 R +/FontFile 2313 0 R >> -% 2312 0 obj +% 2316 0 obj << /Type /FontDescriptor -/FontName /IKXQUG+PazoMath +/FontName /ZSBXRF+PazoMath /Flags 4 /FontBBox [-40 -283 878 946] /Ascent 0 @@ -36236,10 +36338,10 @@ stream /ItalicAngle 0 /StemV 95 /XHeight 0 -/CharSet (/infinity/summation) -/FontFile 2311 0 R +/CharSet (/Omega/infinity/summation) +/FontFile 2315 0 R >> -% 2314 0 obj +% 2318 0 obj << /Type /FontDescriptor /FontName /DUJUUF+PazoMath-Italic @@ -36252,9 +36354,9 @@ stream /StemV 65 /XHeight 0 /CharSet (/alpha/beta) -/FontFile 2313 0 R +/FontFile 2317 0 R >> -% 2316 0 obj +% 2320 0 obj << /Type /FontDescriptor /FontName /BDDEWM+URWPalladioL-Bold @@ -36267,9 +36369,9 @@ stream /StemV 123 /XHeight 471 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/Y/Z/a/b/c/colon/comma/d/e/eight/emdash/endash/equal/f/fi/five/fl/four/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/q/question/quoteright/r/s/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) -/FontFile 2315 0 R +/FontFile 2319 0 R >> -% 2318 0 obj +% 2322 0 obj << /Type /FontDescriptor /FontName /GLTUCO+URWPalladioL-Roma @@ -36282,9 +36384,9 @@ stream /StemV 84 /XHeight 469 /CharSet (/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/R/S/T/U/V/W/X/Y/Z/a/ampersand/asterisk/b/bracketleft/bracketright/bullet/c/colon/comma/d/e/eight/emdash/endash/equal/f/fi/five/fl/four/g/grave/h/hyphen/i/j/k/l/m/n/nine/o/one/p/parenleft/parenright/period/plus/q/quotedblleft/quotedblright/quoteright/r/s/section/semicolon/seven/six/slash/t/three/two/u/v/w/x/y/z/zero) -/FontFile 2317 0 R +/FontFile 2321 0 R >> -% 2320 0 obj +% 2324 0 obj << /Type /FontDescriptor /FontName /ZZXCQL+URWPalladioL-Ital @@ -36297,453 +36399,453 @@ stream /StemV 78 /XHeight 482 /CharSet (/A/B/C/D/E/F/G/H/I/K/L/M/N/O/P/Q/R/S/T/U/V/X/a/b/bracketleft/bracketright/c/colon/comma/d/e/f/fi/g/h/hyphen/i/j/k/l/m/n/nine/o/one/p/period/plus/q/quoteright/r/s/t/three/two/u/v/w/x/y/z/zero) -/FontFile 2319 0 R +/FontFile 2323 0 R >> -% 2291 0 obj +% 2295 0 obj << /Type /Encoding /Differences [2/fi/fl 30/grave 38/ampersand/quoteright/parenleft/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four/five/six/seven/eight/nine/colon/semicolon 61/equal 63/question 65/A/B/C/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft 93/bracketright 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y/z 147/quotedblleft/quotedblright/bullet/endash/emdash 167/section] >> -% 1882 0 obj +% 1885 0 obj << /Type /Font /Subtype /Type1 /BaseFont /MNPEHI+CMEX10 -/FontDescriptor 2296 0 R +/FontDescriptor 2300 0 R /FirstChar 114 /LastChar 114 -/Widths 2281 0 R -/ToUnicode 2321 0 R +/Widths 2285 0 R +/ToUnicode 2325 0 R >> -% 1813 0 obj +% 1816 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SFGIZH+CMITT10 -/FontDescriptor 2298 0 R +/FontDescriptor 2302 0 R /FirstChar 33 /LastChar 121 -/Widths 2282 0 R -/ToUnicode 2322 0 R +/Widths 2286 0 R +/ToUnicode 2326 0 R >> -% 1490 0 obj +% 1491 0 obj << /Type /Font /Subtype /Type1 /BaseFont /TPELEW+CMMI10 -/FontDescriptor 2300 0 R +/FontDescriptor 2304 0 R /FirstChar 44 /LastChar 62 -/Widths 2283 0 R -/ToUnicode 2323 0 R +/Widths 2287 0 R +/ToUnicode 2327 0 R >> -% 942 0 obj +% 943 0 obj << /Type /Font /Subtype /Type1 /BaseFont /SOSTRQ+CMR10 -/FontDescriptor 2302 0 R +/FontDescriptor 2306 0 R /FirstChar 40 /LastChar 93 -/Widths 2288 0 R -/ToUnicode 2324 0 R +/Widths 2292 0 R +/ToUnicode 2328 0 R >> -% 941 0 obj +% 942 0 obj << /Type /Font /Subtype /Type1 /BaseFont /VKSUEJ+CMSY10 -/FontDescriptor 2304 0 R +/FontDescriptor 2308 0 R /FirstChar 0 /LastChar 112 -/Widths 2289 0 R -/ToUnicode 2325 0 R +/Widths 2293 0 R +/ToUnicode 2329 0 R >> -% 940 0 obj +% 941 0 obj << /Type /Font /Subtype /Type1 /BaseFont /XIQVGP+CMTT10 -/FontDescriptor 2306 0 R +/FontDescriptor 2310 0 R /FirstChar 13 /LastChar 126 -/Widths 2290 0 R -/ToUnicode 2326 0 R +/Widths 2294 0 R +/ToUnicode 2330 0 R >> -% 1000 0 obj +% 1001 0 obj << /Type /Font /Subtype /Type1 /BaseFont /KPZRIA+CMTT8 -/FontDescriptor 2308 0 R +/FontDescriptor 2312 0 R /FirstChar 98 /LastChar 116 -/Widths 2287 0 R -/ToUnicode 2327 0 R +/Widths 2291 0 R +/ToUnicode 2331 0 R >> -% 1044 0 obj +% 1045 0 obj << /Type /Font /Subtype /Type1 /BaseFont /FYMOSO+CMTT9 -/FontDescriptor 2310 0 R +/FontDescriptor 2314 0 R /FirstChar 13 /LastChar 122 -/Widths 2286 0 R -/ToUnicode 2328 0 R +/Widths 2290 0 R +/ToUnicode 2332 0 R >> -% 1285 0 obj +% 1286 0 obj << /Type /Font /Subtype /Type1 -/BaseFont /IKXQUG+PazoMath -/FontDescriptor 2312 0 R -/FirstChar 165 +/BaseFont /ZSBXRF+PazoMath +/FontDescriptor 2316 0 R +/FirstChar 87 /LastChar 229 -/Widths 2284 0 R -/ToUnicode 2329 0 R +/Widths 2288 0 R +/ToUnicode 2333 0 R >> -% 1157 0 obj +% 1158 0 obj << /Type /Font /Subtype /Type1 /BaseFont /DUJUUF+PazoMath-Italic -/FontDescriptor 2314 0 R +/FontDescriptor 2318 0 R /FirstChar 97 /LastChar 98 -/Widths 2285 0 R -/ToUnicode 2330 0 R +/Widths 2289 0 R +/ToUnicode 2334 0 R >> % 685 0 obj << /Type /Font /Subtype /Type1 /BaseFont /BDDEWM+URWPalladioL-Bold -/FontDescriptor 2316 0 R +/FontDescriptor 2320 0 R /FirstChar 2 /LastChar 151 -/Widths 2294 0 R -/Encoding 2291 0 R -/ToUnicode 2331 0 R +/Widths 2298 0 R +/Encoding 2295 0 R +/ToUnicode 2335 0 R >> % 687 0 obj << /Type /Font /Subtype /Type1 /BaseFont /GLTUCO+URWPalladioL-Roma -/FontDescriptor 2318 0 R +/FontDescriptor 2322 0 R /FirstChar 2 /LastChar 167 -/Widths 2292 0 R -/Encoding 2291 0 R -/ToUnicode 2332 0 R +/Widths 2296 0 R +/Encoding 2295 0 R +/ToUnicode 2336 0 R >> % 686 0 obj << /Type /Font /Subtype /Type1 /BaseFont /ZZXCQL+URWPalladioL-Ital -/FontDescriptor 2320 0 R +/FontDescriptor 2324 0 R /FirstChar 2 /LastChar 122 -/Widths 2293 0 R -/Encoding 2291 0 R -/ToUnicode 2333 0 R +/Widths 2297 0 R +/Encoding 2295 0 R +/ToUnicode 2337 0 R >> % 688 0 obj << /Type /Pages /Count 6 -/Parent 2334 0 R +/Parent 2338 0 R /Kids [678 0 R 691 0 R 737 0 R 793 0 R 841 0 R 884 0 R] >> % 894 0 obj << /Type /Pages /Count 6 -/Parent 2334 0 R -/Kids [892 0 R 906 0 R 924 0 R 937 0 R 950 0 R 962 0 R] +/Parent 2338 0 R +/Kids [892 0 R 906 0 R 924 0 R 938 0 R 951 0 R 963 0 R] >> -% 978 0 obj +% 979 0 obj << /Type /Pages /Count 6 -/Parent 2334 0 R -/Kids [967 0 R 982 0 R 1003 0 R 1014 0 R 1022 0 R 1033 0 R] +/Parent 2338 0 R +/Kids [968 0 R 983 0 R 1004 0 R 1015 0 R 1023 0 R 1034 0 R] >> -% 1052 0 obj +% 1053 0 obj << /Type /Pages /Count 6 -/Parent 2334 0 R -/Kids [1049 0 R 1054 0 R 1058 0 R 1063 0 R 1070 0 R 1078 0 R] +/Parent 2338 0 R +/Kids [1050 0 R 1055 0 R 1059 0 R 1064 0 R 1071 0 R 1079 0 R] >> -% 1087 0 obj +% 1088 0 obj << /Type /Pages /Count 6 -/Parent 2334 0 R -/Kids [1083 0 R 1089 0 R 1093 0 R 1097 0 R 1103 0 R 1107 0 R] +/Parent 2338 0 R +/Kids [1084 0 R 1090 0 R 1094 0 R 1098 0 R 1104 0 R 1108 0 R] >> -% 1117 0 obj +% 1118 0 obj << /Type /Pages /Count 6 -/Parent 2334 0 R -/Kids [1113 0 R 1120 0 R 1126 0 R 1133 0 R 1139 0 R 1143 0 R] +/Parent 2338 0 R +/Kids [1114 0 R 1121 0 R 1127 0 R 1134 0 R 1140 0 R 1144 0 R] >> -% 1158 0 obj +% 1159 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R -/Kids [1154 0 R 1162 0 R 1172 0 R 1178 0 R 1189 0 R 1194 0 R] +/Parent 2339 0 R +/Kids [1155 0 R 1163 0 R 1173 0 R 1179 0 R 1190 0 R 1195 0 R] >> -% 1205 0 obj +% 1206 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R -/Kids [1201 0 R 1207 0 R 1215 0 R 1223 0 R 1228 0 R 1236 0 R] +/Parent 2339 0 R +/Kids [1202 0 R 1208 0 R 1216 0 R 1224 0 R 1229 0 R 1237 0 R] >> -% 1244 0 obj +% 1245 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R -/Kids [1241 0 R 1249 0 R 1254 0 R 1267 0 R 1274 0 R 1282 0 R] +/Parent 2339 0 R +/Kids [1242 0 R 1250 0 R 1255 0 R 1268 0 R 1275 0 R 1283 0 R] >> -% 1300 0 obj +% 1301 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R -/Kids [1293 0 R 1309 0 R 1315 0 R 1326 0 R 1332 0 R 1343 0 R] +/Parent 2339 0 R +/Kids [1294 0 R 1310 0 R 1316 0 R 1327 0 R 1333 0 R 1344 0 R] >> -% 1351 0 obj +% 1352 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R -/Kids [1348 0 R 1360 0 R 1365 0 R 1374 0 R 1380 0 R 1389 0 R] +/Parent 2339 0 R +/Kids [1349 0 R 1361 0 R 1366 0 R 1375 0 R 1381 0 R 1390 0 R] >> -% 1400 0 obj +% 1401 0 obj << /Type /Pages /Count 6 -/Parent 2335 0 R -/Kids [1396 0 R 1410 0 R 1417 0 R 1426 0 R 1434 0 R 1438 0 R] +/Parent 2339 0 R +/Kids [1397 0 R 1411 0 R 1418 0 R 1427 0 R 1435 0 R 1439 0 R] >> -% 1457 0 obj +% 1458 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R -/Kids [1453 0 R 1459 0 R 1465 0 R 1472 0 R 1476 0 R 1481 0 R] +/Parent 2340 0 R +/Kids [1454 0 R 1460 0 R 1466 0 R 1473 0 R 1477 0 R 1482 0 R] >> -% 1492 0 obj +% 1493 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R -/Kids [1487 0 R 1494 0 R 1505 0 R 1510 0 R 1519 0 R 1526 0 R] +/Parent 2340 0 R +/Kids [1488 0 R 1495 0 R 1506 0 R 1511 0 R 1520 0 R 1527 0 R] >> -% 1534 0 obj +% 1535 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R -/Kids [1531 0 R 1538 0 R 1542 0 R 1550 0 R 1555 0 R 1563 0 R] +/Parent 2340 0 R +/Kids [1532 0 R 1539 0 R 1543 0 R 1551 0 R 1556 0 R 1564 0 R] >> -% 1577 0 obj +% 1578 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R -/Kids [1569 0 R 1579 0 R 1592 0 R 1596 0 R 1609 0 R 1616 0 R] +/Parent 2340 0 R +/Kids [1570 0 R 1580 0 R 1593 0 R 1597 0 R 1610 0 R 1617 0 R] >> -% 1626 0 obj +% 1627 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R -/Kids [1623 0 R 1628 0 R 1635 0 R 1639 0 R 1648 0 R 1656 0 R] +/Parent 2340 0 R +/Kids [1624 0 R 1629 0 R 1636 0 R 1640 0 R 1649 0 R 1657 0 R] >> -% 1663 0 obj +% 1664 0 obj << /Type /Pages /Count 6 -/Parent 2336 0 R -/Kids [1660 0 R 1666 0 R 1670 0 R 1677 0 R 1682 0 R 1688 0 R] +/Parent 2340 0 R +/Kids [1661 0 R 1667 0 R 1671 0 R 1678 0 R 1683 0 R 1689 0 R] >> -% 1698 0 obj +% 1699 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R -/Kids [1694 0 R 1701 0 R 1707 0 R 1714 0 R 1722 0 R 1726 0 R] +/Parent 2341 0 R +/Kids [1695 0 R 1702 0 R 1708 0 R 1715 0 R 1723 0 R 1727 0 R] >> -% 1739 0 obj +% 1740 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R -/Kids [1736 0 R 1741 0 R 1745 0 R 1758 0 R 1762 0 R 1768 0 R] +/Parent 2341 0 R +/Kids [1737 0 R 1742 0 R 1746 0 R 1761 0 R 1765 0 R 1771 0 R] >> -% 1780 0 obj +% 1783 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R -/Kids [1774 0 R 1782 0 R 1786 0 R 1790 0 R 1794 0 R 1798 0 R] +/Parent 2341 0 R +/Kids [1777 0 R 1785 0 R 1789 0 R 1793 0 R 1797 0 R 1801 0 R] >> -% 1805 0 obj +% 1808 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R -/Kids [1802 0 R 1807 0 R 1815 0 R 1819 0 R 1826 0 R 1831 0 R] +/Parent 2341 0 R +/Kids [1805 0 R 1810 0 R 1818 0 R 1822 0 R 1830 0 R 1834 0 R] >> -% 1841 0 obj +% 1844 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R -/Kids [1838 0 R 1843 0 R 1850 0 R 1854 0 R 1861 0 R 1865 0 R] +/Parent 2341 0 R +/Kids [1841 0 R 1846 0 R 1853 0 R 1857 0 R 1864 0 R 1868 0 R] >> -% 1875 0 obj +% 1878 0 obj << /Type /Pages /Count 6 -/Parent 2337 0 R -/Kids [1872 0 R 1877 0 R 1887 0 R 1892 0 R 1899 0 R 1905 0 R] +/Parent 2341 0 R +/Kids [1875 0 R 1880 0 R 1890 0 R 1895 0 R 1902 0 R 1908 0 R] >> -% 1914 0 obj +% 1917 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [1909 0 R 1916 0 R 1922 0 R 1928 0 R 1934 0 R 1940 0 R] +/Parent 2342 0 R +/Kids [1912 0 R 1919 0 R 1925 0 R 1931 0 R 1937 0 R 1943 0 R] >> -% 1952 0 obj +% 1955 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [1947 0 R 1955 0 R 1962 0 R 1969 0 R 1976 0 R 1982 0 R] +/Parent 2342 0 R +/Kids [1950 0 R 1958 0 R 1965 0 R 1972 0 R 1979 0 R 1985 0 R] >> -% 1989 0 obj +% 1992 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [1986 0 R 1994 0 R 2005 0 R 2009 0 R 2018 0 R 2022 0 R] +/Parent 2342 0 R +/Kids [1989 0 R 1997 0 R 2008 0 R 2012 0 R 2021 0 R 2025 0 R] >> -% 2034 0 obj +% 2037 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [2031 0 R 2037 0 R 2041 0 R 2047 0 R 2056 0 R 2063 0 R] +/Parent 2342 0 R +/Kids [2034 0 R 2040 0 R 2044 0 R 2051 0 R 2059 0 R 2066 0 R] >> -% 2070 0 obj +% 2073 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [2067 0 R 2075 0 R 2086 0 R 2091 0 R 2099 0 R 2108 0 R] +/Parent 2342 0 R +/Kids [2070 0 R 2078 0 R 2089 0 R 2094 0 R 2103 0 R 2112 0 R] >> -% 2115 0 obj +% 2119 0 obj << /Type /Pages /Count 6 -/Parent 2338 0 R -/Kids [2112 0 R 2123 0 R 2137 0 R 2146 0 R 2157 0 R 2186 0 R] +/Parent 2342 0 R +/Kids [2116 0 R 2127 0 R 2141 0 R 2150 0 R 2161 0 R 2190 0 R] >> -% 2211 0 obj +% 2215 0 obj << /Type /Pages /Count 6 -/Parent 2339 0 R -/Kids [2206 0 R 2225 0 R 2241 0 R 2245 0 R 2249 0 R 2254 0 R] +/Parent 2343 0 R +/Kids [2210 0 R 2229 0 R 2245 0 R 2249 0 R 2253 0 R 2258 0 R] >> -% 2261 0 obj +% 2265 0 obj << /Type /Pages /Count 4 -/Parent 2339 0 R -/Kids [2258 0 R 2263 0 R 2267 0 R 2276 0 R] +/Parent 2343 0 R +/Kids [2262 0 R 2267 0 R 2271 0 R 2280 0 R] >> -% 2334 0 obj +% 2338 0 obj << /Type /Pages /Count 36 -/Parent 2340 0 R -/Kids [688 0 R 894 0 R 978 0 R 1052 0 R 1087 0 R 1117 0 R] +/Parent 2344 0 R +/Kids [688 0 R 894 0 R 979 0 R 1053 0 R 1088 0 R 1118 0 R] >> -% 2335 0 obj +% 2339 0 obj << /Type /Pages /Count 36 -/Parent 2340 0 R -/Kids [1158 0 R 1205 0 R 1244 0 R 1300 0 R 1351 0 R 1400 0 R] +/Parent 2344 0 R +/Kids [1159 0 R 1206 0 R 1245 0 R 1301 0 R 1352 0 R 1401 0 R] >> -% 2336 0 obj + +endstream +endobj +2345 0 obj +<< +/Type /ObjStm +/N 100 +/First 893 +/Length 9834 +>> +stream +2340 0 2341 121 2342 242 2343 363 2344 448 2346 553 675 622 671 696 667 784 663 872 +659 960 655 1048 651 1136 647 1224 643 1312 639 1400 635 1488 631 1576 627 1664 623 1752 +619 1826 615 1938 611 2012 607 2100 602 2188 598 2262 594 2387 590 2461 586 2535 582 2660 +578 2734 574 2822 570 2910 566 2998 562 3086 558 3174 554 3262 550 3350 546 3424 542 3549 +538 3623 534 3711 530 3799 526 3887 522 3975 518 4049 514 4174 510 4248 506 4336 502 4424 +498 4498 494 4623 490 4697 486 4785 482 4873 478 4961 474 5049 470 5137 466 5225 462 5313 +458 5401 454 5489 450 5577 446 5665 442 5753 438 5841 434 5929 430 6017 426 6091 422 6217 +418 6291 414 6379 410 6467 406 6555 401 6643 397 6731 393 6819 389 6907 385 6995 381 7083 +377 7171 373 7259 369 7347 365 7435 361 7523 357 7611 353 7699 349 7787 345 7875 341 7963 +337 8051 333 8139 329 8227 325 8315 321 8403 317 8491 313 8565 309 8691 305 8765 301 8853 +% 2340 0 obj << /Type /Pages /Count 36 -/Parent 2340 0 R -/Kids [1457 0 R 1492 0 R 1534 0 R 1577 0 R 1626 0 R 1663 0 R] +/Parent 2344 0 R +/Kids [1458 0 R 1493 0 R 1535 0 R 1578 0 R 1627 0 R 1664 0 R] >> -% 2337 0 obj +% 2341 0 obj << /Type /Pages /Count 36 -/Parent 2340 0 R -/Kids [1698 0 R 1739 0 R 1780 0 R 1805 0 R 1841 0 R 1875 0 R] +/Parent 2344 0 R +/Kids [1699 0 R 1740 0 R 1783 0 R 1808 0 R 1844 0 R 1878 0 R] >> -% 2338 0 obj +% 2342 0 obj << /Type /Pages /Count 36 -/Parent 2340 0 R -/Kids [1914 0 R 1952 0 R 1989 0 R 2034 0 R 2070 0 R 2115 0 R] +/Parent 2344 0 R +/Kids [1917 0 R 1955 0 R 1992 0 R 2037 0 R 2073 0 R 2119 0 R] >> - -endstream -endobj -2341 0 obj -<< -/Type /ObjStm -/N 100 -/First 888 -/Length 9739 ->> -stream -2339 0 2340 85 2342 190 675 259 671 333 667 421 663 509 659 597 655 685 651 773 -647 861 643 949 639 1037 635 1125 631 1213 627 1301 623 1389 619 1463 615 1575 611 1649 -607 1737 602 1825 598 1899 594 2024 590 2098 586 2172 582 2297 578 2371 574 2459 570 2547 -566 2635 562 2723 558 2811 554 2899 550 2987 546 3061 542 3186 538 3260 534 3348 530 3436 -526 3524 522 3612 518 3686 514 3811 510 3885 506 3973 502 4061 498 4135 494 4260 490 4334 -486 4422 482 4510 478 4598 474 4686 470 4774 466 4862 462 4950 458 5038 454 5126 450 5214 -446 5302 442 5390 438 5478 434 5566 430 5654 426 5728 422 5854 418 5928 414 6016 410 6104 -406 6192 401 6280 397 6368 393 6456 389 6544 385 6632 381 6720 377 6808 373 6896 369 6984 -365 7072 361 7160 357 7248 353 7336 349 7424 345 7512 341 7600 337 7688 333 7776 329 7864 -325 7952 321 8040 317 8128 313 8202 309 8328 305 8402 301 8490 297 8578 293 8652 289 8777 -% 2339 0 obj +% 2343 0 obj << /Type /Pages /Count 10 -/Parent 2340 0 R -/Kids [2211 0 R 2261 0 R] +/Parent 2344 0 R +/Kids [2215 0 R 2265 0 R] >> -% 2340 0 obj +% 2344 0 obj << /Type /Pages /Count 190 -/Kids [2334 0 R 2335 0 R 2336 0 R 2337 0 R 2338 0 R 2339 0 R] +/Kids [2338 0 R 2339 0 R 2340 0 R 2341 0 R 2342 0 R 2343 0 R] >> -% 2342 0 obj +% 2346 0 obj << /Type /Outlines /First 4 0 R @@ -37508,6 +37610,27 @@ stream /Prev 297 0 R /Next 305 0 R >> + +endstream +endobj +2347 0 obj +<< +/Type /ObjStm +/N 100 +/First 890 +/Length 11873 +>> +stream +297 0 293 74 289 199 285 273 281 361 277 449 273 537 269 625 265 713 261 801 +257 889 253 977 249 1065 245 1153 241 1241 237 1329 233 1417 229 1505 225 1579 221 1704 +217 1777 213 1864 209 1938 205 2026 200 2114 196 2202 192 2290 188 2364 184 2490 180 2564 +176 2652 172 2740 168 2828 164 2916 160 3004 156 3092 152 3180 148 3268 144 3356 140 3444 +136 3532 132 3620 128 3708 124 3796 120 3884 116 3972 112 4060 108 4134 104 4260 100 4333 +96 4418 92 4501 88 4583 84 4665 80 4747 76 4829 72 4911 68 4993 64 5075 60 5157 +56 5239 52 5321 48 5403 44 5472 40 5581 36 5701 32 5770 28 5826 24 5945 20 6027 +16 6096 12 6214 8 6294 4 6359 2348 6452 2349 6649 2350 6822 2351 7002 2352 7179 2353 7356 +2354 7536 2355 7714 2356 7894 2357 8072 2358 8252 2359 8427 2360 8592 2361 8763 2362 8933 2363 9105 +2364 9275 2365 9447 2366 9616 2367 9785 2368 9957 2369 10127 2370 10299 2371 10469 2372 10641 2373 10811 % 297 0 obj << /Title 298 0 R @@ -37533,27 +37656,6 @@ stream /Parent 225 0 R /Prev 285 0 R >> - -endstream -endobj -2343 0 obj -<< -/Type /ObjStm -/N 100 -/First 895 -/Length 12279 ->> -stream -285 0 281 88 277 176 273 264 269 352 265 440 261 528 257 616 253 704 249 792 -245 880 241 968 237 1056 233 1144 229 1232 225 1306 221 1431 217 1504 213 1591 209 1665 -205 1753 200 1841 196 1929 192 2017 188 2091 184 2217 180 2291 176 2379 172 2467 168 2555 -164 2643 160 2731 156 2819 152 2907 148 2995 144 3083 140 3171 136 3259 132 3347 128 3435 -124 3523 120 3611 116 3699 112 3787 108 3861 104 3987 100 4060 96 4145 92 4228 88 4310 -84 4392 80 4474 76 4556 72 4638 68 4720 64 4802 60 4884 56 4966 52 5048 48 5130 -44 5199 40 5308 36 5428 32 5497 28 5553 24 5672 20 5754 16 5823 12 5941 8 6021 -4 6086 2344 6179 2345 6375 2346 6548 2347 6728 2348 6905 2349 7082 2350 7262 2351 7440 2352 7620 -2353 7798 2354 7978 2355 8149 2356 8315 2357 8487 2358 8656 2359 8825 2360 8997 2361 9167 2362 9339 -2363 9509 2364 9681 2365 9851 2366 10023 2367 10193 2368 10365 2369 10534 2370 10708 2371 10930 2372 11135 % 285 0 obj << /Title 286 0 R @@ -38125,730 +38227,747 @@ stream << /Title 5 0 R /A 1 0 R -/Parent 2342 0 R +/Parent 2346 0 R /First 8 0 R /Last 619 0 R /Count -14 >> -% 2344 0 obj -<< -/Names [(Doc-Start) 684 0 R (Hfootnote.1) 943 0 R (Hfootnote.2) 944 0 R (Hfootnote.3) 999 0 R (Hfootnote.4) 1997 0 R (Hfootnote.5) 2081 0 R] -/Limits [(Doc-Start) (Hfootnote.5)] ->> -% 2345 0 obj -<< -/Names [(Item.1) 970 0 R (Item.10) 986 0 R (Item.100) 1711 0 R (Item.101) 1717 0 R (Item.102) 1718 0 R (Item.103) 1729 0 R] -/Limits [(Item.1) (Item.103)] ->> -% 2346 0 obj -<< -/Names [(Item.104) 1730 0 R (Item.105) 1731 0 R (Item.106) 1748 0 R (Item.107) 1749 0 R (Item.108) 1750 0 R (Item.109) 1751 0 R] -/Limits [(Item.104) (Item.109)] ->> -% 2347 0 obj -<< -/Names [(Item.11) 987 0 R (Item.110) 1752 0 R (Item.111) 1753 0 R (Item.112) 1754 0 R (Item.113) 1755 0 R (Item.114) 1756 0 R] -/Limits [(Item.11) (Item.114)] ->> % 2348 0 obj << -/Names [(Item.115) 1765 0 R (Item.116) 1766 0 R (Item.117) 1771 0 R (Item.118) 1772 0 R (Item.119) 1777 0 R (Item.12) 988 0 R] -/Limits [(Item.115) (Item.12)] +/Names [(Doc-Start) 684 0 R (Hfootnote.1) 944 0 R (Hfootnote.2) 945 0 R (Hfootnote.3) 1000 0 R (Hfootnote.4) 2000 0 R (Hfootnote.5) 2084 0 R] +/Limits [(Doc-Start) (Hfootnote.5)] >> % 2349 0 obj << -/Names [(Item.120) 1778 0 R (Item.121) 1779 0 R (Item.122) 1810 0 R (Item.123) 1811 0 R (Item.124) 1812 0 R (Item.125) 1822 0 R] -/Limits [(Item.120) (Item.125)] +/Names [(Item.1) 971 0 R (Item.10) 987 0 R (Item.100) 1712 0 R (Item.101) 1718 0 R (Item.102) 1719 0 R (Item.103) 1730 0 R] +/Limits [(Item.1) (Item.103)] >> % 2350 0 obj << -/Names [(Item.126) 1823 0 R (Item.127) 1824 0 R (Item.128) 1834 0 R (Item.129) 1835 0 R (Item.13) 989 0 R (Item.130) 1836 0 R] -/Limits [(Item.126) (Item.130)] +/Names [(Item.104) 1731 0 R (Item.105) 1732 0 R (Item.106) 1749 0 R (Item.107) 1750 0 R (Item.108) 1751 0 R (Item.109) 1752 0 R] +/Limits [(Item.104) (Item.109)] >> % 2351 0 obj << -/Names [(Item.131) 1846 0 R (Item.132) 1847 0 R (Item.133) 1848 0 R (Item.134) 1857 0 R (Item.135) 1858 0 R (Item.136) 1859 0 R] -/Limits [(Item.131) (Item.136)] +/Names [(Item.11) 988 0 R (Item.110) 1753 0 R (Item.111) 1754 0 R (Item.112) 1755 0 R (Item.113) 1756 0 R (Item.114) 1757 0 R] +/Limits [(Item.11) (Item.114)] >> % 2352 0 obj << -/Names [(Item.137) 1868 0 R (Item.138) 1869 0 R (Item.139) 1870 0 R (Item.14) 990 0 R (Item.140) 1880 0 R (Item.141) 1881 0 R] -/Limits [(Item.137) (Item.141)] +/Names [(Item.115) 1758 0 R (Item.116) 1759 0 R (Item.117) 1768 0 R (Item.118) 1769 0 R (Item.119) 1774 0 R (Item.12) 989 0 R] +/Limits [(Item.115) (Item.12)] >> % 2353 0 obj << -/Names [(Item.142) 1883 0 R (Item.143) 1884 0 R (Item.144) 1885 0 R (Item.145) 1890 0 R (Item.146) 1895 0 R (Item.147) 2150 0 R] -/Limits [(Item.142) (Item.147)] +/Names [(Item.120) 1775 0 R (Item.121) 1780 0 R (Item.122) 1781 0 R (Item.123) 1782 0 R (Item.124) 1813 0 R (Item.125) 1814 0 R] +/Limits [(Item.120) (Item.125)] >> % 2354 0 obj << -/Names [(Item.148) 2151 0 R (Item.149) 2252 0 R (Item.15) 991 0 R (Item.16) 992 0 R (Item.17) 993 0 R (Item.18) 994 0 R] -/Limits [(Item.148) (Item.18)] +/Names [(Item.126) 1815 0 R (Item.127) 1825 0 R (Item.128) 1826 0 R (Item.129) 1827 0 R (Item.13) 990 0 R (Item.130) 1837 0 R] +/Limits [(Item.126) (Item.130)] >> % 2355 0 obj << -/Names [(Item.19) 995 0 R (Item.2) 971 0 R (Item.20) 996 0 R (Item.21) 997 0 R (Item.22) 998 0 R (Item.23) 1006 0 R] -/Limits [(Item.19) (Item.23)] +/Names [(Item.131) 1838 0 R (Item.132) 1839 0 R (Item.133) 1849 0 R (Item.134) 1850 0 R (Item.135) 1851 0 R (Item.136) 1860 0 R] +/Limits [(Item.131) (Item.136)] >> % 2356 0 obj << -/Names [(Item.24) 1007 0 R (Item.25) 1008 0 R (Item.26) 1009 0 R (Item.27) 1010 0 R (Item.28) 1011 0 R (Item.29) 1025 0 R] -/Limits [(Item.24) (Item.29)] +/Names [(Item.137) 1861 0 R (Item.138) 1862 0 R (Item.139) 1871 0 R (Item.14) 991 0 R (Item.140) 1872 0 R (Item.141) 1873 0 R] +/Limits [(Item.137) (Item.141)] >> % 2357 0 obj << -/Names [(Item.3) 972 0 R (Item.30) 1026 0 R (Item.31) 1027 0 R (Item.32) 1028 0 R (Item.33) 1029 0 R (Item.34) 1036 0 R] -/Limits [(Item.3) (Item.34)] +/Names [(Item.142) 1883 0 R (Item.143) 1884 0 R (Item.144) 1886 0 R (Item.145) 1887 0 R (Item.146) 1888 0 R (Item.147) 1893 0 R] +/Limits [(Item.142) (Item.147)] >> % 2358 0 obj << -/Names [(Item.35) 1037 0 R (Item.36) 1038 0 R (Item.37) 1039 0 R (Item.38) 1040 0 R (Item.39) 1041 0 R (Item.4) 973 0 R] -/Limits [(Item.35) (Item.4)] +/Names [(Item.148) 1898 0 R (Item.149) 2154 0 R (Item.15) 992 0 R (Item.150) 2155 0 R (Item.151) 2256 0 R (Item.16) 993 0 R] +/Limits [(Item.148) (Item.16)] >> % 2359 0 obj << -/Names [(Item.40) 1042 0 R (Item.41) 1043 0 R (Item.42) 1086 0 R (Item.43) 1100 0 R (Item.44) 1101 0 R (Item.45) 1181 0 R] -/Limits [(Item.40) (Item.45)] +/Names [(Item.17) 994 0 R (Item.18) 995 0 R (Item.19) 996 0 R (Item.2) 972 0 R (Item.20) 997 0 R (Item.21) 998 0 R] +/Limits [(Item.17) (Item.21)] >> % 2360 0 obj << -/Names [(Item.46) 1210 0 R (Item.47) 1231 0 R (Item.48) 1257 0 R (Item.49) 1429 0 R (Item.5) 974 0 R (Item.50) 1430 0 R] -/Limits [(Item.46) (Item.50)] +/Names [(Item.22) 999 0 R (Item.23) 1007 0 R (Item.24) 1008 0 R (Item.25) 1009 0 R (Item.26) 1010 0 R (Item.27) 1011 0 R] +/Limits [(Item.22) (Item.27)] >> % 2361 0 obj << -/Names [(Item.51) 1431 0 R (Item.52) 1484 0 R (Item.53) 1491 0 R (Item.54) 1497 0 R (Item.55) 1498 0 R (Item.56) 1499 0 R] -/Limits [(Item.51) (Item.56)] +/Names [(Item.28) 1012 0 R (Item.29) 1026 0 R (Item.3) 973 0 R (Item.30) 1027 0 R (Item.31) 1028 0 R (Item.32) 1029 0 R] +/Limits [(Item.28) (Item.32)] >> % 2362 0 obj << -/Names [(Item.57) 1500 0 R (Item.58) 1501 0 R (Item.59) 1513 0 R (Item.6) 975 0 R (Item.60) 1514 0 R (Item.61) 1515 0 R] -/Limits [(Item.57) (Item.61)] +/Names [(Item.33) 1030 0 R (Item.34) 1037 0 R (Item.35) 1038 0 R (Item.36) 1039 0 R (Item.37) 1040 0 R (Item.38) 1041 0 R] +/Limits [(Item.33) (Item.38)] >> % 2363 0 obj << -/Names [(Item.62) 1522 0 R (Item.63) 1545 0 R (Item.64) 1546 0 R (Item.65) 1553 0 R (Item.66) 1558 0 R (Item.67) 1559 0 R] -/Limits [(Item.62) (Item.67)] +/Names [(Item.39) 1042 0 R (Item.4) 974 0 R (Item.40) 1043 0 R (Item.41) 1044 0 R (Item.42) 1087 0 R (Item.43) 1101 0 R] +/Limits [(Item.39) (Item.43)] >> % 2364 0 obj << -/Names [(Item.68) 1560 0 R (Item.69) 1572 0 R (Item.7) 976 0 R (Item.70) 1573 0 R (Item.71) 1574 0 R (Item.72) 1575 0 R] -/Limits [(Item.68) (Item.72)] +/Names [(Item.44) 1102 0 R (Item.45) 1182 0 R (Item.46) 1211 0 R (Item.47) 1232 0 R (Item.48) 1258 0 R (Item.49) 1430 0 R] +/Limits [(Item.44) (Item.49)] >> % 2365 0 obj << -/Names [(Item.73) 1576 0 R (Item.74) 1582 0 R (Item.75) 1583 0 R (Item.76) 1584 0 R (Item.77) 1585 0 R (Item.78) 1586 0 R] -/Limits [(Item.73) (Item.78)] +/Names [(Item.5) 975 0 R (Item.50) 1431 0 R (Item.51) 1432 0 R (Item.52) 1485 0 R (Item.53) 1492 0 R (Item.54) 1498 0 R] +/Limits [(Item.5) (Item.54)] >> % 2366 0 obj << -/Names [(Item.79) 1587 0 R (Item.8) 977 0 R (Item.80) 1599 0 R (Item.81) 1600 0 R (Item.82) 1601 0 R (Item.83) 1602 0 R] -/Limits [(Item.79) (Item.83)] +/Names [(Item.55) 1499 0 R (Item.56) 1500 0 R (Item.57) 1501 0 R (Item.58) 1502 0 R (Item.59) 1514 0 R (Item.6) 976 0 R] +/Limits [(Item.55) (Item.6)] >> % 2367 0 obj << -/Names [(Item.84) 1603 0 R (Item.85) 1604 0 R (Item.86) 1605 0 R (Item.87) 1619 0 R (Item.88) 1631 0 R (Item.89) 1642 0 R] -/Limits [(Item.84) (Item.89)] +/Names [(Item.60) 1515 0 R (Item.61) 1516 0 R (Item.62) 1523 0 R (Item.63) 1546 0 R (Item.64) 1547 0 R (Item.65) 1554 0 R] +/Limits [(Item.60) (Item.65)] >> % 2368 0 obj << -/Names [(Item.9) 985 0 R (Item.90) 1643 0 R (Item.91) 1651 0 R (Item.92) 1652 0 R (Item.93) 1673 0 R (Item.94) 1674 0 R] -/Limits [(Item.9) (Item.94)] +/Names [(Item.66) 1559 0 R (Item.67) 1560 0 R (Item.68) 1561 0 R (Item.69) 1573 0 R (Item.7) 977 0 R (Item.70) 1574 0 R] +/Limits [(Item.66) (Item.70)] >> % 2369 0 obj << -/Names [(Item.95) 1685 0 R (Item.96) 1691 0 R (Item.97) 1697 0 R (Item.98) 1704 0 R (Item.99) 1710 0 R (algocf.1) 2155 0 R] -/Limits [(Item.95) (algocf.1)] +/Names [(Item.71) 1575 0 R (Item.72) 1576 0 R (Item.73) 1577 0 R (Item.74) 1583 0 R (Item.75) 1584 0 R (Item.76) 1585 0 R] +/Limits [(Item.71) (Item.76)] >> % 2370 0 obj << -/Names [(algocf.2) 2202 0 R (algocfline.1) 2141 0 R (algocfline.2) 2209 0 R (cite.2007c) 957 0 R (cite.2007d) 958 0 R (cite.BERTACCINIFILIPPONE) 2012 0 R] -/Limits [(algocf.2) (cite.BERTACCINIFILIPPONE)] +/Names [(Item.77) 1586 0 R (Item.78) 1587 0 R (Item.79) 1588 0 R (Item.8) 978 0 R (Item.80) 1600 0 R (Item.81) 1601 0 R] +/Limits [(Item.77) (Item.81)] >> % 2371 0 obj << -/Names [(cite.BLACS) 933 0 R (cite.BLAS1) 915 0 R (cite.BLAS2) 916 0 R (cite.BLAS3) 917 0 R (cite.CaFiRo:2014) 2127 0 R (cite.DesPat:11) 910 0 R] -/Limits [(cite.BLACS) (cite.DesPat:11)] +/Names [(Item.82) 1602 0 R (Item.83) 1603 0 R (Item.84) 1604 0 R (Item.85) 1605 0 R (Item.86) 1606 0 R (Item.87) 1620 0 R] +/Limits [(Item.82) (Item.87)] >> % 2372 0 obj << -/Names [(cite.DesignPatterns) 1074 0 R (cite.Filippone:2017:SMM:3034774.3017994) 2280 0 R (cite.KIVA3PSBLAS) 2273 0 R (cite.METIS) 945 0 R (cite.MPI1) 2279 0 R (cite.MRC:11) 2142 0 R] -/Limits [(cite.DesignPatterns) (cite.MRC:11)] +/Names [(Item.88) 1632 0 R (Item.89) 1643 0 R (Item.9) 986 0 R (Item.90) 1644 0 R (Item.91) 1652 0 R (Item.92) 1653 0 R] +/Limits [(Item.88) (Item.92)] +>> +% 2373 0 obj +<< +/Names [(Item.93) 1674 0 R (Item.94) 1675 0 R (Item.95) 1686 0 R (Item.96) 1692 0 R (Item.97) 1698 0 R (Item.98) 1705 0 R] +/Limits [(Item.93) (Item.98)] >> endstream endobj -2374 0 obj +2375 0 obj << /Type /ObjStm /N 100 -/First 1040 -/Length 19083 ->> -stream -2373 0 2375 226 2376 431 2377 617 2378 800 2379 1002 2380 1227 2381 1447 2382 1678 2383 1914 -2384 2148 2385 2376 2386 2564 2387 2744 2388 2923 2389 3103 2390 3281 2391 3459 2392 3639 2393 3818 -2394 3998 2395 4177 2396 4357 2397 4536 2398 4716 2399 4895 2400 5075 2401 5253 2402 5423 2403 5595 -2404 5764 2405 5933 2406 6105 2407 6275 2408 6447 2409 6617 2410 6789 2411 6959 2412 7131 2413 7301 -2414 7473 2415 7643 2416 7812 2417 7992 2418 8190 2419 8386 2420 8580 2421 8768 2422 8948 2423 9148 -2424 9378 2425 9608 2426 9827 2427 10051 2428 10281 2429 10503 2430 10725 2431 10953 2432 11181 2433 11411 -2434 11636 2435 11861 2436 12091 2437 12313 2438 12535 2439 12757 2440 13018 2441 13278 2442 13538 2443 13808 -2444 14074 2445 14336 2446 14575 2447 14755 2448 14934 2449 15109 2450 15276 2451 15390 2452 15502 2453 15613 -2454 15724 2455 15840 2456 15962 2457 16081 2458 16194 2459 16307 2460 16418 2461 16529 2462 16644 2463 16767 -2464 16893 2465 17019 2466 17150 2467 17274 2468 17357 2469 17476 2470 17598 2471 17711 2472 17795 2473 17830 -% 2373 0 obj -<< -/Names [(cite.OurTechRep) 2128 0 R (cite.PARA04FOREST) 2271 0 R (cite.PSBLAS) 2272 0 R (cite.RouXiaXu:11) 911 0 R (cite.Sparse03) 909 0 R (cite.machiels) 912 0 R] -/Limits [(cite.OurTechRep) (cite.machiels)] +/First 1039 +/Length 19379 >> -% 2375 0 obj +stream +2374 0 2376 189 2377 394 2378 648 2379 867 2380 1069 2381 1263 2382 1443 2383 1631 2384 1857 +2385 2077 2386 2302 2387 2538 2388 2774 2389 3004 2390 3204 2391 3384 2392 3563 2393 3743 2394 3922 +2395 4102 2396 4281 2397 4461 2398 4639 2399 4817 2400 4997 2401 5176 2402 5356 2403 5535 2404 5715 +2405 5894 2406 6067 2407 6239 2408 6409 2409 6581 2410 6751 2411 6923 2412 7092 2413 7261 2414 7433 +2415 7603 2416 7775 2417 7945 2418 8117 2419 8288 2420 8460 2421 8630 2422 8826 2423 9020 2424 9218 +2425 9406 2426 9589 2427 9768 2428 9998 2429 10228 2430 10451 2431 10671 2432 10899 2433 11124 2434 11346 +2435 11572 2436 11802 2437 12031 2438 12258 2439 12480 2440 12710 2441 12935 2442 13157 2443 13379 2444 13625 +2445 13887 2446 14143 2447 14411 2448 14679 2449 14941 2450 15203 2451 15403 2452 15583 2453 15758 2454 15927 +2455 16023 2456 16137 2457 16249 2458 16360 2459 16471 2460 16591 2461 16714 2462 16832 2463 16945 2464 17057 +2465 17169 2466 17280 2467 17392 2468 17505 2469 17631 2470 17756 2471 17887 2472 18011 2473 18103 2474 18222 +% 2374 0 obj << -/Names [(cite.metcalf) 908 0 R (cite.sblas02) 914 0 R (cite.sblas97) 913 0 R (descdata) 1017 0 R (equation.4.1) 1296 0 R (equation.4.2) 1297 0 R] -/Limits [(cite.metcalf) (equation.4.2)] +/Names [(Item.99) 1711 0 R (algocf.1) 2159 0 R (algocf.2) 2206 0 R (algocfline.1) 2145 0 R (algocfline.2) 2213 0 R (cite.2007c) 958 0 R] +/Limits [(Item.99) (cite.2007c)] >> % 2376 0 obj << -/Names [(equation.4.3) 1298 0 R (figure.1) 927 0 R (figure.2) 953 0 R (figure.3) 1399 0 R (figure.4) 1432 0 R (figure.5) 2149 0 R] -/Limits [(equation.4.3) (figure.5)] +/Names [(cite.2007d) 959 0 R (cite.BERTACCINIFILIPPONE) 2015 0 R (cite.BLACS) 934 0 R (cite.BLAS1) 915 0 R (cite.BLAS2) 916 0 R (cite.BLAS3) 917 0 R] +/Limits [(cite.2007d) (cite.BLAS3)] >> % 2377 0 obj << -/Names [(figure.6) 2144 0 R (figure.7) 2189 0 R (figure.8) 2201 0 R (figure.9) 2228 0 R (listing.1) 1045 0 R (listing.2) 1075 0 R] -/Limits [(figure.6) (listing.2)] +/Names [(cite.CaFiRo:2014) 2131 0 R (cite.DesPat:11) 910 0 R (cite.DesignPatterns) 1075 0 R (cite.Filippone:2017:SMM:3034774.3017994) 2284 0 R (cite.KIVA3PSBLAS) 2277 0 R (cite.METIS) 946 0 R] +/Limits [(cite.CaFiRo:2014) (cite.METIS)] >> % 2378 0 obj << -/Names [(listing.3) 1118 0 R (listing.4) 1137 0 R (listing.5) 1902 0 R (listing.6) 1903 0 R (lstlisting.-1) 1258 0 R (lstlisting.-10) 1972 0 R] -/Limits [(listing.3) (lstlisting.-10)] +/Names [(cite.MPI1) 2283 0 R (cite.MRC:11) 2146 0 R (cite.OurTechRep) 2132 0 R (cite.PARA04FOREST) 2275 0 R (cite.PSBLAS) 2276 0 R (cite.RouXiaXu:11) 911 0 R] +/Limits [(cite.MPI1) (cite.RouXiaXu:11)] >> % 2379 0 obj << -/Names [(lstlisting.-11) 1979 0 R (lstlisting.-12) 2078 0 R (lstlisting.-13) 2102 0 R (lstlisting.-14) 2160 0 R (lstlisting.-2) 1912 0 R (lstlisting.-3) 1919 0 R] -/Limits [(lstlisting.-11) (lstlisting.-3)] +/Names [(cite.Sparse03) 909 0 R (cite.machiels) 912 0 R (cite.metcalf) 908 0 R (cite.sblas02) 914 0 R (cite.sblas97) 913 0 R (descdata) 1018 0 R] +/Limits [(cite.Sparse03) (descdata)] >> % 2380 0 obj << -/Names [(lstlisting.-4) 1925 0 R (lstlisting.-5) 1931 0 R (lstlisting.-6) 1943 0 R (lstlisting.-7) 1950 0 R (lstlisting.-8) 1958 0 R (lstlisting.-9) 1965 0 R] -/Limits [(lstlisting.-4) (lstlisting.-9)] +/Names [(equation.4.1) 1297 0 R (equation.4.2) 1298 0 R (equation.4.3) 1299 0 R (figure.1) 927 0 R (figure.2) 954 0 R (figure.3) 1400 0 R] +/Limits [(equation.4.1) (figure.3)] >> % 2381 0 obj << -/Names [(lstnumber.-1.1) 1259 0 R (lstnumber.-1.2) 1260 0 R (lstnumber.-1.3) 1261 0 R (lstnumber.-1.4) 1262 0 R (lstnumber.-10.1) 1973 0 R (lstnumber.-11.1) 1980 0 R] -/Limits [(lstnumber.-1.1) (lstnumber.-11.1)] +/Names [(figure.4) 1433 0 R (figure.5) 2153 0 R (figure.6) 2148 0 R (figure.7) 2193 0 R (figure.8) 2205 0 R (figure.9) 2232 0 R] +/Limits [(figure.4) (figure.9)] >> % 2382 0 obj << -/Names [(lstnumber.-12.1) 2079 0 R (lstnumber.-12.2) 2080 0 R (lstnumber.-13.1) 2103 0 R (lstnumber.-13.2) 2104 0 R (lstnumber.-14.1) 2161 0 R (lstnumber.-14.2) 2162 0 R] -/Limits [(lstnumber.-12.1) (lstnumber.-14.2)] +/Names [(listing.1) 1046 0 R (listing.2) 1076 0 R (listing.3) 1119 0 R (listing.4) 1138 0 R (listing.5) 1905 0 R (listing.6) 1906 0 R] +/Limits [(listing.1) (listing.6)] >> % 2383 0 obj << -/Names [(lstnumber.-14.3) 2163 0 R (lstnumber.-14.4) 2164 0 R (lstnumber.-14.5) 2165 0 R (lstnumber.-14.6) 2166 0 R (lstnumber.-14.7) 2167 0 R (lstnumber.-2.1) 1913 0 R] -/Limits [(lstnumber.-14.3) (lstnumber.-2.1)] +/Names [(lstlisting.-1) 1259 0 R (lstlisting.-10) 1975 0 R (lstlisting.-11) 1982 0 R (lstlisting.-12) 2081 0 R (lstlisting.-13) 2106 0 R (lstlisting.-14) 2164 0 R] +/Limits [(lstlisting.-1) (lstlisting.-14)] >> % 2384 0 obj << -/Names [(lstnumber.-3.1) 1920 0 R (lstnumber.-4.1) 1926 0 R (lstnumber.-5.1) 1932 0 R (lstnumber.-6.1) 1944 0 R (lstnumber.-7.1) 1951 0 R (lstnumber.-8.1) 1959 0 R] -/Limits [(lstnumber.-3.1) (lstnumber.-8.1)] +/Names [(lstlisting.-2) 1915 0 R (lstlisting.-3) 1922 0 R (lstlisting.-4) 1928 0 R (lstlisting.-5) 1934 0 R (lstlisting.-6) 1946 0 R (lstlisting.-7) 1953 0 R] +/Limits [(lstlisting.-2) (lstlisting.-7)] >> % 2385 0 obj << -/Names [(lstnumber.-9.1) 1966 0 R (page.1) 683 0 R (page.10) 1016 0 R (page.100) 1679 0 R (page.101) 1684 0 R (page.102) 1690 0 R] -/Limits [(lstnumber.-9.1) (page.102)] +/Names [(lstlisting.-8) 1961 0 R (lstlisting.-9) 1968 0 R (lstnumber.-1.1) 1260 0 R (lstnumber.-1.2) 1261 0 R (lstnumber.-1.3) 1262 0 R (lstnumber.-1.4) 1263 0 R] +/Limits [(lstlisting.-8) (lstnumber.-1.4)] >> % 2386 0 obj << -/Names [(page.103) 1696 0 R (page.104) 1703 0 R (page.105) 1709 0 R (page.106) 1716 0 R (page.107) 1724 0 R (page.108) 1728 0 R] -/Limits [(page.103) (page.108)] +/Names [(lstnumber.-10.1) 1976 0 R (lstnumber.-11.1) 1983 0 R (lstnumber.-12.1) 2082 0 R (lstnumber.-12.2) 2083 0 R (lstnumber.-13.1) 2107 0 R (lstnumber.-13.2) 2108 0 R] +/Limits [(lstnumber.-10.1) (lstnumber.-13.2)] >> % 2387 0 obj << -/Names [(page.109) 1738 0 R (page.11) 1024 0 R (page.110) 1743 0 R (page.111) 1747 0 R (page.112) 1760 0 R (page.113) 1764 0 R] -/Limits [(page.109) (page.113)] +/Names [(lstnumber.-14.1) 2165 0 R (lstnumber.-14.2) 2166 0 R (lstnumber.-14.3) 2167 0 R (lstnumber.-14.4) 2168 0 R (lstnumber.-14.5) 2169 0 R (lstnumber.-14.6) 2170 0 R] +/Limits [(lstnumber.-14.1) (lstnumber.-14.6)] >> % 2388 0 obj << -/Names [(page.114) 1770 0 R (page.115) 1776 0 R (page.116) 1784 0 R (page.117) 1788 0 R (page.118) 1792 0 R (page.119) 1796 0 R] -/Limits [(page.114) (page.119)] +/Names [(lstnumber.-14.7) 2171 0 R (lstnumber.-2.1) 1916 0 R (lstnumber.-3.1) 1923 0 R (lstnumber.-4.1) 1929 0 R (lstnumber.-5.1) 1935 0 R (lstnumber.-6.1) 1947 0 R] +/Limits [(lstnumber.-14.7) (lstnumber.-6.1)] >> % 2389 0 obj << -/Names [(page.12) 1035 0 R (page.120) 1800 0 R (page.121) 1804 0 R (page.122) 1809 0 R (page.123) 1817 0 R (page.124) 1821 0 R] -/Limits [(page.12) (page.124)] +/Names [(lstnumber.-7.1) 1954 0 R (lstnumber.-8.1) 1962 0 R (lstnumber.-9.1) 1969 0 R (page.1) 683 0 R (page.10) 1017 0 R (page.100) 1680 0 R] +/Limits [(lstnumber.-7.1) (page.100)] >> % 2390 0 obj << -/Names [(page.125) 1828 0 R (page.126) 1833 0 R (page.127) 1840 0 R (page.128) 1845 0 R (page.129) 1852 0 R (page.13) 1051 0 R] -/Limits [(page.125) (page.13)] +/Names [(page.101) 1685 0 R (page.102) 1691 0 R (page.103) 1697 0 R (page.104) 1704 0 R (page.105) 1710 0 R (page.106) 1717 0 R] +/Limits [(page.101) (page.106)] >> % 2391 0 obj << -/Names [(page.130) 1856 0 R (page.131) 1863 0 R (page.132) 1867 0 R (page.133) 1874 0 R (page.134) 1879 0 R (page.135) 1889 0 R] -/Limits [(page.130) (page.135)] +/Names [(page.107) 1725 0 R (page.108) 1729 0 R (page.109) 1739 0 R (page.11) 1025 0 R (page.110) 1744 0 R (page.111) 1748 0 R] +/Limits [(page.107) (page.111)] >> % 2392 0 obj << -/Names [(page.136) 1894 0 R (page.137) 1901 0 R (page.138) 1907 0 R (page.139) 1911 0 R (page.14) 1056 0 R (page.140) 1918 0 R] -/Limits [(page.136) (page.140)] +/Names [(page.112) 1763 0 R (page.113) 1767 0 R (page.114) 1773 0 R (page.115) 1779 0 R (page.116) 1787 0 R (page.117) 1791 0 R] +/Limits [(page.112) (page.117)] >> % 2393 0 obj << -/Names [(page.141) 1924 0 R (page.142) 1930 0 R (page.143) 1936 0 R (page.144) 1942 0 R (page.145) 1949 0 R (page.146) 1957 0 R] -/Limits [(page.141) (page.146)] +/Names [(page.118) 1795 0 R (page.119) 1799 0 R (page.12) 1036 0 R (page.120) 1803 0 R (page.121) 1807 0 R (page.122) 1812 0 R] +/Limits [(page.118) (page.122)] >> % 2394 0 obj << -/Names [(page.147) 1964 0 R (page.148) 1971 0 R (page.149) 1978 0 R (page.15) 1060 0 R (page.150) 1984 0 R (page.151) 1988 0 R] -/Limits [(page.147) (page.151)] +/Names [(page.123) 1820 0 R (page.124) 1824 0 R (page.125) 1832 0 R (page.126) 1836 0 R (page.127) 1843 0 R (page.128) 1848 0 R] +/Limits [(page.123) (page.128)] >> % 2395 0 obj << -/Names [(page.152) 1996 0 R (page.153) 2007 0 R (page.154) 2011 0 R (page.155) 2020 0 R (page.156) 2024 0 R (page.157) 2033 0 R] -/Limits [(page.152) (page.157)] +/Names [(page.129) 1855 0 R (page.13) 1052 0 R (page.130) 1859 0 R (page.131) 1866 0 R (page.132) 1870 0 R (page.133) 1877 0 R] +/Limits [(page.129) (page.133)] >> % 2396 0 obj << -/Names [(page.158) 2039 0 R (page.159) 2043 0 R (page.16) 1065 0 R (page.160) 2049 0 R (page.161) 2058 0 R (page.162) 2065 0 R] -/Limits [(page.158) (page.162)] +/Names [(page.134) 1882 0 R (page.135) 1892 0 R (page.136) 1897 0 R (page.137) 1904 0 R (page.138) 1910 0 R (page.139) 1914 0 R] +/Limits [(page.134) (page.139)] >> % 2397 0 obj << -/Names [(page.163) 2069 0 R (page.164) 2077 0 R (page.165) 2088 0 R (page.166) 2093 0 R (page.167) 2101 0 R (page.168) 2110 0 R] -/Limits [(page.163) (page.168)] +/Names [(page.14) 1057 0 R (page.140) 1921 0 R (page.141) 1927 0 R (page.142) 1933 0 R (page.143) 1939 0 R (page.144) 1945 0 R] +/Limits [(page.14) (page.144)] >> % 2398 0 obj << -/Names [(page.169) 2114 0 R (page.17) 1072 0 R (page.170) 2125 0 R (page.171) 2139 0 R (page.172) 2148 0 R (page.173) 2159 0 R] -/Limits [(page.169) (page.173)] +/Names [(page.145) 1952 0 R (page.146) 1960 0 R (page.147) 1967 0 R (page.148) 1974 0 R (page.149) 1981 0 R (page.15) 1061 0 R] +/Limits [(page.145) (page.15)] >> % 2399 0 obj << -/Names [(page.174) 2188 0 R (page.175) 2208 0 R (page.176) 2227 0 R (page.177) 2243 0 R (page.178) 2247 0 R (page.179) 2251 0 R] -/Limits [(page.174) (page.179)] +/Names [(page.150) 1987 0 R (page.151) 1991 0 R (page.152) 1999 0 R (page.153) 2010 0 R (page.154) 2014 0 R (page.155) 2023 0 R] +/Limits [(page.150) (page.155)] >> % 2400 0 obj << -/Names [(page.18) 1080 0 R (page.180) 2256 0 R (page.181) 2260 0 R (page.182) 2265 0 R (page.183) 2269 0 R (page.184) 2278 0 R] -/Limits [(page.18) (page.184)] +/Names [(page.156) 2027 0 R (page.157) 2036 0 R (page.158) 2042 0 R (page.159) 2046 0 R (page.16) 1066 0 R (page.160) 2053 0 R] +/Limits [(page.156) (page.160)] >> % 2401 0 obj << -/Names [(page.19) 1085 0 R (page.2) 693 0 R (page.20) 1091 0 R (page.21) 1095 0 R (page.22) 1099 0 R (page.23) 1105 0 R] -/Limits [(page.19) (page.23)] +/Names [(page.161) 2061 0 R (page.162) 2068 0 R (page.163) 2072 0 R (page.164) 2080 0 R (page.165) 2091 0 R (page.166) 2096 0 R] +/Limits [(page.161) (page.166)] >> % 2402 0 obj << -/Names [(page.24) 1109 0 R (page.25) 1115 0 R (page.26) 1122 0 R (page.27) 1128 0 R (page.28) 1135 0 R (page.29) 1141 0 R] -/Limits [(page.24) (page.29)] +/Names [(page.167) 2105 0 R (page.168) 2114 0 R (page.169) 2118 0 R (page.17) 1073 0 R (page.170) 2129 0 R (page.171) 2143 0 R] +/Limits [(page.167) (page.171)] >> % 2403 0 obj << -/Names [(page.3) 926 0 R (page.30) 1145 0 R (page.31) 1156 0 R (page.32) 1164 0 R (page.33) 1174 0 R (page.34) 1180 0 R] -/Limits [(page.3) (page.34)] +/Names [(page.172) 2152 0 R (page.173) 2163 0 R (page.174) 2192 0 R (page.175) 2212 0 R (page.176) 2231 0 R (page.177) 2247 0 R] +/Limits [(page.172) (page.177)] >> % 2404 0 obj << -/Names [(page.35) 1191 0 R (page.36) 1196 0 R (page.37) 1203 0 R (page.38) 1209 0 R (page.39) 1217 0 R (page.4) 939 0 R] -/Limits [(page.35) (page.4)] +/Names [(page.178) 2251 0 R (page.179) 2255 0 R (page.18) 1081 0 R (page.180) 2260 0 R (page.181) 2264 0 R (page.182) 2269 0 R] +/Limits [(page.178) (page.182)] >> % 2405 0 obj << -/Names [(page.40) 1225 0 R (page.41) 1230 0 R (page.42) 1238 0 R (page.43) 1243 0 R (page.44) 1251 0 R (page.45) 1256 0 R] -/Limits [(page.40) (page.45)] +/Names [(page.183) 2273 0 R (page.184) 2282 0 R (page.19) 1086 0 R (page.2) 693 0 R (page.20) 1092 0 R (page.21) 1096 0 R] +/Limits [(page.183) (page.21)] >> % 2406 0 obj << -/Names [(page.46) 1269 0 R (page.47) 1276 0 R (page.48) 1284 0 R (page.49) 1295 0 R (page.5) 952 0 R (page.50) 1311 0 R] -/Limits [(page.46) (page.50)] +/Names [(page.22) 1100 0 R (page.23) 1106 0 R (page.24) 1110 0 R (page.25) 1116 0 R (page.26) 1123 0 R (page.27) 1129 0 R] +/Limits [(page.22) (page.27)] >> % 2407 0 obj << -/Names [(page.51) 1317 0 R (page.52) 1328 0 R (page.53) 1334 0 R (page.54) 1345 0 R (page.55) 1350 0 R (page.56) 1362 0 R] -/Limits [(page.51) (page.56)] +/Names [(page.28) 1136 0 R (page.29) 1142 0 R (page.3) 926 0 R (page.30) 1146 0 R (page.31) 1157 0 R (page.32) 1165 0 R] +/Limits [(page.28) (page.32)] >> % 2408 0 obj << -/Names [(page.57) 1367 0 R (page.58) 1376 0 R (page.59) 1382 0 R (page.6) 964 0 R (page.60) 1391 0 R (page.61) 1398 0 R] -/Limits [(page.57) (page.61)] +/Names [(page.33) 1175 0 R (page.34) 1181 0 R (page.35) 1192 0 R (page.36) 1197 0 R (page.37) 1204 0 R (page.38) 1210 0 R] +/Limits [(page.33) (page.38)] >> % 2409 0 obj << -/Names [(page.62) 1412 0 R (page.63) 1419 0 R (page.64) 1428 0 R (page.65) 1436 0 R (page.66) 1440 0 R (page.67) 1455 0 R] -/Limits [(page.62) (page.67)] +/Names [(page.39) 1218 0 R (page.4) 940 0 R (page.40) 1226 0 R (page.41) 1231 0 R (page.42) 1239 0 R (page.43) 1244 0 R] +/Limits [(page.39) (page.43)] >> % 2410 0 obj << -/Names [(page.68) 1461 0 R (page.69) 1467 0 R (page.7) 969 0 R (page.70) 1474 0 R (page.71) 1478 0 R (page.72) 1483 0 R] -/Limits [(page.68) (page.72)] +/Names [(page.44) 1252 0 R (page.45) 1257 0 R (page.46) 1270 0 R (page.47) 1277 0 R (page.48) 1285 0 R (page.49) 1296 0 R] +/Limits [(page.44) (page.49)] >> % 2411 0 obj << -/Names [(page.73) 1489 0 R (page.74) 1496 0 R (page.75) 1507 0 R (page.76) 1512 0 R (page.77) 1521 0 R (page.78) 1528 0 R] -/Limits [(page.73) (page.78)] +/Names [(page.5) 953 0 R (page.50) 1312 0 R (page.51) 1318 0 R (page.52) 1329 0 R (page.53) 1335 0 R (page.54) 1346 0 R] +/Limits [(page.5) (page.54)] >> % 2412 0 obj << -/Names [(page.79) 1533 0 R (page.8) 984 0 R (page.80) 1540 0 R (page.81) 1544 0 R (page.82) 1552 0 R (page.83) 1557 0 R] -/Limits [(page.79) (page.83)] +/Names [(page.55) 1351 0 R (page.56) 1363 0 R (page.57) 1368 0 R (page.58) 1377 0 R (page.59) 1383 0 R (page.6) 965 0 R] +/Limits [(page.55) (page.6)] >> % 2413 0 obj << -/Names [(page.84) 1565 0 R (page.85) 1571 0 R (page.86) 1581 0 R (page.87) 1594 0 R (page.88) 1598 0 R (page.89) 1611 0 R] -/Limits [(page.84) (page.89)] +/Names [(page.60) 1392 0 R (page.61) 1399 0 R (page.62) 1413 0 R (page.63) 1420 0 R (page.64) 1429 0 R (page.65) 1437 0 R] +/Limits [(page.60) (page.65)] >> % 2414 0 obj << -/Names [(page.9) 1005 0 R (page.90) 1618 0 R (page.91) 1625 0 R (page.92) 1630 0 R (page.93) 1637 0 R (page.94) 1641 0 R] -/Limits [(page.9) (page.94)] +/Names [(page.66) 1441 0 R (page.67) 1456 0 R (page.68) 1462 0 R (page.69) 1468 0 R (page.7) 970 0 R (page.70) 1475 0 R] +/Limits [(page.66) (page.70)] >> % 2415 0 obj << -/Names [(page.95) 1650 0 R (page.96) 1658 0 R (page.97) 1662 0 R (page.98) 1668 0 R (page.99) 1672 0 R (page.i) 739 0 R] -/Limits [(page.95) (page.i)] +/Names [(page.71) 1479 0 R (page.72) 1484 0 R (page.73) 1490 0 R (page.74) 1497 0 R (page.75) 1508 0 R (page.76) 1513 0 R] +/Limits [(page.71) (page.76)] >> % 2416 0 obj << -/Names [(page.ii) 795 0 R (page.iii) 843 0 R (page.iv) 886 0 R (precdata) 1136 0 R (section*.1) 740 0 R (section*.10) 634 0 R] -/Limits [(page.ii) (section*.10)] +/Names [(page.77) 1522 0 R (page.78) 1529 0 R (page.79) 1534 0 R (page.8) 985 0 R (page.80) 1541 0 R (page.81) 1545 0 R] +/Limits [(page.77) (page.81)] >> % 2417 0 obj << -/Names [(section*.11) 638 0 R (section*.12) 642 0 R (section*.13) 646 0 R (section*.14) 650 0 R (section*.15) 654 0 R (section*.16) 658 0 R] -/Limits [(section*.11) (section*.16)] +/Names [(page.82) 1553 0 R (page.83) 1558 0 R (page.84) 1566 0 R (page.85) 1572 0 R (page.86) 1582 0 R (page.87) 1595 0 R] +/Limits [(page.82) (page.87)] >> % 2418 0 obj << -/Names [(section*.17) 662 0 R (section*.18) 666 0 R (section*.19) 670 0 R (section*.2) 7 0 R (section*.20) 674 0 R (section*.21) 2270 0 R] -/Limits [(section*.17) (section*.21)] +/Names [(page.88) 1599 0 R (page.89) 1612 0 R (page.9) 1006 0 R (page.90) 1619 0 R (page.91) 1626 0 R (page.92) 1631 0 R] +/Limits [(page.88) (page.92)] >> % 2419 0 obj << -/Names [(section*.3) 2140 0 R (section*.4) 2168 0 R (section*.5) 2190 0 R (section*.6) 2210 0 R (section*.7) 622 0 R (section*.8) 626 0 R] -/Limits [(section*.3) (section*.8)] +/Names [(page.93) 1638 0 R (page.94) 1642 0 R (page.95) 1651 0 R (page.96) 1659 0 R (page.97) 1663 0 R (page.98) 1669 0 R] +/Limits [(page.93) (page.98)] >> % 2420 0 obj << -/Names [(section*.9) 630 0 R (section.1) 11 0 R (section.10) 545 0 R (section.11) 585 0 R (section.12) 597 0 R (section.13) 618 0 R] -/Limits [(section*.9) (section.13)] +/Names [(page.99) 1673 0 R (page.i) 739 0 R (page.ii) 795 0 R (page.iii) 843 0 R (page.iv) 886 0 R (precdata) 1137 0 R] +/Limits [(page.99) (precdata)] >> % 2421 0 obj << -/Names [(section.2) 15 0 R (section.3) 39 0 R (section.4) 224 0 R (section.5) 292 0 R (section.6) 312 0 R (section.7) 425 0 R] -/Limits [(section.2) (section.7)] +/Names [(section*.1) 740 0 R (section*.10) 634 0 R (section*.11) 638 0 R (section*.12) 642 0 R (section*.13) 646 0 R (section*.14) 650 0 R] +/Limits [(section*.1) (section*.14)] >> % 2422 0 obj << -/Names [(section.8) 497 0 R (section.9) 517 0 R (spbasedata) 1081 0 R (spdata) 1073 0 R (subsection.10.1) 549 0 R (subsection.10.2) 553 0 R] -/Limits [(section.8) (subsection.10.2)] +/Names [(section*.15) 654 0 R (section*.16) 658 0 R (section*.17) 662 0 R (section*.18) 666 0 R (section*.19) 670 0 R (section*.2) 7 0 R] +/Limits [(section*.15) (section*.2)] >> % 2423 0 obj << -/Names [(subsection.10.3) 557 0 R (subsection.10.4) 561 0 R (subsection.10.5) 565 0 R (subsection.10.6) 569 0 R (subsection.10.7) 573 0 R (subsection.10.8) 577 0 R] -/Limits [(subsection.10.3) (subsection.10.8)] +/Names [(section*.20) 674 0 R (section*.21) 2274 0 R (section*.3) 2144 0 R (section*.4) 2172 0 R (section*.5) 2194 0 R (section*.6) 2214 0 R] +/Limits [(section*.20) (section*.6)] >> % 2424 0 obj << -/Names [(subsection.10.9) 581 0 R (subsection.11.1) 589 0 R (subsection.11.2) 593 0 R (subsection.12.1) 601 0 R (subsection.12.2) 606 0 R (subsection.12.3) 610 0 R] -/Limits [(subsection.10.9) (subsection.12.3)] +/Names [(section*.7) 622 0 R (section*.8) 626 0 R (section*.9) 630 0 R (section.1) 11 0 R (section.10) 545 0 R (section.11) 585 0 R] +/Limits [(section*.7) (section.11)] >> % 2425 0 obj << -/Names [(subsection.12.4) 614 0 R (subsection.2.1) 19 0 R (subsection.2.2) 23 0 R (subsection.2.3) 27 0 R (subsection.2.4) 35 0 R (subsection.3.1) 43 0 R] -/Limits [(subsection.12.4) (subsection.3.1)] +/Names [(section.12) 597 0 R (section.13) 618 0 R (section.2) 15 0 R (section.3) 39 0 R (section.4) 224 0 R (section.5) 292 0 R] +/Limits [(section.12) (section.5)] >> % 2426 0 obj << -/Names [(subsection.3.2) 107 0 R (subsection.3.3) 187 0 R (subsection.3.4) 216 0 R (subsection.3.5) 220 0 R (subsection.4.1) 228 0 R (subsection.4.10) 264 0 R] -/Limits [(subsection.3.2) (subsection.4.10)] +/Names [(section.6) 312 0 R (section.7) 425 0 R (section.8) 497 0 R (section.9) 517 0 R (spbasedata) 1082 0 R (spdata) 1074 0 R] +/Limits [(section.6) (spdata)] >> % 2427 0 obj << -/Names [(subsection.4.11) 268 0 R (subsection.4.12) 272 0 R (subsection.4.13) 276 0 R (subsection.4.14) 280 0 R (subsection.4.15) 284 0 R (subsection.4.16) 288 0 R] -/Limits [(subsection.4.11) (subsection.4.16)] +/Names [(subsection.10.1) 549 0 R (subsection.10.2) 553 0 R (subsection.10.3) 557 0 R (subsection.10.4) 561 0 R (subsection.10.5) 565 0 R (subsection.10.6) 569 0 R] +/Limits [(subsection.10.1) (subsection.10.6)] >> % 2428 0 obj << -/Names [(subsection.4.2) 232 0 R (subsection.4.3) 236 0 R (subsection.4.4) 240 0 R (subsection.4.5) 244 0 R (subsection.4.6) 248 0 R (subsection.4.7) 252 0 R] -/Limits [(subsection.4.2) (subsection.4.7)] +/Names [(subsection.10.7) 573 0 R (subsection.10.8) 577 0 R (subsection.10.9) 581 0 R (subsection.11.1) 589 0 R (subsection.11.2) 593 0 R (subsection.12.1) 601 0 R] +/Limits [(subsection.10.7) (subsection.12.1)] >> % 2429 0 obj << -/Names [(subsection.4.8) 256 0 R (subsection.4.9) 260 0 R (subsection.5.1) 296 0 R (subsection.5.2) 300 0 R (subsection.5.3) 304 0 R (subsection.5.4) 308 0 R] -/Limits [(subsection.4.8) (subsection.5.4)] +/Names [(subsection.12.2) 606 0 R (subsection.12.3) 610 0 R (subsection.12.4) 614 0 R (subsection.2.1) 19 0 R (subsection.2.2) 23 0 R (subsection.2.3) 27 0 R] +/Limits [(subsection.12.2) (subsection.2.3)] >> % 2430 0 obj << -/Names [(subsection.6.1) 316 0 R (subsection.6.10) 352 0 R (subsection.6.11) 356 0 R (subsection.6.12) 360 0 R (subsection.6.13) 364 0 R (subsection.6.14) 368 0 R] -/Limits [(subsection.6.1) (subsection.6.14)] +/Names [(subsection.2.4) 35 0 R (subsection.3.1) 43 0 R (subsection.3.2) 107 0 R (subsection.3.3) 187 0 R (subsection.3.4) 216 0 R (subsection.3.5) 220 0 R] +/Limits [(subsection.2.4) (subsection.3.5)] >> % 2431 0 obj << -/Names [(subsection.6.15) 372 0 R (subsection.6.16) 376 0 R (subsection.6.17) 380 0 R (subsection.6.18) 384 0 R (subsection.6.19) 388 0 R (subsection.6.2) 320 0 R] -/Limits [(subsection.6.15) (subsection.6.2)] +/Names [(subsection.4.1) 228 0 R (subsection.4.10) 264 0 R (subsection.4.11) 268 0 R (subsection.4.12) 272 0 R (subsection.4.13) 276 0 R (subsection.4.14) 280 0 R] +/Limits [(subsection.4.1) (subsection.4.14)] >> % 2432 0 obj << -/Names [(subsection.6.20) 392 0 R (subsection.6.21) 396 0 R (subsection.6.22) 400 0 R (subsection.6.23) 405 0 R (subsection.6.24) 409 0 R (subsection.6.25) 413 0 R] -/Limits [(subsection.6.20) (subsection.6.25)] +/Names [(subsection.4.15) 284 0 R (subsection.4.16) 288 0 R (subsection.4.2) 232 0 R (subsection.4.3) 236 0 R (subsection.4.4) 240 0 R (subsection.4.5) 244 0 R] +/Limits [(subsection.4.15) (subsection.4.5)] >> % 2433 0 obj << -/Names [(subsection.6.26) 417 0 R (subsection.6.27) 421 0 R (subsection.6.3) 324 0 R (subsection.6.4) 328 0 R (subsection.6.5) 332 0 R (subsection.6.6) 336 0 R] -/Limits [(subsection.6.26) (subsection.6.6)] +/Names [(subsection.4.6) 248 0 R (subsection.4.7) 252 0 R (subsection.4.8) 256 0 R (subsection.4.9) 260 0 R (subsection.5.1) 296 0 R (subsection.5.2) 300 0 R] +/Limits [(subsection.4.6) (subsection.5.2)] >> % 2434 0 obj << -/Names [(subsection.6.7) 340 0 R (subsection.6.8) 344 0 R (subsection.6.9) 348 0 R (subsection.7.1) 429 0 R (subsection.7.10) 465 0 R (subsection.7.11) 469 0 R] -/Limits [(subsection.6.7) (subsection.7.11)] +/Names [(subsection.5.3) 304 0 R (subsection.5.4) 308 0 R (subsection.6.1) 316 0 R (subsection.6.10) 352 0 R (subsection.6.11) 356 0 R (subsection.6.12) 360 0 R] +/Limits [(subsection.5.3) (subsection.6.12)] >> % 2435 0 obj << -/Names [(subsection.7.12) 473 0 R (subsection.7.13) 477 0 R (subsection.7.14) 481 0 R (subsection.7.15) 485 0 R (subsection.7.16) 489 0 R (subsection.7.17) 493 0 R] -/Limits [(subsection.7.12) (subsection.7.17)] +/Names [(subsection.6.13) 364 0 R (subsection.6.14) 368 0 R (subsection.6.15) 372 0 R (subsection.6.16) 376 0 R (subsection.6.17) 380 0 R (subsection.6.18) 384 0 R] +/Limits [(subsection.6.13) (subsection.6.18)] >> % 2436 0 obj << -/Names [(subsection.7.2) 433 0 R (subsection.7.3) 437 0 R (subsection.7.4) 441 0 R (subsection.7.5) 445 0 R (subsection.7.6) 449 0 R (subsection.7.7) 453 0 R] -/Limits [(subsection.7.2) (subsection.7.7)] +/Names [(subsection.6.19) 388 0 R (subsection.6.2) 320 0 R (subsection.6.20) 392 0 R (subsection.6.21) 396 0 R (subsection.6.22) 400 0 R (subsection.6.23) 405 0 R] +/Limits [(subsection.6.19) (subsection.6.23)] >> % 2437 0 obj << -/Names [(subsection.7.8) 457 0 R (subsection.7.9) 461 0 R (subsection.8.1) 501 0 R (subsection.8.2) 505 0 R (subsection.8.3) 509 0 R (subsection.8.4) 513 0 R] -/Limits [(subsection.7.8) (subsection.8.4)] +/Names [(subsection.6.24) 409 0 R (subsection.6.25) 413 0 R (subsection.6.26) 417 0 R (subsection.6.27) 421 0 R (subsection.6.3) 324 0 R (subsection.6.4) 328 0 R] +/Limits [(subsection.6.24) (subsection.6.4)] >> % 2438 0 obj << -/Names [(subsection.9.1) 521 0 R (subsection.9.2) 525 0 R (subsection.9.3) 529 0 R (subsection.9.4) 533 0 R (subsection.9.5) 537 0 R (subsection.9.6) 541 0 R] -/Limits [(subsection.9.1) (subsection.9.6)] +/Names [(subsection.6.5) 332 0 R (subsection.6.6) 336 0 R (subsection.6.7) 340 0 R (subsection.6.8) 344 0 R (subsection.6.9) 348 0 R (subsection.7.1) 429 0 R] +/Limits [(subsection.6.5) (subsection.7.1)] >> % 2439 0 obj << -/Names [(subsubsection.2.3.1) 31 0 R (subsubsection.3.1.1) 47 0 R (subsubsection.3.1.10) 83 0 R (subsubsection.3.1.11) 87 0 R (subsubsection.3.1.12) 91 0 R (subsubsection.3.1.13) 95 0 R] -/Limits [(subsubsection.2.3.1) (subsubsection.3.1.13)] +/Names [(subsection.7.10) 465 0 R (subsection.7.11) 469 0 R (subsection.7.12) 473 0 R (subsection.7.13) 477 0 R (subsection.7.14) 481 0 R (subsection.7.15) 485 0 R] +/Limits [(subsection.7.10) (subsection.7.15)] >> % 2440 0 obj << -/Names [(subsubsection.3.1.14) 99 0 R (subsubsection.3.1.15) 103 0 R (subsubsection.3.1.2) 51 0 R (subsubsection.3.1.3) 55 0 R (subsubsection.3.1.4) 59 0 R (subsubsection.3.1.5) 63 0 R] -/Limits [(subsubsection.3.1.14) (subsubsection.3.1.5)] +/Names [(subsection.7.16) 489 0 R (subsection.7.17) 493 0 R (subsection.7.2) 433 0 R (subsection.7.3) 437 0 R (subsection.7.4) 441 0 R (subsection.7.5) 445 0 R] +/Limits [(subsection.7.16) (subsection.7.5)] >> % 2441 0 obj << -/Names [(subsubsection.3.1.6) 67 0 R (subsubsection.3.1.7) 71 0 R (subsubsection.3.1.8) 75 0 R (subsubsection.3.1.9) 79 0 R (subsubsection.3.2.1) 111 0 R (subsubsection.3.2.10) 147 0 R] -/Limits [(subsubsection.3.1.6) (subsubsection.3.2.10)] +/Names [(subsection.7.6) 449 0 R (subsection.7.7) 453 0 R (subsection.7.8) 457 0 R (subsection.7.9) 461 0 R (subsection.8.1) 501 0 R (subsection.8.2) 505 0 R] +/Limits [(subsection.7.6) (subsection.8.2)] >> % 2442 0 obj << -/Names [(subsubsection.3.2.11) 151 0 R (subsubsection.3.2.12) 155 0 R (subsubsection.3.2.13) 159 0 R (subsubsection.3.2.14) 163 0 R (subsubsection.3.2.15) 167 0 R (subsubsection.3.2.16) 171 0 R] -/Limits [(subsubsection.3.2.11) (subsubsection.3.2.16)] +/Names [(subsection.8.3) 509 0 R (subsection.8.4) 513 0 R (subsection.9.1) 521 0 R (subsection.9.2) 525 0 R (subsection.9.3) 529 0 R (subsection.9.4) 533 0 R] +/Limits [(subsection.8.3) (subsection.9.4)] >> % 2443 0 obj << -/Names [(subsubsection.3.2.17) 175 0 R (subsubsection.3.2.18) 179 0 R (subsubsection.3.2.19) 183 0 R (subsubsection.3.2.2) 115 0 R (subsubsection.3.2.3) 119 0 R (subsubsection.3.2.4) 123 0 R] -/Limits [(subsubsection.3.2.17) (subsubsection.3.2.4)] +/Names [(subsection.9.5) 537 0 R (subsection.9.6) 541 0 R (subsubsection.2.3.1) 31 0 R (subsubsection.3.1.1) 47 0 R (subsubsection.3.1.10) 83 0 R (subsubsection.3.1.11) 87 0 R] +/Limits [(subsection.9.5) (subsubsection.3.1.11)] >> % 2444 0 obj << -/Names [(subsubsection.3.2.5) 127 0 R (subsubsection.3.2.6) 131 0 R (subsubsection.3.2.7) 135 0 R (subsubsection.3.2.8) 139 0 R (subsubsection.3.2.9) 143 0 R (subsubsection.3.3.1) 191 0 R] -/Limits [(subsubsection.3.2.5) (subsubsection.3.3.1)] +/Names [(subsubsection.3.1.12) 91 0 R (subsubsection.3.1.13) 95 0 R (subsubsection.3.1.14) 99 0 R (subsubsection.3.1.15) 103 0 R (subsubsection.3.1.2) 51 0 R (subsubsection.3.1.3) 55 0 R] +/Limits [(subsubsection.3.1.12) (subsubsection.3.1.3)] >> % 2445 0 obj << -/Names [(subsubsection.3.3.2) 195 0 R (subsubsection.3.3.3) 199 0 R (subsubsection.3.3.4) 204 0 R (subsubsection.3.3.5) 208 0 R (subsubsection.3.3.6) 212 0 R (table.1) 1129 0 R] -/Limits [(subsubsection.3.3.2) (table.1)] +/Names [(subsubsection.3.1.4) 59 0 R (subsubsection.3.1.5) 63 0 R (subsubsection.3.1.6) 67 0 R (subsubsection.3.1.7) 71 0 R (subsubsection.3.1.8) 75 0 R (subsubsection.3.1.9) 79 0 R] +/Limits [(subsubsection.3.1.4) (subsubsection.3.1.9)] >> % 2446 0 obj << -/Names [(table.10) 1277 0 R (table.11) 1286 0 R (table.12) 1299 0 R (table.13) 1318 0 R (table.14) 1346 0 R (table.15) 1363 0 R] -/Limits [(table.10) (table.15)] +/Names [(subsubsection.3.2.1) 111 0 R (subsubsection.3.2.10) 147 0 R (subsubsection.3.2.11) 151 0 R (subsubsection.3.2.12) 155 0 R (subsubsection.3.2.13) 159 0 R (subsubsection.3.2.14) 163 0 R] +/Limits [(subsubsection.3.2.1) (subsubsection.3.2.14)] >> % 2447 0 obj << -/Names [(table.16) 1377 0 R (table.17) 1392 0 R (table.18) 1420 0 R (table.19) 1456 0 R (table.2) 1175 0 R (table.20) 1468 0 R] -/Limits [(table.16) (table.20)] +/Names [(subsubsection.3.2.15) 167 0 R (subsubsection.3.2.16) 171 0 R (subsubsection.3.2.17) 175 0 R (subsubsection.3.2.18) 179 0 R (subsubsection.3.2.19) 183 0 R (subsubsection.3.2.2) 115 0 R] +/Limits [(subsubsection.3.2.15) (subsubsection.3.2.2)] >> % 2448 0 obj << -/Names [(table.21) 1998 0 R (table.22) 2143 0 R (table.3) 1192 0 R (table.4) 1204 0 R (table.5) 1218 0 R (table.6) 1226 0 R] -/Limits [(table.21) (table.6)] +/Names [(subsubsection.3.2.3) 119 0 R (subsubsection.3.2.4) 123 0 R (subsubsection.3.2.5) 127 0 R (subsubsection.3.2.6) 131 0 R (subsubsection.3.2.7) 135 0 R (subsubsection.3.2.8) 139 0 R] +/Limits [(subsubsection.3.2.3) (subsubsection.3.2.8)] >> % 2449 0 obj << -/Names [(table.7) 1239 0 R (table.8) 1252 0 R (table.9) 1270 0 R (title.0) 3 0 R (vbasedata) 1061 0 R (vdata) 1116 0 R] -/Limits [(table.7) (vdata)] +/Names [(subsubsection.3.2.9) 143 0 R (subsubsection.3.3.1) 191 0 R (subsubsection.3.3.2) 195 0 R (subsubsection.3.3.3) 199 0 R (subsubsection.3.3.4) 204 0 R (subsubsection.3.3.5) 208 0 R] +/Limits [(subsubsection.3.2.9) (subsubsection.3.3.5)] >> % 2450 0 obj << -/Kids [2344 0 R 2345 0 R 2346 0 R 2347 0 R 2348 0 R 2349 0 R] -/Limits [(Doc-Start) (Item.125)] +/Names [(subsubsection.3.3.6) 212 0 R (table.1) 1130 0 R (table.10) 1278 0 R (table.11) 1287 0 R (table.12) 1300 0 R (table.13) 1319 0 R] +/Limits [(subsubsection.3.3.6) (table.13)] >> % 2451 0 obj << -/Kids [2350 0 R 2351 0 R 2352 0 R 2353 0 R 2354 0 R 2355 0 R] -/Limits [(Item.126) (Item.23)] +/Names [(table.14) 1347 0 R (table.15) 1364 0 R (table.16) 1378 0 R (table.17) 1393 0 R (table.18) 1421 0 R (table.19) 1457 0 R] +/Limits [(table.14) (table.19)] >> % 2452 0 obj << -/Kids [2356 0 R 2357 0 R 2358 0 R 2359 0 R 2360 0 R 2361 0 R] -/Limits [(Item.24) (Item.56)] +/Names [(table.2) 1176 0 R (table.20) 1469 0 R (table.21) 2001 0 R (table.22) 2147 0 R (table.3) 1193 0 R (table.4) 1205 0 R] +/Limits [(table.2) (table.4)] >> % 2453 0 obj << -/Kids [2362 0 R 2363 0 R 2364 0 R 2365 0 R 2366 0 R 2367 0 R] -/Limits [(Item.57) (Item.89)] +/Names [(table.5) 1219 0 R (table.6) 1227 0 R (table.7) 1240 0 R (table.8) 1253 0 R (table.9) 1271 0 R (title.0) 3 0 R] +/Limits [(table.5) (title.0)] >> % 2454 0 obj << -/Kids [2368 0 R 2369 0 R 2370 0 R 2371 0 R 2372 0 R 2373 0 R] -/Limits [(Item.9) (cite.machiels)] +/Names [(vbasedata) 1062 0 R (vdata) 1117 0 R] +/Limits [(vbasedata) (vdata)] >> % 2455 0 obj << -/Kids [2375 0 R 2376 0 R 2377 0 R 2378 0 R 2379 0 R 2380 0 R] -/Limits [(cite.metcalf) (lstlisting.-9)] +/Kids [2348 0 R 2349 0 R 2350 0 R 2351 0 R 2352 0 R 2353 0 R] +/Limits [(Doc-Start) (Item.125)] >> % 2456 0 obj << -/Kids [2381 0 R 2382 0 R 2383 0 R 2384 0 R 2385 0 R 2386 0 R] -/Limits [(lstnumber.-1.1) (page.108)] +/Kids [2354 0 R 2355 0 R 2356 0 R 2357 0 R 2358 0 R 2359 0 R] +/Limits [(Item.126) (Item.21)] >> % 2457 0 obj << -/Kids [2387 0 R 2388 0 R 2389 0 R 2390 0 R 2391 0 R 2392 0 R] -/Limits [(page.109) (page.140)] +/Kids [2360 0 R 2361 0 R 2362 0 R 2363 0 R 2364 0 R 2365 0 R] +/Limits [(Item.22) (Item.54)] >> % 2458 0 obj << -/Kids [2393 0 R 2394 0 R 2395 0 R 2396 0 R 2397 0 R 2398 0 R] -/Limits [(page.141) (page.173)] +/Kids [2366 0 R 2367 0 R 2368 0 R 2369 0 R 2370 0 R 2371 0 R] +/Limits [(Item.55) (Item.87)] >> % 2459 0 obj << -/Kids [2399 0 R 2400 0 R 2401 0 R 2402 0 R 2403 0 R 2404 0 R] -/Limits [(page.174) (page.4)] +/Kids [2372 0 R 2373 0 R 2374 0 R 2376 0 R 2377 0 R 2378 0 R] +/Limits [(Item.88) (cite.RouXiaXu:11)] >> % 2460 0 obj << -/Kids [2405 0 R 2406 0 R 2407 0 R 2408 0 R 2409 0 R 2410 0 R] -/Limits [(page.40) (page.72)] +/Kids [2379 0 R 2380 0 R 2381 0 R 2382 0 R 2383 0 R 2384 0 R] +/Limits [(cite.Sparse03) (lstlisting.-7)] >> % 2461 0 obj << -/Kids [2411 0 R 2412 0 R 2413 0 R 2414 0 R 2415 0 R 2416 0 R] -/Limits [(page.73) (section*.10)] +/Kids [2385 0 R 2386 0 R 2387 0 R 2388 0 R 2389 0 R 2390 0 R] +/Limits [(lstlisting.-8) (page.106)] >> % 2462 0 obj << -/Kids [2417 0 R 2418 0 R 2419 0 R 2420 0 R 2421 0 R 2422 0 R] -/Limits [(section*.11) (subsection.10.2)] +/Kids [2391 0 R 2392 0 R 2393 0 R 2394 0 R 2395 0 R 2396 0 R] +/Limits [(page.107) (page.139)] >> % 2463 0 obj << -/Kids [2423 0 R 2424 0 R 2425 0 R 2426 0 R 2427 0 R 2428 0 R] -/Limits [(subsection.10.3) (subsection.4.7)] +/Kids [2397 0 R 2398 0 R 2399 0 R 2400 0 R 2401 0 R 2402 0 R] +/Limits [(page.14) (page.171)] >> % 2464 0 obj << -/Kids [2429 0 R 2430 0 R 2431 0 R 2432 0 R 2433 0 R 2434 0 R] -/Limits [(subsection.4.8) (subsection.7.11)] +/Kids [2403 0 R 2404 0 R 2405 0 R 2406 0 R 2407 0 R 2408 0 R] +/Limits [(page.172) (page.38)] >> % 2465 0 obj << -/Kids [2435 0 R 2436 0 R 2437 0 R 2438 0 R 2439 0 R 2440 0 R] -/Limits [(subsection.7.12) (subsubsection.3.1.5)] +/Kids [2409 0 R 2410 0 R 2411 0 R 2412 0 R 2413 0 R 2414 0 R] +/Limits [(page.39) (page.70)] >> % 2466 0 obj << -/Kids [2441 0 R 2442 0 R 2443 0 R 2444 0 R 2445 0 R 2446 0 R] -/Limits [(subsubsection.3.1.6) (table.15)] +/Kids [2415 0 R 2416 0 R 2417 0 R 2418 0 R 2419 0 R 2420 0 R] +/Limits [(page.71) (precdata)] >> % 2467 0 obj << -/Kids [2447 0 R 2448 0 R 2449 0 R] -/Limits [(table.16) (vdata)] +/Kids [2421 0 R 2422 0 R 2423 0 R 2424 0 R 2425 0 R 2426 0 R] +/Limits [(section*.1) (spdata)] >> % 2468 0 obj << -/Kids [2450 0 R 2451 0 R 2452 0 R 2453 0 R 2454 0 R 2455 0 R] -/Limits [(Doc-Start) (lstlisting.-9)] +/Kids [2427 0 R 2428 0 R 2429 0 R 2430 0 R 2431 0 R 2432 0 R] +/Limits [(subsection.10.1) (subsection.4.5)] >> % 2469 0 obj << -/Kids [2456 0 R 2457 0 R 2458 0 R 2459 0 R 2460 0 R 2461 0 R] -/Limits [(lstnumber.-1.1) (section*.10)] +/Kids [2433 0 R 2434 0 R 2435 0 R 2436 0 R 2437 0 R 2438 0 R] +/Limits [(subsection.4.6) (subsection.7.1)] >> % 2470 0 obj << -/Kids [2462 0 R 2463 0 R 2464 0 R 2465 0 R 2466 0 R 2467 0 R] -/Limits [(section*.11) (vdata)] +/Kids [2439 0 R 2440 0 R 2441 0 R 2442 0 R 2443 0 R 2444 0 R] +/Limits [(subsection.7.10) (subsubsection.3.1.3)] >> % 2471 0 obj << -/Kids [2468 0 R 2469 0 R 2470 0 R] -/Limits [(Doc-Start) (vdata)] +/Kids [2445 0 R 2446 0 R 2447 0 R 2448 0 R 2449 0 R 2450 0 R] +/Limits [(subsubsection.3.1.4) (table.13)] >> % 2472 0 obj << -/Dests 2471 0 R +/Kids [2451 0 R 2452 0 R 2453 0 R 2454 0 R] +/Limits [(table.14) (vdata)] >> % 2473 0 obj << -/Type /Catalog -/Pages 2340 0 R -/Outlines 2342 0 R -/Names 2472 0 R - /URI (http://ce.uniroma2.it/psblas) /PageMode/UseOutlines/PageLabels<>2<>6<>]>> -/OpenAction 677 0 R +/Kids [2455 0 R 2456 0 R 2457 0 R 2458 0 R 2459 0 R 2460 0 R] +/Limits [(Doc-Start) (lstlisting.-7)] +>> +% 2474 0 obj +<< +/Kids [2461 0 R 2462 0 R 2463 0 R 2464 0 R 2465 0 R 2466 0 R] +/Limits [(lstlisting.-8) (precdata)] >> endstream endobj -2474 0 obj +2480 0 obj << /Title (Parallel Sparse BLAS V. 3.9.0) /Subject (Parallel Sparse Basic Linear Algebra Subroutines) /Keywords (Computer Science Linear Algebra Fluid Dynamics Parallel Linux MPI PSBLAS Iterative Solvers Preconditioners) /Creator (pdfLaTeX) /Producer ($Id$) /Author()/Title()/Subject()/Creator(LaTeX with hyperref)/Keywords() -/CreationDate (D:20250605185524+02'00') -/ModDate (D:20250605185524+02'00') +/CreationDate (D:20251223150647+01'00') +/ModDate (D:20251223150647+01'00') /Trapped /False /PTEX.Fullbanner (This is pdfTeX, Version 3.141592653-2.6-1.40.25 (TeX Live 2023) kpathsea version 6.3.5) >> endobj -2475 0 obj +2476 0 obj +<< +/Type /ObjStm +/N 4 +/First 34 +/Length 478 +>> +stream +2475 0 2477 112 2478 196 2479 231 +% 2475 0 obj +<< +/Kids [2467 0 R 2468 0 R 2469 0 R 2470 0 R 2471 0 R 2472 0 R] +/Limits [(section*.1) (vdata)] +>> +% 2477 0 obj +<< +/Kids [2473 0 R 2474 0 R 2475 0 R] +/Limits [(Doc-Start) (vdata)] +>> +% 2478 0 obj +<< +/Dests 2477 0 R +>> +% 2479 0 obj +<< +/Type /Catalog +/Pages 2344 0 R +/Outlines 2346 0 R +/Names 2478 0 R + /URI (http://ce.uniroma2.it/psblas) /PageMode/UseOutlines/PageLabels<>2<>6<>]>> +/OpenAction 677 0 R +>> + +endstream +endobj +2481 0 obj << /Type /XRef -/Index [0 2476] -/Size 2476 +/Index [0 2482] +/Size 2482 /W [1 3 1] -/Root 2473 0 R -/Info 2474 0 R -/ID [ ] -/Length 12380 ->> -stream -]) 'Fz& 'Ez3 'Dz> 'CzF 'B  -zR 'A  z[ '@  '? '>$ '=% '<E ';F ':G '9H '8L '7 M '6!"N '5#$R '4%&S '3'(U '2)*V '1+,Z '0-.[ '//0\ '.12c '-344 ',564 '+784 '*9:4  ');<4  '(=>4 ''?@4 '&AB4 '%CD4 '$EF4 '#GH4 '"IJ4 '!KL4 ' MN4% 'OP4& 'QR4' 'ST4+ 'UV41 'WX42 'YZ43 '[\44 ']^4: '_`4; 'ab4< 'c>\4B '4G '4H '4I '4P '  -4T '  4^ '  - '  ' % ' 1 ' -9 ' E 'P 'a ' '   '!" '#$( '%&C ''(P ')*_ %c+,g %b-.g %a/0g %`12g= %_34gF %^56gQ %]78gR %\9: %[;< %Z=> %Y?@ %XAB$ %WCD/ %VEF: %UGHU %TIJL %SKLL %RMNL %QOPL %PQRL$ %OSTL, %NUVL0 %MWXL5 %LYZL? %K[\LD %J]^LJ %I_`LP %HabLV %Gc|YL\ %FLc %E %D %C %B  -' %A  + %@ 1 %?7 %>> %=B %<F %;J %:N %9R %8\ %7 % %6!"%  %5#$% %4%&%  %3'(%* %2)*%6 %1+,%; %0-.%B %//0%K %.12%Q %-34%W %,56%] %+78%c %*9: %);<  %(=> %'?@ %&AB  %%CD' %$EF0 %#GH7 %"IJ@ %!KLM % MNY %OP^ %QRb %ST %UV  %WX %YZ %[\ %]^3 %_`J %abK %c]{R %]]S %]]~> %]]~B %]]~C %] ] -~E %] ] ~I %] ]~J % ]]~K % ]]~L % ]]~M % -]]~N % ]]~O %]]~P %]]~T %]]~U %]] ~V %]!]"~W %]#]$]%]&]*]'](<>=?Ғ]-]+0],]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]D]F]G]H]I]J]K]L]M]N]P]R]S]T]U]V]W]X]Y]Z][]`]^].]\]]]C]E]O]Q]a]b]c  -    !"#$%&'()*.,]_L+/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTVWY[`^-4]UXZ\bzzzzzzzzz z -z z z zzzzzzzzzzzzzzzzzzz z!z"z$_}!z#aczJz'z%T@z)z*z+z,z-z.z/z0z1z2z4z(  ~cz:z;z<BzBz@z5+z=z?z6z7z8z9GzCzDzIzAS&zE765zGzH zNzOzSzJwzPzQzKzLzM~b~azUzVzXzTYzWzY^zZz\z]z^z_z`zazbzcA4  -   8 &"'!Eo#&)*+2(g,-./0145@3:6789:;<=>9?BCIADBOJIKWPQT]XY_`a4^b4 -4^4 444444 -T54 4C44d444v44"444 4!4(4#4$4,4)4*4.4/464-t4045D494=47484?4@4C4>4A4_4E4M4K4D4F4J4O4Q4L$4N4U4R6)4S4W4X4Y4Z4[4\4b4`4V74];E4c4aU! F   ؼ!"#' >$&F+(x)*-./3,02567;4 8:?<>X=>ABCG@JDFJHhIGLMNRKkROQ[STUVWXYZ]^_c\`bNe   -: H !"$(#&,*%C1')-./0124+c5367958;<=>?@AE:BDHF^GIJKLMNTURIOQWS$VYZ[\]aX֠^`cgbgHggggg -g*gg R[ggg EggJg g gggg`%ggggggg!ggg g#g$g%g*g"g&g'g(g)g6g-g+0g,g7g.Lg5g/g0g1g2g3g4"hUg9g:g;g?g8og<g>KgBg@NgAgDgJgHgCgEgGgKgLgNgIgMgSgODgPgUgXgTgVgWgZg]gYg[4g\Lg^<-g_g`gagbgcfw @  -  ŞM!"% T#*&'(),-1+.072d3456=;8 9>?F<i@ABCDENOGLBLFLA_LCLELHLLLGmLILKLNLRLM+LOLQQLTLXLS3LULWLZL_LYOL[L]L^LaL`GLb!d -   -   R $ 5 !"#(% V&.) W*,-4/ q023;5 689:S?< =C@ AGD qEKH AIOL 8MSP |QTYT jUVWX3]Z [c^!_`ab%%!<%"%% %!Ts%%%%% % -!i % U%%!F%%%%%%!%%%!%%%%%!%!%%'%"!ڋ%#%$%%%&%+%(!%)V%3%,"%-%.%/2%0%1%2%8%4" %5%7%=%9"7%:%<%?%@%C%>"MP%A%F%G%H%D"hc%E%N%I";%J%L%MW%T%O"f%P%R%S%Z%U"%V%X%Y%`%["r%\%^%_%a"%b$ n"K " -  X#v###"]!"%*$#@&()-+#]2,1.#_/Y34592#e68E;<=>CA:#y?FB#D~`HIJKNG#LQO#ުPSTUVWZR#TXZ\_[#]c`$ da$8%t  - $Cz $[$hI[$"$j !%&')#$4(+-*$v,/0197.$2456:;=8$ <@>$?\BDEFGHLA$]ICNO%SP%%~ZVM%QTU\~`W%@[]^_XY%b~~a%dm~~~~ ~ -~ ~ ~ ~~bc%Y~~'p~%a~%W%a%;& j~~~~~%m~~~~~~~~&~&&&%~)~+&d~'~-~ &D~(~*~,]~!~"~#~$~%&o~&&p&q&&~5~8~.&~6~7~/~0&~1~2~3&q~4&m&͍&~;~9&~:~?~<&_~=~F~@']~A~D~Q~G'2n~H~X~R'G~S^~[~Y'R~Z~\'SS~]~^~_* '  1!"#'$'%'&('(5"((])(*(+),)2-)(.)/)0*<*@>*F*L*S*\*b\*h*n*rl*w*}*_`abc % %*p %* 'G 'H 'I 'J 'K 'L 'M 'N 'O 'P 'Q 'R 'S 'T 'U 'V 'W 'X 'Y 'Z '[ '\ '] '^ '_ '` 'a 'b 'c F+(, F F F F F F F F F  F - F  F  F  F F F F F F F F F F F F F F F F F F F  F! F" F# F$ F% F& F' F( F) F* F+ F, F- F. F/ F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F: F; F< F= F> F? F@ FA FB FC FD FE FF FG FH FI FJ FK FL FM FN FO FP FQ FR FS FT FU FV FW FX FY FZ F[ F\ F] F^ F_ F` Fa Fb Fc+s+u6 +/Root 2479 0 R +/Info 2480 0 R +/ID [<4D9BB99220F5A2ADD1D1D9EC33113CB4> <4D9BB99220F5A2ADD1D1D9EC33113CB4>] +/Length 12410 +>> +stream +]) +Iz& +Hz3 +Gz> +FzF +E  +zR +D  z[ +C  +B +A$ +@% +?E +>F +=G +<H +;L +: M +9!"N +8#$R +7%&S +6'(U +5)*V +4+,Z +3-.[ +2/0\ +112c +0345 +/565 +.785 +-9:5  +,;<5  ++=>5 +*?@5 +)AB5 +(CD5 +'EF5 +&GH5 +%IJ5 +$KL5 +#MN5% +"OP5& +!QR5' + ST5+ +UV51 +WX52 +YZ53 +[\54 +]^5: +_`5; +ab5< +c>\5B +5G +5H +5I +5P +  +5T +  5^ +  + + +% +1 + 9 + E + P + +a +  +   +!" +#$( +%&C +'(P +)*_ ++,h +-.h +/0h )c12h= )b34hF )a56hQ )`78hR )_9: )^;< )]=> )\?@ )[AB$ )ZCD/ )YEF: )XGHU )WIJM )VKLM )UMNM )TOPM )SQRM$ )RSTM, )QUVM0 )PWXM5 )OYZM? )N[\MD )M]^MJ )L_`MP )KabMV )Jc|YM\ )IMc )H )G )F )E  +) )D  - )C 3 )B9 )A@ )@D )?H )>L )=P )<T );^ ): $ )9!"$ )8#$$ )7%&$" )6'($, )5)*$8 )4+,$= )3-.$D )2/0$M )112$S )034$Y )/56$_ ).78 )-9: ),;<  )+=> )*?@ ))AB" )(CD) )'EF2 )&GH9 )%IJB )$KLO )#MN[ )"OP` )!QR ) ST )UV )WX )YZ )[\ )]^6 )_`M )abN )c]U )]]V )]]}A )]]}E )]]}F )] ] +}H )] ] }L )] ]}M )]]}N )]]}O )]]}P ) ]]}Q ) ]]}R ) ]]}S ) +]]}W ) ]]}X )]] }Y )]!]"}Z )]#]$]%]&]*]'](?A@BҜ]-]+:],]/]0]1]2]3]4]5]6]7]8]9]:];]<]=]>]?]@]A]B]D]F]G]H]I]J]K]L]M]N]P]R]S]T]U]V]W]X]Y]Z][]`]^].]\]]]C]E]O]Q]a]b]c  +    !"#$%&'()*.,]_V+/0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTVWY[`^-4]UXZ\bzzzzzzzzz z +z z z zzzzzzzzzzzzzzzzzzz z!z"z$_}+z#aczЄz'z%^Cz)z*z+z,z-z.z/z0z1z2z4z(z:z;z<CVzBz@z5,,z=z?z6z7z8z9GIrzCzDzIzATzE:98zGzHzNzOzSzJz zPzQzKzLzMzUzVzXzTszWzYxzZz\z]z^z_z`zazbzcD>  +   ; ("'!Gu#&)*+2(j ,-./0145@3Y6789:;<=><?BCIADEOJhKWP.QT]XY_`a5^b5 5a5 56&5555 +VV5 5F55f?555x@55"5'55 5!5(5#75$5,5)5*5.5/565-Е5055G595=57585?5@5C5>45A5_5E5M5K5D5F5J5O5Q5L'5N5U5R8J5S5W5X5Y5Z5[5\5b5`5V9&5]>H5c5aWB g   ?!"#' _$&I+()*-./3, 02567;4"8:?<@y=>ABCG@LDFJHjIJLMNRKmsOQ[STUVWXYZ]^_c\`bo   +=  K !"$*#&,*%ER')-./0124+eV367958;<=>?@AE:BDHFGLJKLMNTURIUOQWSVYZ[\]aXف^`chbhKMhhhhh +h-hh Uhhh HhhMh h hhhhcbhhhhhhh!h hh h#h$h%h*h"h&h'h(h)h6h-h+mh,h7h.h5h/h0h1h2h3h4%Yh9h:h;h?h8h<h>NhBh@hAhDhJhHhCQhEhGhKhLhNhI[hMhShO܁hPhUhXhThVhWhZh]hYh[7h\Oh^?jh_h`hahbhc{+ }  +  ,P!"% ё#*&'(),-1+%.0723456=;8 9>?F<"t@ABCDEQOG?HIJKLMNQRSVPTT`WoXYZ[\]^_bcMa}M;MMM MRMMM M MM +M RMMۘMMMMMMߴMMMMMMM M!M"M'MM#M%M&M)M*M-M( M+M1M.!M/SM3M6M2.M4M;M7JnM8M9M:M=M@M<MM>MBMFMAfMCMEMHMLMGsMIMKMNMRMMMOMQTMTMXMSMUMWMZM_MYM[M]M^MaM`Mb!2    +   U $& Cn !"#$%*' p(0+ q,./61 245=7 8:;<VA> H?EB CIF (GMJ KQN OUR 3SW[V !WXYZ6_\!]$`!=abc$"и$$!W $$ $!n$$$ $ +$$ !$ X$$!$$$$$$!$$$!Ȃ$$$$$#$ !ܓ$!$)$$!$%$&$'$($-$*" _$+Y$5$."!}$/$0$15$2$3$4$:$6";i$7$9$?$;"Q$<$>$A$B$E$@"g$C$H$I$J$F"$G$P$K"$L$N$OZ$V$Q"$R$T$U$\$W"$X$Z$[$b$]"$^$`$a$c"d$(R "/  +# [#Z#+ %#=A!#$',&#Z(*+/-#x.30#z1\567;4#8:G=>?@EC<#AHD#F}cJKLMPI#eNSQ#RUVWXY\T#8Z]^a]$i_b$$Hc%>$S`  +  $^8 $vP$^&$$ !"#'()+%$*-/,$4.1234<:0$U5789=>@;$?CA%B_EGHIJKOD%.LFQR%nS%̢}]YP%7WTWX_} cZ%[^`ab[\%}}}}%}} +} } } }}}}}'}}%}}}%}%%%&$}}}}"}&}} }!}}}}}&0}&1&2&@Y},}.&q}*}0}#&_/}+}-}/`}$}%}&}'}(&z})&v&&#&]}8};}1&V}9}:}2}3&}4}5}6& }7&&%'0}>}<'q}=}B}?'}@}I}C'5}D}G}T}J'M}K}[}U'b{}Va}^}\'m]}] +}_'m}`}a}b * '#  !"#4$%&'t''S((C)(1P*(P}+(xu,(G-(.)$0/)50)E1)F2* +]3*X*\*cF*i*p{*x*~*=*|****bc ) ) ) ) )* )+ +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +[ +\ +] +^ +_ +` +a +b +c G+C{ G G G G G G G G G  G + G  G  G  G G G G G G G G G G G G G G G G G G G  G! G" G# G$ G% G& G' G( G) G* G+ G, G- G. G/ G0 G1 G2 G3 G4 G5 G6 G7 G8 G9 G: G; G< G= G> G? G@ GA GB GC GD GE GF GG GH GI GJ GK GL GM GN GO GP GQ GR GS GT GU GV GW GX GY GZ G[ G\ G] G^ G_ G` Ga Gb Gc +   ++ endstream endobj startxref -2848054 +2855909 %%EOF diff --git a/docs/src/datastruct.tex b/docs/src/datastruct.tex index 654819121..936ac43d9 100644 --- a/docs/src/datastruct.tex +++ b/docs/src/datastruct.tex @@ -26,7 +26,7 @@ defined in the library as follows: \item[psb\_mpk\_] Kind parameter for 4-bytes integer data, as is always used by MPI; \item[psb\_epk\_] Kind parameter for 8-bytes integer data, as is - always used by the \fortinline|sizeof| methods; + always returned by the \fortinline|sizeof| methods; \item[psb\_ipk\_] Kind parameter for ``local'' integer indices and data; with default build options this is a 4 bytes integer; \item[psb\_lpk\_] Kind parameter for ``global'' integer indices and data; @@ -47,9 +47,9 @@ developer's documentation. \subsection{Descriptor data structure} \label{sec:desc} -All the general matrix informations and elements to be -exchanged among processes are stored within a data structure of the -type \hypertarget{descdata}{{\tt psb\_desc\_type}}. +All the general matrix information and the identification of elements +to be exchanged among processes are stored within a data structure of +the type \hypertarget{descdata}{{\tt psb\_desc\_type}}. Every structure of this type is associated with a discretization pattern and enables data communications and other operations that are necessary for implementing the various algorithms of interest to us. diff --git a/docs/src/error.tex b/docs/src/error.tex index 07d009d8c..68f16fe40 100644 --- a/docs/src/error.tex +++ b/docs/src/error.tex @@ -2,11 +2,11 @@ \section{Error handling\label{sec:errors}} -The PSBLAS library error handling policy has been completely rewritten -in version 2.0. The idea behind the design of this new error handling -strategy is to keep error messages on a stack allowing the user to -trace back up to the point where the first error message has been -generated. Every routine in the PSBLAS-2.0 library has, as last +The PSBLAS library error handling policy has been defined at the time +version 2.0 was written. The idea behind the design of error +handling strategy is to keep error messages on a stack allowing the +user to trace back up to the point where the first error message has +been generated. Every routine in the PSBLAS library has, as last non-optional argument, an integer \verb|info| variable; whenever, inside the routine, an error is detected, this variable is set to a value corresponding to a specific error code. Then this error code is @@ -21,7 +21,7 @@ levels of nested calls until the level where the user decides to abort the program execution. Figure~\ref{fig:routerr} shows the layout of a generic \verb|psb_foo| -routine with respect to the PSBLAS-2.0 error handling policy. It is +routine with respect to the PSBLAS error handling policy. It is possible to see how, whenever an error condition is detected, the \verb|info| variable is set to the corresponding error code which is, then, pushed on top of the stack by means of the @@ -110,7 +110,7 @@ end subroutine psb_foo Figure~\ref{fig:errormsg} reports a sample error message generated by -the PSBLAS-2.0 library. This error has been generated by the fact that +the PSBLAS library. This error has been generated by the fact that the user has chosen the invalid ``FOO'' storage format to represent the sparse matrix. From this error message it is possible to see that the error has been detected inside the \verb|psb_cest| subroutine @@ -161,7 +161,7 @@ Aborting... \fbox{\TheSbox} \end{center} \fi - \caption{\label{fig:errormsg}A sample PSBLAS-3.0 error + \caption{\label{fig:errormsg}A sample PSBLAS error message. Process 0 detected an error condition inside the {\textrm psb\_cest} subroutine} \end{listing} diff --git a/docs/src/figures/psblas.eps b/docs/src/figures/psblas.eps index 2690fc0bf..9ed97fcae 100644 --- a/docs/src/figures/psblas.eps +++ b/docs/src/figures/psblas.eps @@ -1,10 +1,9 @@ %!PS-Adobe-3.0 EPSF-3.0 %%Title: psblas.fig -%%Creator: fig2dev Version 3.2 Patchlevel 5d -%%CreationDate: Thu Dec 15 14:55:15 2011 -%%For: sfilippo@donald (Salvatore Filippone) -%%BoundingBox: 0 0 197 215 -%Magnification: 0.5000 +%%Creator: fig2dev Version 3.2.9a +%%CreationDate: 2025-12-23 13:28:52 +%%BoundingBox: 0 0 194 215 +%%Magnification: 0.5000 %%EndComments %%BeginProlog /$F2psDict 200 dict def @@ -12,37 +11,7 @@ $F2psDict begin $F2psDict /mtrx matrix put /col-1 {0 setgray} bind def /col0 {0.000 0.000 0.000 srgb} bind def -/col1 {0.000 0.000 1.000 srgb} bind def -/col2 {0.000 1.000 0.000 srgb} bind def -/col3 {0.000 1.000 1.000 srgb} bind def -/col4 {1.000 0.000 0.000 srgb} bind def -/col5 {1.000 0.000 1.000 srgb} bind def -/col6 {1.000 1.000 0.000 srgb} bind def /col7 {1.000 1.000 1.000 srgb} bind def -/col8 {0.000 0.000 0.560 srgb} bind def -/col9 {0.000 0.000 0.690 srgb} bind def -/col10 {0.000 0.000 0.820 srgb} bind def -/col11 {0.530 0.810 1.000 srgb} bind def -/col12 {0.000 0.560 0.000 srgb} bind def -/col13 {0.000 0.690 0.000 srgb} bind def -/col14 {0.000 0.820 0.000 srgb} bind def -/col15 {0.000 0.560 0.560 srgb} bind def -/col16 {0.000 0.690 0.690 srgb} bind def -/col17 {0.000 0.820 0.820 srgb} bind def -/col18 {0.560 0.000 0.000 srgb} bind def -/col19 {0.690 0.000 0.000 srgb} bind def -/col20 {0.820 0.000 0.000 srgb} bind def -/col21 {0.560 0.000 0.560 srgb} bind def -/col22 {0.690 0.000 0.690 srgb} bind def -/col23 {0.820 0.000 0.820 srgb} bind def -/col24 {0.500 0.190 0.000 srgb} bind def -/col25 {0.630 0.250 0.000 srgb} bind def -/col26 {0.750 0.380 0.000 srgb} bind def -/col27 {1.000 0.500 0.500 srgb} bind def -/col28 {1.000 0.630 0.630 srgb} bind def -/col29 {1.000 0.750 0.750 srgb} bind def -/col30 {1.000 0.880 0.880 srgb} bind def -/col31 {1.000 0.840 0.000 srgb} bind def end @@ -53,6 +22,7 @@ end /sa {save} bind def /rs {restore} bind def /l {lineto} bind def +/rl {rlineto} bind def /m {moveto} bind def /rm {rmoveto} bind def /n {newpath} bind def @@ -77,14 +47,15 @@ end bind def /shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul 4 -2 roll mul srgb} bind def +/xfig_image {image Data flushfile} def /$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def /$F2psEnd {$F2psEnteredState restore end} def /pageheader { -save -newpath 0 215 moveto 0 0 lineto 197 0 lineto 197 215 lineto closepath clip newpath --5.3 221.5 translate -1 -1 scale +sa +n 0 215 m 0 0 l 194 0 l 194 215 l cp clip +-5.3 221.5 tr +1 -1 sc $F2psBegin 10 setmiterlimit 0 slj 0 slc @@ -99,7 +70,7 @@ pageheader % % Fig objects follow % -% +%% % here starts figure with depth 50 /Times-Roman ff 396.88 scf sf 540 6210 m @@ -115,15 +86,13 @@ n 2025 225 m 1800 225 1800 1350 225 arcto 4 {pop} repeat 1800 1575 4275 1575 225 arcto 4 {pop} repeat 4500 1575 4500 450 225 arcto 4 {pop} repeat 4500 225 2025 225 225 arcto 4 {pop} repeat - cp gs col0 s gr -% Polyline + cp gs col0 s gr % Polyline gs clippath -3180 1765 m 3180 1560 l 3120 1560 l 3120 1765 l 3120 1765 l 3150 1615 l 3180 1765 l cp +3143 1568 m 3157 1568 l 3180 1765 l 3150 1735 l 3120 1765 l cp eoclip n 3150 2970 m 3150 1575 l gs col0 s gr gr - -% arrowhead +%% arrowhead 15.000 slw n 3180 1765 m 3150 1615 l 3120 1765 l 3150 1735 l 3180 1765 l cp gs 0.00 setgray ef gr col0 s @@ -133,24 +102,20 @@ n 2100 2925 m 1845 2925 1845 4020 255 arcto 4 {pop} repeat 1845 4275 4425 4275 255 arcto 4 {pop} repeat 4680 4275 4680 3180 255 arcto 4 {pop} repeat 4680 2925 2100 2925 255 arcto 4 {pop} repeat - cp gs col0 s gr -% Polyline + cp gs col0 s gr % Polyline n 405 5670 m 180 5670 180 6750 225 arcto 4 {pop} repeat 180 6975 2655 6975 225 arcto 4 {pop} repeat 2880 6975 2880 5895 225 arcto 4 {pop} repeat 2880 5670 405 5670 225 arcto 4 {pop} repeat - cp gs col0 s gr -% Polyline + cp gs col0 s gr % Polyline n 2880 6300 m - 3420 6300 l gs col0 s gr -% Polyline + 3420 6300 l gs col0 s gr % Polyline gs clippath -3180 4456 m 3180 4305 l 3120 4305 l 3120 4456 l 3120 4456 l 3150 4336 l 3180 4456 l cp +3143 4313 m 3157 4313 l 3180 4456 l 3120 4456 l cp eoclip n 3150 6300 m 3150 4320 l gs col0 s gr gr - -% arrowhead +%% arrowhead n 3180 4456 m 3150 4336 l 3120 4456 l 3180 4456 l cp gs 0.00 setgray ef gr col0 s % Polyline 15.000 slw @@ -167,8 +132,7 @@ n 3645 5625 m 3420 5625 3420 6795 225 arcto 4 {pop} repeat 3420 7020 5895 7020 225 arcto 4 {pop} repeat 6120 7020 6120 5850 225 arcto 4 {pop} repeat 6120 5625 3645 5625 225 arcto 4 {pop} repeat - cp gs col0 s gr -/Times-Roman ff 396.88 scf sf + cp gs col0 s gr /Times-Roman ff 396.88 scf sf 2295 990 m gs 1 -1 sc (Application) col0 sh gr /Times-Roman ff 396.88 scf sf @@ -191,8 +155,8 @@ gs 1 -1 sc (Message Passing) col0 sh gr gs 1 -1 sc (MPI) col0 sh gr /Times-Roman ff 396.88 scf sf 4050 2160 m -gs 1 -1 sc (Fortran 2003) col0 sh gr -% here ends figure; +gs 1 -1 sc (Fortran 2008) col0 sh gr +%% here ends figure; pagefooter showpage %%Trailer diff --git a/docs/src/figures/psblas.fig b/docs/src/figures/psblas.fig index 10f2b0efe..56970afb9 100644 --- a/docs/src/figures/psblas.fig +++ b/docs/src/figures/psblas.fig @@ -1,15 +1,16 @@ -#FIG 3.2 Produced by xfig version 3.2.5b +#FIG 3.2 Produced by xfig version 3.2.9 +#encoding: UTF-8 Landscape Center Metric -Letter +Letter 50.00 Single -2 1200 2 6 540 5940 2430 6660 -4 0 0 50 -1 0 25 0.0000 4 375 2250 540 6210 Serial Sparse\001 -4 0 0 50 -1 0 25 0.0000 4 285 1080 1080 6660 BLAS\001 +4 0 0 50 -1 0 25 0.0000 4 376 2163 540 6210 Serial Sparse\001 +4 0 0 50 -1 0 25 0.0000 4 288 1032 1080 6660 BLAS\001 -6 2 4 0 1 0 7 50 -1 -1 0.000 0 0 15 0 0 5 4500 1575 1800 1575 1800 225 4500 225 4500 1575 @@ -31,11 +32,11 @@ Single 945 4995 5490 4995 2 4 0 1 0 7 50 -1 -1 0.000 0 0 15 0 0 5 6120 7020 3420 7020 3420 5625 6120 5625 6120 7020 -4 0 0 50 -1 0 25 0.0000 4 375 2010 2295 990 Application\001 -4 0 0 50 -1 0 25 0.0000 4 285 1665 2250 3735 PSBLAS \001 -4 0 0 50 -1 0 25 0.0000 4 285 1515 4050 2565 Interface\001 -4 0 0 50 -1 0 25 0.0000 4 285 885 4140 4860 Inner\001 -4 0 0 50 -1 0 25 0.0000 4 285 1515 4140 5310 Interface\001 -4 0 0 50 -1 0 25 0.0000 4 375 2910 3420 6120 Message Passing\001 -4 0 0 50 -1 0 25 0.0000 4 285 750 4275 6660 MPI\001 -4 0 0 50 -1 0 25 0.0000 4 285 2190 4050 2160 Fortran 2003\001 +4 0 0 50 -1 0 25 0.0000 4 376 1956 2295 990 Application\001 +4 0 0 50 -1 0 25 0.0000 4 288 1524 2250 3735 PSBLAS \001 +4 0 0 50 -1 0 25 0.0000 4 288 1466 4050 2565 Interface\001 +4 0 0 50 -1 0 25 0.0000 4 280 873 4140 4860 Inner\001 +4 0 0 50 -1 0 25 0.0000 4 288 1466 4140 5310 Interface\001 +4 0 0 50 -1 0 25 0.0000 4 376 2818 3420 6120 Message Passing\001 +4 0 0 50 -1 0 25 0.0000 4 276 730 4275 6660 MPI\001 +4 0 0 50 -1 0 25 0.0000 4 288 2137 4050 2160 Fortran 2008\001 diff --git a/docs/src/figures/psblas.pdf b/docs/src/figures/psblas.pdf index 0657a7a55..a296c8503 100644 Binary files a/docs/src/figures/psblas.pdf and b/docs/src/figures/psblas.pdf differ diff --git a/docs/src/figures/psblas.png b/docs/src/figures/psblas.png index c904340d8..33a35ba01 100644 Binary files a/docs/src/figures/psblas.png and b/docs/src/figures/psblas.png differ diff --git a/docs/src/intro.tex b/docs/src/intro.tex index a7bef845e..073a428e7 100644 --- a/docs/src/intro.tex +++ b/docs/src/intro.tex @@ -21,12 +21,13 @@ The software architecture allows us to offer support for many alternatives in the implementation, including usage of heterogeneous platforms, and computations performed on GPUs throuh CUDA. -There is support for GPU computations through OpenACC, but it is at -this time a highly experimental version; we plan to also look at using -accelerators through OpenMP as support from compilers improves. +There is also support for GPU computations through OpenACC, but it is +at this time a highly experimental version; we plan to also look at +using accelerators through OpenMP as support from compilers improves. -The project is lead by Salvatore Filippone; a number of people have been contributing to this package over the -years; contributors in roughly reverse chronological order: +The project is lead by Salvatore Filippone; a number of people have +been contributing to this package over the years; contributors in +roughly reverse chronological order: \begin{obeylines} Luca Pepè Sciarria Theophane Loloum @@ -81,18 +82,19 @@ works discussing advanced programming in Fortran~2008 include~\cite{DesPat:11,RouXiaXu:11}; sufficient support for Fortran~2008 is now available from many compilers, including recent versions of the GNU Fortran compiler from the Free Software -Foundation, and the FLANG compiler from the LLVM project. +Foundation, the FLANG compiler from the LLVM project, and the Intel +OneAPI compiler. +The README file contains a list of compilers against which we have +successfully tested the current release. Previous approaches have been based on mixing Fortran~95, with its support for object-based design, with other languages; these have been advocated by a number of authors, -e.g.~\cite{machiels}. Moreover, the Fortran~95 facilities for dynamic -memory management and interface overloading greatly enhance the -usability of the PSBLAS -subroutines. In this way, the library can take care of runtime memory -requirements that are quite difficult or even impossible to predict at -implementation or compilation time. +e.g.~\cite{machiels}. The Fortran~95 facilities for dynamic +memory management and interface overloading ensure that the library +can take care of runtime memory requirements that are quite difficult +or even impossible to predict at implementation or compilation time. The presentation of the PSBLAS library follows the general structure of the proposal for @@ -101,13 +103,13 @@ proposal for BLAS on dense matrices~\cite{BLAS1,BLAS2,BLAS3}. The applicability of sparse iterative solvers to many different areas causes some terminology problems because the same concept may be -denoted through different names depending on the application area. The -PSBLAS features presented in this document will be discussed referring -to a finite difference discretization of a Partial Differential -Equation (PDE). However, the scope of the library is wider than -that: for example, it can be applied to finite element discretizations -of PDEs, and even to different classes of problems such as nonlinear -optimization, for example in optimal control problems. +denoted by different names depending on the application area. The +PSBLAS features presented in this document will be discussed taking as +a reference a finite difference discretization of a Partial +Differential Equation (PDE). However, the scope of the library is +wider than that: it can be applied to finite element and other +discretizations of PDEs, and even to different classes of problems +such as nonlinear optimization, for example in optimal control problems. The design of a solver for sparse linear systems is driven by many conflicting objectives, such as limiting occupation of storage @@ -145,7 +147,7 @@ application layer. The serial parts of the computation on each process are executed through calls to the serial sparse BLAS subroutines. In a similar way, the inter-process message exchanges are encapsulated -in an applicaiton layer that has been strongly inspired by the Basic +in an application layer that has been strongly inspired by the Basic Linear Algebra Communication Subroutines (BLACS) library~\cite{BLACS}. Usually there is no need to deal directly with MPI; however, in some cases, MPI routines are used directly to improve efficiency. For @@ -184,10 +186,9 @@ the variable associated to each mesh point is assigned to a process that will own the corresponding row in the coefficient matrix and will carry out all related computations. This allocation strategy is equivalent to a partition of the discretization mesh into {\em -sub-domains}. -Our library supports any distribution that keeps together -the coefficients of each matrix row; there are no other constraints on -the variable assignment. +sub-domains}; our library supports any distribution that keeps +together the coefficients of each matrix row; there are no other +constraints on the variable assignment. This choice is consistent with simple data distributions %commonly used in ScaLAPACK such as \verb|CYCLIC(N)| and \verb|BLOCK|, @@ -201,8 +202,8 @@ matrices, that is, the entries of a vector follow the same distribution of the matrix rows. We assume that the sparse matrix is built in parallel, where each -process generates its own portion. We never require that the entire -matrix be available on a single node. However, it is possible +process generates its own portion: we never \emph{require} that the +entire matrix be available on a single node. However, it is possible to hold the entire matrix in one process and distribute it explicitly\footnote{In our prototype implementation we provide sample scatter/gather routines.}, even though the resulting memory @@ -227,33 +228,31 @@ assigned to the parallel processes, we classify the points of a given sub-domain as following. \begin{description} \item[Internal.] An internal point of - a given domain {\em depends} only on points of the -same domain. -If all points of a domain are assigned to one -process, then a computational step (e.g., a -matrix-vector product) of the -equations associated with the internal points requires no data -items from other domains and no communications. - -\item[Boundary.] A point of -a given domain is a boundary point if it {\em depends} on points -belonging to other domains. - -\item[Halo.] A halo point for a given domain is a point belonging to -another domain such that there is a boundary point which {\em depends\/} + a given sub-domain {\em depends} only on points of the +same sub-domain. +If all points of a sub-domain are assigned to one +process, then a computational step (e.g., a matrix-vector product) of +the equations associated with the internal points requires no data +items from other sub-domains and no communications. + +\item[Boundary.] A point of a given sub-domain is a boundary point if + it {\em depends} on points belonging to other sub-domains. + +\item[Halo.] A halo point for a given sub-domain is a point belonging to +another sub-domain such that there is a boundary point which {\em depends\/} on it. Whenever performing a computational step, such as a matrix-vector product, the values associated with halo points are -requested from other domains. A boundary point of a given -domain is usually a halo point for some other domain\footnote{This is +requested from other sub-domains. A boundary point of a given +sub-domain is usually a halo point for some other sub-domain\footnote{This is the normal situation when the pattern of the sparse matrix is symmetric, which is equivalent to say that the interaction between two variables is reciprocal. If the matrix pattern is non-symmetric we may have one-way interactions, and these could cause a situation in which a boundary point is not a halo point for its neighbour.}; therefore the cardinality of the boundary points set determines the amount of data - sent to other domains. + sent to other sub-domains. \item[Overlap.] An overlap point is a boundary point assigned to -multiple domains. Any operation that involves an overlap point +multiple sub-domains. Any operation that involves an overlap point has to be replicated for each assignment. \end{description} Overlap points do not usually exist in the basic data @@ -378,7 +377,7 @@ $1\dots n_{\hbox{row}_i}$, each element of which corresponds to a certain element of $1\dots n$. The user does not set explicitly this mapping; when the application needs to indicate to which element of the index space a certain item is related, such as the row and column index of a -matrix coefficient, it does so in the ``global'' numbering, and the +matrix coefficient, it usually does so in the ``global'' numbering, and the library will translate into the appropriate ``local'' numbering. For a given index space $1\dots n$ there are many possible associated @@ -390,7 +389,7 @@ with a call to \verb|psb_cdasb| and a sparse matrix with a call to \verb|psb_spasb|. After \verb|psb_cdasb| each process $i$ will have defined a set of ``halo'' (or ``ghost'') indices $n_{\hbox{row}_i}+1\dots n_{\hbox{col}_i}$, denoting elements of the index -space that are \emph{not} assigned to process $i$; however the +space that are \emph{not} assigned to process $i$; the variables associated with them are needed to complete computations associated with the sparse matrix $A$, and thus they have to be fetched from (neighbouring) processes. The descriptor of the index @@ -521,7 +520,7 @@ computation. This is certainly true for the data allocation and assembly routines, for all the computational routines and for some of the tools routines. -However there are many cases where no synchronization, and indeed no +However there are cases where no synchronization, and indeed no communication among processes, is implied; for instance, all the routines in sec.~\ref{sec:datastruct} are only acting on the local data structures, and thus may be called independently. The most important case is that diff --git a/docs/src/methods.tex b/docs/src/methods.tex index 55b7b4e03..8acac9100 100644 --- a/docs/src/methods.tex +++ b/docs/src/methods.tex @@ -156,8 +156,8 @@ An integer value; 0 means no error has been detected. Richardson Iteration Driver Routine} This subroutine is a driver implementig a Richardson iteration -\[ x_{k+1} = M^-1 (b-Ax_k) +x_k,\] -with the preconditioner operator $M$ defined in the previous section. +\[ x_{k+1} = M^{-1} (b-Ax_k) +x_k,\] +with the preconditioner operator $M$ defined in section~\ref{sec:precs}. The stopping criterion can take the following values: \begin{description} diff --git a/docs/src/penv.tex b/docs/src/penv.tex index 31c2fc2ed..018a748b4 100644 --- a/docs/src/penv.tex +++ b/docs/src/penv.tex @@ -94,12 +94,12 @@ Specified as: an integer variable. Scope: {\bf local}.\\ Type: {\bf required}.\\ Intent: {\bf out}.\\ -Specified as: an integer value. $-1 \le iam \le np-1$\ +Returned as: an integer value. $-1 \le iam \le np-1$\ \item[np] Number of processes in the PSBLAS virtual parallel machine.\\ Scope: {\bf global}.\\ Type: {\bf required}.\\ Intent: {\bf out}.\\ -Specified as: an integer variable. \ +Returned as: an integer variable. \ \end{description} @@ -153,8 +153,9 @@ Specified as: a logical variable, default value: true. same program, or to enter and exit multiple times into the parallel environment, this routine may be called to selectively close the contexts with \verb|close=.false.|, while on - the last call it should be called with \verb|close=.true.| to - shutdown in a clean way the entire parallel environment. + the last instance it should close in a clean way the entire + parallel environment with \verb|close=.true.| + \end{enumerate} diff --git a/docs/src/psbrout.tex b/docs/src/psbrout.tex index 7877f6890..51675938d 100644 --- a/docs/src/psbrout.tex +++ b/docs/src/psbrout.tex @@ -1246,7 +1246,7 @@ An integer value; 0 means no error has been detected. This function computes the entrywise product between two vectors $x$ and $y$ -\[dot \leftarrow x(i) y(i).\] +\[y(i) \leftarrow x(i) y(i).\] \fortinline|psb_gemlt(x, y, desc_a, info)| @@ -1313,7 +1313,7 @@ $y$ This function computes the entrywise division between two vectors $x$ and $y$ -\[/ \leftarrow x(i)/y(i).\] +\[y(i) \leftarrow x(i)/y(i).\] \fortinline|psb_gediv(x, y, desc_a, info, [flag)| @@ -1385,7 +1385,7 @@ $y$ This function computes the entrywise inverse of a vector $x$ and puts it into $y$ -\[/ \leftarrow 1/x(i).\] +\[y(i) \leftarrow 1/x(i).\] \fortinline|psb_geinv(x, y, desc_a, info, [flag)| diff --git a/docs/src/toolsrout.tex b/docs/src/toolsrout.tex index d026f5859..739142495 100644 --- a/docs/src/toolsrout.tex +++ b/docs/src/toolsrout.tex @@ -598,7 +598,7 @@ An integer value; 0 means no error has been detected. state. \item The descriptor may be in either the build or assembled state. \item Providing a good estimate for the number of nonzeroes $nnz$ in - the assembled matrix may substantially improve performance in the + the assembled matrix may improve performance in the matrix build phase, as it will reduce or eliminate the need for (potentially multiple) data reallocations; \item Using \verb|psb_matbld_remote_| is likely to cause a runtime overhead at @@ -722,7 +722,7 @@ An integer value; 0 means no error has been detected. entirety to a single call to this routine: the buildup of a row may be split into as many calls as desired (even in the CSR format); \item Coefficients from different rows may also be mixed up freely - in a single call, according to the application needs; + in a single call (in COO format), according to the application needs; \item Coefficients from matrix rows not owned by the calling process are treated according to the value of \verb|bldmode| specified at allocation time; if @@ -1246,7 +1246,7 @@ An integer value; 0 means no error has been detected. %% psb_glob_to_loc %% % \clearpage\subsection{psb\_glob\_to\_loc --- Global to local indices - convertion} + conversion} %\addcontentsline{toc}{subsection}{psb\_glob\_to\_loc} \begin{verbatim} @@ -1261,7 +1261,7 @@ call psb_glob_to_loc(x, desc_a, info, iact,owned) Scope: {\bf local} \\ Type: {\bf required}\\ Intent: {\bf in, inout}.\\ -Specified as: a rank one integer array.\\ +Specified as: a rank one integer array of global indices, i.e. \verb|psb_lpk_|.\\ \item[desc\_a] the communication descriptor.\\ Scope:{\bf local}.\\ Type:{\bf required}.\\ @@ -1292,7 +1292,7 @@ Intent: {\bf inout}.\\ Specified as: a rank one integer array. \item[y] If $y$ is present, then $y$ is overwritten with the translated integer indices, and $x$ - is left unchanged. + is left unchanged; since $y$ contains local indices it should use \verb|psb_ipk_|. Scope: {\bf global} \\ Type: {\bf optional}\\ Intent: {\bf out}.\\ @@ -1325,7 +1325,8 @@ call psb_loc_to_glob(x, desc_a, info, iact) \begin{description} \item[Type:] Asynchronous. \item[\bf On Entry] -\item[x] An integer vector of indices to be converted.\\ +\item[x] An integer vector of indices to be converted; if $y$ is present, + they are local indices, i.e. \verb|psb_ipk_| \\ Scope: {\bf local} \\ Type: {\bf required}\\ Intent: {\bf in, inout}.\\ @@ -1346,14 +1347,14 @@ Specified as: a character variable \verb|I|gnore, \verb|W|arning or \begin{description} \item[\bf On Return] \item[x] If $y$ is not present, - then $x$ is overwritten with the translated integer indices. + then $x$ is overwritten with the translated integer global indices, i.e. \verb|psb_lpk_| Scope: {\bf global} \\ Type: {\bf required}\\ Intent: {\bf inout}.\\ Specified as: a rank one integer array. -\item[y] If $y$ is not present, - then $y$ is overwritten with the translated integer indices, and $x$ - is left unchanged. +\item[y] If $y$ not present, + then $y$ is overwritten with the translated global + indices i.e. \verb|psb_lpk_|, and $x$ is left unchanged. Scope: {\bf global} \\ Type: {\bf optional}\\ Intent: {\bf out}.\\ @@ -1773,13 +1774,16 @@ Specified as: a preconditioner data structure \precdata. \item[Function value] The memory occupation of the object specified in the calling sequence, in bytes.\\ Scope: {\bf local} \\ -Returned as: an \verb|integer(psb_long_int_k_)| number. +Returned as: an \verb|integer(psb_lpk_)| number. \end{description} \clearpage\subsection{Sorting utilities --- } %\addcontentsline{toc}{subsection}{Sorting utilities} +{\par\noindent\large\bfseries psb\_isort --- Sorting by the Insertion-sort + algorithm} + {\par\noindent\large\bfseries psb\_msort --- Sorting by the Merge-sort algorithm} @@ -1788,13 +1792,14 @@ Returned as: an \verb|integer(psb_long_int_k_)| number. {\par\noindent\large\bfseries psb\_hsort --- Sorting by the Heapsort algorithm} \begin{verbatim} -call psb_msort(x,ix,dir,flag) -call psb_qsort(x,ix,dir,flag) -call psb_hsort(x,ix,dir,flag) +call psb_isort(x,ix,dir,flag,reord) +call psb_msort(x,ix,dir,flag,reord) +call psb_qsort(x,ix,dir,flag,reord) +call psb_hsort(x,ix,dir,flag,reord) \end{verbatim} These serial routines sort a sequence $X$ into ascending or -descending order. The argument meaning is identical for the three +descending order. The argument meaning is identical for all calls; the only difference is the algorithm used to accomplish the task (see Usage Notes below). \begin{description} @@ -1805,7 +1810,8 @@ Type:{\bf required}.\\ Specified as: an integer, real or complex array of rank 1. \item[ix] A vector of indices.\\ Type:{\bf optional}.\\ -Specified as: an integer array of (at least) the same size as $X$. +Specified as: an integer array of (at least) the same size as +$X$. This argument is required when $reord=psb\_sort\_noreord\_x\_$. \item[dir] The desired ordering.\\ Type:{\bf optional}.\\ Specified as: an integer value: \begin{description} @@ -1820,18 +1826,24 @@ default \verb|psb_lsort_up_|. Type:{\bf optional}.\\ Specified as: an integer value \verb|psb_sort_ovw_idx_| or \verb|psb_sort_keep_idx_|; default \verb|psb_sort_ovw_idx_|. +\item[reord] Whether to reorder the input vector $x$ or just return + $IX$ for further usage.\\ +Type:{\bf optional}.\\ +Specified as: an integer value \verb|psb_sort_reord_x_| or +\verb|psb_sort_noreord_x_|; default \verb|psb_sort_reord_x_|. \end{description} \begin{description} \item[\bf On Return] -\item[x] The sequence of values, in the chosen ordering.\\ +\item[x] The sequence of values; if \verb|reord=psb_sort_reord_x_| it + will be in the chosen ordering.\\ Type:{\bf required}.\\ Specified as: an integer, real or complex array of rank 1. \item[ix] A vector of indices.\\ Type: {\bf Optional} \\ -An integer array of rank 1, whose entries are moved to the same -position as the corresponding entries in $x$. +An integer array of rank 1, whose $i$-th entry gives the position of +the (sorted) value of $x$ in the original sequence. \end{description} {\goodbreak\par\noindent\large\bfseries Notes} @@ -1843,10 +1855,13 @@ position as the corresponding entries in $x$. the imaginary part) or on the absolute values; \item The routines return the items in the chosen ordering; the output difference is the handling of ties (i.e. items with an - equal value) in the original input. With the merge-sort algorithm + equal value) in the original input. With the insertion-sort or merge-sort algorithms ties are preserved in the same relative order as they had in the original sequence, while this is not guaranteed for quicksort or - heapsort; + heapsort; +\item If $reord=psb\_sort\_noreord\_x\_$, then the input sequence $x$ + is not reordered; the output is given in $ix$. Calling without $ix$ + in this case is flagged as an error; \item If $flag = psb\_sort\_ovw\_idx\_$ then the entries in $ix(1:n)$ where $n$ is the size of $x$ are initialized to $ix(i) \leftarrow i$; thus, upon return from the subroutine, for each @@ -1854,11 +1869,16 @@ position as the corresponding entries in $x$. occupied in the original data sequence; \item If $flag = psb\_sort\_keep\_idx\_$ the routine will assume that the entries in $ix(:)$ have already been initialized by the user; -\item The three sorting algorithms have a similar $O(n \log n)$ expected - running time; in the average case quicksort will be the +\item Three sorting algorithms have a similar $O(n \log n)$ expected + running time, whereas insertion sort has an expected running time + $O(n^2)$; of the other three, in the average case quicksort will be the fastest and merge-sort the slowest. However note that: -\begin{enumerate} -\item The worst case running time for quicksort is $O(n^2)$; the algorithm + \begin{enumerate} + \item The best case running time for insertion sort is $\Omega(n)$ + while the average and worst case are $O(n^2)$; moreover, for + very short input sequences this is likely to be the fastest + method; + \item The worst case running time for quicksort is $O(n^2)$; the algorithm implemented here follows the well-known median-of-three heuristics, but the worst case may still apply; \item The worst case running time for merge-sort and heap-sort is @@ -1867,8 +1887,8 @@ position as the corresponding entries in $x$. subsequences that may be already in the desired ordering prior to the subroutine call; this situation is relatively common when dealing with groups of indices of sparse matrix entries, thus - merge-sort is the preferred choice when a sorting is needed - by other routines in the library. + merge-sort is the preferred choice when a sorting routine is needed + for preprocessing matrix data. \end{enumerate} \end{enumerate} diff --git a/docs/src/userguide.tex b/docs/src/userguide.tex index 2b1e89f3c..d41864b8f 100644 --- a/docs/src/userguide.tex +++ b/docs/src/userguide.tex @@ -136,7 +136,7 @@ by Salvatore Filippone\\ Alfredo Buttari \\ Fabio Durastante}\\ -June 9th, 2025 +December 23rd, 2025 \end{minipage}} } %\addtolength{\textwidth}{\centeroffset} diff --git a/docs/src/userhtml.tex b/docs/src/userhtml.tex index 2ac85f59d..e51acae6a 100644 --- a/docs/src/userhtml.tex +++ b/docs/src/userhtml.tex @@ -106,7 +106,7 @@ Fabio Durastante } \\ %\today Software version: 3.9.0\\ %\today -June 9th, 2025 +December 23rd, 2025 \cleardoublepage \begingroup \renewcommand*{\thepage}{toc} diff --git a/ext/Makefile b/ext/Makefile old mode 100755 new mode 100644 index 6ef24cbae..4b30d8b58 --- a/ext/Makefile +++ b/ext/Makefile @@ -14,7 +14,7 @@ CINCLUDES= LIBNAME=libpsb_ext.a -FOBJS= psb_d_ell_mat_mod.o psb_d_hll_mat_mod.o \ +MODOBJS=psb_d_ell_mat_mod.o psb_d_hll_mat_mod.o \ psb_s_hll_mat_mod.o psb_s_ell_mat_mod.o \ psb_c_hll_mat_mod.o psb_c_ell_mat_mod.o \ psb_z_hll_mat_mod.o psb_z_ell_mat_mod.o \ @@ -31,13 +31,15 @@ FOBJS= psb_d_ell_mat_mod.o psb_d_hll_mat_mod.o \ COBJS= -OBJS=$(COBJS) $(FOBJS) +OBJS=$(COBJS) $(MODOBJS) lib: objs ilib $(AR) $(LIBNAME) $(OBJS) /bin/cp -p $(LIBNAME) $(LIBDIR) -objs: $(OBJS) iobjs +objs: mods $(OBJS) iobjs + +mods: $(MODOBJS) /bin/cp -p *$(.mod) $(MODDIR) @@ -65,11 +67,11 @@ psb_s_hll_mat_mod.o psb_c_hll_mat_mod.o psb_d_hll_mat_mod.o psb_z_hll_mat_mod.o: ilib: objs $(MAKE) -C impl lib LIBNAME=$(LIBNAME) -iobjs: $(OBJS) +iobjs: mods $(MAKE) -C impl objs clean: cclean iclean - /bin/rm -f $(FOBJS) *$(.mod) *.a + /bin/rm -f $(MODOBJS) *$(.mod) *.a cclean: /bin/rm -f $(COBJS) diff --git a/ext/impl/Makefile b/ext/impl/Makefile old mode 100755 new mode 100644 diff --git a/ext/impl/psb_c_cp_dia_from_coo.f90 b/ext/impl/psb_c_cp_dia_from_coo.f90 index 2d2b1caa0..a7a8f83ca 100644 --- a/ext/impl/psb_c_cp_dia_from_coo.f90 +++ b/ext/impl/psb_c_cp_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_cp_dia_to_coo.f90 b/ext/impl/psb_c_cp_dia_to_coo.f90 index 9975bec02..8d2093221 100644 --- a/ext/impl/psb_c_cp_dia_to_coo.f90 +++ b/ext/impl/psb_c_cp_dia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_cp_ell_from_coo.f90 b/ext/impl/psb_c_cp_ell_from_coo.f90 index 28d7d2420..0a5f389f9 100644 --- a/ext/impl/psb_c_cp_ell_from_coo.f90 +++ b/ext/impl/psb_c_cp_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_cp_ell_from_fmt.f90 b/ext/impl/psb_c_cp_ell_from_fmt.f90 index 309063b9d..39074b727 100644 --- a/ext/impl/psb_c_cp_ell_from_fmt.f90 +++ b/ext/impl/psb_c_cp_ell_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_cp_ell_to_coo.f90 b/ext/impl/psb_c_cp_ell_to_coo.f90 index ec6bcff51..8fea05179 100644 --- a/ext/impl/psb_c_cp_ell_to_coo.f90 +++ b/ext/impl/psb_c_cp_ell_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_cp_ell_to_fmt.f90 b/ext/impl/psb_c_cp_ell_to_fmt.f90 index 0c6a6903b..40d79bec9 100644 --- a/ext/impl/psb_c_cp_ell_to_fmt.f90 +++ b/ext/impl/psb_c_cp_ell_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_cp_hdia_from_coo.f90 b/ext/impl/psb_c_cp_hdia_from_coo.f90 index a9e1ca215..e787e70a5 100644 --- a/ext/impl/psb_c_cp_hdia_from_coo.f90 +++ b/ext/impl/psb_c_cp_hdia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_cp_hdia_to_coo.f90 b/ext/impl/psb_c_cp_hdia_to_coo.f90 index 328016534..a607f008e 100644 --- a/ext/impl/psb_c_cp_hdia_to_coo.f90 +++ b/ext/impl/psb_c_cp_hdia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_cp_hll_from_coo.f90 b/ext/impl/psb_c_cp_hll_from_coo.f90 index 506196c2d..39b8cdba6 100644 --- a/ext/impl/psb_c_cp_hll_from_coo.f90 +++ b/ext/impl/psb_c_cp_hll_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_cp_hll_from_fmt.f90 b/ext/impl/psb_c_cp_hll_from_fmt.f90 index 0849561f3..fa08338e0 100644 --- a/ext/impl/psb_c_cp_hll_from_fmt.f90 +++ b/ext/impl/psb_c_cp_hll_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_cp_hll_to_coo.f90 b/ext/impl/psb_c_cp_hll_to_coo.f90 index 0ff46352a..38dd22d90 100644 --- a/ext/impl/psb_c_cp_hll_to_coo.f90 +++ b/ext/impl/psb_c_cp_hll_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_cp_hll_to_fmt.f90 b/ext/impl/psb_c_cp_hll_to_fmt.f90 index df8fa3b76..ff8da74a8 100644 --- a/ext/impl/psb_c_cp_hll_to_fmt.f90 +++ b/ext/impl/psb_c_cp_hll_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_aclsum.f90 b/ext/impl/psb_c_dia_aclsum.f90 index 4bd8d4408..0c09d910b 100644 --- a/ext/impl/psb_c_dia_aclsum.f90 +++ b/ext/impl/psb_c_dia_aclsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_allocate_mnnz.f90 b/ext/impl/psb_c_dia_allocate_mnnz.f90 index 37fb34e1a..731eea94f 100644 --- a/ext/impl/psb_c_dia_allocate_mnnz.f90 +++ b/ext/impl/psb_c_dia_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_arwsum.f90 b/ext/impl/psb_c_dia_arwsum.f90 index fe40deb8d..ede166d54 100644 --- a/ext/impl/psb_c_dia_arwsum.f90 +++ b/ext/impl/psb_c_dia_arwsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_colsum.f90 b/ext/impl/psb_c_dia_colsum.f90 index ed43fa12c..0a2125c23 100644 --- a/ext/impl/psb_c_dia_colsum.f90 +++ b/ext/impl/psb_c_dia_colsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_csgetptn.f90 b/ext/impl/psb_c_dia_csgetptn.f90 index ad479d357..ac4a1bd2e 100644 --- a/ext/impl/psb_c_dia_csgetptn.f90 +++ b/ext/impl/psb_c_dia_csgetptn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_csgetrow.f90 b/ext/impl/psb_c_dia_csgetrow.f90 index 2989b20f0..1344cc7a3 100644 --- a/ext/impl/psb_c_dia_csgetrow.f90 +++ b/ext/impl/psb_c_dia_csgetrow.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_csmm.f90 b/ext/impl/psb_c_dia_csmm.f90 index b65c4651a..e146d9537 100644 --- a/ext/impl/psb_c_dia_csmm.f90 +++ b/ext/impl/psb_c_dia_csmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_csmv.f90 b/ext/impl/psb_c_dia_csmv.f90 index cf1ef677e..fdb664e14 100644 --- a/ext/impl/psb_c_dia_csmv.f90 +++ b/ext/impl/psb_c_dia_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_get_diag.f90 b/ext/impl/psb_c_dia_get_diag.f90 index d868b62d3..278e98377 100644 --- a/ext/impl/psb_c_dia_get_diag.f90 +++ b/ext/impl/psb_c_dia_get_diag.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_maxval.f90 b/ext/impl/psb_c_dia_maxval.f90 index 03a2be82c..99bbadd8e 100644 --- a/ext/impl/psb_c_dia_maxval.f90 +++ b/ext/impl/psb_c_dia_maxval.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_mold.f90 b/ext/impl/psb_c_dia_mold.f90 index 1d6948286..2a89b5231 100644 --- a/ext/impl/psb_c_dia_mold.f90 +++ b/ext/impl/psb_c_dia_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_print.f90 b/ext/impl/psb_c_dia_print.f90 index f3233366d..86c7b7bf7 100644 --- a/ext/impl/psb_c_dia_print.f90 +++ b/ext/impl/psb_c_dia_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_reallocate_nz.f90 b/ext/impl/psb_c_dia_reallocate_nz.f90 index c46cd4654..86f161925 100644 --- a/ext/impl/psb_c_dia_reallocate_nz.f90 +++ b/ext/impl/psb_c_dia_reallocate_nz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_reinit.f90 b/ext/impl/psb_c_dia_reinit.f90 index 04a345eb3..415d7f4c4 100644 --- a/ext/impl/psb_c_dia_reinit.f90 +++ b/ext/impl/psb_c_dia_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_rowsum.f90 b/ext/impl/psb_c_dia_rowsum.f90 index 1f36dab4c..5cef3e0f5 100644 --- a/ext/impl/psb_c_dia_rowsum.f90 +++ b/ext/impl/psb_c_dia_rowsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_scal.f90 b/ext/impl/psb_c_dia_scal.f90 index 8f35b7c1b..25fc48853 100644 --- a/ext/impl/psb_c_dia_scal.f90 +++ b/ext/impl/psb_c_dia_scal.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_dia_scals.f90 b/ext/impl/psb_c_dia_scals.f90 index a9ca5db14..d82790f51 100644 --- a/ext/impl/psb_c_dia_scals.f90 +++ b/ext/impl/psb_c_dia_scals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_aclsum.f90 b/ext/impl/psb_c_ell_aclsum.f90 index 3d5a292ae..ce09dc137 100644 --- a/ext/impl/psb_c_ell_aclsum.f90 +++ b/ext/impl/psb_c_ell_aclsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_allocate_mnnz.f90 b/ext/impl/psb_c_ell_allocate_mnnz.f90 index b137eb044..7cb2f5d55 100644 --- a/ext/impl/psb_c_ell_allocate_mnnz.f90 +++ b/ext/impl/psb_c_ell_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_arwsum.f90 b/ext/impl/psb_c_ell_arwsum.f90 index c047c742f..a17caf70e 100644 --- a/ext/impl/psb_c_ell_arwsum.f90 +++ b/ext/impl/psb_c_ell_arwsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_colsum.f90 b/ext/impl/psb_c_ell_colsum.f90 index 6d06b5894..15fba919d 100644 --- a/ext/impl/psb_c_ell_colsum.f90 +++ b/ext/impl/psb_c_ell_colsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_csgetblk.f90 b/ext/impl/psb_c_ell_csgetblk.f90 index deb07c25f..f07f0825a 100644 --- a/ext/impl/psb_c_ell_csgetblk.f90 +++ b/ext/impl/psb_c_ell_csgetblk.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_csgetptn.f90 b/ext/impl/psb_c_ell_csgetptn.f90 index 821daa89b..da19391c3 100644 --- a/ext/impl/psb_c_ell_csgetptn.f90 +++ b/ext/impl/psb_c_ell_csgetptn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_csgetrow.f90 b/ext/impl/psb_c_ell_csgetrow.f90 index 39eff5a2f..735539146 100644 --- a/ext/impl/psb_c_ell_csgetrow.f90 +++ b/ext/impl/psb_c_ell_csgetrow.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_csmm.f90 b/ext/impl/psb_c_ell_csmm.f90 index 86d15e29b..ac2f46e36 100644 --- a/ext/impl/psb_c_ell_csmm.f90 +++ b/ext/impl/psb_c_ell_csmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_csmv.f90 b/ext/impl/psb_c_ell_csmv.f90 index 46d5ac004..a8e3bedcc 100644 --- a/ext/impl/psb_c_ell_csmv.f90 +++ b/ext/impl/psb_c_ell_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_csnm1.f90 b/ext/impl/psb_c_ell_csnm1.f90 index e83dcb282..a02933a42 100644 --- a/ext/impl/psb_c_ell_csnm1.f90 +++ b/ext/impl/psb_c_ell_csnm1.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_csnmi.f90 b/ext/impl/psb_c_ell_csnmi.f90 index 6dc9cfa47..918fdb9e5 100644 --- a/ext/impl/psb_c_ell_csnmi.f90 +++ b/ext/impl/psb_c_ell_csnmi.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_csput.f90 b/ext/impl/psb_c_ell_csput.f90 index e0b0f47f4..261275e01 100644 --- a/ext/impl/psb_c_ell_csput.f90 +++ b/ext/impl/psb_c_ell_csput.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_cssm.f90 b/ext/impl/psb_c_ell_cssm.f90 index 26e760307..204fe19f1 100644 --- a/ext/impl/psb_c_ell_cssm.f90 +++ b/ext/impl/psb_c_ell_cssm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_cssv.f90 b/ext/impl/psb_c_ell_cssv.f90 index e65e81dce..f37d4dd16 100644 --- a/ext/impl/psb_c_ell_cssv.f90 +++ b/ext/impl/psb_c_ell_cssv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_get_diag.f90 b/ext/impl/psb_c_ell_get_diag.f90 index edcdae419..19434edc1 100644 --- a/ext/impl/psb_c_ell_get_diag.f90 +++ b/ext/impl/psb_c_ell_get_diag.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_maxval.f90 b/ext/impl/psb_c_ell_maxval.f90 index 4de58b110..11102f1f5 100644 --- a/ext/impl/psb_c_ell_maxval.f90 +++ b/ext/impl/psb_c_ell_maxval.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_mold.f90 b/ext/impl/psb_c_ell_mold.f90 index c7c5d621b..fd0a3dc0b 100644 --- a/ext/impl/psb_c_ell_mold.f90 +++ b/ext/impl/psb_c_ell_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_print.f90 b/ext/impl/psb_c_ell_print.f90 index 1b8117a82..1212c3942 100644 --- a/ext/impl/psb_c_ell_print.f90 +++ b/ext/impl/psb_c_ell_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_reallocate_nz.f90 b/ext/impl/psb_c_ell_reallocate_nz.f90 index b0d775688..c10739cfb 100644 --- a/ext/impl/psb_c_ell_reallocate_nz.f90 +++ b/ext/impl/psb_c_ell_reallocate_nz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_reinit.f90 b/ext/impl/psb_c_ell_reinit.f90 index 2b15dfeaf..a3590e07e 100644 --- a/ext/impl/psb_c_ell_reinit.f90 +++ b/ext/impl/psb_c_ell_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_rowsum.f90 b/ext/impl/psb_c_ell_rowsum.f90 index 5ae7d42cd..002a8e473 100644 --- a/ext/impl/psb_c_ell_rowsum.f90 +++ b/ext/impl/psb_c_ell_rowsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_scal.f90 b/ext/impl/psb_c_ell_scal.f90 index 63150f32f..cf2db8f93 100644 --- a/ext/impl/psb_c_ell_scal.f90 +++ b/ext/impl/psb_c_ell_scal.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_scals.f90 b/ext/impl/psb_c_ell_scals.f90 index 3e4cd92a0..ed2e90135 100644 --- a/ext/impl/psb_c_ell_scals.f90 +++ b/ext/impl/psb_c_ell_scals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_ell_trim.f90 b/ext/impl/psb_c_ell_trim.f90 index 22aafefde..c1a13248b 100644 --- a/ext/impl/psb_c_ell_trim.f90 +++ b/ext/impl/psb_c_ell_trim.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hdia_allocate_mnnz.f90 b/ext/impl/psb_c_hdia_allocate_mnnz.f90 index 17a49ffe1..a6cbc7d96 100644 --- a/ext/impl/psb_c_hdia_allocate_mnnz.f90 +++ b/ext/impl/psb_c_hdia_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hdia_csmv.f90 b/ext/impl/psb_c_hdia_csmv.f90 index a04fde071..c486cbebf 100644 --- a/ext/impl/psb_c_hdia_csmv.f90 +++ b/ext/impl/psb_c_hdia_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hdia_mold.f90 b/ext/impl/psb_c_hdia_mold.f90 index d9f85ec94..545ca3de0 100644 --- a/ext/impl/psb_c_hdia_mold.f90 +++ b/ext/impl/psb_c_hdia_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hdia_print.f90 b/ext/impl/psb_c_hdia_print.f90 index 477a54330..a042d9eb6 100644 --- a/ext/impl/psb_c_hdia_print.f90 +++ b/ext/impl/psb_c_hdia_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_aclsum.f90 b/ext/impl/psb_c_hll_aclsum.f90 index f1bd8e898..2190f7489 100644 --- a/ext/impl/psb_c_hll_aclsum.f90 +++ b/ext/impl/psb_c_hll_aclsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_allocate_mnnz.f90 b/ext/impl/psb_c_hll_allocate_mnnz.f90 index 97b996bdb..400d68174 100644 --- a/ext/impl/psb_c_hll_allocate_mnnz.f90 +++ b/ext/impl/psb_c_hll_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_arwsum.f90 b/ext/impl/psb_c_hll_arwsum.f90 index 9c48e1c04..0f13f4141 100644 --- a/ext/impl/psb_c_hll_arwsum.f90 +++ b/ext/impl/psb_c_hll_arwsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_colsum.f90 b/ext/impl/psb_c_hll_colsum.f90 index fbcb0934c..cff3c9ef3 100644 --- a/ext/impl/psb_c_hll_colsum.f90 +++ b/ext/impl/psb_c_hll_colsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_csgetblk.f90 b/ext/impl/psb_c_hll_csgetblk.f90 index 9bf0b869c..a2c26cd60 100644 --- a/ext/impl/psb_c_hll_csgetblk.f90 +++ b/ext/impl/psb_c_hll_csgetblk.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_csgetptn.f90 b/ext/impl/psb_c_hll_csgetptn.f90 index 0f6481ed8..7c6f07f7b 100644 --- a/ext/impl/psb_c_hll_csgetptn.f90 +++ b/ext/impl/psb_c_hll_csgetptn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_csgetrow.f90 b/ext/impl/psb_c_hll_csgetrow.f90 index 798ffa853..111639044 100644 --- a/ext/impl/psb_c_hll_csgetrow.f90 +++ b/ext/impl/psb_c_hll_csgetrow.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_csmm.f90 b/ext/impl/psb_c_hll_csmm.f90 index 24024c72f..77bab41e3 100644 --- a/ext/impl/psb_c_hll_csmm.f90 +++ b/ext/impl/psb_c_hll_csmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_csmv.f90 b/ext/impl/psb_c_hll_csmv.f90 index fe26e4bb5..ce597e2e3 100644 --- a/ext/impl/psb_c_hll_csmv.f90 +++ b/ext/impl/psb_c_hll_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_csnm1.f90 b/ext/impl/psb_c_hll_csnm1.f90 index 25daa75da..5c3ca5c4b 100644 --- a/ext/impl/psb_c_hll_csnm1.f90 +++ b/ext/impl/psb_c_hll_csnm1.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_csnmi.f90 b/ext/impl/psb_c_hll_csnmi.f90 index c70be9ceb..23097aa24 100644 --- a/ext/impl/psb_c_hll_csnmi.f90 +++ b/ext/impl/psb_c_hll_csnmi.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_csput.f90 b/ext/impl/psb_c_hll_csput.f90 index e46ae30a0..b7db2c6a9 100644 --- a/ext/impl/psb_c_hll_csput.f90 +++ b/ext/impl/psb_c_hll_csput.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_cssm.f90 b/ext/impl/psb_c_hll_cssm.f90 index 90e3b9786..2c20996bf 100644 --- a/ext/impl/psb_c_hll_cssm.f90 +++ b/ext/impl/psb_c_hll_cssm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_cssv.f90 b/ext/impl/psb_c_hll_cssv.f90 index 2a157849f..e71b12526 100644 --- a/ext/impl/psb_c_hll_cssv.f90 +++ b/ext/impl/psb_c_hll_cssv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_get_diag.f90 b/ext/impl/psb_c_hll_get_diag.f90 index 0a4a37e37..2ea40bb6a 100644 --- a/ext/impl/psb_c_hll_get_diag.f90 +++ b/ext/impl/psb_c_hll_get_diag.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_maxval.f90 b/ext/impl/psb_c_hll_maxval.f90 index ff82bb40a..042e840f1 100644 --- a/ext/impl/psb_c_hll_maxval.f90 +++ b/ext/impl/psb_c_hll_maxval.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_mold.f90 b/ext/impl/psb_c_hll_mold.f90 index 4a6204b0d..3e281a58d 100644 --- a/ext/impl/psb_c_hll_mold.f90 +++ b/ext/impl/psb_c_hll_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_print.f90 b/ext/impl/psb_c_hll_print.f90 index a5eec378f..c576503f6 100644 --- a/ext/impl/psb_c_hll_print.f90 +++ b/ext/impl/psb_c_hll_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_reallocate_nz.f90 b/ext/impl/psb_c_hll_reallocate_nz.f90 index 44d9cfc92..6a08c1802 100644 --- a/ext/impl/psb_c_hll_reallocate_nz.f90 +++ b/ext/impl/psb_c_hll_reallocate_nz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_reinit.f90 b/ext/impl/psb_c_hll_reinit.f90 index 82d5cb169..0471a2275 100644 --- a/ext/impl/psb_c_hll_reinit.f90 +++ b/ext/impl/psb_c_hll_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_rowsum.f90 b/ext/impl/psb_c_hll_rowsum.f90 index e6eea2272..09d11a609 100644 --- a/ext/impl/psb_c_hll_rowsum.f90 +++ b/ext/impl/psb_c_hll_rowsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_scal.f90 b/ext/impl/psb_c_hll_scal.f90 index 0fd59f15b..a1bc8bb2c 100644 --- a/ext/impl/psb_c_hll_scal.f90 +++ b/ext/impl/psb_c_hll_scal.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_hll_scals.f90 b/ext/impl/psb_c_hll_scals.f90 index 13a03a225..9e307b566 100644 --- a/ext/impl/psb_c_hll_scals.f90 +++ b/ext/impl/psb_c_hll_scals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_mv_dia_from_coo.f90 b/ext/impl/psb_c_mv_dia_from_coo.f90 index 998713488..a5c3379a3 100644 --- a/ext/impl/psb_c_mv_dia_from_coo.f90 +++ b/ext/impl/psb_c_mv_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_mv_dia_to_coo.f90 b/ext/impl/psb_c_mv_dia_to_coo.f90 index 1382cec33..278bbee05 100644 --- a/ext/impl/psb_c_mv_dia_to_coo.f90 +++ b/ext/impl/psb_c_mv_dia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_mv_ell_from_coo.f90 b/ext/impl/psb_c_mv_ell_from_coo.f90 index 64da3e8d8..c94b1ff38 100644 --- a/ext/impl/psb_c_mv_ell_from_coo.f90 +++ b/ext/impl/psb_c_mv_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_mv_ell_from_fmt.f90 b/ext/impl/psb_c_mv_ell_from_fmt.f90 index d0fa9bc42..faac5743b 100644 --- a/ext/impl/psb_c_mv_ell_from_fmt.f90 +++ b/ext/impl/psb_c_mv_ell_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_mv_ell_to_coo.f90 b/ext/impl/psb_c_mv_ell_to_coo.f90 index a49e2e3cf..82edaac47 100644 --- a/ext/impl/psb_c_mv_ell_to_coo.f90 +++ b/ext/impl/psb_c_mv_ell_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_mv_ell_to_fmt.f90 b/ext/impl/psb_c_mv_ell_to_fmt.f90 index 3ea02d6be..15f23e52c 100644 --- a/ext/impl/psb_c_mv_ell_to_fmt.f90 +++ b/ext/impl/psb_c_mv_ell_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_mv_hdia_from_coo.f90 b/ext/impl/psb_c_mv_hdia_from_coo.f90 index 4247fdf82..cc3835ac7 100644 --- a/ext/impl/psb_c_mv_hdia_from_coo.f90 +++ b/ext/impl/psb_c_mv_hdia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_mv_hdia_to_coo.f90 b/ext/impl/psb_c_mv_hdia_to_coo.f90 index 3a91917a2..149e369a3 100644 --- a/ext/impl/psb_c_mv_hdia_to_coo.f90 +++ b/ext/impl/psb_c_mv_hdia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_mv_hll_from_coo.f90 b/ext/impl/psb_c_mv_hll_from_coo.f90 index b78bdd807..e86217467 100644 --- a/ext/impl/psb_c_mv_hll_from_coo.f90 +++ b/ext/impl/psb_c_mv_hll_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_mv_hll_from_fmt.f90 b/ext/impl/psb_c_mv_hll_from_fmt.f90 index add903558..1d258ab5f 100644 --- a/ext/impl/psb_c_mv_hll_from_fmt.f90 +++ b/ext/impl/psb_c_mv_hll_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_mv_hll_to_coo.f90 b/ext/impl/psb_c_mv_hll_to_coo.f90 index fbf5dfcd1..2d74d9940 100644 --- a/ext/impl/psb_c_mv_hll_to_coo.f90 +++ b/ext/impl/psb_c_mv_hll_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_c_mv_hll_to_fmt.f90 b/ext/impl/psb_c_mv_hll_to_fmt.f90 index 37d77e857..0138b8862 100644 --- a/ext/impl/psb_c_mv_hll_to_fmt.f90 +++ b/ext/impl/psb_c_mv_hll_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_cp_dia_from_coo.f90 b/ext/impl/psb_d_cp_dia_from_coo.f90 index b640565f1..d774f95e9 100644 --- a/ext/impl/psb_d_cp_dia_from_coo.f90 +++ b/ext/impl/psb_d_cp_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_cp_dia_to_coo.f90 b/ext/impl/psb_d_cp_dia_to_coo.f90 index 527c96d0e..bace6af91 100644 --- a/ext/impl/psb_d_cp_dia_to_coo.f90 +++ b/ext/impl/psb_d_cp_dia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_cp_ell_from_coo.f90 b/ext/impl/psb_d_cp_ell_from_coo.f90 index cf23a0e02..038b1b7a2 100644 --- a/ext/impl/psb_d_cp_ell_from_coo.f90 +++ b/ext/impl/psb_d_cp_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_cp_ell_from_fmt.f90 b/ext/impl/psb_d_cp_ell_from_fmt.f90 index ce8a8d7eb..a88155c85 100644 --- a/ext/impl/psb_d_cp_ell_from_fmt.f90 +++ b/ext/impl/psb_d_cp_ell_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_cp_ell_to_coo.f90 b/ext/impl/psb_d_cp_ell_to_coo.f90 index 8e7ad7352..76fd587c6 100644 --- a/ext/impl/psb_d_cp_ell_to_coo.f90 +++ b/ext/impl/psb_d_cp_ell_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_cp_ell_to_fmt.f90 b/ext/impl/psb_d_cp_ell_to_fmt.f90 index fd05d0fda..b6c8f9c8c 100644 --- a/ext/impl/psb_d_cp_ell_to_fmt.f90 +++ b/ext/impl/psb_d_cp_ell_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_cp_hdia_from_coo.f90 b/ext/impl/psb_d_cp_hdia_from_coo.f90 index bbc341959..4d9440089 100644 --- a/ext/impl/psb_d_cp_hdia_from_coo.f90 +++ b/ext/impl/psb_d_cp_hdia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_cp_hdia_to_coo.f90 b/ext/impl/psb_d_cp_hdia_to_coo.f90 index bfa77b082..615b0401c 100644 --- a/ext/impl/psb_d_cp_hdia_to_coo.f90 +++ b/ext/impl/psb_d_cp_hdia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_cp_hll_from_coo.f90 b/ext/impl/psb_d_cp_hll_from_coo.f90 index 03028d209..dbb22cd83 100644 --- a/ext/impl/psb_d_cp_hll_from_coo.f90 +++ b/ext/impl/psb_d_cp_hll_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_cp_hll_from_fmt.f90 b/ext/impl/psb_d_cp_hll_from_fmt.f90 index 785b23ac0..d8d979001 100644 --- a/ext/impl/psb_d_cp_hll_from_fmt.f90 +++ b/ext/impl/psb_d_cp_hll_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_cp_hll_to_coo.f90 b/ext/impl/psb_d_cp_hll_to_coo.f90 index b20144c55..2722b4938 100644 --- a/ext/impl/psb_d_cp_hll_to_coo.f90 +++ b/ext/impl/psb_d_cp_hll_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_cp_hll_to_fmt.f90 b/ext/impl/psb_d_cp_hll_to_fmt.f90 index 6c60c5b5b..75cd9ace2 100644 --- a/ext/impl/psb_d_cp_hll_to_fmt.f90 +++ b/ext/impl/psb_d_cp_hll_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_aclsum.f90 b/ext/impl/psb_d_dia_aclsum.f90 index 0f4df6ca1..566c41a81 100644 --- a/ext/impl/psb_d_dia_aclsum.f90 +++ b/ext/impl/psb_d_dia_aclsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_allocate_mnnz.f90 b/ext/impl/psb_d_dia_allocate_mnnz.f90 index 309b7d4a3..aec538a8c 100644 --- a/ext/impl/psb_d_dia_allocate_mnnz.f90 +++ b/ext/impl/psb_d_dia_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_arwsum.f90 b/ext/impl/psb_d_dia_arwsum.f90 index 98eefc447..b1427fde8 100644 --- a/ext/impl/psb_d_dia_arwsum.f90 +++ b/ext/impl/psb_d_dia_arwsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_colsum.f90 b/ext/impl/psb_d_dia_colsum.f90 index 6a6eb81c5..780f19553 100644 --- a/ext/impl/psb_d_dia_colsum.f90 +++ b/ext/impl/psb_d_dia_colsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_csgetptn.f90 b/ext/impl/psb_d_dia_csgetptn.f90 index ad0e040a2..a7e4d768c 100644 --- a/ext/impl/psb_d_dia_csgetptn.f90 +++ b/ext/impl/psb_d_dia_csgetptn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_csgetrow.f90 b/ext/impl/psb_d_dia_csgetrow.f90 index 7e05a26e4..b4595beaf 100644 --- a/ext/impl/psb_d_dia_csgetrow.f90 +++ b/ext/impl/psb_d_dia_csgetrow.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_csmm.f90 b/ext/impl/psb_d_dia_csmm.f90 index 81ad967de..1b4ed8e9b 100644 --- a/ext/impl/psb_d_dia_csmm.f90 +++ b/ext/impl/psb_d_dia_csmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_csmv.f90 b/ext/impl/psb_d_dia_csmv.f90 index 166b4c580..9a007d415 100644 --- a/ext/impl/psb_d_dia_csmv.f90 +++ b/ext/impl/psb_d_dia_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_get_diag.f90 b/ext/impl/psb_d_dia_get_diag.f90 index bbcb4a12f..dbcc51ea1 100644 --- a/ext/impl/psb_d_dia_get_diag.f90 +++ b/ext/impl/psb_d_dia_get_diag.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_maxval.f90 b/ext/impl/psb_d_dia_maxval.f90 index f57be1ff1..84c2082e6 100644 --- a/ext/impl/psb_d_dia_maxval.f90 +++ b/ext/impl/psb_d_dia_maxval.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_mold.f90 b/ext/impl/psb_d_dia_mold.f90 index 2b3cef81c..9ae8dffc9 100644 --- a/ext/impl/psb_d_dia_mold.f90 +++ b/ext/impl/psb_d_dia_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_print.f90 b/ext/impl/psb_d_dia_print.f90 index e32dc2edb..f3d358e47 100644 --- a/ext/impl/psb_d_dia_print.f90 +++ b/ext/impl/psb_d_dia_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_reallocate_nz.f90 b/ext/impl/psb_d_dia_reallocate_nz.f90 index 83864dd88..6bd56d54d 100644 --- a/ext/impl/psb_d_dia_reallocate_nz.f90 +++ b/ext/impl/psb_d_dia_reallocate_nz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_reinit.f90 b/ext/impl/psb_d_dia_reinit.f90 index f1e91ade8..aefeeb1dc 100644 --- a/ext/impl/psb_d_dia_reinit.f90 +++ b/ext/impl/psb_d_dia_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_rowsum.f90 b/ext/impl/psb_d_dia_rowsum.f90 index 7a5875bae..de97870d0 100644 --- a/ext/impl/psb_d_dia_rowsum.f90 +++ b/ext/impl/psb_d_dia_rowsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_scal.f90 b/ext/impl/psb_d_dia_scal.f90 index d87c0d258..7c63425d5 100644 --- a/ext/impl/psb_d_dia_scal.f90 +++ b/ext/impl/psb_d_dia_scal.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_dia_scals.f90 b/ext/impl/psb_d_dia_scals.f90 index a3958f57d..95d3ad462 100644 --- a/ext/impl/psb_d_dia_scals.f90 +++ b/ext/impl/psb_d_dia_scals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_aclsum.f90 b/ext/impl/psb_d_ell_aclsum.f90 index e0bfc18d8..83c46b446 100644 --- a/ext/impl/psb_d_ell_aclsum.f90 +++ b/ext/impl/psb_d_ell_aclsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_allocate_mnnz.f90 b/ext/impl/psb_d_ell_allocate_mnnz.f90 index 95e4558cc..bec159d62 100644 --- a/ext/impl/psb_d_ell_allocate_mnnz.f90 +++ b/ext/impl/psb_d_ell_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_arwsum.f90 b/ext/impl/psb_d_ell_arwsum.f90 index 6bf3b8881..224c24f59 100644 --- a/ext/impl/psb_d_ell_arwsum.f90 +++ b/ext/impl/psb_d_ell_arwsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_colsum.f90 b/ext/impl/psb_d_ell_colsum.f90 index 9eb30ca0b..862b39607 100644 --- a/ext/impl/psb_d_ell_colsum.f90 +++ b/ext/impl/psb_d_ell_colsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_csgetblk.f90 b/ext/impl/psb_d_ell_csgetblk.f90 index 9725518fc..c30adcfba 100644 --- a/ext/impl/psb_d_ell_csgetblk.f90 +++ b/ext/impl/psb_d_ell_csgetblk.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_csgetptn.f90 b/ext/impl/psb_d_ell_csgetptn.f90 index a050fe546..86748fb83 100644 --- a/ext/impl/psb_d_ell_csgetptn.f90 +++ b/ext/impl/psb_d_ell_csgetptn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_csgetrow.f90 b/ext/impl/psb_d_ell_csgetrow.f90 index 08e10cab1..1d54d1d9a 100644 --- a/ext/impl/psb_d_ell_csgetrow.f90 +++ b/ext/impl/psb_d_ell_csgetrow.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_csmm.f90 b/ext/impl/psb_d_ell_csmm.f90 index dca837c8d..21a889359 100644 --- a/ext/impl/psb_d_ell_csmm.f90 +++ b/ext/impl/psb_d_ell_csmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_csmv.f90 b/ext/impl/psb_d_ell_csmv.f90 index cb247432a..38453fecb 100644 --- a/ext/impl/psb_d_ell_csmv.f90 +++ b/ext/impl/psb_d_ell_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_csnm1.f90 b/ext/impl/psb_d_ell_csnm1.f90 index 418d97394..bcc15e7d8 100644 --- a/ext/impl/psb_d_ell_csnm1.f90 +++ b/ext/impl/psb_d_ell_csnm1.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_csnmi.f90 b/ext/impl/psb_d_ell_csnmi.f90 index b4e3d03e5..b76962047 100644 --- a/ext/impl/psb_d_ell_csnmi.f90 +++ b/ext/impl/psb_d_ell_csnmi.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_csput.f90 b/ext/impl/psb_d_ell_csput.f90 index d38d9d512..0e21676db 100644 --- a/ext/impl/psb_d_ell_csput.f90 +++ b/ext/impl/psb_d_ell_csput.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_cssm.f90 b/ext/impl/psb_d_ell_cssm.f90 index 3c8b5f217..1e2704c74 100644 --- a/ext/impl/psb_d_ell_cssm.f90 +++ b/ext/impl/psb_d_ell_cssm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_cssv.f90 b/ext/impl/psb_d_ell_cssv.f90 index 8c559e652..2541c917c 100644 --- a/ext/impl/psb_d_ell_cssv.f90 +++ b/ext/impl/psb_d_ell_cssv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_get_diag.f90 b/ext/impl/psb_d_ell_get_diag.f90 index 71998f7bc..c6b8d3d31 100644 --- a/ext/impl/psb_d_ell_get_diag.f90 +++ b/ext/impl/psb_d_ell_get_diag.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_maxval.f90 b/ext/impl/psb_d_ell_maxval.f90 index d0cb24d3e..b7f284e14 100644 --- a/ext/impl/psb_d_ell_maxval.f90 +++ b/ext/impl/psb_d_ell_maxval.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_mold.f90 b/ext/impl/psb_d_ell_mold.f90 index 48814f3c4..950ffd1b4 100644 --- a/ext/impl/psb_d_ell_mold.f90 +++ b/ext/impl/psb_d_ell_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_print.f90 b/ext/impl/psb_d_ell_print.f90 index cf5396622..c068e858b 100644 --- a/ext/impl/psb_d_ell_print.f90 +++ b/ext/impl/psb_d_ell_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_reallocate_nz.f90 b/ext/impl/psb_d_ell_reallocate_nz.f90 index 8f92ffadc..4af6927f3 100644 --- a/ext/impl/psb_d_ell_reallocate_nz.f90 +++ b/ext/impl/psb_d_ell_reallocate_nz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_reinit.f90 b/ext/impl/psb_d_ell_reinit.f90 index ab9a7ba22..2fcee3988 100644 --- a/ext/impl/psb_d_ell_reinit.f90 +++ b/ext/impl/psb_d_ell_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_rowsum.f90 b/ext/impl/psb_d_ell_rowsum.f90 index 782775d4c..d0c545828 100644 --- a/ext/impl/psb_d_ell_rowsum.f90 +++ b/ext/impl/psb_d_ell_rowsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_scal.f90 b/ext/impl/psb_d_ell_scal.f90 index 15be8a669..566982ea5 100644 --- a/ext/impl/psb_d_ell_scal.f90 +++ b/ext/impl/psb_d_ell_scal.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_scals.f90 b/ext/impl/psb_d_ell_scals.f90 index 501f42b03..f651798af 100644 --- a/ext/impl/psb_d_ell_scals.f90 +++ b/ext/impl/psb_d_ell_scals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_ell_trim.f90 b/ext/impl/psb_d_ell_trim.f90 index 8b1d52f71..e7aaa144e 100644 --- a/ext/impl/psb_d_ell_trim.f90 +++ b/ext/impl/psb_d_ell_trim.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hdia_allocate_mnnz.f90 b/ext/impl/psb_d_hdia_allocate_mnnz.f90 index e5721754e..7b2f9f504 100644 --- a/ext/impl/psb_d_hdia_allocate_mnnz.f90 +++ b/ext/impl/psb_d_hdia_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hdia_csmv.f90 b/ext/impl/psb_d_hdia_csmv.f90 index 825993425..4944dff82 100644 --- a/ext/impl/psb_d_hdia_csmv.f90 +++ b/ext/impl/psb_d_hdia_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hdia_mold.f90 b/ext/impl/psb_d_hdia_mold.f90 index cebedd441..8e8079a08 100644 --- a/ext/impl/psb_d_hdia_mold.f90 +++ b/ext/impl/psb_d_hdia_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hdia_print.f90 b/ext/impl/psb_d_hdia_print.f90 index 437532992..660658f93 100644 --- a/ext/impl/psb_d_hdia_print.f90 +++ b/ext/impl/psb_d_hdia_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_aclsum.f90 b/ext/impl/psb_d_hll_aclsum.f90 index 1f868edc8..3d32ef87d 100644 --- a/ext/impl/psb_d_hll_aclsum.f90 +++ b/ext/impl/psb_d_hll_aclsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_allocate_mnnz.f90 b/ext/impl/psb_d_hll_allocate_mnnz.f90 index f58d0e4a4..555d09b7e 100644 --- a/ext/impl/psb_d_hll_allocate_mnnz.f90 +++ b/ext/impl/psb_d_hll_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_arwsum.f90 b/ext/impl/psb_d_hll_arwsum.f90 index e5ae24fbd..d5870340f 100644 --- a/ext/impl/psb_d_hll_arwsum.f90 +++ b/ext/impl/psb_d_hll_arwsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_colsum.f90 b/ext/impl/psb_d_hll_colsum.f90 index 8c2020ec1..163ebf3b9 100644 --- a/ext/impl/psb_d_hll_colsum.f90 +++ b/ext/impl/psb_d_hll_colsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_csgetblk.f90 b/ext/impl/psb_d_hll_csgetblk.f90 index 185baf297..7d7538ec0 100644 --- a/ext/impl/psb_d_hll_csgetblk.f90 +++ b/ext/impl/psb_d_hll_csgetblk.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_csgetptn.f90 b/ext/impl/psb_d_hll_csgetptn.f90 index a7cdc1482..872060d87 100644 --- a/ext/impl/psb_d_hll_csgetptn.f90 +++ b/ext/impl/psb_d_hll_csgetptn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_csgetrow.f90 b/ext/impl/psb_d_hll_csgetrow.f90 index 38ed3f5d5..5ee914e84 100644 --- a/ext/impl/psb_d_hll_csgetrow.f90 +++ b/ext/impl/psb_d_hll_csgetrow.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_csmm.f90 b/ext/impl/psb_d_hll_csmm.f90 index 33f68ef82..1840e5229 100644 --- a/ext/impl/psb_d_hll_csmm.f90 +++ b/ext/impl/psb_d_hll_csmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_csmv.f90 b/ext/impl/psb_d_hll_csmv.f90 index f849a54a7..52816fd78 100644 --- a/ext/impl/psb_d_hll_csmv.f90 +++ b/ext/impl/psb_d_hll_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_csnm1.f90 b/ext/impl/psb_d_hll_csnm1.f90 index 4627a4d23..3aeed5d4f 100644 --- a/ext/impl/psb_d_hll_csnm1.f90 +++ b/ext/impl/psb_d_hll_csnm1.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_csnmi.f90 b/ext/impl/psb_d_hll_csnmi.f90 index 2b758fa38..66f17aa97 100644 --- a/ext/impl/psb_d_hll_csnmi.f90 +++ b/ext/impl/psb_d_hll_csnmi.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_csput.f90 b/ext/impl/psb_d_hll_csput.f90 index 064e6c598..8d02953a8 100644 --- a/ext/impl/psb_d_hll_csput.f90 +++ b/ext/impl/psb_d_hll_csput.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_cssm.f90 b/ext/impl/psb_d_hll_cssm.f90 index f4f6e3496..ee5ddc5ad 100644 --- a/ext/impl/psb_d_hll_cssm.f90 +++ b/ext/impl/psb_d_hll_cssm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_cssv.f90 b/ext/impl/psb_d_hll_cssv.f90 index 39da6115f..378fe8d3f 100644 --- a/ext/impl/psb_d_hll_cssv.f90 +++ b/ext/impl/psb_d_hll_cssv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_get_diag.f90 b/ext/impl/psb_d_hll_get_diag.f90 index 081a60255..2cc7462ca 100644 --- a/ext/impl/psb_d_hll_get_diag.f90 +++ b/ext/impl/psb_d_hll_get_diag.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_maxval.f90 b/ext/impl/psb_d_hll_maxval.f90 index 8408cc96a..119ba5054 100644 --- a/ext/impl/psb_d_hll_maxval.f90 +++ b/ext/impl/psb_d_hll_maxval.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_mold.f90 b/ext/impl/psb_d_hll_mold.f90 index e9d721f0d..cd0d77877 100644 --- a/ext/impl/psb_d_hll_mold.f90 +++ b/ext/impl/psb_d_hll_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_print.f90 b/ext/impl/psb_d_hll_print.f90 index 93c56d5cc..93c396231 100644 --- a/ext/impl/psb_d_hll_print.f90 +++ b/ext/impl/psb_d_hll_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_reallocate_nz.f90 b/ext/impl/psb_d_hll_reallocate_nz.f90 index 7abdd58f0..5761687a1 100644 --- a/ext/impl/psb_d_hll_reallocate_nz.f90 +++ b/ext/impl/psb_d_hll_reallocate_nz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_reinit.f90 b/ext/impl/psb_d_hll_reinit.f90 index 6a0f34fad..c7d66df90 100644 --- a/ext/impl/psb_d_hll_reinit.f90 +++ b/ext/impl/psb_d_hll_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_rowsum.f90 b/ext/impl/psb_d_hll_rowsum.f90 index bfa2d2e16..3f909bc96 100644 --- a/ext/impl/psb_d_hll_rowsum.f90 +++ b/ext/impl/psb_d_hll_rowsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_scal.f90 b/ext/impl/psb_d_hll_scal.f90 index ed9dd9cec..7a2231b65 100644 --- a/ext/impl/psb_d_hll_scal.f90 +++ b/ext/impl/psb_d_hll_scal.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_hll_scals.f90 b/ext/impl/psb_d_hll_scals.f90 index 8e05cddd3..ebe80e77e 100644 --- a/ext/impl/psb_d_hll_scals.f90 +++ b/ext/impl/psb_d_hll_scals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_mv_dia_from_coo.f90 b/ext/impl/psb_d_mv_dia_from_coo.f90 index e38e975a0..4fe6670ce 100644 --- a/ext/impl/psb_d_mv_dia_from_coo.f90 +++ b/ext/impl/psb_d_mv_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_mv_dia_to_coo.f90 b/ext/impl/psb_d_mv_dia_to_coo.f90 index d8ac7a692..83e102334 100644 --- a/ext/impl/psb_d_mv_dia_to_coo.f90 +++ b/ext/impl/psb_d_mv_dia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_mv_ell_from_coo.f90 b/ext/impl/psb_d_mv_ell_from_coo.f90 index 8f98daaba..5e09dc5d9 100644 --- a/ext/impl/psb_d_mv_ell_from_coo.f90 +++ b/ext/impl/psb_d_mv_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_mv_ell_from_fmt.f90 b/ext/impl/psb_d_mv_ell_from_fmt.f90 index 6589fd0a5..630c6db22 100644 --- a/ext/impl/psb_d_mv_ell_from_fmt.f90 +++ b/ext/impl/psb_d_mv_ell_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_mv_ell_to_coo.f90 b/ext/impl/psb_d_mv_ell_to_coo.f90 index a1220a6e0..11944346f 100644 --- a/ext/impl/psb_d_mv_ell_to_coo.f90 +++ b/ext/impl/psb_d_mv_ell_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_mv_ell_to_fmt.f90 b/ext/impl/psb_d_mv_ell_to_fmt.f90 index a59753601..4f6447d04 100644 --- a/ext/impl/psb_d_mv_ell_to_fmt.f90 +++ b/ext/impl/psb_d_mv_ell_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_mv_hdia_from_coo.f90 b/ext/impl/psb_d_mv_hdia_from_coo.f90 index 68caea345..bcb2880a4 100644 --- a/ext/impl/psb_d_mv_hdia_from_coo.f90 +++ b/ext/impl/psb_d_mv_hdia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_mv_hdia_to_coo.f90 b/ext/impl/psb_d_mv_hdia_to_coo.f90 index 595e20a26..95d47bc41 100644 --- a/ext/impl/psb_d_mv_hdia_to_coo.f90 +++ b/ext/impl/psb_d_mv_hdia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_mv_hll_from_coo.f90 b/ext/impl/psb_d_mv_hll_from_coo.f90 index 78faed4b1..de6775a26 100644 --- a/ext/impl/psb_d_mv_hll_from_coo.f90 +++ b/ext/impl/psb_d_mv_hll_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_mv_hll_from_fmt.f90 b/ext/impl/psb_d_mv_hll_from_fmt.f90 index 76a2f2fb2..1a202b921 100644 --- a/ext/impl/psb_d_mv_hll_from_fmt.f90 +++ b/ext/impl/psb_d_mv_hll_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_mv_hll_to_coo.f90 b/ext/impl/psb_d_mv_hll_to_coo.f90 index fbc9111b9..6423ed586 100644 --- a/ext/impl/psb_d_mv_hll_to_coo.f90 +++ b/ext/impl/psb_d_mv_hll_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_d_mv_hll_to_fmt.f90 b/ext/impl/psb_d_mv_hll_to_fmt.f90 index 8022b2e5b..929039728 100644 --- a/ext/impl/psb_d_mv_hll_to_fmt.f90 +++ b/ext/impl/psb_d_mv_hll_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_cp_dia_from_coo.f90 b/ext/impl/psb_s_cp_dia_from_coo.f90 index 6d9a0749d..620d80f35 100644 --- a/ext/impl/psb_s_cp_dia_from_coo.f90 +++ b/ext/impl/psb_s_cp_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_cp_dia_to_coo.f90 b/ext/impl/psb_s_cp_dia_to_coo.f90 index c0cd5d325..4c103287d 100644 --- a/ext/impl/psb_s_cp_dia_to_coo.f90 +++ b/ext/impl/psb_s_cp_dia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_cp_ell_from_coo.f90 b/ext/impl/psb_s_cp_ell_from_coo.f90 index f178a05c8..afe344702 100644 --- a/ext/impl/psb_s_cp_ell_from_coo.f90 +++ b/ext/impl/psb_s_cp_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_cp_ell_from_fmt.f90 b/ext/impl/psb_s_cp_ell_from_fmt.f90 index bffe3d854..63504c976 100644 --- a/ext/impl/psb_s_cp_ell_from_fmt.f90 +++ b/ext/impl/psb_s_cp_ell_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_cp_ell_to_coo.f90 b/ext/impl/psb_s_cp_ell_to_coo.f90 index b8acddfcd..b866edcd2 100644 --- a/ext/impl/psb_s_cp_ell_to_coo.f90 +++ b/ext/impl/psb_s_cp_ell_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_cp_ell_to_fmt.f90 b/ext/impl/psb_s_cp_ell_to_fmt.f90 index 58fe3756e..c1beb7441 100644 --- a/ext/impl/psb_s_cp_ell_to_fmt.f90 +++ b/ext/impl/psb_s_cp_ell_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_cp_hdia_from_coo.f90 b/ext/impl/psb_s_cp_hdia_from_coo.f90 index b3d427d95..5cd7353c8 100644 --- a/ext/impl/psb_s_cp_hdia_from_coo.f90 +++ b/ext/impl/psb_s_cp_hdia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_cp_hdia_to_coo.f90 b/ext/impl/psb_s_cp_hdia_to_coo.f90 index 8e90e236d..9648e11ca 100644 --- a/ext/impl/psb_s_cp_hdia_to_coo.f90 +++ b/ext/impl/psb_s_cp_hdia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_cp_hll_from_coo.f90 b/ext/impl/psb_s_cp_hll_from_coo.f90 index 9d75f994b..c3ba656f9 100644 --- a/ext/impl/psb_s_cp_hll_from_coo.f90 +++ b/ext/impl/psb_s_cp_hll_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_cp_hll_from_fmt.f90 b/ext/impl/psb_s_cp_hll_from_fmt.f90 index 8f0109029..8e94e7004 100644 --- a/ext/impl/psb_s_cp_hll_from_fmt.f90 +++ b/ext/impl/psb_s_cp_hll_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_cp_hll_to_coo.f90 b/ext/impl/psb_s_cp_hll_to_coo.f90 index 74502ba29..944bb69bd 100644 --- a/ext/impl/psb_s_cp_hll_to_coo.f90 +++ b/ext/impl/psb_s_cp_hll_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_cp_hll_to_fmt.f90 b/ext/impl/psb_s_cp_hll_to_fmt.f90 index f7adaa542..b701e7494 100644 --- a/ext/impl/psb_s_cp_hll_to_fmt.f90 +++ b/ext/impl/psb_s_cp_hll_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_aclsum.f90 b/ext/impl/psb_s_dia_aclsum.f90 index 718a24243..7781f5ed9 100644 --- a/ext/impl/psb_s_dia_aclsum.f90 +++ b/ext/impl/psb_s_dia_aclsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_allocate_mnnz.f90 b/ext/impl/psb_s_dia_allocate_mnnz.f90 index df56c4a65..fa434c100 100644 --- a/ext/impl/psb_s_dia_allocate_mnnz.f90 +++ b/ext/impl/psb_s_dia_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_arwsum.f90 b/ext/impl/psb_s_dia_arwsum.f90 index 5a974bbfa..8174c71ae 100644 --- a/ext/impl/psb_s_dia_arwsum.f90 +++ b/ext/impl/psb_s_dia_arwsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_colsum.f90 b/ext/impl/psb_s_dia_colsum.f90 index e60eb88f9..6f671bcc3 100644 --- a/ext/impl/psb_s_dia_colsum.f90 +++ b/ext/impl/psb_s_dia_colsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_csgetptn.f90 b/ext/impl/psb_s_dia_csgetptn.f90 index f946eb73a..93f8d12a2 100644 --- a/ext/impl/psb_s_dia_csgetptn.f90 +++ b/ext/impl/psb_s_dia_csgetptn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_csgetrow.f90 b/ext/impl/psb_s_dia_csgetrow.f90 index b79e2470a..615bca558 100644 --- a/ext/impl/psb_s_dia_csgetrow.f90 +++ b/ext/impl/psb_s_dia_csgetrow.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_csmm.f90 b/ext/impl/psb_s_dia_csmm.f90 index 9f586dbb2..079f7091f 100644 --- a/ext/impl/psb_s_dia_csmm.f90 +++ b/ext/impl/psb_s_dia_csmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_csmv.f90 b/ext/impl/psb_s_dia_csmv.f90 index 1a23932e5..e7d64d806 100644 --- a/ext/impl/psb_s_dia_csmv.f90 +++ b/ext/impl/psb_s_dia_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_get_diag.f90 b/ext/impl/psb_s_dia_get_diag.f90 index 5909c72a9..3dc35378d 100644 --- a/ext/impl/psb_s_dia_get_diag.f90 +++ b/ext/impl/psb_s_dia_get_diag.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_maxval.f90 b/ext/impl/psb_s_dia_maxval.f90 index 5f6726440..4a95733a9 100644 --- a/ext/impl/psb_s_dia_maxval.f90 +++ b/ext/impl/psb_s_dia_maxval.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_mold.f90 b/ext/impl/psb_s_dia_mold.f90 index a65379a47..05d8a8276 100644 --- a/ext/impl/psb_s_dia_mold.f90 +++ b/ext/impl/psb_s_dia_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_print.f90 b/ext/impl/psb_s_dia_print.f90 index a0de1ba84..448465304 100644 --- a/ext/impl/psb_s_dia_print.f90 +++ b/ext/impl/psb_s_dia_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_reallocate_nz.f90 b/ext/impl/psb_s_dia_reallocate_nz.f90 index d37d9e5f0..5fbbbba43 100644 --- a/ext/impl/psb_s_dia_reallocate_nz.f90 +++ b/ext/impl/psb_s_dia_reallocate_nz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_reinit.f90 b/ext/impl/psb_s_dia_reinit.f90 index dd1097834..d270013b8 100644 --- a/ext/impl/psb_s_dia_reinit.f90 +++ b/ext/impl/psb_s_dia_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_rowsum.f90 b/ext/impl/psb_s_dia_rowsum.f90 index 3f32a2b28..22b246e23 100644 --- a/ext/impl/psb_s_dia_rowsum.f90 +++ b/ext/impl/psb_s_dia_rowsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_scal.f90 b/ext/impl/psb_s_dia_scal.f90 index 7ccf881a2..91e619c39 100644 --- a/ext/impl/psb_s_dia_scal.f90 +++ b/ext/impl/psb_s_dia_scal.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_dia_scals.f90 b/ext/impl/psb_s_dia_scals.f90 index da1bc94e4..142afaf75 100644 --- a/ext/impl/psb_s_dia_scals.f90 +++ b/ext/impl/psb_s_dia_scals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_aclsum.f90 b/ext/impl/psb_s_ell_aclsum.f90 index 2eea0cc9a..e0634ac4c 100644 --- a/ext/impl/psb_s_ell_aclsum.f90 +++ b/ext/impl/psb_s_ell_aclsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_allocate_mnnz.f90 b/ext/impl/psb_s_ell_allocate_mnnz.f90 index fd9f1b490..6cd47c33b 100644 --- a/ext/impl/psb_s_ell_allocate_mnnz.f90 +++ b/ext/impl/psb_s_ell_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_arwsum.f90 b/ext/impl/psb_s_ell_arwsum.f90 index a47f87215..00f4154cf 100644 --- a/ext/impl/psb_s_ell_arwsum.f90 +++ b/ext/impl/psb_s_ell_arwsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_colsum.f90 b/ext/impl/psb_s_ell_colsum.f90 index 0924d8a97..8ca6e53c5 100644 --- a/ext/impl/psb_s_ell_colsum.f90 +++ b/ext/impl/psb_s_ell_colsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_csgetblk.f90 b/ext/impl/psb_s_ell_csgetblk.f90 index 5468e93c5..df5c118f0 100644 --- a/ext/impl/psb_s_ell_csgetblk.f90 +++ b/ext/impl/psb_s_ell_csgetblk.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_csgetptn.f90 b/ext/impl/psb_s_ell_csgetptn.f90 index 074637574..fe21394c0 100644 --- a/ext/impl/psb_s_ell_csgetptn.f90 +++ b/ext/impl/psb_s_ell_csgetptn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_csgetrow.f90 b/ext/impl/psb_s_ell_csgetrow.f90 index 0164fadba..5d98b7491 100644 --- a/ext/impl/psb_s_ell_csgetrow.f90 +++ b/ext/impl/psb_s_ell_csgetrow.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_csmm.f90 b/ext/impl/psb_s_ell_csmm.f90 index 1abce00ff..8dafa2f48 100644 --- a/ext/impl/psb_s_ell_csmm.f90 +++ b/ext/impl/psb_s_ell_csmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_csmv.f90 b/ext/impl/psb_s_ell_csmv.f90 index 35151439b..e1aceaf37 100644 --- a/ext/impl/psb_s_ell_csmv.f90 +++ b/ext/impl/psb_s_ell_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_csnm1.f90 b/ext/impl/psb_s_ell_csnm1.f90 index d4d604dfe..6ac3d908e 100644 --- a/ext/impl/psb_s_ell_csnm1.f90 +++ b/ext/impl/psb_s_ell_csnm1.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_csnmi.f90 b/ext/impl/psb_s_ell_csnmi.f90 index 1df9bafaf..69d657c34 100644 --- a/ext/impl/psb_s_ell_csnmi.f90 +++ b/ext/impl/psb_s_ell_csnmi.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_csput.f90 b/ext/impl/psb_s_ell_csput.f90 index c0d69067c..7c2f84116 100644 --- a/ext/impl/psb_s_ell_csput.f90 +++ b/ext/impl/psb_s_ell_csput.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_cssm.f90 b/ext/impl/psb_s_ell_cssm.f90 index ca50fa359..2c4594c78 100644 --- a/ext/impl/psb_s_ell_cssm.f90 +++ b/ext/impl/psb_s_ell_cssm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_cssv.f90 b/ext/impl/psb_s_ell_cssv.f90 index 94ac01044..7b11ccf8d 100644 --- a/ext/impl/psb_s_ell_cssv.f90 +++ b/ext/impl/psb_s_ell_cssv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_get_diag.f90 b/ext/impl/psb_s_ell_get_diag.f90 index fb91a2290..07207f585 100644 --- a/ext/impl/psb_s_ell_get_diag.f90 +++ b/ext/impl/psb_s_ell_get_diag.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_maxval.f90 b/ext/impl/psb_s_ell_maxval.f90 index 6e2635b88..9ba1ebf8f 100644 --- a/ext/impl/psb_s_ell_maxval.f90 +++ b/ext/impl/psb_s_ell_maxval.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_mold.f90 b/ext/impl/psb_s_ell_mold.f90 index 4d137112d..e7a24b2af 100644 --- a/ext/impl/psb_s_ell_mold.f90 +++ b/ext/impl/psb_s_ell_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_print.f90 b/ext/impl/psb_s_ell_print.f90 index aec15a6d7..93fdadca6 100644 --- a/ext/impl/psb_s_ell_print.f90 +++ b/ext/impl/psb_s_ell_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_reallocate_nz.f90 b/ext/impl/psb_s_ell_reallocate_nz.f90 index ff7dabdae..4895f45ab 100644 --- a/ext/impl/psb_s_ell_reallocate_nz.f90 +++ b/ext/impl/psb_s_ell_reallocate_nz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_reinit.f90 b/ext/impl/psb_s_ell_reinit.f90 index 088e83986..f6442dc66 100644 --- a/ext/impl/psb_s_ell_reinit.f90 +++ b/ext/impl/psb_s_ell_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_rowsum.f90 b/ext/impl/psb_s_ell_rowsum.f90 index 092329c9c..2fc556753 100644 --- a/ext/impl/psb_s_ell_rowsum.f90 +++ b/ext/impl/psb_s_ell_rowsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_scal.f90 b/ext/impl/psb_s_ell_scal.f90 index 7f39f63d7..bcab2e920 100644 --- a/ext/impl/psb_s_ell_scal.f90 +++ b/ext/impl/psb_s_ell_scal.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_scals.f90 b/ext/impl/psb_s_ell_scals.f90 index 4bc77626a..66952cfe4 100644 --- a/ext/impl/psb_s_ell_scals.f90 +++ b/ext/impl/psb_s_ell_scals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_ell_trim.f90 b/ext/impl/psb_s_ell_trim.f90 index 758a8bb50..333cd1080 100644 --- a/ext/impl/psb_s_ell_trim.f90 +++ b/ext/impl/psb_s_ell_trim.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hdia_allocate_mnnz.f90 b/ext/impl/psb_s_hdia_allocate_mnnz.f90 index 2c4e16fc4..aba20270f 100644 --- a/ext/impl/psb_s_hdia_allocate_mnnz.f90 +++ b/ext/impl/psb_s_hdia_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hdia_csmv.f90 b/ext/impl/psb_s_hdia_csmv.f90 index d945f9643..8f45a82b1 100644 --- a/ext/impl/psb_s_hdia_csmv.f90 +++ b/ext/impl/psb_s_hdia_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hdia_mold.f90 b/ext/impl/psb_s_hdia_mold.f90 index a62630c06..d3990aae3 100644 --- a/ext/impl/psb_s_hdia_mold.f90 +++ b/ext/impl/psb_s_hdia_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hdia_print.f90 b/ext/impl/psb_s_hdia_print.f90 index f4b927bcf..c83e18db8 100644 --- a/ext/impl/psb_s_hdia_print.f90 +++ b/ext/impl/psb_s_hdia_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_aclsum.f90 b/ext/impl/psb_s_hll_aclsum.f90 index cf75dfb2c..d23ad0154 100644 --- a/ext/impl/psb_s_hll_aclsum.f90 +++ b/ext/impl/psb_s_hll_aclsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_allocate_mnnz.f90 b/ext/impl/psb_s_hll_allocate_mnnz.f90 index 549eccb48..7249d8261 100644 --- a/ext/impl/psb_s_hll_allocate_mnnz.f90 +++ b/ext/impl/psb_s_hll_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_arwsum.f90 b/ext/impl/psb_s_hll_arwsum.f90 index b93efb12e..5ec343bf8 100644 --- a/ext/impl/psb_s_hll_arwsum.f90 +++ b/ext/impl/psb_s_hll_arwsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_colsum.f90 b/ext/impl/psb_s_hll_colsum.f90 index 02cceac2f..2a9a1300c 100644 --- a/ext/impl/psb_s_hll_colsum.f90 +++ b/ext/impl/psb_s_hll_colsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_csgetblk.f90 b/ext/impl/psb_s_hll_csgetblk.f90 index c925e3a2e..2bc896655 100644 --- a/ext/impl/psb_s_hll_csgetblk.f90 +++ b/ext/impl/psb_s_hll_csgetblk.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_csgetptn.f90 b/ext/impl/psb_s_hll_csgetptn.f90 index ccb1b6a18..a346214a4 100644 --- a/ext/impl/psb_s_hll_csgetptn.f90 +++ b/ext/impl/psb_s_hll_csgetptn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_csgetrow.f90 b/ext/impl/psb_s_hll_csgetrow.f90 index 9c87313d3..5ce408bff 100644 --- a/ext/impl/psb_s_hll_csgetrow.f90 +++ b/ext/impl/psb_s_hll_csgetrow.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_csmm.f90 b/ext/impl/psb_s_hll_csmm.f90 index 985d8e34c..30d429745 100644 --- a/ext/impl/psb_s_hll_csmm.f90 +++ b/ext/impl/psb_s_hll_csmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_csmv.f90 b/ext/impl/psb_s_hll_csmv.f90 index 84f0e391e..a3ead4c5c 100644 --- a/ext/impl/psb_s_hll_csmv.f90 +++ b/ext/impl/psb_s_hll_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_csnm1.f90 b/ext/impl/psb_s_hll_csnm1.f90 index 6e7450810..439532ea8 100644 --- a/ext/impl/psb_s_hll_csnm1.f90 +++ b/ext/impl/psb_s_hll_csnm1.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_csnmi.f90 b/ext/impl/psb_s_hll_csnmi.f90 index 3be15f9b3..1838c653d 100644 --- a/ext/impl/psb_s_hll_csnmi.f90 +++ b/ext/impl/psb_s_hll_csnmi.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_csput.f90 b/ext/impl/psb_s_hll_csput.f90 index b12678d49..fd206112a 100644 --- a/ext/impl/psb_s_hll_csput.f90 +++ b/ext/impl/psb_s_hll_csput.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_cssm.f90 b/ext/impl/psb_s_hll_cssm.f90 index 30c77c8fb..361bfe9c9 100644 --- a/ext/impl/psb_s_hll_cssm.f90 +++ b/ext/impl/psb_s_hll_cssm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_cssv.f90 b/ext/impl/psb_s_hll_cssv.f90 index 899b30eea..197225bbe 100644 --- a/ext/impl/psb_s_hll_cssv.f90 +++ b/ext/impl/psb_s_hll_cssv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_get_diag.f90 b/ext/impl/psb_s_hll_get_diag.f90 index fb4e473bf..745898364 100644 --- a/ext/impl/psb_s_hll_get_diag.f90 +++ b/ext/impl/psb_s_hll_get_diag.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_maxval.f90 b/ext/impl/psb_s_hll_maxval.f90 index 846253288..fafe9fb66 100644 --- a/ext/impl/psb_s_hll_maxval.f90 +++ b/ext/impl/psb_s_hll_maxval.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_mold.f90 b/ext/impl/psb_s_hll_mold.f90 index eb04ccd90..4a5adb34f 100644 --- a/ext/impl/psb_s_hll_mold.f90 +++ b/ext/impl/psb_s_hll_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_print.f90 b/ext/impl/psb_s_hll_print.f90 index fb6bb38d9..6dbc8557c 100644 --- a/ext/impl/psb_s_hll_print.f90 +++ b/ext/impl/psb_s_hll_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_reallocate_nz.f90 b/ext/impl/psb_s_hll_reallocate_nz.f90 index f7a3076f8..b727a1eb8 100644 --- a/ext/impl/psb_s_hll_reallocate_nz.f90 +++ b/ext/impl/psb_s_hll_reallocate_nz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_reinit.f90 b/ext/impl/psb_s_hll_reinit.f90 index 170abe086..65168b714 100644 --- a/ext/impl/psb_s_hll_reinit.f90 +++ b/ext/impl/psb_s_hll_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_rowsum.f90 b/ext/impl/psb_s_hll_rowsum.f90 index c74846980..cbe38ca70 100644 --- a/ext/impl/psb_s_hll_rowsum.f90 +++ b/ext/impl/psb_s_hll_rowsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_scal.f90 b/ext/impl/psb_s_hll_scal.f90 index c8f3ddd5f..60624ad8d 100644 --- a/ext/impl/psb_s_hll_scal.f90 +++ b/ext/impl/psb_s_hll_scal.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_hll_scals.f90 b/ext/impl/psb_s_hll_scals.f90 index 8f823a204..255c07f69 100644 --- a/ext/impl/psb_s_hll_scals.f90 +++ b/ext/impl/psb_s_hll_scals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_mv_dia_from_coo.f90 b/ext/impl/psb_s_mv_dia_from_coo.f90 index d7dcfc1bc..2289b677a 100644 --- a/ext/impl/psb_s_mv_dia_from_coo.f90 +++ b/ext/impl/psb_s_mv_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_mv_dia_to_coo.f90 b/ext/impl/psb_s_mv_dia_to_coo.f90 index c0944b214..343a8cf25 100644 --- a/ext/impl/psb_s_mv_dia_to_coo.f90 +++ b/ext/impl/psb_s_mv_dia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_mv_ell_from_coo.f90 b/ext/impl/psb_s_mv_ell_from_coo.f90 index 90965e418..fe78947e1 100644 --- a/ext/impl/psb_s_mv_ell_from_coo.f90 +++ b/ext/impl/psb_s_mv_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_mv_ell_from_fmt.f90 b/ext/impl/psb_s_mv_ell_from_fmt.f90 index 03ebf8e4e..ad968275d 100644 --- a/ext/impl/psb_s_mv_ell_from_fmt.f90 +++ b/ext/impl/psb_s_mv_ell_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_mv_ell_to_coo.f90 b/ext/impl/psb_s_mv_ell_to_coo.f90 index 151cbeff6..3fbe8be58 100644 --- a/ext/impl/psb_s_mv_ell_to_coo.f90 +++ b/ext/impl/psb_s_mv_ell_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_mv_ell_to_fmt.f90 b/ext/impl/psb_s_mv_ell_to_fmt.f90 index 66f335085..acc2ad1fa 100644 --- a/ext/impl/psb_s_mv_ell_to_fmt.f90 +++ b/ext/impl/psb_s_mv_ell_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_mv_hdia_from_coo.f90 b/ext/impl/psb_s_mv_hdia_from_coo.f90 index 88765079d..ec3e352dd 100644 --- a/ext/impl/psb_s_mv_hdia_from_coo.f90 +++ b/ext/impl/psb_s_mv_hdia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_mv_hdia_to_coo.f90 b/ext/impl/psb_s_mv_hdia_to_coo.f90 index 56399b2ae..d574686d7 100644 --- a/ext/impl/psb_s_mv_hdia_to_coo.f90 +++ b/ext/impl/psb_s_mv_hdia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_mv_hll_from_coo.f90 b/ext/impl/psb_s_mv_hll_from_coo.f90 index c8e460860..55938296d 100644 --- a/ext/impl/psb_s_mv_hll_from_coo.f90 +++ b/ext/impl/psb_s_mv_hll_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_mv_hll_from_fmt.f90 b/ext/impl/psb_s_mv_hll_from_fmt.f90 index 19bda0a6f..7cb40597b 100644 --- a/ext/impl/psb_s_mv_hll_from_fmt.f90 +++ b/ext/impl/psb_s_mv_hll_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_mv_hll_to_coo.f90 b/ext/impl/psb_s_mv_hll_to_coo.f90 index d36286a58..bfb8a7aa0 100644 --- a/ext/impl/psb_s_mv_hll_to_coo.f90 +++ b/ext/impl/psb_s_mv_hll_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_s_mv_hll_to_fmt.f90 b/ext/impl/psb_s_mv_hll_to_fmt.f90 index 17618f69b..cdbf09964 100644 --- a/ext/impl/psb_s_mv_hll_to_fmt.f90 +++ b/ext/impl/psb_s_mv_hll_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_cp_dia_from_coo.f90 b/ext/impl/psb_z_cp_dia_from_coo.f90 index e87bfb349..85614118c 100644 --- a/ext/impl/psb_z_cp_dia_from_coo.f90 +++ b/ext/impl/psb_z_cp_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_cp_dia_to_coo.f90 b/ext/impl/psb_z_cp_dia_to_coo.f90 index 26fac30b3..570aeca49 100644 --- a/ext/impl/psb_z_cp_dia_to_coo.f90 +++ b/ext/impl/psb_z_cp_dia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_cp_ell_from_coo.f90 b/ext/impl/psb_z_cp_ell_from_coo.f90 index 7559621d3..1c4bd8c55 100644 --- a/ext/impl/psb_z_cp_ell_from_coo.f90 +++ b/ext/impl/psb_z_cp_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_cp_ell_from_fmt.f90 b/ext/impl/psb_z_cp_ell_from_fmt.f90 index 6d63b64e8..606dc6611 100644 --- a/ext/impl/psb_z_cp_ell_from_fmt.f90 +++ b/ext/impl/psb_z_cp_ell_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_cp_ell_to_coo.f90 b/ext/impl/psb_z_cp_ell_to_coo.f90 index 38a1696ba..04e1c7eef 100644 --- a/ext/impl/psb_z_cp_ell_to_coo.f90 +++ b/ext/impl/psb_z_cp_ell_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_cp_ell_to_fmt.f90 b/ext/impl/psb_z_cp_ell_to_fmt.f90 index 7fb64a90e..ea443a0fa 100644 --- a/ext/impl/psb_z_cp_ell_to_fmt.f90 +++ b/ext/impl/psb_z_cp_ell_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_cp_hdia_from_coo.f90 b/ext/impl/psb_z_cp_hdia_from_coo.f90 index ed77914e6..4f46bafb9 100644 --- a/ext/impl/psb_z_cp_hdia_from_coo.f90 +++ b/ext/impl/psb_z_cp_hdia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_cp_hdia_to_coo.f90 b/ext/impl/psb_z_cp_hdia_to_coo.f90 index c0544ff01..87a3f1d7b 100644 --- a/ext/impl/psb_z_cp_hdia_to_coo.f90 +++ b/ext/impl/psb_z_cp_hdia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_cp_hll_from_coo.f90 b/ext/impl/psb_z_cp_hll_from_coo.f90 index 15a8d1c2f..96e5ac602 100644 --- a/ext/impl/psb_z_cp_hll_from_coo.f90 +++ b/ext/impl/psb_z_cp_hll_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_cp_hll_from_fmt.f90 b/ext/impl/psb_z_cp_hll_from_fmt.f90 index 3bdb22716..7bdde1f38 100644 --- a/ext/impl/psb_z_cp_hll_from_fmt.f90 +++ b/ext/impl/psb_z_cp_hll_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_cp_hll_to_coo.f90 b/ext/impl/psb_z_cp_hll_to_coo.f90 index 409fe7b5e..817d54475 100644 --- a/ext/impl/psb_z_cp_hll_to_coo.f90 +++ b/ext/impl/psb_z_cp_hll_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_cp_hll_to_fmt.f90 b/ext/impl/psb_z_cp_hll_to_fmt.f90 index b0417c923..b1c321bcf 100644 --- a/ext/impl/psb_z_cp_hll_to_fmt.f90 +++ b/ext/impl/psb_z_cp_hll_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_aclsum.f90 b/ext/impl/psb_z_dia_aclsum.f90 index 5aed7ff03..da9df10da 100644 --- a/ext/impl/psb_z_dia_aclsum.f90 +++ b/ext/impl/psb_z_dia_aclsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_allocate_mnnz.f90 b/ext/impl/psb_z_dia_allocate_mnnz.f90 index e9c614f65..8f05fb19b 100644 --- a/ext/impl/psb_z_dia_allocate_mnnz.f90 +++ b/ext/impl/psb_z_dia_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_arwsum.f90 b/ext/impl/psb_z_dia_arwsum.f90 index 428053499..f9fa8cc96 100644 --- a/ext/impl/psb_z_dia_arwsum.f90 +++ b/ext/impl/psb_z_dia_arwsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_colsum.f90 b/ext/impl/psb_z_dia_colsum.f90 index 69919736f..623142b22 100644 --- a/ext/impl/psb_z_dia_colsum.f90 +++ b/ext/impl/psb_z_dia_colsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_csgetptn.f90 b/ext/impl/psb_z_dia_csgetptn.f90 index d63304f87..fd805e738 100644 --- a/ext/impl/psb_z_dia_csgetptn.f90 +++ b/ext/impl/psb_z_dia_csgetptn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_csgetrow.f90 b/ext/impl/psb_z_dia_csgetrow.f90 index 6571264e6..ef69265ae 100644 --- a/ext/impl/psb_z_dia_csgetrow.f90 +++ b/ext/impl/psb_z_dia_csgetrow.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_csmm.f90 b/ext/impl/psb_z_dia_csmm.f90 index cbebd10ec..1e4a55314 100644 --- a/ext/impl/psb_z_dia_csmm.f90 +++ b/ext/impl/psb_z_dia_csmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_csmv.f90 b/ext/impl/psb_z_dia_csmv.f90 index 9d1f5a2ae..9d37ff878 100644 --- a/ext/impl/psb_z_dia_csmv.f90 +++ b/ext/impl/psb_z_dia_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_get_diag.f90 b/ext/impl/psb_z_dia_get_diag.f90 index 9b4039233..f8a3c67b4 100644 --- a/ext/impl/psb_z_dia_get_diag.f90 +++ b/ext/impl/psb_z_dia_get_diag.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_maxval.f90 b/ext/impl/psb_z_dia_maxval.f90 index d3518c17b..fe845c7d6 100644 --- a/ext/impl/psb_z_dia_maxval.f90 +++ b/ext/impl/psb_z_dia_maxval.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_mold.f90 b/ext/impl/psb_z_dia_mold.f90 index 421af2841..aa212a4e8 100644 --- a/ext/impl/psb_z_dia_mold.f90 +++ b/ext/impl/psb_z_dia_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_print.f90 b/ext/impl/psb_z_dia_print.f90 index 1f7853ef2..bc5bffd65 100644 --- a/ext/impl/psb_z_dia_print.f90 +++ b/ext/impl/psb_z_dia_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_reallocate_nz.f90 b/ext/impl/psb_z_dia_reallocate_nz.f90 index 2d204a642..eac201d19 100644 --- a/ext/impl/psb_z_dia_reallocate_nz.f90 +++ b/ext/impl/psb_z_dia_reallocate_nz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_reinit.f90 b/ext/impl/psb_z_dia_reinit.f90 index 0f58a9ed7..2e6315bc7 100644 --- a/ext/impl/psb_z_dia_reinit.f90 +++ b/ext/impl/psb_z_dia_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_rowsum.f90 b/ext/impl/psb_z_dia_rowsum.f90 index 6918ada1a..3c5e53a19 100644 --- a/ext/impl/psb_z_dia_rowsum.f90 +++ b/ext/impl/psb_z_dia_rowsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_scal.f90 b/ext/impl/psb_z_dia_scal.f90 index 65957e607..6f07e9819 100644 --- a/ext/impl/psb_z_dia_scal.f90 +++ b/ext/impl/psb_z_dia_scal.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_dia_scals.f90 b/ext/impl/psb_z_dia_scals.f90 index 895763d9e..fd9a67f2a 100644 --- a/ext/impl/psb_z_dia_scals.f90 +++ b/ext/impl/psb_z_dia_scals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_aclsum.f90 b/ext/impl/psb_z_ell_aclsum.f90 index b03121fd5..d2ffd4c77 100644 --- a/ext/impl/psb_z_ell_aclsum.f90 +++ b/ext/impl/psb_z_ell_aclsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_allocate_mnnz.f90 b/ext/impl/psb_z_ell_allocate_mnnz.f90 index f7f7f67e4..a707f5b8e 100644 --- a/ext/impl/psb_z_ell_allocate_mnnz.f90 +++ b/ext/impl/psb_z_ell_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_arwsum.f90 b/ext/impl/psb_z_ell_arwsum.f90 index 9d4b4949a..52f9e1044 100644 --- a/ext/impl/psb_z_ell_arwsum.f90 +++ b/ext/impl/psb_z_ell_arwsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_colsum.f90 b/ext/impl/psb_z_ell_colsum.f90 index e9c2bc0b2..e34fd6247 100644 --- a/ext/impl/psb_z_ell_colsum.f90 +++ b/ext/impl/psb_z_ell_colsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_csgetblk.f90 b/ext/impl/psb_z_ell_csgetblk.f90 index d2e56e1db..e6e4fcc45 100644 --- a/ext/impl/psb_z_ell_csgetblk.f90 +++ b/ext/impl/psb_z_ell_csgetblk.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_csgetptn.f90 b/ext/impl/psb_z_ell_csgetptn.f90 index 97ed7d90c..d2aec0161 100644 --- a/ext/impl/psb_z_ell_csgetptn.f90 +++ b/ext/impl/psb_z_ell_csgetptn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_csgetrow.f90 b/ext/impl/psb_z_ell_csgetrow.f90 index 5716f9c1b..c6d0941ad 100644 --- a/ext/impl/psb_z_ell_csgetrow.f90 +++ b/ext/impl/psb_z_ell_csgetrow.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_csmm.f90 b/ext/impl/psb_z_ell_csmm.f90 index 33c7bdb95..ad076c655 100644 --- a/ext/impl/psb_z_ell_csmm.f90 +++ b/ext/impl/psb_z_ell_csmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_csmv.f90 b/ext/impl/psb_z_ell_csmv.f90 index 2ed4042bd..e0a2df4df 100644 --- a/ext/impl/psb_z_ell_csmv.f90 +++ b/ext/impl/psb_z_ell_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_csnm1.f90 b/ext/impl/psb_z_ell_csnm1.f90 index 9669b20bf..ebcf5ca7a 100644 --- a/ext/impl/psb_z_ell_csnm1.f90 +++ b/ext/impl/psb_z_ell_csnm1.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_csnmi.f90 b/ext/impl/psb_z_ell_csnmi.f90 index ecbfb1e1e..db82d8801 100644 --- a/ext/impl/psb_z_ell_csnmi.f90 +++ b/ext/impl/psb_z_ell_csnmi.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_csput.f90 b/ext/impl/psb_z_ell_csput.f90 index cf45070f3..cda18850a 100644 --- a/ext/impl/psb_z_ell_csput.f90 +++ b/ext/impl/psb_z_ell_csput.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_cssm.f90 b/ext/impl/psb_z_ell_cssm.f90 index 2e26c656e..199d997e5 100644 --- a/ext/impl/psb_z_ell_cssm.f90 +++ b/ext/impl/psb_z_ell_cssm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_cssv.f90 b/ext/impl/psb_z_ell_cssv.f90 index d17238a28..2ed0ae4c8 100644 --- a/ext/impl/psb_z_ell_cssv.f90 +++ b/ext/impl/psb_z_ell_cssv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_get_diag.f90 b/ext/impl/psb_z_ell_get_diag.f90 index af9c37a8c..e01ba2d4b 100644 --- a/ext/impl/psb_z_ell_get_diag.f90 +++ b/ext/impl/psb_z_ell_get_diag.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_maxval.f90 b/ext/impl/psb_z_ell_maxval.f90 index 9596f1241..a792d66e1 100644 --- a/ext/impl/psb_z_ell_maxval.f90 +++ b/ext/impl/psb_z_ell_maxval.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_mold.f90 b/ext/impl/psb_z_ell_mold.f90 index 3e1db6ccb..9391ae0f0 100644 --- a/ext/impl/psb_z_ell_mold.f90 +++ b/ext/impl/psb_z_ell_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_print.f90 b/ext/impl/psb_z_ell_print.f90 index 502abb94b..d4d384045 100644 --- a/ext/impl/psb_z_ell_print.f90 +++ b/ext/impl/psb_z_ell_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_reallocate_nz.f90 b/ext/impl/psb_z_ell_reallocate_nz.f90 index 582375080..880bfd1a1 100644 --- a/ext/impl/psb_z_ell_reallocate_nz.f90 +++ b/ext/impl/psb_z_ell_reallocate_nz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_reinit.f90 b/ext/impl/psb_z_ell_reinit.f90 index d73620d87..75c14daa8 100644 --- a/ext/impl/psb_z_ell_reinit.f90 +++ b/ext/impl/psb_z_ell_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_rowsum.f90 b/ext/impl/psb_z_ell_rowsum.f90 index 60eb70af3..196947a68 100644 --- a/ext/impl/psb_z_ell_rowsum.f90 +++ b/ext/impl/psb_z_ell_rowsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_scal.f90 b/ext/impl/psb_z_ell_scal.f90 index 7f2f8944b..7500bd0cc 100644 --- a/ext/impl/psb_z_ell_scal.f90 +++ b/ext/impl/psb_z_ell_scal.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_scals.f90 b/ext/impl/psb_z_ell_scals.f90 index 4086d8cce..1160f5260 100644 --- a/ext/impl/psb_z_ell_scals.f90 +++ b/ext/impl/psb_z_ell_scals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_ell_trim.f90 b/ext/impl/psb_z_ell_trim.f90 index 7cc2ed650..acde75e84 100644 --- a/ext/impl/psb_z_ell_trim.f90 +++ b/ext/impl/psb_z_ell_trim.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hdia_allocate_mnnz.f90 b/ext/impl/psb_z_hdia_allocate_mnnz.f90 index abed0c587..e856ac7c5 100644 --- a/ext/impl/psb_z_hdia_allocate_mnnz.f90 +++ b/ext/impl/psb_z_hdia_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hdia_csmv.f90 b/ext/impl/psb_z_hdia_csmv.f90 index 73d11da66..34e736f38 100644 --- a/ext/impl/psb_z_hdia_csmv.f90 +++ b/ext/impl/psb_z_hdia_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hdia_mold.f90 b/ext/impl/psb_z_hdia_mold.f90 index d91bdb351..a67cda16c 100644 --- a/ext/impl/psb_z_hdia_mold.f90 +++ b/ext/impl/psb_z_hdia_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hdia_print.f90 b/ext/impl/psb_z_hdia_print.f90 index 46f7769d1..09d11df25 100644 --- a/ext/impl/psb_z_hdia_print.f90 +++ b/ext/impl/psb_z_hdia_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_aclsum.f90 b/ext/impl/psb_z_hll_aclsum.f90 index e4add2994..bcc3732b7 100644 --- a/ext/impl/psb_z_hll_aclsum.f90 +++ b/ext/impl/psb_z_hll_aclsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_allocate_mnnz.f90 b/ext/impl/psb_z_hll_allocate_mnnz.f90 index 6ba9d7f1d..2bd4c3559 100644 --- a/ext/impl/psb_z_hll_allocate_mnnz.f90 +++ b/ext/impl/psb_z_hll_allocate_mnnz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_arwsum.f90 b/ext/impl/psb_z_hll_arwsum.f90 index a6e020fda..ebbd62d26 100644 --- a/ext/impl/psb_z_hll_arwsum.f90 +++ b/ext/impl/psb_z_hll_arwsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_colsum.f90 b/ext/impl/psb_z_hll_colsum.f90 index 196a694ec..91ad04882 100644 --- a/ext/impl/psb_z_hll_colsum.f90 +++ b/ext/impl/psb_z_hll_colsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_csgetblk.f90 b/ext/impl/psb_z_hll_csgetblk.f90 index 0cdf1fefe..e58abc250 100644 --- a/ext/impl/psb_z_hll_csgetblk.f90 +++ b/ext/impl/psb_z_hll_csgetblk.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_csgetptn.f90 b/ext/impl/psb_z_hll_csgetptn.f90 index 9d4c6714a..1ef36b0cd 100644 --- a/ext/impl/psb_z_hll_csgetptn.f90 +++ b/ext/impl/psb_z_hll_csgetptn.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_csgetrow.f90 b/ext/impl/psb_z_hll_csgetrow.f90 index f6d563dd1..160c6623c 100644 --- a/ext/impl/psb_z_hll_csgetrow.f90 +++ b/ext/impl/psb_z_hll_csgetrow.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_csmm.f90 b/ext/impl/psb_z_hll_csmm.f90 index fb48d5aa6..c5e0dec31 100644 --- a/ext/impl/psb_z_hll_csmm.f90 +++ b/ext/impl/psb_z_hll_csmm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_csmv.f90 b/ext/impl/psb_z_hll_csmv.f90 index e1b9e73f3..cf871d601 100644 --- a/ext/impl/psb_z_hll_csmv.f90 +++ b/ext/impl/psb_z_hll_csmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_csnm1.f90 b/ext/impl/psb_z_hll_csnm1.f90 index eb5c5b6b4..4ca5de7ce 100644 --- a/ext/impl/psb_z_hll_csnm1.f90 +++ b/ext/impl/psb_z_hll_csnm1.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_csnmi.f90 b/ext/impl/psb_z_hll_csnmi.f90 index 6243e5cfd..949cc1915 100644 --- a/ext/impl/psb_z_hll_csnmi.f90 +++ b/ext/impl/psb_z_hll_csnmi.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_csput.f90 b/ext/impl/psb_z_hll_csput.f90 index e47664c7e..84de26d64 100644 --- a/ext/impl/psb_z_hll_csput.f90 +++ b/ext/impl/psb_z_hll_csput.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_cssm.f90 b/ext/impl/psb_z_hll_cssm.f90 index ba1aa1504..a377fe34c 100644 --- a/ext/impl/psb_z_hll_cssm.f90 +++ b/ext/impl/psb_z_hll_cssm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_cssv.f90 b/ext/impl/psb_z_hll_cssv.f90 index 75606bbd3..ffb758cb6 100644 --- a/ext/impl/psb_z_hll_cssv.f90 +++ b/ext/impl/psb_z_hll_cssv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_get_diag.f90 b/ext/impl/psb_z_hll_get_diag.f90 index 1fe3ae046..0ddc1c504 100644 --- a/ext/impl/psb_z_hll_get_diag.f90 +++ b/ext/impl/psb_z_hll_get_diag.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_maxval.f90 b/ext/impl/psb_z_hll_maxval.f90 index 22258c3a9..922d9dc74 100644 --- a/ext/impl/psb_z_hll_maxval.f90 +++ b/ext/impl/psb_z_hll_maxval.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_mold.f90 b/ext/impl/psb_z_hll_mold.f90 index e108e9ce9..4d571b9c2 100644 --- a/ext/impl/psb_z_hll_mold.f90 +++ b/ext/impl/psb_z_hll_mold.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_print.f90 b/ext/impl/psb_z_hll_print.f90 index 438822641..83d6bc106 100644 --- a/ext/impl/psb_z_hll_print.f90 +++ b/ext/impl/psb_z_hll_print.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_reallocate_nz.f90 b/ext/impl/psb_z_hll_reallocate_nz.f90 index 23432f9f0..27273b05e 100644 --- a/ext/impl/psb_z_hll_reallocate_nz.f90 +++ b/ext/impl/psb_z_hll_reallocate_nz.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_reinit.f90 b/ext/impl/psb_z_hll_reinit.f90 index b6851c612..b551dd86b 100644 --- a/ext/impl/psb_z_hll_reinit.f90 +++ b/ext/impl/psb_z_hll_reinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_rowsum.f90 b/ext/impl/psb_z_hll_rowsum.f90 index 027c5b22e..28e6034d5 100644 --- a/ext/impl/psb_z_hll_rowsum.f90 +++ b/ext/impl/psb_z_hll_rowsum.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_scal.f90 b/ext/impl/psb_z_hll_scal.f90 index a11d0da81..f7827258c 100644 --- a/ext/impl/psb_z_hll_scal.f90 +++ b/ext/impl/psb_z_hll_scal.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_hll_scals.f90 b/ext/impl/psb_z_hll_scals.f90 index 432f11e6a..af846fdb1 100644 --- a/ext/impl/psb_z_hll_scals.f90 +++ b/ext/impl/psb_z_hll_scals.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_mv_dia_from_coo.f90 b/ext/impl/psb_z_mv_dia_from_coo.f90 index 29e27dfc5..ae052501f 100644 --- a/ext/impl/psb_z_mv_dia_from_coo.f90 +++ b/ext/impl/psb_z_mv_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_mv_dia_to_coo.f90 b/ext/impl/psb_z_mv_dia_to_coo.f90 index 1679c9e00..63affd553 100644 --- a/ext/impl/psb_z_mv_dia_to_coo.f90 +++ b/ext/impl/psb_z_mv_dia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_mv_ell_from_coo.f90 b/ext/impl/psb_z_mv_ell_from_coo.f90 index de39604e9..90f2b1ed1 100644 --- a/ext/impl/psb_z_mv_ell_from_coo.f90 +++ b/ext/impl/psb_z_mv_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_mv_ell_from_fmt.f90 b/ext/impl/psb_z_mv_ell_from_fmt.f90 index a2c7c1901..942d421ec 100644 --- a/ext/impl/psb_z_mv_ell_from_fmt.f90 +++ b/ext/impl/psb_z_mv_ell_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_mv_ell_to_coo.f90 b/ext/impl/psb_z_mv_ell_to_coo.f90 index 3f8afb0a9..20da30833 100644 --- a/ext/impl/psb_z_mv_ell_to_coo.f90 +++ b/ext/impl/psb_z_mv_ell_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_mv_ell_to_fmt.f90 b/ext/impl/psb_z_mv_ell_to_fmt.f90 index d34ae80e0..c31475228 100644 --- a/ext/impl/psb_z_mv_ell_to_fmt.f90 +++ b/ext/impl/psb_z_mv_ell_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_mv_hdia_from_coo.f90 b/ext/impl/psb_z_mv_hdia_from_coo.f90 index b9593f343..61c706a62 100644 --- a/ext/impl/psb_z_mv_hdia_from_coo.f90 +++ b/ext/impl/psb_z_mv_hdia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_mv_hdia_to_coo.f90 b/ext/impl/psb_z_mv_hdia_to_coo.f90 index f4c8df558..8ae285bd6 100644 --- a/ext/impl/psb_z_mv_hdia_to_coo.f90 +++ b/ext/impl/psb_z_mv_hdia_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_mv_hll_from_coo.f90 b/ext/impl/psb_z_mv_hll_from_coo.f90 index abe988b3e..3b84be4f7 100644 --- a/ext/impl/psb_z_mv_hll_from_coo.f90 +++ b/ext/impl/psb_z_mv_hll_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_mv_hll_from_fmt.f90 b/ext/impl/psb_z_mv_hll_from_fmt.f90 index 81626aba4..3f3beb895 100644 --- a/ext/impl/psb_z_mv_hll_from_fmt.f90 +++ b/ext/impl/psb_z_mv_hll_from_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_mv_hll_to_coo.f90 b/ext/impl/psb_z_mv_hll_to_coo.f90 index af0330047..705dcbe0e 100644 --- a/ext/impl/psb_z_mv_hll_to_coo.f90 +++ b/ext/impl/psb_z_mv_hll_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psb_z_mv_hll_to_fmt.f90 b/ext/impl/psb_z_mv_hll_to_fmt.f90 index a2fd7027c..8f0ac8e6c 100644 --- a/ext/impl/psb_z_mv_hll_to_fmt.f90 +++ b/ext/impl/psb_z_mv_hll_to_fmt.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_c_convert_dia_from_coo.f90 b/ext/impl/psi_c_convert_dia_from_coo.f90 index 295657485..7735c2e3a 100644 --- a/ext/impl/psi_c_convert_dia_from_coo.f90 +++ b/ext/impl/psi_c_convert_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_c_convert_ell_from_coo.f90 b/ext/impl/psi_c_convert_ell_from_coo.f90 index b4e0c7e4a..c208ef44e 100644 --- a/ext/impl/psi_c_convert_ell_from_coo.f90 +++ b/ext/impl/psi_c_convert_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_c_convert_hll_from_coo.f90 b/ext/impl/psi_c_convert_hll_from_coo.f90 index 2ebb86a6e..4a4b34ce4 100644 --- a/ext/impl/psi_c_convert_hll_from_coo.f90 +++ b/ext/impl/psi_c_convert_hll_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_c_xtr_coo_from_dia.f90 b/ext/impl/psi_c_xtr_coo_from_dia.f90 index eab82a11b..59bc97e5a 100644 --- a/ext/impl/psi_c_xtr_coo_from_dia.f90 +++ b/ext/impl/psi_c_xtr_coo_from_dia.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_c_xtr_dia_from_coo.f90 b/ext/impl/psi_c_xtr_dia_from_coo.f90 index f72a03df1..5075ae824 100644 --- a/ext/impl/psi_c_xtr_dia_from_coo.f90 +++ b/ext/impl/psi_c_xtr_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_c_xtr_ell_from_coo.f90 b/ext/impl/psi_c_xtr_ell_from_coo.f90 index 706e6c1f7..329a9dfb7 100644 --- a/ext/impl/psi_c_xtr_ell_from_coo.f90 +++ b/ext/impl/psi_c_xtr_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_d_convert_dia_from_coo.f90 b/ext/impl/psi_d_convert_dia_from_coo.f90 index 5f821967a..a0dbdb1ce 100644 --- a/ext/impl/psi_d_convert_dia_from_coo.f90 +++ b/ext/impl/psi_d_convert_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_d_convert_ell_from_coo.f90 b/ext/impl/psi_d_convert_ell_from_coo.f90 index 51471c19d..19ccaa2b7 100644 --- a/ext/impl/psi_d_convert_ell_from_coo.f90 +++ b/ext/impl/psi_d_convert_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_d_convert_hll_from_coo.f90 b/ext/impl/psi_d_convert_hll_from_coo.f90 index cb07e52cf..62ce1a31c 100644 --- a/ext/impl/psi_d_convert_hll_from_coo.f90 +++ b/ext/impl/psi_d_convert_hll_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_d_xtr_coo_from_dia.f90 b/ext/impl/psi_d_xtr_coo_from_dia.f90 index 5fc98b827..4e19ba783 100644 --- a/ext/impl/psi_d_xtr_coo_from_dia.f90 +++ b/ext/impl/psi_d_xtr_coo_from_dia.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_d_xtr_dia_from_coo.f90 b/ext/impl/psi_d_xtr_dia_from_coo.f90 index cd95b64e8..3c76ddcfa 100644 --- a/ext/impl/psi_d_xtr_dia_from_coo.f90 +++ b/ext/impl/psi_d_xtr_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_d_xtr_ell_from_coo.f90 b/ext/impl/psi_d_xtr_ell_from_coo.f90 index ec520797d..0014ed995 100644 --- a/ext/impl/psi_d_xtr_ell_from_coo.f90 +++ b/ext/impl/psi_d_xtr_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_s_convert_dia_from_coo.f90 b/ext/impl/psi_s_convert_dia_from_coo.f90 index d2f587787..65946d76b 100644 --- a/ext/impl/psi_s_convert_dia_from_coo.f90 +++ b/ext/impl/psi_s_convert_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_s_convert_ell_from_coo.f90 b/ext/impl/psi_s_convert_ell_from_coo.f90 index ecdd9b1e6..6cd161271 100644 --- a/ext/impl/psi_s_convert_ell_from_coo.f90 +++ b/ext/impl/psi_s_convert_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_s_convert_hll_from_coo.f90 b/ext/impl/psi_s_convert_hll_from_coo.f90 index dcf6c4e25..b560ee761 100644 --- a/ext/impl/psi_s_convert_hll_from_coo.f90 +++ b/ext/impl/psi_s_convert_hll_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_s_xtr_coo_from_dia.f90 b/ext/impl/psi_s_xtr_coo_from_dia.f90 index 3745365b4..db58cd4c1 100644 --- a/ext/impl/psi_s_xtr_coo_from_dia.f90 +++ b/ext/impl/psi_s_xtr_coo_from_dia.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_s_xtr_dia_from_coo.f90 b/ext/impl/psi_s_xtr_dia_from_coo.f90 index a8ee7c4b3..236c44746 100644 --- a/ext/impl/psi_s_xtr_dia_from_coo.f90 +++ b/ext/impl/psi_s_xtr_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_s_xtr_ell_from_coo.f90 b/ext/impl/psi_s_xtr_ell_from_coo.f90 index 0bac2ec08..eff8fe7d8 100644 --- a/ext/impl/psi_s_xtr_ell_from_coo.f90 +++ b/ext/impl/psi_s_xtr_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_z_convert_dia_from_coo.f90 b/ext/impl/psi_z_convert_dia_from_coo.f90 index ddc9d2fd5..34623e893 100644 --- a/ext/impl/psi_z_convert_dia_from_coo.f90 +++ b/ext/impl/psi_z_convert_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_z_convert_ell_from_coo.f90 b/ext/impl/psi_z_convert_ell_from_coo.f90 index 3d37c11f9..b646948db 100644 --- a/ext/impl/psi_z_convert_ell_from_coo.f90 +++ b/ext/impl/psi_z_convert_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_z_convert_hll_from_coo.f90 b/ext/impl/psi_z_convert_hll_from_coo.f90 index bc9fdde17..6904d3ab2 100644 --- a/ext/impl/psi_z_convert_hll_from_coo.f90 +++ b/ext/impl/psi_z_convert_hll_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_z_xtr_coo_from_dia.f90 b/ext/impl/psi_z_xtr_coo_from_dia.f90 index 70d0938f6..61cc65751 100644 --- a/ext/impl/psi_z_xtr_coo_from_dia.f90 +++ b/ext/impl/psi_z_xtr_coo_from_dia.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_z_xtr_dia_from_coo.f90 b/ext/impl/psi_z_xtr_dia_from_coo.f90 index 6b2542c6f..bc88c174b 100644 --- a/ext/impl/psi_z_xtr_dia_from_coo.f90 +++ b/ext/impl/psi_z_xtr_dia_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/impl/psi_z_xtr_ell_from_coo.f90 b/ext/impl/psi_z_xtr_ell_from_coo.f90 index 7133f2aee..cc018f611 100644 --- a/ext/impl/psi_z_xtr_ell_from_coo.f90 +++ b/ext/impl/psi_z_xtr_ell_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_c_dia_mat_mod.f90 b/ext/psb_c_dia_mat_mod.f90 index 8311487b9..80e933376 100644 --- a/ext/psb_c_dia_mat_mod.f90 +++ b/ext/psb_c_dia_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_c_dns_mat_mod.f90 b/ext/psb_c_dns_mat_mod.f90 index 5e5a191dd..2ff21d0ab 100644 --- a/ext/psb_c_dns_mat_mod.f90 +++ b/ext/psb_c_dns_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_c_ell_mat_mod.f90 b/ext/psb_c_ell_mat_mod.f90 index 6954946f5..12b8bd5b6 100644 --- a/ext/psb_c_ell_mat_mod.f90 +++ b/ext/psb_c_ell_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_c_hdia_mat_mod.f90 b/ext/psb_c_hdia_mat_mod.f90 index fbac05dee..5f0059999 100644 --- a/ext/psb_c_hdia_mat_mod.f90 +++ b/ext/psb_c_hdia_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_c_hll_mat_mod.f90 b/ext/psb_c_hll_mat_mod.f90 index 966b60f56..1876ccb1e 100644 --- a/ext/psb_c_hll_mat_mod.f90 +++ b/ext/psb_c_hll_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_d_dia_mat_mod.f90 b/ext/psb_d_dia_mat_mod.f90 index 7df615acf..92d47f52d 100644 --- a/ext/psb_d_dia_mat_mod.f90 +++ b/ext/psb_d_dia_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_d_dns_mat_mod.f90 b/ext/psb_d_dns_mat_mod.f90 index f8c977bce..5bc038851 100644 --- a/ext/psb_d_dns_mat_mod.f90 +++ b/ext/psb_d_dns_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_d_ell_mat_mod.f90 b/ext/psb_d_ell_mat_mod.f90 index cc945baf6..479695aba 100644 --- a/ext/psb_d_ell_mat_mod.f90 +++ b/ext/psb_d_ell_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_d_hdia_mat_mod.f90 b/ext/psb_d_hdia_mat_mod.f90 index 25bc6898c..a16f42757 100644 --- a/ext/psb_d_hdia_mat_mod.f90 +++ b/ext/psb_d_hdia_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_d_hll_mat_mod.f90 b/ext/psb_d_hll_mat_mod.f90 index acc3b312b..5185eff44 100644 --- a/ext/psb_d_hll_mat_mod.f90 +++ b/ext/psb_d_hll_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_ext_mod.F90 b/ext/psb_ext_mod.F90 index b1dbdb59c..a7711968d 100644 --- a/ext/psb_ext_mod.F90 +++ b/ext/psb_ext_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_s_dia_mat_mod.f90 b/ext/psb_s_dia_mat_mod.f90 index 3a11d959f..3d59d227f 100644 --- a/ext/psb_s_dia_mat_mod.f90 +++ b/ext/psb_s_dia_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_s_dns_mat_mod.f90 b/ext/psb_s_dns_mat_mod.f90 index e9ea5f263..e68343cef 100644 --- a/ext/psb_s_dns_mat_mod.f90 +++ b/ext/psb_s_dns_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_s_ell_mat_mod.f90 b/ext/psb_s_ell_mat_mod.f90 index 9e3dd8b45..5f842ecd7 100644 --- a/ext/psb_s_ell_mat_mod.f90 +++ b/ext/psb_s_ell_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_s_hdia_mat_mod.f90 b/ext/psb_s_hdia_mat_mod.f90 index b7b2b110d..c9b1667e8 100644 --- a/ext/psb_s_hdia_mat_mod.f90 +++ b/ext/psb_s_hdia_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_s_hll_mat_mod.f90 b/ext/psb_s_hll_mat_mod.f90 index 735091c8b..ccb5ec907 100644 --- a/ext/psb_s_hll_mat_mod.f90 +++ b/ext/psb_s_hll_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_z_dia_mat_mod.f90 b/ext/psb_z_dia_mat_mod.f90 index 76d071af2..ab02e0537 100644 --- a/ext/psb_z_dia_mat_mod.f90 +++ b/ext/psb_z_dia_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_z_dns_mat_mod.f90 b/ext/psb_z_dns_mat_mod.f90 index 6147057d7..75908a544 100644 --- a/ext/psb_z_dns_mat_mod.f90 +++ b/ext/psb_z_dns_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_z_ell_mat_mod.f90 b/ext/psb_z_ell_mat_mod.f90 index 0e1f0e00e..b58d5eee0 100644 --- a/ext/psb_z_ell_mat_mod.f90 +++ b/ext/psb_z_ell_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_z_hdia_mat_mod.f90 b/ext/psb_z_hdia_mat_mod.f90 index e7c113219..2b7f36f0f 100644 --- a/ext/psb_z_hdia_mat_mod.f90 +++ b/ext/psb_z_hdia_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psb_z_hll_mat_mod.f90 b/ext/psb_z_hll_mat_mod.f90 index 98eb403f2..60d046906 100644 --- a/ext/psb_z_hll_mat_mod.f90 +++ b/ext/psb_z_hll_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psi_c_ext_util_mod.f90 b/ext/psi_c_ext_util_mod.f90 index e58c0d93a..734e5fe24 100644 --- a/ext/psi_c_ext_util_mod.f90 +++ b/ext/psi_c_ext_util_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psi_d_ext_util_mod.f90 b/ext/psi_d_ext_util_mod.f90 index 07de8ad1f..5adfd4089 100644 --- a/ext/psi_d_ext_util_mod.f90 +++ b/ext/psi_d_ext_util_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psi_ext_util_mod.f90 b/ext/psi_ext_util_mod.f90 index afb2c7498..5e85ef105 100644 --- a/ext/psi_ext_util_mod.f90 +++ b/ext/psi_ext_util_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psi_i_ext_util_mod.f90 b/ext/psi_i_ext_util_mod.f90 index ac073f1d0..9227b07f6 100644 --- a/ext/psi_i_ext_util_mod.f90 +++ b/ext/psi_i_ext_util_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psi_s_ext_util_mod.f90 b/ext/psi_s_ext_util_mod.f90 index 2aeefc7b9..98cebda8b 100644 --- a/ext/psi_s_ext_util_mod.f90 +++ b/ext/psi_s_ext_util_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/ext/psi_z_ext_util_mod.f90 b/ext/psi_z_ext_util_mod.f90 index 25f1ede0d..79573c858 100644 --- a/ext/psi_z_ext_util_mod.f90 +++ b/ext/psi_z_ext_util_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/linsolve/Makefile b/linsolve/Makefile index c8fa3ac74..fa64b1b7e 100644 --- a/linsolve/Makefile +++ b/linsolve/Makefile @@ -18,8 +18,10 @@ LIBNAME=$(METHDLIBNAME) FINCLUDES=$(FMFLAG). $(FMFLAG)$(MODDIR) -objs: $(OBJS) impld - /bin/cp -p $(CPUPDFLAG) *$(.mod) $(MODDIR) +objs: mods $(OBJS) impld + +mods: $(MODOBJS) + $(INSTALL) -p $(CPUPDFLAG) *$(.mod) $(MODDIR) lib: objs $(MAKE) -C impl lib diff --git a/linsolve/impl/psb_cbicg.f90 b/linsolve/impl/psb_cbicg.f90 index c357054b1..15a1aa0a2 100644 --- a/linsolve/impl/psb_cbicg.f90 +++ b/linsolve/impl/psb_cbicg.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -112,11 +112,10 @@ subroutine psb_cbicg_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), optional, intent(out) :: iter real(psb_spk_), optional, intent(out) :: err ! !$ local data - complex(psb_spk_), allocatable, target :: aux(:) type(psb_c_vect_type), allocatable, target :: wwrk(:) type(psb_c_vect_type), pointer :: ww, q, r, p,& & zt, pt, z, rt, qt - integer(psb_ipk_) :: itmax_, naux, it, itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col, istop_, err_act integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -188,10 +187,7 @@ subroutine psb_cbicg_vect(a,prec,b,x,eps,desc_a,info,& end if - naux=4*n_col - - allocate(aux(naux),stat=info) - if (info == psb_success_) call psb_geall(wwrk,desc_a,info,n=9_psb_ipk_) + call psb_geall(wwrk,desc_a,info,n=9_psb_ipk_) if (info == psb_success_) call psb_geasb(wwrk,desc_a,info,mold=x%v) if(info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -239,7 +235,7 @@ subroutine psb_cbicg_vect(a,prec,b,x,eps,desc_a,info,& if (itx >= itmax_) exit restart it = 0 call psb_geaxpby(cone,b,czero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-cone,a,x,cone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-cone,a,x,cone,r,desc_a,info) if (debug_level >= psb_debug_ext_)& & write(debug_unit,*) me,' ',trim(name),' Done spmm',info if (info == psb_success_) call psb_geaxpby(cone,r,czero,rt,desc_a,info) @@ -265,8 +261,8 @@ subroutine psb_cbicg_vect(a,prec,b,x,eps,desc_a,info,& if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),'iteration: ',itx - call prec%apply(r,z,desc_a,info,work=aux) - if (info == psb_success_) call prec%apply(rt,zt,desc_a,info,trans='c',work=aux) + call prec%apply(r,z,desc_a,info) + if (info == psb_success_) call prec%apply(rt,zt,desc_a,info,trans='c') rho_old = rho rho = psb_gedot(rt,z,desc_a,info) @@ -286,10 +282,8 @@ subroutine psb_cbicg_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(cone,zt,beta,pt,desc_a,info) end if - call psb_spmm(cone,a,p,czero,q,desc_a,info,& - & work=aux) - call psb_spmm(cone,a,pt,czero,qt,desc_a,info,& - & work=aux,trans='c') + call psb_spmm(cone,a,p,czero,q,desc_a,info) + call psb_spmm(cone,a,pt,czero,qt,desc_a,info,trans='c') sigma = psb_gedot(pt,q,desc_a,info) if (sigma == czero) then @@ -319,11 +313,6 @@ subroutine psb_cbicg_vect(a,prec,b,x,eps,desc_a,info,& if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) - if (info /= psb_success_) then - call psb_errpush(info,name) - goto 9999 - end if call psb_erractionrestore(err_act) return diff --git a/linsolve/impl/psb_ccg.F90 b/linsolve/impl/psb_ccg.F90 index 0ba1b5fc2..c4cca5937 100644 --- a/linsolve/impl/psb_ccg.F90 +++ b/linsolve/impl/psb_ccg.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -113,12 +113,12 @@ subroutine psb_ccg_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_spk_), Optional, Intent(out) :: err,cond ! = Local data - complex(psb_spk_), allocatable, target :: aux(:),td(:),tu(:),eig(:),ewrk(:) + complex(psb_spk_), allocatable, target ::td(:),tu(:),eig(:),ewrk(:) integer(psb_mpk_), allocatable :: ibl(:), ispl(:), iwrk(:) type(psb_c_vect_type), allocatable, target :: wwrk(:) type(psb_c_vect_type), pointer :: q, p, r, z, w complex(psb_spk_) :: alpha, beta, rho, rho_old, sigma,alpha_old,beta_old - integer(psb_ipk_) :: itmax_, istop_, naux, it, itx, itrace_,& + integer(psb_ipk_) :: itmax_, istop_, it, itx, itrace_,& & n_col, n_row,err_act, ieg,nspl, istebz integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -171,9 +171,8 @@ subroutine psb_ccg_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux), stat=info) - if (info == psb_success_) call psb_geall(wwrk,desc_a,info,n=5_psb_ipk_) + + call psb_geall(wwrk,desc_a,info,n=5_psb_ipk_) if (info == psb_success_) call psb_geasb(wwrk,desc_a,info,mold=x%v,scratch=.true.) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -215,7 +214,7 @@ subroutine psb_ccg_vect(a,prec,b,x,eps,desc_a,info,& it = 0 call psb_geaxpby(cone,b,czero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-cone,a,x,cone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-cone,a,x,cone,r,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -235,7 +234,7 @@ subroutine psb_ccg_vect(a,prec,b,x,eps,desc_a,info,& it = it + 1 itx = itx + 1 - call prec%apply(r,z,desc_a,info,work=aux) + call prec%apply(r,z,desc_a,info) rho_old = rho rho = psb_gedot(r,z,desc_a,info) @@ -252,7 +251,7 @@ subroutine psb_ccg_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(cone,z,beta,p,desc_a,info) end if - call psb_spmm(cone,a,p,czero,q,desc_a,info,work=aux) + call psb_spmm(cone,a,p,czero,q,desc_a,info) sigma = psb_gedot(p,q,desc_a,info) if (sigma == czero) then if (debug_level >= psb_debug_ext_)& @@ -285,11 +284,6 @@ subroutine psb_ccg_vect(a,prec,b,x,eps,desc_a,info,& if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) - if (info /= psb_success_) then - call psb_errpush(info,name) - goto 9999 - end if call psb_erractionrestore(err_act) return diff --git a/linsolve/impl/psb_ccgs.f90 b/linsolve/impl/psb_ccgs.f90 index f7808c0d0..2db1d65ce 100644 --- a/linsolve/impl/psb_ccgs.f90 +++ b/linsolve/impl/psb_ccgs.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -110,11 +110,10 @@ Subroutine psb_ccgs_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_spk_), Optional, Intent(out) :: err ! = local data - complex(psb_spk_), allocatable, target :: aux(:) type(psb_c_vect_type), allocatable, target :: wwrk(:) type(psb_c_vect_type), pointer :: ww, q, r, p, v,& & s, z, f, rt, qt, uv - integer(psb_ipk_) :: itmax_, naux, it, itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col,istop_, itx, err_act integer(psb_lpk_) :: mglob type(psb_ctxt_type) :: ctxt @@ -165,8 +164,7 @@ Subroutine psb_ccgs_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - Allocate(aux(naux),stat=info) + if (info == psb_success_) Call psb_geall(wwrk,desc_a,info,n=11_psb_ipk_) if (info == psb_success_) Call psb_geasb(wwrk,desc_a,info,mold=x%v) if (info /= psb_success_) Then @@ -215,7 +213,7 @@ Subroutine psb_ccgs_vect(a,prec,b,x,eps,desc_a,info,& if (itx >= itmax_) exit restart it = 0 call psb_geaxpby(cone,b,czero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-cone,a,x,cone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-cone,a,x,cone,r,desc_a,info) if (info == psb_success_) call psb_geaxpby(cone,r,czero,rt,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -260,10 +258,9 @@ Subroutine psb_ccgs_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_geaxpby(cone,uv,beta,p,desc_a,info) end if - if (info == psb_success_) call prec%apply(p,f,desc_a,info,work=aux) + if (info == psb_success_) call prec%apply(p,f,desc_a,info) - if (info == psb_success_) call psb_spmm(cone,a,f,czero,v,desc_a,info,& - & work=aux) + if (info == psb_success_) call psb_spmm(cone,a,f,czero,v,desc_a,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='First loop part ') @@ -285,12 +282,11 @@ Subroutine psb_ccgs_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_geaxpby(cone,uv,czero,s,desc_a,info) if (info == psb_success_) call psb_geaxpby(cone,q,cone,s,desc_a,info) - if (info == psb_success_) call prec%apply(s,z,desc_a,info,work=aux) + if (info == psb_success_) call prec%apply(s,z,desc_a,info) if (info == psb_success_) call psb_geaxpby(alpha,z,cone,x,desc_a,info) - if (info == psb_success_) call psb_spmm(cone,a,z,czero,qt,desc_a,info,& - & work=aux) + if (info == psb_success_) call psb_spmm(cone,a,z,czero,qt,desc_a,info) if (info == psb_success_) call psb_geaxpby(-alpha,qt,cone,r,desc_a,info) @@ -312,11 +308,6 @@ Subroutine psb_ccgs_vect(a,prec,b,x,eps,desc_a,info,& if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) - if (info /= psb_success_) then - call psb_errpush(info,name) - goto 9999 - end if call psb_erractionrestore(err_act) return diff --git a/linsolve/impl/psb_ccgstab.f90 b/linsolve/impl/psb_ccgstab.f90 index 4ccbaf7a8..1688024a8 100644 --- a/linsolve/impl/psb_ccgstab.f90 +++ b/linsolve/impl/psb_ccgstab.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -110,10 +110,10 @@ Subroutine psb_ccgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_spk_), Optional, Intent(out) :: err ! = Local data - complex(psb_spk_), allocatable, target :: aux(:),wwrk(:,:) + complex(psb_spk_), allocatable, target :: wwrk(:,:) type(psb_c_vect_type) :: q, r, p, v, s, t, z, f - integer(psb_ipk_) :: itmax_, naux, it,itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -179,14 +179,6 @@ Subroutine psb_ccgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist call psb_errpush(info,name,a_err='psb_chkvect on B') goto 9999 end if - naux=6*n_col - if (info == psb_success_) allocate(aux(naux),stat=info) - if (info /= psb_success_) then - info=psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - End If - call psb_geasb(q,desc_a,info,mold=x%v,scratch=.true.) call psb_geasb(r,desc_a,info,mold=x%v,scratch=.true.) @@ -230,7 +222,7 @@ Subroutine psb_ccgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist it = 0 call psb_geaxpby(cone,b,czero,r,desc_a,info) - call psb_spmm(-cone,a,x,cone,r,desc_a,info,work=aux) + call psb_spmm(-cone,a,x,cone,r,desc_a,info) call psb_geaxpby(cone,r,czero,q,desc_a,info) ! Perhaps we already satisfy the convergence criterion... @@ -279,10 +271,9 @@ Subroutine psb_ccgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist call psb_geaxpby(cone,r,beta,p,desc_a,info) End If - call prec%apply(p,f,desc_a,info,work=aux) + call prec%apply(p,f,desc_a,info) - call psb_spmm(cone,a,f,czero,v,desc_a,info,& - & work=aux) + call psb_spmm(cone,a,f,czero,v,desc_a,info) sigma = psb_gedot(q,v,desc_a,info) @@ -316,8 +307,8 @@ Subroutine psb_ccgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist end if - call prec%apply(s,z,desc_a,info,work=aux) - Call psb_spmm(cone,a,z,czero,t,desc_a,info,work=aux) + call prec%apply(s,z,desc_a,info) + Call psb_spmm(cone,a,z,czero,t,desc_a,info) if(psb_errstatus_fatal()) then call psb_errpush(psb_err_from_subroutine_,name,a_err='precaply/spmm') @@ -367,8 +358,6 @@ Subroutine psb_ccgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist call psb_end_conv(methdname,itx,desc_a,stopdat,info,derr,iter) if (present(err)) err = derr - deallocate(aux,stat=info) - call x%sync() call psb_gefree(q,desc_a,info) call psb_gefree(r,desc_a,info) diff --git a/linsolve/impl/psb_ccgstabl.f90 b/linsolve/impl/psb_ccgstabl.f90 index f1463b83d..ea66523ed 100644 --- a/linsolve/impl/psb_ccgstabl.f90 +++ b/linsolve/impl/psb_ccgstabl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -121,13 +121,13 @@ Subroutine psb_ccgstabl_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_spk_), Optional, Intent(out) :: err ! = local data - complex(psb_spk_), allocatable, target :: aux(:), gamma(:),& + complex(psb_spk_), allocatable, target :: gamma(:),& & gamma1(:), gamma2(:), taum(:,:), sigma(:) type(psb_c_vect_type), allocatable, target :: wwrk(:),uh(:), rh(:) type(psb_c_vect_type), Pointer :: ww, q, r, rt0, p, v, & & s, t, z, f - integer(psb_ipk_) :: itmax_, naux, it, itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col, nl, err_act integer(psb_lpk_) :: mglob Logical, Parameter :: exchange=.True., noexchange=.False. @@ -213,10 +213,6 @@ Subroutine psb_ccgstabl_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux),gamma(0:nl),gamma1(nl),& - &gamma2(nl),taum(nl,nl),sigma(nl), stat=info) - if (info /= psb_success_) then info=psb_err_alloc_dealloc_ call psb_errpush(info,name) @@ -263,7 +259,7 @@ Subroutine psb_ccgstabl_vect(a,prec,b,x,eps,desc_a,info,& it = 0 call psb_geaxpby(cone,b,czero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-cone,a,x,cone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-cone,a,x,cone,r,desc_a,info) if (info == psb_success_) call prec%apply(r,desc_a,info) @@ -318,7 +314,7 @@ Subroutine psb_ccgstabl_vect(a,prec,b,x,eps,desc_a,info,& ! = call psb_geaxpby(cone,rh(:,0:j),-beta,uh(:,0:j),desc_a,info) call psb_geaxpby(cone,rh(k),-beta,uh(k),desc_a,info) end do - call psb_spmm(cone,a,uh(j),czero,uh(j+1),desc_a,info,work=aux) + call psb_spmm(cone,a,uh(j),czero,uh(j+1),desc_a,info) call prec%apply(uh(j+1),desc_a,info) @@ -340,7 +336,7 @@ Subroutine psb_ccgstabl_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(-alpha,uh(k+1),cone,rh(k),desc_a,info) end do call psb_geaxpby(alpha,uh(0),cone,x,desc_a,info) - call psb_spmm(cone,a,rh(j),czero,rh(j+1),desc_a,info,work=aux) + call psb_spmm(cone,a,rh(j),czero,rh(j+1),desc_a,info) call prec%apply(rh(j+1),desc_a,info) @@ -403,7 +399,6 @@ Subroutine psb_ccgstabl_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_gefree(uh,desc_a,info) if (info == psb_success_) call psb_gefree(rh,desc_a,info) if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) if (info /= psb_success_) then call psb_errpush(info,name) goto 9999 diff --git a/linsolve/impl/psb_cfcg.F90 b/linsolve/impl/psb_cfcg.F90 index f28db7dea..910b611de 100644 --- a/linsolve/impl/psb_cfcg.F90 +++ b/linsolve/impl/psb_cfcg.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -125,12 +125,11 @@ subroutine psb_cfcg_vect(a,prec,b,x,eps,desc_a,info,& complex(psb_spk_) :: alpha, beta, delta, gamma, theta real(psb_dpk_) :: derr integer(psb_ipk_) :: i, idx, nc2l, it, itx, istop_, itmax_, itrace_ - integer(psb_ipk_) :: n_col, naux, err_act + integer(psb_ipk_) :: n_col, err_act integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me - complex(psb_spk_), allocatable, target :: aux(:) complex(psb_spk_) :: vres(3) character(len=20) :: name type(psb_itconv_type) :: stopdat @@ -177,10 +176,6 @@ subroutine psb_cfcg_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux), stat=info) - - if (present(itmax)) then itmax_ = itmax else @@ -234,7 +229,7 @@ subroutine psb_cfcg_vect(a,prec,b,x,eps,desc_a,info,& ! Apply the preconditioner v=Pr ! Compute w = Av - call prec%apply(r,v,desc_a,info,work=aux) + call prec%apply(r,v,desc_a,info) if (info == psb_success_) call psb_spmm(cone,a,v,czero,w,desc_a,info) if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& @@ -289,7 +284,7 @@ subroutine psb_cfcg_vect(a,prec,b,x,eps,desc_a,info,& ! Apply the preconditioner v = Pr ! Compute w = Av - call prec%apply(r,v,desc_a,info,work=aux) + call prec%apply(r,v,desc_a,info) if (info == psb_success_) call psb_spmm(cone,a,v,czero,w,desc_a,info) if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& diff --git a/linsolve/impl/psb_cgcr.f90 b/linsolve/impl/psb_cgcr.f90 index 5120b102f..99865aec4 100644 --- a/linsolve/impl/psb_cgcr.f90 +++ b/linsolve/impl/psb_cgcr.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -130,14 +130,13 @@ subroutine psb_cgcr_vect(a,prec,b,x,eps,desc_a,info,& type(psb_c_vect_type) :: r real(psb_dpk_) :: r_norm, b_norm, a_norm, derr - integer(psb_ipk_) :: n_col, naux, err_act + integer(psb_ipk_) :: n_col, err_act integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me integer(psb_ipk_) :: i, j, it, itx, istop_, itmax_, itrace_, nl, m, nrst complex(psb_spk_) :: hjj - complex(psb_spk_), allocatable, target :: aux(:) character(len=20) :: name type(psb_itconv_type) :: stopdat character(len=*), parameter :: methdname='GCR' @@ -223,10 +222,6 @@ subroutine psb_cgcr_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 endif - naux=4*n_col - allocate(aux(naux),h(nl+1,nl+1),& - &c_scale(nl+1),c(nl+1),z(nl+1), alpha(nl+1), stat=info) - h = czero if (info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -261,7 +256,7 @@ subroutine psb_cgcr_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(cone, b, czero, r, desc_a, info) - call psb_spmm(-cone,a,x,cone,r,desc_a,info,work=aux) + call psb_spmm(-cone,a,x,cone,r,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -278,9 +273,9 @@ subroutine psb_cgcr_vect(a,prec,b,x,eps,desc_a,info,& it = it + 1 j = it !Apply preconditioner - call prec%apply(r,z(j),desc_a,info,work=aux) + call prec%apply(r,z(j),desc_a,info) - call psb_spmm(cone,a,z(j),czero,c(1),desc_a,info,work=aux) + call psb_spmm(cone,a,z(j),czero,c(1),desc_a,info) do i =1, j - 1 h(i,j) = psb_gedot(c_scale(i), c(i), desc_a, info) @@ -347,7 +342,7 @@ subroutine psb_cgcr_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_gefree(c(i),desc_a,info) end do - if (info == psb_success_) deallocate(aux,h,c_scale,z,c,alpha,stat=info) + if (info == psb_success_) deallocate(h,c_scale,z,c,alpha,stat=info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) diff --git a/linsolve/impl/psb_ckrylov.f90 b/linsolve/impl/psb_ckrylov.f90 index 39f310fc8..22712da05 100644 --- a/linsolve/impl/psb_ckrylov.f90 +++ b/linsolve/impl/psb_ckrylov.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/linsolve/impl/psb_crgmres.f90 b/linsolve/impl/psb_crgmres.f90 index e0c0b38da..214a89b39 100644 --- a/linsolve/impl/psb_crgmres.f90 +++ b/linsolve/impl/psb_crgmres.f90 @@ -18,7 +18,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -124,13 +124,12 @@ subroutine psb_crgmres_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_spk_), Optional, Intent(out) :: err ! = local data - complex(psb_spk_), allocatable :: aux(:) complex(psb_spk_), allocatable :: c(:), s(:), h(:,:), rs(:), rst(:) type(psb_c_vect_type), allocatable :: v(:) type(psb_c_vect_type) :: w, w1, xt real(psb_spk_) :: tmp complex(psb_spk_) :: scal, gm, rti, rti1 - integer(psb_ipk_) ::litmax, naux, it, k, itrace_,& + integer(psb_ipk_) ::litmax, it, k, itrace_,& & n_row, n_col, nl integer(psb_lpk_) :: mglob Logical, Parameter :: exchange=.True., noexchange=.False., use_srot=.true. @@ -229,11 +228,6 @@ subroutine psb_crgmres_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - - naux=4*n_col - allocate(aux(naux),h(nl+1,nl+1),& - &c(nl+1),s(nl+1),rs(nl+1), rst(nl+1),stat=info) - if (info == psb_success_) call psb_geall(v,desc_a,info,n=nl+1) if (info == psb_success_) call psb_geall(w,desc_a,info) if (info == psb_success_) call psb_geall(w1,desc_a,info) @@ -266,7 +260,7 @@ subroutine psb_crgmres_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - call psb_spmm(-cone,a,x,cone,v(1),desc_a,info,work=aux) + call psb_spmm(-cone,a,x,cone,v(1),desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -301,7 +295,7 @@ subroutine psb_crgmres_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - call psb_spmm(-cone,a,x,cone,v(1),desc_a,info,work=aux) + call psb_spmm(-cone,a,x,cone,v(1),desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -358,7 +352,7 @@ subroutine psb_crgmres_vect(a,prec,b,x,eps,desc_a,info,& itx = itx + 1 call prec%apply(v(i),w1,desc_a,info) - call psb_spmm(cone,a,w1,czero,w,desc_a,info,work=aux) + call psb_spmm(cone,a,w1,czero,w,desc_a,info) ! do k = 1, i @@ -397,7 +391,7 @@ subroutine psb_crgmres_vect(a,prec,b,x,eps,desc_a,info,& call prec%apply(xt,desc_a,info) call psb_geaxpby(cone,x,cone,xt,desc_a,info) call psb_geaxpby(cone,b,czero,w1,desc_a,info) - call psb_spmm(-cone,a,xt,cone,w1,desc_a,info,work=aux) + call psb_spmm(-cone,a,xt,cone,w1,desc_a,info) rni = psb_geamax(w1,desc_a,info) xni = psb_geamax(xt,desc_a,info) errnum = rni @@ -490,7 +484,7 @@ subroutine psb_crgmres_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_gefree(w,desc_a,info) if (info == psb_success_) call psb_gefree(w1,desc_a,info) if (info == psb_success_) call psb_gefree(xt,desc_a,info) - if (info == psb_success_) deallocate(aux,h,c,s,rs,rst, stat=info) + if (info == psb_success_) deallocate(h,c,s,rs,rst, stat=info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) diff --git a/linsolve/impl/psb_crichardson.f90 b/linsolve/impl/psb_crichardson.f90 index 3eb4c2634..893c14c53 100644 --- a/linsolve/impl/psb_crichardson.f90 +++ b/linsolve/impl/psb_crichardson.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -91,11 +91,10 @@ Subroutine psb_crichardson_vect(a,prec,b,x,eps,desc_a,info,& logical :: do_alloc_wrk type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: me,np,err_act - complex(psb_spk_), allocatable, target :: aux(:) type(psb_c_vect_type), allocatable, target :: wwrk(:) type(psb_c_vect_type), pointer :: q, p, r, z, w real(psb_dpk_) :: derr - integer(psb_ipk_) :: itmax_, istop_, naux, it, itx, itrace_,& + integer(psb_ipk_) :: itmax_, istop_, it, itx, itrace_,& & n_col, n_row,ieg,nspl, istebz integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -155,15 +154,6 @@ Subroutine psb_crichardson_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux), stat=info) - if (info == psb_success_) call psb_geall(wwrk,desc_a,info,n=5_psb_ipk_) - if (info == psb_success_) call psb_geasb(wwrk,desc_a,info,mold=x%v,scratch=.true.) - if (info /= psb_success_) then - info=psb_err_from_subroutine_non_ - call psb_errpush(info,name) - goto 9999 - end if p => wwrk(1) q => wwrk(2) r => wwrk(3) @@ -171,7 +161,7 @@ Subroutine psb_crichardson_vect(a,prec,b,x,eps,desc_a,info,& w => wwrk(5) call psb_geaxpby(cone,b,czero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-cone,a,x,cone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-cone,a,x,cone,r,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -186,17 +176,16 @@ Subroutine psb_crichardson_vect(a,prec,b,x,eps,desc_a,info,& End If loop: do itx=1,itmax_ - call prec%apply(r,z,desc_a,info,work=aux) + call prec%apply(r,z,desc_a,info) call psb_geaxpby(cone,z,cone,x,desc_a,info) call psb_geaxpby(cone,b,czero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-cone,a,x,cone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-cone,a,x,cone,r,desc_a,info) if (psb_check_conv(methdname,itx,x,r,desc_a,stopdat,info)) exit loop end do loop call psb_end_conv(methdname,itx,desc_a,stopdat,info,derr,iter) if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) if ((info==psb_success_).and.do_alloc_wrk) call prec%free_wrk(info) if(info /= psb_success_) then diff --git a/linsolve/impl/psb_dbicg.f90 b/linsolve/impl/psb_dbicg.f90 index ebcc8eb90..1ac471995 100644 --- a/linsolve/impl/psb_dbicg.f90 +++ b/linsolve/impl/psb_dbicg.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -112,11 +112,10 @@ subroutine psb_dbicg_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), optional, intent(out) :: iter real(psb_dpk_), optional, intent(out) :: err ! !$ local data - real(psb_dpk_), allocatable, target :: aux(:) type(psb_d_vect_type), allocatable, target :: wwrk(:) type(psb_d_vect_type), pointer :: ww, q, r, p,& & zt, pt, z, rt, qt - integer(psb_ipk_) :: itmax_, naux, it, itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col, istop_, err_act integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -188,10 +187,7 @@ subroutine psb_dbicg_vect(a,prec,b,x,eps,desc_a,info,& end if - naux=4*n_col - - allocate(aux(naux),stat=info) - if (info == psb_success_) call psb_geall(wwrk,desc_a,info,n=9_psb_ipk_) + call psb_geall(wwrk,desc_a,info,n=9_psb_ipk_) if (info == psb_success_) call psb_geasb(wwrk,desc_a,info,mold=x%v) if(info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -239,7 +235,7 @@ subroutine psb_dbicg_vect(a,prec,b,x,eps,desc_a,info,& if (itx >= itmax_) exit restart it = 0 call psb_geaxpby(done,b,dzero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-done,a,x,done,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-done,a,x,done,r,desc_a,info) if (debug_level >= psb_debug_ext_)& & write(debug_unit,*) me,' ',trim(name),' Done spmm',info if (info == psb_success_) call psb_geaxpby(done,r,dzero,rt,desc_a,info) @@ -265,8 +261,8 @@ subroutine psb_dbicg_vect(a,prec,b,x,eps,desc_a,info,& if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),'iteration: ',itx - call prec%apply(r,z,desc_a,info,work=aux) - if (info == psb_success_) call prec%apply(rt,zt,desc_a,info,trans='c',work=aux) + call prec%apply(r,z,desc_a,info) + if (info == psb_success_) call prec%apply(rt,zt,desc_a,info,trans='c') rho_old = rho rho = psb_gedot(rt,z,desc_a,info) @@ -286,10 +282,8 @@ subroutine psb_dbicg_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(done,zt,beta,pt,desc_a,info) end if - call psb_spmm(done,a,p,dzero,q,desc_a,info,& - & work=aux) - call psb_spmm(done,a,pt,dzero,qt,desc_a,info,& - & work=aux,trans='c') + call psb_spmm(done,a,p,dzero,q,desc_a,info) + call psb_spmm(done,a,pt,dzero,qt,desc_a,info,trans='c') sigma = psb_gedot(pt,q,desc_a,info) if (sigma == dzero) then @@ -319,11 +313,6 @@ subroutine psb_dbicg_vect(a,prec,b,x,eps,desc_a,info,& if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) - if (info /= psb_success_) then - call psb_errpush(info,name) - goto 9999 - end if call psb_erractionrestore(err_act) return diff --git a/linsolve/impl/psb_dcg.F90 b/linsolve/impl/psb_dcg.F90 index a59937310..e7f9cf941 100644 --- a/linsolve/impl/psb_dcg.F90 +++ b/linsolve/impl/psb_dcg.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -113,12 +113,12 @@ subroutine psb_dcg_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_dpk_), Optional, Intent(out) :: err,cond ! = Local data - real(psb_dpk_), allocatable, target :: aux(:),td(:),tu(:),eig(:),ewrk(:) + real(psb_dpk_), allocatable, target ::td(:),tu(:),eig(:),ewrk(:) integer(psb_mpk_), allocatable :: ibl(:), ispl(:), iwrk(:) type(psb_d_vect_type), allocatable, target :: wwrk(:) type(psb_d_vect_type), pointer :: q, p, r, z, w real(psb_dpk_) :: alpha, beta, rho, rho_old, sigma,alpha_old,beta_old - integer(psb_ipk_) :: itmax_, istop_, naux, it, itx, itrace_,& + integer(psb_ipk_) :: itmax_, istop_, it, itx, itrace_,& & n_col, n_row,err_act, ieg,nspl, istebz integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -171,9 +171,8 @@ subroutine psb_dcg_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux), stat=info) - if (info == psb_success_) call psb_geall(wwrk,desc_a,info,n=5_psb_ipk_) + + call psb_geall(wwrk,desc_a,info,n=5_psb_ipk_) if (info == psb_success_) call psb_geasb(wwrk,desc_a,info,mold=x%v,scratch=.true.) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -223,7 +222,7 @@ subroutine psb_dcg_vect(a,prec,b,x,eps,desc_a,info,& it = 0 call psb_geaxpby(done,b,dzero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-done,a,x,done,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-done,a,x,done,r,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -243,7 +242,7 @@ subroutine psb_dcg_vect(a,prec,b,x,eps,desc_a,info,& it = it + 1 itx = itx + 1 - call prec%apply(r,z,desc_a,info,work=aux) + call prec%apply(r,z,desc_a,info) rho_old = rho rho = psb_gedot(r,z,desc_a,info) @@ -260,7 +259,7 @@ subroutine psb_dcg_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(done,z,beta,p,desc_a,info) end if - call psb_spmm(done,a,p,dzero,q,desc_a,info,work=aux) + call psb_spmm(done,a,p,dzero,q,desc_a,info) sigma = psb_gedot(p,q,desc_a,info) if (sigma == dzero) then if (debug_level >= psb_debug_ext_)& @@ -318,11 +317,6 @@ subroutine psb_dcg_vect(a,prec,b,x,eps,desc_a,info,& if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) - if (info /= psb_success_) then - call psb_errpush(info,name) - goto 9999 - end if call psb_erractionrestore(err_act) return diff --git a/linsolve/impl/psb_dcgs.f90 b/linsolve/impl/psb_dcgs.f90 index 5c2401d1a..ad4849b8e 100644 --- a/linsolve/impl/psb_dcgs.f90 +++ b/linsolve/impl/psb_dcgs.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -110,11 +110,10 @@ Subroutine psb_dcgs_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_dpk_), Optional, Intent(out) :: err ! = local data - real(psb_dpk_), allocatable, target :: aux(:) type(psb_d_vect_type), allocatable, target :: wwrk(:) type(psb_d_vect_type), pointer :: ww, q, r, p, v,& & s, z, f, rt, qt, uv - integer(psb_ipk_) :: itmax_, naux, it, itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col,istop_, itx, err_act integer(psb_lpk_) :: mglob type(psb_ctxt_type) :: ctxt @@ -165,8 +164,7 @@ Subroutine psb_dcgs_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - Allocate(aux(naux),stat=info) + if (info == psb_success_) Call psb_geall(wwrk,desc_a,info,n=11_psb_ipk_) if (info == psb_success_) Call psb_geasb(wwrk,desc_a,info,mold=x%v) if (info /= psb_success_) Then @@ -215,7 +213,7 @@ Subroutine psb_dcgs_vect(a,prec,b,x,eps,desc_a,info,& if (itx >= itmax_) exit restart it = 0 call psb_geaxpby(done,b,dzero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-done,a,x,done,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-done,a,x,done,r,desc_a,info) if (info == psb_success_) call psb_geaxpby(done,r,dzero,rt,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -260,10 +258,9 @@ Subroutine psb_dcgs_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_geaxpby(done,uv,beta,p,desc_a,info) end if - if (info == psb_success_) call prec%apply(p,f,desc_a,info,work=aux) + if (info == psb_success_) call prec%apply(p,f,desc_a,info) - if (info == psb_success_) call psb_spmm(done,a,f,dzero,v,desc_a,info,& - & work=aux) + if (info == psb_success_) call psb_spmm(done,a,f,dzero,v,desc_a,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='First loop part ') @@ -285,12 +282,11 @@ Subroutine psb_dcgs_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_geaxpby(done,uv,dzero,s,desc_a,info) if (info == psb_success_) call psb_geaxpby(done,q,done,s,desc_a,info) - if (info == psb_success_) call prec%apply(s,z,desc_a,info,work=aux) + if (info == psb_success_) call prec%apply(s,z,desc_a,info) if (info == psb_success_) call psb_geaxpby(alpha,z,done,x,desc_a,info) - if (info == psb_success_) call psb_spmm(done,a,z,dzero,qt,desc_a,info,& - & work=aux) + if (info == psb_success_) call psb_spmm(done,a,z,dzero,qt,desc_a,info) if (info == psb_success_) call psb_geaxpby(-alpha,qt,done,r,desc_a,info) @@ -312,11 +308,6 @@ Subroutine psb_dcgs_vect(a,prec,b,x,eps,desc_a,info,& if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) - if (info /= psb_success_) then - call psb_errpush(info,name) - goto 9999 - end if call psb_erractionrestore(err_act) return diff --git a/linsolve/impl/psb_dcgstab.f90 b/linsolve/impl/psb_dcgstab.f90 index 749015d75..4b9e426ff 100644 --- a/linsolve/impl/psb_dcgstab.f90 +++ b/linsolve/impl/psb_dcgstab.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -110,10 +110,10 @@ Subroutine psb_dcgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_dpk_), Optional, Intent(out) :: err ! = Local data - real(psb_dpk_), allocatable, target :: aux(:),wwrk(:,:) + real(psb_dpk_), allocatable, target :: wwrk(:,:) type(psb_d_vect_type) :: q, r, p, v, s, t, z, f - integer(psb_ipk_) :: itmax_, naux, it,itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -179,14 +179,6 @@ Subroutine psb_dcgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist call psb_errpush(info,name,a_err='psb_chkvect on B') goto 9999 end if - naux=6*n_col - if (info == psb_success_) allocate(aux(naux),stat=info) - if (info /= psb_success_) then - info=psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - End If - call psb_geasb(q,desc_a,info,mold=x%v,scratch=.true.) call psb_geasb(r,desc_a,info,mold=x%v,scratch=.true.) @@ -230,7 +222,7 @@ Subroutine psb_dcgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist it = 0 call psb_geaxpby(done,b,dzero,r,desc_a,info) - call psb_spmm(-done,a,x,done,r,desc_a,info,work=aux) + call psb_spmm(-done,a,x,done,r,desc_a,info) call psb_geaxpby(done,r,dzero,q,desc_a,info) ! Perhaps we already satisfy the convergence criterion... @@ -279,10 +271,9 @@ Subroutine psb_dcgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist call psb_geaxpby(done,r,beta,p,desc_a,info) End If - call prec%apply(p,f,desc_a,info,work=aux) + call prec%apply(p,f,desc_a,info) - call psb_spmm(done,a,f,dzero,v,desc_a,info,& - & work=aux) + call psb_spmm(done,a,f,dzero,v,desc_a,info) sigma = psb_gedot(q,v,desc_a,info) @@ -316,8 +307,8 @@ Subroutine psb_dcgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist end if - call prec%apply(s,z,desc_a,info,work=aux) - Call psb_spmm(done,a,z,dzero,t,desc_a,info,work=aux) + call prec%apply(s,z,desc_a,info) + Call psb_spmm(done,a,z,dzero,t,desc_a,info) if(psb_errstatus_fatal()) then call psb_errpush(psb_err_from_subroutine_,name,a_err='precaply/spmm') @@ -367,8 +358,6 @@ Subroutine psb_dcgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist call psb_end_conv(methdname,itx,desc_a,stopdat,info,derr,iter) if (present(err)) err = derr - deallocate(aux,stat=info) - call x%sync() call psb_gefree(q,desc_a,info) call psb_gefree(r,desc_a,info) diff --git a/linsolve/impl/psb_dcgstabl.f90 b/linsolve/impl/psb_dcgstabl.f90 index a2ae6164b..750097833 100644 --- a/linsolve/impl/psb_dcgstabl.f90 +++ b/linsolve/impl/psb_dcgstabl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -121,13 +121,13 @@ Subroutine psb_dcgstabl_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_dpk_), Optional, Intent(out) :: err ! = local data - real(psb_dpk_), allocatable, target :: aux(:), gamma(:),& + real(psb_dpk_), allocatable, target :: gamma(:),& & gamma1(:), gamma2(:), taum(:,:), sigma(:) type(psb_d_vect_type), allocatable, target :: wwrk(:),uh(:), rh(:) type(psb_d_vect_type), Pointer :: ww, q, r, rt0, p, v, & & s, t, z, f - integer(psb_ipk_) :: itmax_, naux, it, itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col, nl, err_act integer(psb_lpk_) :: mglob Logical, Parameter :: exchange=.True., noexchange=.False. @@ -213,10 +213,6 @@ Subroutine psb_dcgstabl_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux),gamma(0:nl),gamma1(nl),& - &gamma2(nl),taum(nl,nl),sigma(nl), stat=info) - if (info /= psb_success_) then info=psb_err_alloc_dealloc_ call psb_errpush(info,name) @@ -263,7 +259,7 @@ Subroutine psb_dcgstabl_vect(a,prec,b,x,eps,desc_a,info,& it = 0 call psb_geaxpby(done,b,dzero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-done,a,x,done,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-done,a,x,done,r,desc_a,info) if (info == psb_success_) call prec%apply(r,desc_a,info) @@ -318,7 +314,7 @@ Subroutine psb_dcgstabl_vect(a,prec,b,x,eps,desc_a,info,& ! = call psb_geaxpby(done,rh(:,0:j),-beta,uh(:,0:j),desc_a,info) call psb_geaxpby(done,rh(k),-beta,uh(k),desc_a,info) end do - call psb_spmm(done,a,uh(j),dzero,uh(j+1),desc_a,info,work=aux) + call psb_spmm(done,a,uh(j),dzero,uh(j+1),desc_a,info) call prec%apply(uh(j+1),desc_a,info) @@ -340,7 +336,7 @@ Subroutine psb_dcgstabl_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(-alpha,uh(k+1),done,rh(k),desc_a,info) end do call psb_geaxpby(alpha,uh(0),done,x,desc_a,info) - call psb_spmm(done,a,rh(j),dzero,rh(j+1),desc_a,info,work=aux) + call psb_spmm(done,a,rh(j),dzero,rh(j+1),desc_a,info) call prec%apply(rh(j+1),desc_a,info) @@ -403,7 +399,6 @@ Subroutine psb_dcgstabl_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_gefree(uh,desc_a,info) if (info == psb_success_) call psb_gefree(rh,desc_a,info) if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) if (info /= psb_success_) then call psb_errpush(info,name) goto 9999 diff --git a/linsolve/impl/psb_dfcg.F90 b/linsolve/impl/psb_dfcg.F90 index cb741795a..3b7dcea4f 100644 --- a/linsolve/impl/psb_dfcg.F90 +++ b/linsolve/impl/psb_dfcg.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -125,12 +125,11 @@ subroutine psb_dfcg_vect(a,prec,b,x,eps,desc_a,info,& real(psb_dpk_) :: alpha, beta, delta, gamma, theta real(psb_dpk_) :: derr integer(psb_ipk_) :: i, idx, nc2l, it, itx, istop_, itmax_, itrace_ - integer(psb_ipk_) :: n_col, naux, err_act + integer(psb_ipk_) :: n_col, err_act integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me - real(psb_dpk_), allocatable, target :: aux(:) real(psb_dpk_) :: vres(3) character(len=20) :: name type(psb_itconv_type) :: stopdat @@ -177,10 +176,6 @@ subroutine psb_dfcg_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux), stat=info) - - if (present(itmax)) then itmax_ = itmax else @@ -234,7 +229,7 @@ subroutine psb_dfcg_vect(a,prec,b,x,eps,desc_a,info,& ! Apply the preconditioner v=Pr ! Compute w = Av - call prec%apply(r,v,desc_a,info,work=aux) + call prec%apply(r,v,desc_a,info) if (info == psb_success_) call psb_spmm(done,a,v,dzero,w,desc_a,info) if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& @@ -289,7 +284,7 @@ subroutine psb_dfcg_vect(a,prec,b,x,eps,desc_a,info,& ! Apply the preconditioner v = Pr ! Compute w = Av - call prec%apply(r,v,desc_a,info,work=aux) + call prec%apply(r,v,desc_a,info) if (info == psb_success_) call psb_spmm(done,a,v,dzero,w,desc_a,info) if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& diff --git a/linsolve/impl/psb_dgcr.f90 b/linsolve/impl/psb_dgcr.f90 index cf2e2b0eb..c9bc8e6d1 100644 --- a/linsolve/impl/psb_dgcr.f90 +++ b/linsolve/impl/psb_dgcr.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -130,14 +130,13 @@ subroutine psb_dgcr_vect(a,prec,b,x,eps,desc_a,info,& type(psb_d_vect_type) :: r real(psb_dpk_) :: r_norm, b_norm, a_norm, derr - integer(psb_ipk_) :: n_col, naux, err_act + integer(psb_ipk_) :: n_col, err_act integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me integer(psb_ipk_) :: i, j, it, itx, istop_, itmax_, itrace_, nl, m, nrst real(psb_dpk_) :: hjj - real(psb_dpk_), allocatable, target :: aux(:) character(len=20) :: name type(psb_itconv_type) :: stopdat character(len=*), parameter :: methdname='GCR' @@ -223,10 +222,6 @@ subroutine psb_dgcr_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 endif - naux=4*n_col - allocate(aux(naux),h(nl+1,nl+1),& - &c_scale(nl+1),c(nl+1),z(nl+1), alpha(nl+1), stat=info) - h = dzero if (info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -261,7 +256,7 @@ subroutine psb_dgcr_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(done, b, dzero, r, desc_a, info) - call psb_spmm(-done,a,x,done,r,desc_a,info,work=aux) + call psb_spmm(-done,a,x,done,r,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -278,9 +273,9 @@ subroutine psb_dgcr_vect(a,prec,b,x,eps,desc_a,info,& it = it + 1 j = it !Apply preconditioner - call prec%apply(r,z(j),desc_a,info,work=aux) + call prec%apply(r,z(j),desc_a,info) - call psb_spmm(done,a,z(j),dzero,c(1),desc_a,info,work=aux) + call psb_spmm(done,a,z(j),dzero,c(1),desc_a,info) do i =1, j - 1 h(i,j) = psb_gedot(c_scale(i), c(i), desc_a, info) @@ -347,7 +342,7 @@ subroutine psb_dgcr_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_gefree(c(i),desc_a,info) end do - if (info == psb_success_) deallocate(aux,h,c_scale,z,c,alpha,stat=info) + if (info == psb_success_) deallocate(h,c_scale,z,c,alpha,stat=info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) diff --git a/linsolve/impl/psb_dkrylov.f90 b/linsolve/impl/psb_dkrylov.f90 index d858c2285..5963f5a8a 100644 --- a/linsolve/impl/psb_dkrylov.f90 +++ b/linsolve/impl/psb_dkrylov.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/linsolve/impl/psb_drgmres.f90 b/linsolve/impl/psb_drgmres.f90 index e0d783822..584b93876 100644 --- a/linsolve/impl/psb_drgmres.f90 +++ b/linsolve/impl/psb_drgmres.f90 @@ -18,7 +18,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -124,13 +124,12 @@ subroutine psb_drgmres_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_dpk_), Optional, Intent(out) :: err ! = local data - real(psb_dpk_), allocatable :: aux(:) real(psb_dpk_), allocatable :: c(:), s(:), h(:,:), rs(:), rst(:) type(psb_d_vect_type), allocatable :: v(:) type(psb_d_vect_type) :: w, w1, xt real(psb_dpk_) :: tmp real(psb_dpk_) :: scal, gm, rti, rti1 - integer(psb_ipk_) ::litmax, naux, it, k, itrace_,& + integer(psb_ipk_) ::litmax, it, k, itrace_,& & n_row, n_col, nl integer(psb_lpk_) :: mglob Logical, Parameter :: exchange=.True., noexchange=.False., use_srot=.true. @@ -229,11 +228,6 @@ subroutine psb_drgmres_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - - naux=4*n_col - allocate(aux(naux),h(nl+1,nl+1),& - &c(nl+1),s(nl+1),rs(nl+1), rst(nl+1),stat=info) - if (info == psb_success_) call psb_geall(v,desc_a,info,n=nl+1) if (info == psb_success_) call psb_geall(w,desc_a,info) if (info == psb_success_) call psb_geall(w1,desc_a,info) @@ -266,7 +260,7 @@ subroutine psb_drgmres_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - call psb_spmm(-done,a,x,done,v(1),desc_a,info,work=aux) + call psb_spmm(-done,a,x,done,v(1),desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -301,7 +295,7 @@ subroutine psb_drgmres_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - call psb_spmm(-done,a,x,done,v(1),desc_a,info,work=aux) + call psb_spmm(-done,a,x,done,v(1),desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -358,7 +352,7 @@ subroutine psb_drgmres_vect(a,prec,b,x,eps,desc_a,info,& itx = itx + 1 call prec%apply(v(i),w1,desc_a,info) - call psb_spmm(done,a,w1,dzero,w,desc_a,info,work=aux) + call psb_spmm(done,a,w1,dzero,w,desc_a,info) ! do k = 1, i @@ -397,7 +391,7 @@ subroutine psb_drgmres_vect(a,prec,b,x,eps,desc_a,info,& call prec%apply(xt,desc_a,info) call psb_geaxpby(done,x,done,xt,desc_a,info) call psb_geaxpby(done,b,dzero,w1,desc_a,info) - call psb_spmm(-done,a,xt,done,w1,desc_a,info,work=aux) + call psb_spmm(-done,a,xt,done,w1,desc_a,info) rni = psb_geamax(w1,desc_a,info) xni = psb_geamax(xt,desc_a,info) errnum = rni @@ -490,7 +484,7 @@ subroutine psb_drgmres_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_gefree(w,desc_a,info) if (info == psb_success_) call psb_gefree(w1,desc_a,info) if (info == psb_success_) call psb_gefree(xt,desc_a,info) - if (info == psb_success_) deallocate(aux,h,c,s,rs,rst, stat=info) + if (info == psb_success_) deallocate(h,c,s,rs,rst, stat=info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) diff --git a/linsolve/impl/psb_drichardson.f90 b/linsolve/impl/psb_drichardson.f90 index b0a53a4b2..e6813051a 100644 --- a/linsolve/impl/psb_drichardson.f90 +++ b/linsolve/impl/psb_drichardson.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -91,11 +91,10 @@ Subroutine psb_drichardson_vect(a,prec,b,x,eps,desc_a,info,& logical :: do_alloc_wrk type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: me,np,err_act - real(psb_dpk_), allocatable, target :: aux(:) type(psb_d_vect_type), allocatable, target :: wwrk(:) type(psb_d_vect_type), pointer :: q, p, r, z, w real(psb_dpk_) :: derr - integer(psb_ipk_) :: itmax_, istop_, naux, it, itx, itrace_,& + integer(psb_ipk_) :: itmax_, istop_, it, itx, itrace_,& & n_col, n_row,ieg,nspl, istebz integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -155,15 +154,6 @@ Subroutine psb_drichardson_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux), stat=info) - if (info == psb_success_) call psb_geall(wwrk,desc_a,info,n=5_psb_ipk_) - if (info == psb_success_) call psb_geasb(wwrk,desc_a,info,mold=x%v,scratch=.true.) - if (info /= psb_success_) then - info=psb_err_from_subroutine_non_ - call psb_errpush(info,name) - goto 9999 - end if p => wwrk(1) q => wwrk(2) r => wwrk(3) @@ -171,7 +161,7 @@ Subroutine psb_drichardson_vect(a,prec,b,x,eps,desc_a,info,& w => wwrk(5) call psb_geaxpby(done,b,dzero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-done,a,x,done,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-done,a,x,done,r,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -186,17 +176,16 @@ Subroutine psb_drichardson_vect(a,prec,b,x,eps,desc_a,info,& End If loop: do itx=1,itmax_ - call prec%apply(r,z,desc_a,info,work=aux) + call prec%apply(r,z,desc_a,info) call psb_geaxpby(done,z,done,x,desc_a,info) call psb_geaxpby(done,b,dzero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-done,a,x,done,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-done,a,x,done,r,desc_a,info) if (psb_check_conv(methdname,itx,x,r,desc_a,stopdat,info)) exit loop end do loop call psb_end_conv(methdname,itx,desc_a,stopdat,info,derr,iter) if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) if ((info==psb_success_).and.do_alloc_wrk) call prec%free_wrk(info) if(info /= psb_success_) then diff --git a/linsolve/impl/psb_sbicg.f90 b/linsolve/impl/psb_sbicg.f90 index 1b5f1fb89..bb687f037 100644 --- a/linsolve/impl/psb_sbicg.f90 +++ b/linsolve/impl/psb_sbicg.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -112,11 +112,10 @@ subroutine psb_sbicg_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), optional, intent(out) :: iter real(psb_spk_), optional, intent(out) :: err ! !$ local data - real(psb_spk_), allocatable, target :: aux(:) type(psb_s_vect_type), allocatable, target :: wwrk(:) type(psb_s_vect_type), pointer :: ww, q, r, p,& & zt, pt, z, rt, qt - integer(psb_ipk_) :: itmax_, naux, it, itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col, istop_, err_act integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -188,10 +187,7 @@ subroutine psb_sbicg_vect(a,prec,b,x,eps,desc_a,info,& end if - naux=4*n_col - - allocate(aux(naux),stat=info) - if (info == psb_success_) call psb_geall(wwrk,desc_a,info,n=9_psb_ipk_) + call psb_geall(wwrk,desc_a,info,n=9_psb_ipk_) if (info == psb_success_) call psb_geasb(wwrk,desc_a,info,mold=x%v) if(info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -239,7 +235,7 @@ subroutine psb_sbicg_vect(a,prec,b,x,eps,desc_a,info,& if (itx >= itmax_) exit restart it = 0 call psb_geaxpby(sone,b,szero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-sone,a,x,sone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-sone,a,x,sone,r,desc_a,info) if (debug_level >= psb_debug_ext_)& & write(debug_unit,*) me,' ',trim(name),' Done spmm',info if (info == psb_success_) call psb_geaxpby(sone,r,szero,rt,desc_a,info) @@ -265,8 +261,8 @@ subroutine psb_sbicg_vect(a,prec,b,x,eps,desc_a,info,& if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),'iteration: ',itx - call prec%apply(r,z,desc_a,info,work=aux) - if (info == psb_success_) call prec%apply(rt,zt,desc_a,info,trans='c',work=aux) + call prec%apply(r,z,desc_a,info) + if (info == psb_success_) call prec%apply(rt,zt,desc_a,info,trans='c') rho_old = rho rho = psb_gedot(rt,z,desc_a,info) @@ -286,10 +282,8 @@ subroutine psb_sbicg_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(sone,zt,beta,pt,desc_a,info) end if - call psb_spmm(sone,a,p,szero,q,desc_a,info,& - & work=aux) - call psb_spmm(sone,a,pt,szero,qt,desc_a,info,& - & work=aux,trans='c') + call psb_spmm(sone,a,p,szero,q,desc_a,info) + call psb_spmm(sone,a,pt,szero,qt,desc_a,info,trans='c') sigma = psb_gedot(pt,q,desc_a,info) if (sigma == szero) then @@ -319,11 +313,6 @@ subroutine psb_sbicg_vect(a,prec,b,x,eps,desc_a,info,& if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) - if (info /= psb_success_) then - call psb_errpush(info,name) - goto 9999 - end if call psb_erractionrestore(err_act) return diff --git a/linsolve/impl/psb_scg.F90 b/linsolve/impl/psb_scg.F90 index c116edc4e..198537eb1 100644 --- a/linsolve/impl/psb_scg.F90 +++ b/linsolve/impl/psb_scg.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -113,12 +113,12 @@ subroutine psb_scg_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_spk_), Optional, Intent(out) :: err,cond ! = Local data - real(psb_spk_), allocatable, target :: aux(:),td(:),tu(:),eig(:),ewrk(:) + real(psb_spk_), allocatable, target ::td(:),tu(:),eig(:),ewrk(:) integer(psb_mpk_), allocatable :: ibl(:), ispl(:), iwrk(:) type(psb_s_vect_type), allocatable, target :: wwrk(:) type(psb_s_vect_type), pointer :: q, p, r, z, w real(psb_spk_) :: alpha, beta, rho, rho_old, sigma,alpha_old,beta_old - integer(psb_ipk_) :: itmax_, istop_, naux, it, itx, itrace_,& + integer(psb_ipk_) :: itmax_, istop_, it, itx, itrace_,& & n_col, n_row,err_act, ieg,nspl, istebz integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -171,9 +171,8 @@ subroutine psb_scg_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux), stat=info) - if (info == psb_success_) call psb_geall(wwrk,desc_a,info,n=5_psb_ipk_) + + call psb_geall(wwrk,desc_a,info,n=5_psb_ipk_) if (info == psb_success_) call psb_geasb(wwrk,desc_a,info,mold=x%v,scratch=.true.) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -223,7 +222,7 @@ subroutine psb_scg_vect(a,prec,b,x,eps,desc_a,info,& it = 0 call psb_geaxpby(sone,b,szero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-sone,a,x,sone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-sone,a,x,sone,r,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -243,7 +242,7 @@ subroutine psb_scg_vect(a,prec,b,x,eps,desc_a,info,& it = it + 1 itx = itx + 1 - call prec%apply(r,z,desc_a,info,work=aux) + call prec%apply(r,z,desc_a,info) rho_old = rho rho = psb_gedot(r,z,desc_a,info) @@ -260,7 +259,7 @@ subroutine psb_scg_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(sone,z,beta,p,desc_a,info) end if - call psb_spmm(sone,a,p,szero,q,desc_a,info,work=aux) + call psb_spmm(sone,a,p,szero,q,desc_a,info) sigma = psb_gedot(p,q,desc_a,info) if (sigma == szero) then if (debug_level >= psb_debug_ext_)& @@ -318,11 +317,6 @@ subroutine psb_scg_vect(a,prec,b,x,eps,desc_a,info,& if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) - if (info /= psb_success_) then - call psb_errpush(info,name) - goto 9999 - end if call psb_erractionrestore(err_act) return diff --git a/linsolve/impl/psb_scgs.f90 b/linsolve/impl/psb_scgs.f90 index 4034283e6..f6eb345e6 100644 --- a/linsolve/impl/psb_scgs.f90 +++ b/linsolve/impl/psb_scgs.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -110,11 +110,10 @@ Subroutine psb_scgs_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_spk_), Optional, Intent(out) :: err ! = local data - real(psb_spk_), allocatable, target :: aux(:) type(psb_s_vect_type), allocatable, target :: wwrk(:) type(psb_s_vect_type), pointer :: ww, q, r, p, v,& & s, z, f, rt, qt, uv - integer(psb_ipk_) :: itmax_, naux, it, itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col,istop_, itx, err_act integer(psb_lpk_) :: mglob type(psb_ctxt_type) :: ctxt @@ -165,8 +164,7 @@ Subroutine psb_scgs_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - Allocate(aux(naux),stat=info) + if (info == psb_success_) Call psb_geall(wwrk,desc_a,info,n=11_psb_ipk_) if (info == psb_success_) Call psb_geasb(wwrk,desc_a,info,mold=x%v) if (info /= psb_success_) Then @@ -215,7 +213,7 @@ Subroutine psb_scgs_vect(a,prec,b,x,eps,desc_a,info,& if (itx >= itmax_) exit restart it = 0 call psb_geaxpby(sone,b,szero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-sone,a,x,sone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-sone,a,x,sone,r,desc_a,info) if (info == psb_success_) call psb_geaxpby(sone,r,szero,rt,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -260,10 +258,9 @@ Subroutine psb_scgs_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_geaxpby(sone,uv,beta,p,desc_a,info) end if - if (info == psb_success_) call prec%apply(p,f,desc_a,info,work=aux) + if (info == psb_success_) call prec%apply(p,f,desc_a,info) - if (info == psb_success_) call psb_spmm(sone,a,f,szero,v,desc_a,info,& - & work=aux) + if (info == psb_success_) call psb_spmm(sone,a,f,szero,v,desc_a,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='First loop part ') @@ -285,12 +282,11 @@ Subroutine psb_scgs_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_geaxpby(sone,uv,szero,s,desc_a,info) if (info == psb_success_) call psb_geaxpby(sone,q,sone,s,desc_a,info) - if (info == psb_success_) call prec%apply(s,z,desc_a,info,work=aux) + if (info == psb_success_) call prec%apply(s,z,desc_a,info) if (info == psb_success_) call psb_geaxpby(alpha,z,sone,x,desc_a,info) - if (info == psb_success_) call psb_spmm(sone,a,z,szero,qt,desc_a,info,& - & work=aux) + if (info == psb_success_) call psb_spmm(sone,a,z,szero,qt,desc_a,info) if (info == psb_success_) call psb_geaxpby(-alpha,qt,sone,r,desc_a,info) @@ -312,11 +308,6 @@ Subroutine psb_scgs_vect(a,prec,b,x,eps,desc_a,info,& if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) - if (info /= psb_success_) then - call psb_errpush(info,name) - goto 9999 - end if call psb_erractionrestore(err_act) return diff --git a/linsolve/impl/psb_scgstab.f90 b/linsolve/impl/psb_scgstab.f90 index a0b57fa8d..2b2bdcfa3 100644 --- a/linsolve/impl/psb_scgstab.f90 +++ b/linsolve/impl/psb_scgstab.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -110,10 +110,10 @@ Subroutine psb_scgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_spk_), Optional, Intent(out) :: err ! = Local data - real(psb_spk_), allocatable, target :: aux(:),wwrk(:,:) + real(psb_spk_), allocatable, target :: wwrk(:,:) type(psb_s_vect_type) :: q, r, p, v, s, t, z, f - integer(psb_ipk_) :: itmax_, naux, it,itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -179,14 +179,6 @@ Subroutine psb_scgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist call psb_errpush(info,name,a_err='psb_chkvect on B') goto 9999 end if - naux=6*n_col - if (info == psb_success_) allocate(aux(naux),stat=info) - if (info /= psb_success_) then - info=psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - End If - call psb_geasb(q,desc_a,info,mold=x%v,scratch=.true.) call psb_geasb(r,desc_a,info,mold=x%v,scratch=.true.) @@ -230,7 +222,7 @@ Subroutine psb_scgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist it = 0 call psb_geaxpby(sone,b,szero,r,desc_a,info) - call psb_spmm(-sone,a,x,sone,r,desc_a,info,work=aux) + call psb_spmm(-sone,a,x,sone,r,desc_a,info) call psb_geaxpby(sone,r,szero,q,desc_a,info) ! Perhaps we already satisfy the convergence criterion... @@ -279,10 +271,9 @@ Subroutine psb_scgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist call psb_geaxpby(sone,r,beta,p,desc_a,info) End If - call prec%apply(p,f,desc_a,info,work=aux) + call prec%apply(p,f,desc_a,info) - call psb_spmm(sone,a,f,szero,v,desc_a,info,& - & work=aux) + call psb_spmm(sone,a,f,szero,v,desc_a,info) sigma = psb_gedot(q,v,desc_a,info) @@ -316,8 +307,8 @@ Subroutine psb_scgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist end if - call prec%apply(s,z,desc_a,info,work=aux) - Call psb_spmm(sone,a,z,szero,t,desc_a,info,work=aux) + call prec%apply(s,z,desc_a,info) + Call psb_spmm(sone,a,z,szero,t,desc_a,info) if(psb_errstatus_fatal()) then call psb_errpush(psb_err_from_subroutine_,name,a_err='precaply/spmm') @@ -367,8 +358,6 @@ Subroutine psb_scgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist call psb_end_conv(methdname,itx,desc_a,stopdat,info,derr,iter) if (present(err)) err = derr - deallocate(aux,stat=info) - call x%sync() call psb_gefree(q,desc_a,info) call psb_gefree(r,desc_a,info) diff --git a/linsolve/impl/psb_scgstabl.f90 b/linsolve/impl/psb_scgstabl.f90 index e55d27467..125e3b92d 100644 --- a/linsolve/impl/psb_scgstabl.f90 +++ b/linsolve/impl/psb_scgstabl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -121,13 +121,13 @@ Subroutine psb_scgstabl_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_spk_), Optional, Intent(out) :: err ! = local data - real(psb_spk_), allocatable, target :: aux(:), gamma(:),& + real(psb_spk_), allocatable, target :: gamma(:),& & gamma1(:), gamma2(:), taum(:,:), sigma(:) type(psb_s_vect_type), allocatable, target :: wwrk(:),uh(:), rh(:) type(psb_s_vect_type), Pointer :: ww, q, r, rt0, p, v, & & s, t, z, f - integer(psb_ipk_) :: itmax_, naux, it, itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col, nl, err_act integer(psb_lpk_) :: mglob Logical, Parameter :: exchange=.True., noexchange=.False. @@ -213,10 +213,6 @@ Subroutine psb_scgstabl_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux),gamma(0:nl),gamma1(nl),& - &gamma2(nl),taum(nl,nl),sigma(nl), stat=info) - if (info /= psb_success_) then info=psb_err_alloc_dealloc_ call psb_errpush(info,name) @@ -263,7 +259,7 @@ Subroutine psb_scgstabl_vect(a,prec,b,x,eps,desc_a,info,& it = 0 call psb_geaxpby(sone,b,szero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-sone,a,x,sone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-sone,a,x,sone,r,desc_a,info) if (info == psb_success_) call prec%apply(r,desc_a,info) @@ -318,7 +314,7 @@ Subroutine psb_scgstabl_vect(a,prec,b,x,eps,desc_a,info,& ! = call psb_geaxpby(sone,rh(:,0:j),-beta,uh(:,0:j),desc_a,info) call psb_geaxpby(sone,rh(k),-beta,uh(k),desc_a,info) end do - call psb_spmm(sone,a,uh(j),szero,uh(j+1),desc_a,info,work=aux) + call psb_spmm(sone,a,uh(j),szero,uh(j+1),desc_a,info) call prec%apply(uh(j+1),desc_a,info) @@ -340,7 +336,7 @@ Subroutine psb_scgstabl_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(-alpha,uh(k+1),sone,rh(k),desc_a,info) end do call psb_geaxpby(alpha,uh(0),sone,x,desc_a,info) - call psb_spmm(sone,a,rh(j),szero,rh(j+1),desc_a,info,work=aux) + call psb_spmm(sone,a,rh(j),szero,rh(j+1),desc_a,info) call prec%apply(rh(j+1),desc_a,info) @@ -403,7 +399,6 @@ Subroutine psb_scgstabl_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_gefree(uh,desc_a,info) if (info == psb_success_) call psb_gefree(rh,desc_a,info) if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) if (info /= psb_success_) then call psb_errpush(info,name) goto 9999 diff --git a/linsolve/impl/psb_sfcg.F90 b/linsolve/impl/psb_sfcg.F90 index 449942cd6..940aa21ef 100644 --- a/linsolve/impl/psb_sfcg.F90 +++ b/linsolve/impl/psb_sfcg.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -125,12 +125,11 @@ subroutine psb_sfcg_vect(a,prec,b,x,eps,desc_a,info,& real(psb_spk_) :: alpha, beta, delta, gamma, theta real(psb_dpk_) :: derr integer(psb_ipk_) :: i, idx, nc2l, it, itx, istop_, itmax_, itrace_ - integer(psb_ipk_) :: n_col, naux, err_act + integer(psb_ipk_) :: n_col, err_act integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me - real(psb_spk_), allocatable, target :: aux(:) real(psb_spk_) :: vres(3) character(len=20) :: name type(psb_itconv_type) :: stopdat @@ -177,10 +176,6 @@ subroutine psb_sfcg_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux), stat=info) - - if (present(itmax)) then itmax_ = itmax else @@ -234,7 +229,7 @@ subroutine psb_sfcg_vect(a,prec,b,x,eps,desc_a,info,& ! Apply the preconditioner v=Pr ! Compute w = Av - call prec%apply(r,v,desc_a,info,work=aux) + call prec%apply(r,v,desc_a,info) if (info == psb_success_) call psb_spmm(sone,a,v,szero,w,desc_a,info) if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& @@ -289,7 +284,7 @@ subroutine psb_sfcg_vect(a,prec,b,x,eps,desc_a,info,& ! Apply the preconditioner v = Pr ! Compute w = Av - call prec%apply(r,v,desc_a,info,work=aux) + call prec%apply(r,v,desc_a,info) if (info == psb_success_) call psb_spmm(sone,a,v,szero,w,desc_a,info) if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& diff --git a/linsolve/impl/psb_sgcr.f90 b/linsolve/impl/psb_sgcr.f90 index b2d09d3e7..6c45d44be 100644 --- a/linsolve/impl/psb_sgcr.f90 +++ b/linsolve/impl/psb_sgcr.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -130,14 +130,13 @@ subroutine psb_sgcr_vect(a,prec,b,x,eps,desc_a,info,& type(psb_s_vect_type) :: r real(psb_dpk_) :: r_norm, b_norm, a_norm, derr - integer(psb_ipk_) :: n_col, naux, err_act + integer(psb_ipk_) :: n_col, err_act integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me integer(psb_ipk_) :: i, j, it, itx, istop_, itmax_, itrace_, nl, m, nrst real(psb_spk_) :: hjj - real(psb_spk_), allocatable, target :: aux(:) character(len=20) :: name type(psb_itconv_type) :: stopdat character(len=*), parameter :: methdname='GCR' @@ -223,10 +222,6 @@ subroutine psb_sgcr_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 endif - naux=4*n_col - allocate(aux(naux),h(nl+1,nl+1),& - &c_scale(nl+1),c(nl+1),z(nl+1), alpha(nl+1), stat=info) - h = szero if (info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -261,7 +256,7 @@ subroutine psb_sgcr_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(sone, b, szero, r, desc_a, info) - call psb_spmm(-sone,a,x,sone,r,desc_a,info,work=aux) + call psb_spmm(-sone,a,x,sone,r,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -278,9 +273,9 @@ subroutine psb_sgcr_vect(a,prec,b,x,eps,desc_a,info,& it = it + 1 j = it !Apply preconditioner - call prec%apply(r,z(j),desc_a,info,work=aux) + call prec%apply(r,z(j),desc_a,info) - call psb_spmm(sone,a,z(j),szero,c(1),desc_a,info,work=aux) + call psb_spmm(sone,a,z(j),szero,c(1),desc_a,info) do i =1, j - 1 h(i,j) = psb_gedot(c_scale(i), c(i), desc_a, info) @@ -347,7 +342,7 @@ subroutine psb_sgcr_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_gefree(c(i),desc_a,info) end do - if (info == psb_success_) deallocate(aux,h,c_scale,z,c,alpha,stat=info) + if (info == psb_success_) deallocate(h,c_scale,z,c,alpha,stat=info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) diff --git a/linsolve/impl/psb_skrylov.f90 b/linsolve/impl/psb_skrylov.f90 index 1a612a122..e24d7d05f 100644 --- a/linsolve/impl/psb_skrylov.f90 +++ b/linsolve/impl/psb_skrylov.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/linsolve/impl/psb_srgmres.f90 b/linsolve/impl/psb_srgmres.f90 index 32129e35e..a0db5f698 100644 --- a/linsolve/impl/psb_srgmres.f90 +++ b/linsolve/impl/psb_srgmres.f90 @@ -18,7 +18,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -124,13 +124,12 @@ subroutine psb_srgmres_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_spk_), Optional, Intent(out) :: err ! = local data - real(psb_spk_), allocatable :: aux(:) real(psb_spk_), allocatable :: c(:), s(:), h(:,:), rs(:), rst(:) type(psb_s_vect_type), allocatable :: v(:) type(psb_s_vect_type) :: w, w1, xt real(psb_spk_) :: tmp real(psb_spk_) :: scal, gm, rti, rti1 - integer(psb_ipk_) ::litmax, naux, it, k, itrace_,& + integer(psb_ipk_) ::litmax, it, k, itrace_,& & n_row, n_col, nl integer(psb_lpk_) :: mglob Logical, Parameter :: exchange=.True., noexchange=.False., use_srot=.true. @@ -229,11 +228,6 @@ subroutine psb_srgmres_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - - naux=4*n_col - allocate(aux(naux),h(nl+1,nl+1),& - &c(nl+1),s(nl+1),rs(nl+1), rst(nl+1),stat=info) - if (info == psb_success_) call psb_geall(v,desc_a,info,n=nl+1) if (info == psb_success_) call psb_geall(w,desc_a,info) if (info == psb_success_) call psb_geall(w1,desc_a,info) @@ -266,7 +260,7 @@ subroutine psb_srgmres_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - call psb_spmm(-sone,a,x,sone,v(1),desc_a,info,work=aux) + call psb_spmm(-sone,a,x,sone,v(1),desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -301,7 +295,7 @@ subroutine psb_srgmres_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - call psb_spmm(-sone,a,x,sone,v(1),desc_a,info,work=aux) + call psb_spmm(-sone,a,x,sone,v(1),desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -358,7 +352,7 @@ subroutine psb_srgmres_vect(a,prec,b,x,eps,desc_a,info,& itx = itx + 1 call prec%apply(v(i),w1,desc_a,info) - call psb_spmm(sone,a,w1,szero,w,desc_a,info,work=aux) + call psb_spmm(sone,a,w1,szero,w,desc_a,info) ! do k = 1, i @@ -397,7 +391,7 @@ subroutine psb_srgmres_vect(a,prec,b,x,eps,desc_a,info,& call prec%apply(xt,desc_a,info) call psb_geaxpby(sone,x,sone,xt,desc_a,info) call psb_geaxpby(sone,b,szero,w1,desc_a,info) - call psb_spmm(-sone,a,xt,sone,w1,desc_a,info,work=aux) + call psb_spmm(-sone,a,xt,sone,w1,desc_a,info) rni = psb_geamax(w1,desc_a,info) xni = psb_geamax(xt,desc_a,info) errnum = rni @@ -490,7 +484,7 @@ subroutine psb_srgmres_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_gefree(w,desc_a,info) if (info == psb_success_) call psb_gefree(w1,desc_a,info) if (info == psb_success_) call psb_gefree(xt,desc_a,info) - if (info == psb_success_) deallocate(aux,h,c,s,rs,rst, stat=info) + if (info == psb_success_) deallocate(h,c,s,rs,rst, stat=info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) diff --git a/linsolve/impl/psb_srichardson.f90 b/linsolve/impl/psb_srichardson.f90 index 660778fcc..1f9acb894 100644 --- a/linsolve/impl/psb_srichardson.f90 +++ b/linsolve/impl/psb_srichardson.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -91,11 +91,10 @@ Subroutine psb_srichardson_vect(a,prec,b,x,eps,desc_a,info,& logical :: do_alloc_wrk type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: me,np,err_act - real(psb_spk_), allocatable, target :: aux(:) type(psb_s_vect_type), allocatable, target :: wwrk(:) type(psb_s_vect_type), pointer :: q, p, r, z, w real(psb_dpk_) :: derr - integer(psb_ipk_) :: itmax_, istop_, naux, it, itx, itrace_,& + integer(psb_ipk_) :: itmax_, istop_, it, itx, itrace_,& & n_col, n_row,ieg,nspl, istebz integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -155,15 +154,6 @@ Subroutine psb_srichardson_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux), stat=info) - if (info == psb_success_) call psb_geall(wwrk,desc_a,info,n=5_psb_ipk_) - if (info == psb_success_) call psb_geasb(wwrk,desc_a,info,mold=x%v,scratch=.true.) - if (info /= psb_success_) then - info=psb_err_from_subroutine_non_ - call psb_errpush(info,name) - goto 9999 - end if p => wwrk(1) q => wwrk(2) r => wwrk(3) @@ -171,7 +161,7 @@ Subroutine psb_srichardson_vect(a,prec,b,x,eps,desc_a,info,& w => wwrk(5) call psb_geaxpby(sone,b,szero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-sone,a,x,sone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-sone,a,x,sone,r,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -186,17 +176,16 @@ Subroutine psb_srichardson_vect(a,prec,b,x,eps,desc_a,info,& End If loop: do itx=1,itmax_ - call prec%apply(r,z,desc_a,info,work=aux) + call prec%apply(r,z,desc_a,info) call psb_geaxpby(sone,z,sone,x,desc_a,info) call psb_geaxpby(sone,b,szero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-sone,a,x,sone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-sone,a,x,sone,r,desc_a,info) if (psb_check_conv(methdname,itx,x,r,desc_a,stopdat,info)) exit loop end do loop call psb_end_conv(methdname,itx,desc_a,stopdat,info,derr,iter) if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) if ((info==psb_success_).and.do_alloc_wrk) call prec%free_wrk(info) if(info /= psb_success_) then diff --git a/linsolve/impl/psb_zbicg.f90 b/linsolve/impl/psb_zbicg.f90 index 6a3e02154..19ba88001 100644 --- a/linsolve/impl/psb_zbicg.f90 +++ b/linsolve/impl/psb_zbicg.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -112,11 +112,10 @@ subroutine psb_zbicg_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), optional, intent(out) :: iter real(psb_dpk_), optional, intent(out) :: err ! !$ local data - complex(psb_dpk_), allocatable, target :: aux(:) type(psb_z_vect_type), allocatable, target :: wwrk(:) type(psb_z_vect_type), pointer :: ww, q, r, p,& & zt, pt, z, rt, qt - integer(psb_ipk_) :: itmax_, naux, it, itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col, istop_, err_act integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -188,10 +187,7 @@ subroutine psb_zbicg_vect(a,prec,b,x,eps,desc_a,info,& end if - naux=4*n_col - - allocate(aux(naux),stat=info) - if (info == psb_success_) call psb_geall(wwrk,desc_a,info,n=9_psb_ipk_) + call psb_geall(wwrk,desc_a,info,n=9_psb_ipk_) if (info == psb_success_) call psb_geasb(wwrk,desc_a,info,mold=x%v) if(info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -239,7 +235,7 @@ subroutine psb_zbicg_vect(a,prec,b,x,eps,desc_a,info,& if (itx >= itmax_) exit restart it = 0 call psb_geaxpby(zone,b,zzero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-zone,a,x,zone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-zone,a,x,zone,r,desc_a,info) if (debug_level >= psb_debug_ext_)& & write(debug_unit,*) me,' ',trim(name),' Done spmm',info if (info == psb_success_) call psb_geaxpby(zone,r,zzero,rt,desc_a,info) @@ -265,8 +261,8 @@ subroutine psb_zbicg_vect(a,prec,b,x,eps,desc_a,info,& if (debug_level >= psb_debug_ext_) & & write(debug_unit,*) me,' ',trim(name),'iteration: ',itx - call prec%apply(r,z,desc_a,info,work=aux) - if (info == psb_success_) call prec%apply(rt,zt,desc_a,info,trans='c',work=aux) + call prec%apply(r,z,desc_a,info) + if (info == psb_success_) call prec%apply(rt,zt,desc_a,info,trans='c') rho_old = rho rho = psb_gedot(rt,z,desc_a,info) @@ -286,10 +282,8 @@ subroutine psb_zbicg_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(zone,zt,beta,pt,desc_a,info) end if - call psb_spmm(zone,a,p,zzero,q,desc_a,info,& - & work=aux) - call psb_spmm(zone,a,pt,zzero,qt,desc_a,info,& - & work=aux,trans='c') + call psb_spmm(zone,a,p,zzero,q,desc_a,info) + call psb_spmm(zone,a,pt,zzero,qt,desc_a,info,trans='c') sigma = psb_gedot(pt,q,desc_a,info) if (sigma == zzero) then @@ -319,11 +313,6 @@ subroutine psb_zbicg_vect(a,prec,b,x,eps,desc_a,info,& if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) - if (info /= psb_success_) then - call psb_errpush(info,name) - goto 9999 - end if call psb_erractionrestore(err_act) return diff --git a/linsolve/impl/psb_zcg.F90 b/linsolve/impl/psb_zcg.F90 index 6ca5909c1..dbc6ea2ee 100644 --- a/linsolve/impl/psb_zcg.F90 +++ b/linsolve/impl/psb_zcg.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -113,12 +113,12 @@ subroutine psb_zcg_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_dpk_), Optional, Intent(out) :: err,cond ! = Local data - complex(psb_dpk_), allocatable, target :: aux(:),td(:),tu(:),eig(:),ewrk(:) + complex(psb_dpk_), allocatable, target ::td(:),tu(:),eig(:),ewrk(:) integer(psb_mpk_), allocatable :: ibl(:), ispl(:), iwrk(:) type(psb_z_vect_type), allocatable, target :: wwrk(:) type(psb_z_vect_type), pointer :: q, p, r, z, w complex(psb_dpk_) :: alpha, beta, rho, rho_old, sigma,alpha_old,beta_old - integer(psb_ipk_) :: itmax_, istop_, naux, it, itx, itrace_,& + integer(psb_ipk_) :: itmax_, istop_, it, itx, itrace_,& & n_col, n_row,err_act, ieg,nspl, istebz integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -171,9 +171,8 @@ subroutine psb_zcg_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux), stat=info) - if (info == psb_success_) call psb_geall(wwrk,desc_a,info,n=5_psb_ipk_) + + call psb_geall(wwrk,desc_a,info,n=5_psb_ipk_) if (info == psb_success_) call psb_geasb(wwrk,desc_a,info,mold=x%v,scratch=.true.) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -215,7 +214,7 @@ subroutine psb_zcg_vect(a,prec,b,x,eps,desc_a,info,& it = 0 call psb_geaxpby(zone,b,zzero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-zone,a,x,zone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-zone,a,x,zone,r,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -235,7 +234,7 @@ subroutine psb_zcg_vect(a,prec,b,x,eps,desc_a,info,& it = it + 1 itx = itx + 1 - call prec%apply(r,z,desc_a,info,work=aux) + call prec%apply(r,z,desc_a,info) rho_old = rho rho = psb_gedot(r,z,desc_a,info) @@ -252,7 +251,7 @@ subroutine psb_zcg_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(zone,z,beta,p,desc_a,info) end if - call psb_spmm(zone,a,p,zzero,q,desc_a,info,work=aux) + call psb_spmm(zone,a,p,zzero,q,desc_a,info) sigma = psb_gedot(p,q,desc_a,info) if (sigma == zzero) then if (debug_level >= psb_debug_ext_)& @@ -285,11 +284,6 @@ subroutine psb_zcg_vect(a,prec,b,x,eps,desc_a,info,& if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) - if (info /= psb_success_) then - call psb_errpush(info,name) - goto 9999 - end if call psb_erractionrestore(err_act) return diff --git a/linsolve/impl/psb_zcgs.f90 b/linsolve/impl/psb_zcgs.f90 index c51405452..88d0d927d 100644 --- a/linsolve/impl/psb_zcgs.f90 +++ b/linsolve/impl/psb_zcgs.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -110,11 +110,10 @@ Subroutine psb_zcgs_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_dpk_), Optional, Intent(out) :: err ! = local data - complex(psb_dpk_), allocatable, target :: aux(:) type(psb_z_vect_type), allocatable, target :: wwrk(:) type(psb_z_vect_type), pointer :: ww, q, r, p, v,& & s, z, f, rt, qt, uv - integer(psb_ipk_) :: itmax_, naux, it, itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col,istop_, itx, err_act integer(psb_lpk_) :: mglob type(psb_ctxt_type) :: ctxt @@ -165,8 +164,7 @@ Subroutine psb_zcgs_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - Allocate(aux(naux),stat=info) + if (info == psb_success_) Call psb_geall(wwrk,desc_a,info,n=11_psb_ipk_) if (info == psb_success_) Call psb_geasb(wwrk,desc_a,info,mold=x%v) if (info /= psb_success_) Then @@ -215,7 +213,7 @@ Subroutine psb_zcgs_vect(a,prec,b,x,eps,desc_a,info,& if (itx >= itmax_) exit restart it = 0 call psb_geaxpby(zone,b,zzero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-zone,a,x,zone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-zone,a,x,zone,r,desc_a,info) if (info == psb_success_) call psb_geaxpby(zone,r,zzero,rt,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -260,10 +258,9 @@ Subroutine psb_zcgs_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_geaxpby(zone,uv,beta,p,desc_a,info) end if - if (info == psb_success_) call prec%apply(p,f,desc_a,info,work=aux) + if (info == psb_success_) call prec%apply(p,f,desc_a,info) - if (info == psb_success_) call psb_spmm(zone,a,f,zzero,v,desc_a,info,& - & work=aux) + if (info == psb_success_) call psb_spmm(zone,a,f,zzero,v,desc_a,info) if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='First loop part ') @@ -285,12 +282,11 @@ Subroutine psb_zcgs_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_geaxpby(zone,uv,zzero,s,desc_a,info) if (info == psb_success_) call psb_geaxpby(zone,q,zone,s,desc_a,info) - if (info == psb_success_) call prec%apply(s,z,desc_a,info,work=aux) + if (info == psb_success_) call prec%apply(s,z,desc_a,info) if (info == psb_success_) call psb_geaxpby(alpha,z,zone,x,desc_a,info) - if (info == psb_success_) call psb_spmm(zone,a,z,zzero,qt,desc_a,info,& - & work=aux) + if (info == psb_success_) call psb_spmm(zone,a,z,zzero,qt,desc_a,info) if (info == psb_success_) call psb_geaxpby(-alpha,qt,zone,r,desc_a,info) @@ -312,11 +308,6 @@ Subroutine psb_zcgs_vect(a,prec,b,x,eps,desc_a,info,& if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) - if (info /= psb_success_) then - call psb_errpush(info,name) - goto 9999 - end if call psb_erractionrestore(err_act) return diff --git a/linsolve/impl/psb_zcgstab.f90 b/linsolve/impl/psb_zcgstab.f90 index e04cd7c40..16bb5ddc5 100644 --- a/linsolve/impl/psb_zcgstab.f90 +++ b/linsolve/impl/psb_zcgstab.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -110,10 +110,10 @@ Subroutine psb_zcgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_dpk_), Optional, Intent(out) :: err ! = Local data - complex(psb_dpk_), allocatable, target :: aux(:),wwrk(:,:) + complex(psb_dpk_), allocatable, target :: wwrk(:,:) type(psb_z_vect_type) :: q, r, p, v, s, t, z, f - integer(psb_ipk_) :: itmax_, naux, it,itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -179,14 +179,6 @@ Subroutine psb_zcgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist call psb_errpush(info,name,a_err='psb_chkvect on B') goto 9999 end if - naux=6*n_col - if (info == psb_success_) allocate(aux(naux),stat=info) - if (info /= psb_success_) then - info=psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - End If - call psb_geasb(q,desc_a,info,mold=x%v,scratch=.true.) call psb_geasb(r,desc_a,info,mold=x%v,scratch=.true.) @@ -230,7 +222,7 @@ Subroutine psb_zcgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist it = 0 call psb_geaxpby(zone,b,zzero,r,desc_a,info) - call psb_spmm(-zone,a,x,zone,r,desc_a,info,work=aux) + call psb_spmm(-zone,a,x,zone,r,desc_a,info) call psb_geaxpby(zone,r,zzero,q,desc_a,info) ! Perhaps we already satisfy the convergence criterion... @@ -279,10 +271,9 @@ Subroutine psb_zcgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist call psb_geaxpby(zone,r,beta,p,desc_a,info) End If - call prec%apply(p,f,desc_a,info,work=aux) + call prec%apply(p,f,desc_a,info) - call psb_spmm(zone,a,f,zzero,v,desc_a,info,& - & work=aux) + call psb_spmm(zone,a,f,zzero,v,desc_a,info) sigma = psb_gedot(q,v,desc_a,info) @@ -316,8 +307,8 @@ Subroutine psb_zcgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist end if - call prec%apply(s,z,desc_a,info,work=aux) - Call psb_spmm(zone,a,z,zzero,t,desc_a,info,work=aux) + call prec%apply(s,z,desc_a,info) + Call psb_spmm(zone,a,z,zzero,t,desc_a,info) if(psb_errstatus_fatal()) then call psb_errpush(psb_err_from_subroutine_,name,a_err='precaply/spmm') @@ -367,8 +358,6 @@ Subroutine psb_zcgstab_vect(a,prec,b,x,eps,desc_a,info,itmax,iter,err,itrace,ist call psb_end_conv(methdname,itx,desc_a,stopdat,info,derr,iter) if (present(err)) err = derr - deallocate(aux,stat=info) - call x%sync() call psb_gefree(q,desc_a,info) call psb_gefree(r,desc_a,info) diff --git a/linsolve/impl/psb_zcgstabl.f90 b/linsolve/impl/psb_zcgstabl.f90 index 93abd0561..aba579327 100644 --- a/linsolve/impl/psb_zcgstabl.f90 +++ b/linsolve/impl/psb_zcgstabl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -121,13 +121,13 @@ Subroutine psb_zcgstabl_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_dpk_), Optional, Intent(out) :: err ! = local data - complex(psb_dpk_), allocatable, target :: aux(:), gamma(:),& + complex(psb_dpk_), allocatable, target :: gamma(:),& & gamma1(:), gamma2(:), taum(:,:), sigma(:) type(psb_z_vect_type), allocatable, target :: wwrk(:),uh(:), rh(:) type(psb_z_vect_type), Pointer :: ww, q, r, rt0, p, v, & & s, t, z, f - integer(psb_ipk_) :: itmax_, naux, it, itrace_,& + integer(psb_ipk_) :: itmax_, it, itrace_,& & n_row, n_col, nl, err_act integer(psb_lpk_) :: mglob Logical, Parameter :: exchange=.True., noexchange=.False. @@ -213,10 +213,6 @@ Subroutine psb_zcgstabl_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux),gamma(0:nl),gamma1(nl),& - &gamma2(nl),taum(nl,nl),sigma(nl), stat=info) - if (info /= psb_success_) then info=psb_err_alloc_dealloc_ call psb_errpush(info,name) @@ -263,7 +259,7 @@ Subroutine psb_zcgstabl_vect(a,prec,b,x,eps,desc_a,info,& it = 0 call psb_geaxpby(zone,b,zzero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-zone,a,x,zone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-zone,a,x,zone,r,desc_a,info) if (info == psb_success_) call prec%apply(r,desc_a,info) @@ -318,7 +314,7 @@ Subroutine psb_zcgstabl_vect(a,prec,b,x,eps,desc_a,info,& ! = call psb_geaxpby(zone,rh(:,0:j),-beta,uh(:,0:j),desc_a,info) call psb_geaxpby(zone,rh(k),-beta,uh(k),desc_a,info) end do - call psb_spmm(zone,a,uh(j),zzero,uh(j+1),desc_a,info,work=aux) + call psb_spmm(zone,a,uh(j),zzero,uh(j+1),desc_a,info) call prec%apply(uh(j+1),desc_a,info) @@ -340,7 +336,7 @@ Subroutine psb_zcgstabl_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(-alpha,uh(k+1),zone,rh(k),desc_a,info) end do call psb_geaxpby(alpha,uh(0),zone,x,desc_a,info) - call psb_spmm(zone,a,rh(j),zzero,rh(j+1),desc_a,info,work=aux) + call psb_spmm(zone,a,rh(j),zzero,rh(j+1),desc_a,info) call prec%apply(rh(j+1),desc_a,info) @@ -403,7 +399,6 @@ Subroutine psb_zcgstabl_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_gefree(uh,desc_a,info) if (info == psb_success_) call psb_gefree(rh,desc_a,info) if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) if (info /= psb_success_) then call psb_errpush(info,name) goto 9999 diff --git a/linsolve/impl/psb_zfcg.F90 b/linsolve/impl/psb_zfcg.F90 index 1ab036feb..41dbfe8df 100644 --- a/linsolve/impl/psb_zfcg.F90 +++ b/linsolve/impl/psb_zfcg.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -125,12 +125,11 @@ subroutine psb_zfcg_vect(a,prec,b,x,eps,desc_a,info,& complex(psb_dpk_) :: alpha, beta, delta, gamma, theta real(psb_dpk_) :: derr integer(psb_ipk_) :: i, idx, nc2l, it, itx, istop_, itmax_, itrace_ - integer(psb_ipk_) :: n_col, naux, err_act + integer(psb_ipk_) :: n_col, err_act integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me - complex(psb_dpk_), allocatable, target :: aux(:) complex(psb_dpk_) :: vres(3) character(len=20) :: name type(psb_itconv_type) :: stopdat @@ -177,10 +176,6 @@ subroutine psb_zfcg_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux), stat=info) - - if (present(itmax)) then itmax_ = itmax else @@ -234,7 +229,7 @@ subroutine psb_zfcg_vect(a,prec,b,x,eps,desc_a,info,& ! Apply the preconditioner v=Pr ! Compute w = Av - call prec%apply(r,v,desc_a,info,work=aux) + call prec%apply(r,v,desc_a,info) if (info == psb_success_) call psb_spmm(zone,a,v,zzero,w,desc_a,info) if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& @@ -289,7 +284,7 @@ subroutine psb_zfcg_vect(a,prec,b,x,eps,desc_a,info,& ! Apply the preconditioner v = Pr ! Compute w = Av - call prec%apply(r,v,desc_a,info,work=aux) + call prec%apply(r,v,desc_a,info) if (info == psb_success_) call psb_spmm(zone,a,v,zzero,w,desc_a,info) if (info /= psb_success_) then call psb_errpush(psb_err_internal_error_,name,& diff --git a/linsolve/impl/psb_zgcr.f90 b/linsolve/impl/psb_zgcr.f90 index e48fc4c1d..55feffd1f 100644 --- a/linsolve/impl/psb_zgcr.f90 +++ b/linsolve/impl/psb_zgcr.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -130,14 +130,13 @@ subroutine psb_zgcr_vect(a,prec,b,x,eps,desc_a,info,& type(psb_z_vect_type) :: r real(psb_dpk_) :: r_norm, b_norm, a_norm, derr - integer(psb_ipk_) :: n_col, naux, err_act + integer(psb_ipk_) :: n_col, err_act integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np, me integer(psb_ipk_) :: i, j, it, itx, istop_, itmax_, itrace_, nl, m, nrst complex(psb_dpk_) :: hjj - complex(psb_dpk_), allocatable, target :: aux(:) character(len=20) :: name type(psb_itconv_type) :: stopdat character(len=*), parameter :: methdname='GCR' @@ -223,10 +222,6 @@ subroutine psb_zgcr_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 endif - naux=4*n_col - allocate(aux(naux),h(nl+1,nl+1),& - &c_scale(nl+1),c(nl+1),z(nl+1), alpha(nl+1), stat=info) - h = zzero if (info /= psb_success_) then info=psb_err_from_subroutine_non_ @@ -261,7 +256,7 @@ subroutine psb_zgcr_vect(a,prec,b,x,eps,desc_a,info,& call psb_geaxpby(zone, b, zzero, r, desc_a, info) - call psb_spmm(-zone,a,x,zone,r,desc_a,info,work=aux) + call psb_spmm(-zone,a,x,zone,r,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -278,9 +273,9 @@ subroutine psb_zgcr_vect(a,prec,b,x,eps,desc_a,info,& it = it + 1 j = it !Apply preconditioner - call prec%apply(r,z(j),desc_a,info,work=aux) + call prec%apply(r,z(j),desc_a,info) - call psb_spmm(zone,a,z(j),zzero,c(1),desc_a,info,work=aux) + call psb_spmm(zone,a,z(j),zzero,c(1),desc_a,info) do i =1, j - 1 h(i,j) = psb_gedot(c_scale(i), c(i), desc_a, info) @@ -347,7 +342,7 @@ subroutine psb_zgcr_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_gefree(c(i),desc_a,info) end do - if (info == psb_success_) deallocate(aux,h,c_scale,z,c,alpha,stat=info) + if (info == psb_success_) deallocate(h,c_scale,z,c,alpha,stat=info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) diff --git a/linsolve/impl/psb_zkrylov.f90 b/linsolve/impl/psb_zkrylov.f90 index 900e50b61..091271d15 100644 --- a/linsolve/impl/psb_zkrylov.f90 +++ b/linsolve/impl/psb_zkrylov.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/linsolve/impl/psb_zrgmres.f90 b/linsolve/impl/psb_zrgmres.f90 index c6bcc0189..fc1450dcd 100644 --- a/linsolve/impl/psb_zrgmres.f90 +++ b/linsolve/impl/psb_zrgmres.f90 @@ -18,7 +18,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -124,13 +124,12 @@ subroutine psb_zrgmres_vect(a,prec,b,x,eps,desc_a,info,& integer(psb_ipk_), Optional, Intent(out) :: iter Real(psb_dpk_), Optional, Intent(out) :: err ! = local data - complex(psb_dpk_), allocatable :: aux(:) complex(psb_dpk_), allocatable :: c(:), s(:), h(:,:), rs(:), rst(:) type(psb_z_vect_type), allocatable :: v(:) type(psb_z_vect_type) :: w, w1, xt real(psb_dpk_) :: tmp complex(psb_dpk_) :: scal, gm, rti, rti1 - integer(psb_ipk_) ::litmax, naux, it, k, itrace_,& + integer(psb_ipk_) ::litmax, it, k, itrace_,& & n_row, n_col, nl integer(psb_lpk_) :: mglob Logical, Parameter :: exchange=.True., noexchange=.False., use_srot=.true. @@ -229,11 +228,6 @@ subroutine psb_zrgmres_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - - naux=4*n_col - allocate(aux(naux),h(nl+1,nl+1),& - &c(nl+1),s(nl+1),rs(nl+1), rst(nl+1),stat=info) - if (info == psb_success_) call psb_geall(v,desc_a,info,n=nl+1) if (info == psb_success_) call psb_geall(w,desc_a,info) if (info == psb_success_) call psb_geall(w1,desc_a,info) @@ -266,7 +260,7 @@ subroutine psb_zrgmres_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - call psb_spmm(-zone,a,x,zone,v(1),desc_a,info,work=aux) + call psb_spmm(-zone,a,x,zone,v(1),desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -301,7 +295,7 @@ subroutine psb_zrgmres_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - call psb_spmm(-zone,a,x,zone,v(1),desc_a,info,work=aux) + call psb_spmm(-zone,a,x,zone,v(1),desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -358,7 +352,7 @@ subroutine psb_zrgmres_vect(a,prec,b,x,eps,desc_a,info,& itx = itx + 1 call prec%apply(v(i),w1,desc_a,info) - call psb_spmm(zone,a,w1,zzero,w,desc_a,info,work=aux) + call psb_spmm(zone,a,w1,zzero,w,desc_a,info) ! do k = 1, i @@ -397,7 +391,7 @@ subroutine psb_zrgmres_vect(a,prec,b,x,eps,desc_a,info,& call prec%apply(xt,desc_a,info) call psb_geaxpby(zone,x,zone,xt,desc_a,info) call psb_geaxpby(zone,b,zzero,w1,desc_a,info) - call psb_spmm(-zone,a,xt,zone,w1,desc_a,info,work=aux) + call psb_spmm(-zone,a,xt,zone,w1,desc_a,info) rni = psb_geamax(w1,desc_a,info) xni = psb_geamax(xt,desc_a,info) errnum = rni @@ -490,7 +484,7 @@ subroutine psb_zrgmres_vect(a,prec,b,x,eps,desc_a,info,& if (info == psb_success_) call psb_gefree(w,desc_a,info) if (info == psb_success_) call psb_gefree(w1,desc_a,info) if (info == psb_success_) call psb_gefree(xt,desc_a,info) - if (info == psb_success_) deallocate(aux,h,c,s,rs,rst, stat=info) + if (info == psb_success_) deallocate(h,c,s,rs,rst, stat=info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) diff --git a/linsolve/impl/psb_zrichardson.f90 b/linsolve/impl/psb_zrichardson.f90 index 4c2bc5674..098b7cb10 100644 --- a/linsolve/impl/psb_zrichardson.f90 +++ b/linsolve/impl/psb_zrichardson.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -91,11 +91,10 @@ Subroutine psb_zrichardson_vect(a,prec,b,x,eps,desc_a,info,& logical :: do_alloc_wrk type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: me,np,err_act - complex(psb_dpk_), allocatable, target :: aux(:) type(psb_z_vect_type), allocatable, target :: wwrk(:) type(psb_z_vect_type), pointer :: q, p, r, z, w real(psb_dpk_) :: derr - integer(psb_ipk_) :: itmax_, istop_, naux, it, itx, itrace_,& + integer(psb_ipk_) :: itmax_, istop_, it, itx, itrace_,& & n_col, n_row,ieg,nspl, istebz integer(psb_lpk_) :: mglob integer(psb_ipk_) :: debug_level, debug_unit @@ -155,15 +154,6 @@ Subroutine psb_zrichardson_vect(a,prec,b,x,eps,desc_a,info,& goto 9999 end if - naux=4*n_col - allocate(aux(naux), stat=info) - if (info == psb_success_) call psb_geall(wwrk,desc_a,info,n=5_psb_ipk_) - if (info == psb_success_) call psb_geasb(wwrk,desc_a,info,mold=x%v,scratch=.true.) - if (info /= psb_success_) then - info=psb_err_from_subroutine_non_ - call psb_errpush(info,name) - goto 9999 - end if p => wwrk(1) q => wwrk(2) r => wwrk(3) @@ -171,7 +161,7 @@ Subroutine psb_zrichardson_vect(a,prec,b,x,eps,desc_a,info,& w => wwrk(5) call psb_geaxpby(zone,b,zzero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-zone,a,x,zone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-zone,a,x,zone,r,desc_a,info) if (info /= psb_success_) then info=psb_err_from_subroutine_non_ call psb_errpush(info,name) @@ -186,17 +176,16 @@ Subroutine psb_zrichardson_vect(a,prec,b,x,eps,desc_a,info,& End If loop: do itx=1,itmax_ - call prec%apply(r,z,desc_a,info,work=aux) + call prec%apply(r,z,desc_a,info) call psb_geaxpby(zone,z,zone,x,desc_a,info) call psb_geaxpby(zone,b,zzero,r,desc_a,info) - if (info == psb_success_) call psb_spmm(-zone,a,x,zone,r,desc_a,info,work=aux) + if (info == psb_success_) call psb_spmm(-zone,a,x,zone,r,desc_a,info) if (psb_check_conv(methdname,itx,x,r,desc_a,stopdat,info)) exit loop end do loop call psb_end_conv(methdname,itx,desc_a,stopdat,info,derr,iter) if (present(err)) err = derr if (info == psb_success_) call psb_gefree(wwrk,desc_a,info) - if (info == psb_success_) deallocate(aux,stat=info) if ((info==psb_success_).and.do_alloc_wrk) call prec%free_wrk(info) if(info /= psb_success_) then diff --git a/linsolve/psb_base_linsolve_conv_mod.f90 b/linsolve/psb_base_linsolve_conv_mod.f90 index 8d36fb53a..8e45614f4 100644 --- a/linsolve/psb_base_linsolve_conv_mod.f90 +++ b/linsolve/psb_base_linsolve_conv_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -76,7 +76,7 @@ contains character(len=*), intent(in) :: methdname integer(psb_ipk_), intent(in) :: me, itx, itrace real(psb_dpk_), intent(in) :: errnum, errden, eps - character(len=*), parameter :: fmt='(a18,1x,i4,3(2x,es15.9))' + character(len=*), parameter :: fmt='(a18,1x,i4,3(2x,es18.9))' integer(psb_ipk_), parameter :: outlen=18 character(len=len(methdname)) :: mname character(len=outlen) :: outname @@ -102,8 +102,8 @@ contains real(psb_dpk_), optional, intent(out) :: err integer(psb_ipk_), optional, intent(out) :: iter - character(len=*), parameter :: fmt='(a,2x,es15.9,1x,a,1x,i4,1x,a)' - character(len=*), parameter :: fmt1='(a,3(2x,es15.9))' + character(len=*), parameter :: fmt='(a,2x,es18.9,1x,a,1x,i4,1x,a)' + character(len=*), parameter :: fmt1='(a,3(2x,es18.9))' if (errden == dzero) then if (errnum > eps) then diff --git a/linsolve/psb_c_linsolve_conv_mod.f90 b/linsolve/psb_c_linsolve_conv_mod.f90 index 73db081eb..474acfaa6 100644 --- a/linsolve/psb_c_linsolve_conv_mod.f90 +++ b/linsolve/psb_c_linsolve_conv_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/linsolve/psb_d_linsolve_conv_mod.f90 b/linsolve/psb_d_linsolve_conv_mod.f90 index ba59923f7..f92edce39 100644 --- a/linsolve/psb_d_linsolve_conv_mod.f90 +++ b/linsolve/psb_d_linsolve_conv_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/linsolve/psb_linsolve_conv_mod.f90 b/linsolve/psb_linsolve_conv_mod.f90 index 23d6c84c7..e5640eaa9 100644 --- a/linsolve/psb_linsolve_conv_mod.f90 +++ b/linsolve/psb_linsolve_conv_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/linsolve/psb_linsolve_mod.f90 b/linsolve/psb_linsolve_mod.f90 index c54326f3b..1cd324622 100644 --- a/linsolve/psb_linsolve_mod.f90 +++ b/linsolve/psb_linsolve_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/linsolve/psb_s_linsolve_conv_mod.f90 b/linsolve/psb_s_linsolve_conv_mod.f90 index 5de6ebb62..8cac66a41 100644 --- a/linsolve/psb_s_linsolve_conv_mod.f90 +++ b/linsolve/psb_s_linsolve_conv_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/linsolve/psb_z_linsolve_conv_mod.f90 b/linsolve/psb_z_linsolve_conv_mod.f90 index 6c6276ff6..d6082262c 100644 --- a/linsolve/psb_z_linsolve_conv_mod.f90 +++ b/linsolve/psb_z_linsolve_conv_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/openacc/Makefile b/openacc/Makefile index 6b1f3fbb3..6976955bc 100644 --- a/openacc/Makefile +++ b/openacc/Makefile @@ -38,8 +38,10 @@ lib: objs ilib $(AR) $(LIBNAME) $(OBJS) /bin/cp -p $(LIBNAME) $(LIBDIR) -objs: $(OBJS) iobjs - /bin/cp -p *$(.mod) $(MODDIR) +objs: mods $(OBJS) iobjs + +mods: $(FOBJS) + $(INSTALL) -p *$(.mod) $(MODDIR) iobjs: $(OBJS) $(MAKE) -C impl objs diff --git a/openacc/impl/Makefile b/openacc/impl/Makefile old mode 100755 new mode 100644 diff --git a/openacc/psb_c_oacc_csr_mat_mod.F90 b/openacc/psb_c_oacc_csr_mat_mod.F90 index c6461fe3c..f138e4c99 100644 --- a/openacc/psb_c_oacc_csr_mat_mod.F90 +++ b/openacc/psb_c_oacc_csr_mat_mod.F90 @@ -144,9 +144,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irp)>0) call acc_delete_finalize(a%irp) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irp)>0) then + !$acc exit data delete(a%irp) finalize + end if return end subroutine c_oacc_csr_free_dev_space @@ -257,9 +263,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irp)>0) call acc_copyin(a%irp) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc enter data copyin(a%irp) + end if end subroutine c_oacc_csr_sync_dev_space subroutine c_oacc_csr_sync(a) @@ -275,13 +287,25 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irp)>0) call acc_update_self(a%irp) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update self(a%irp) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irp)>0) call acc_update_device(a%irp) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update device(a%irp) + end if end if call tmpa%set_sync() end subroutine c_oacc_csr_sync diff --git a/openacc/psb_c_oacc_ell_mat_mod.F90 b/openacc/psb_c_oacc_ell_mat_mod.F90 index b21686466..30438011f 100644 --- a/openacc/psb_c_oacc_ell_mat_mod.F90 +++ b/openacc/psb_c_oacc_ell_mat_mod.F90 @@ -143,10 +143,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn) - if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irn)>0) then + !$acc exit data delete(a%irn) finalize + end if + if (psb_size(a%idiag)>0) then + !$acc exit data delete(a%idiag) finalize + end if return end subroutine c_oacc_ell_free_dev_space @@ -170,7 +178,7 @@ contains if (a%is_dev()) call a%sync() res = 8 - res = res + psb_sizeof_dp * size(a%val) + res = res + (2*psb_sizeof_sp) * size(a%val) res = res + psb_sizeof_ip * size(a%ja) res = res + psb_sizeof_ip * size(a%irn) res = res + psb_sizeof_ip * size(a%idiag) @@ -186,10 +194,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irn)>0) call acc_copyin(a%irn) - if (psb_size(a%idiag)>0) call acc_copyin(a%idiag) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc enter data copyin(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc enter data copyin(a%idiag) + end if end subroutine c_oacc_ell_sync_dev_space function c_oacc_ell_is_host(a) result(res) @@ -256,15 +272,31 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irn)>0) call acc_update_self(a%irn) - if (psb_size(a%idiag)>0) call acc_update_self(a%idiag) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update self(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update self(a%idiag) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irn)>0) call acc_update_device(a%irn) - if (psb_size(a%idiag)>0) call acc_update_device(a%idiag) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update device(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update device(a%idiag) + end if end if call tmpa%set_sync() end subroutine c_oacc_ell_sync diff --git a/openacc/psb_c_oacc_hll_mat_mod.F90 b/openacc/psb_c_oacc_hll_mat_mod.F90 index f8c192753..5c9d97219 100644 --- a/openacc/psb_c_oacc_hll_mat_mod.F90 +++ b/openacc/psb_c_oacc_hll_mat_mod.F90 @@ -171,7 +171,7 @@ contains if (a%is_dev()) call a%sync() res = 8 - res = res + psb_sizeof_dp * size(a%val) + res = res + (2*psb_sizeof_sp) * size(a%val) res = res + psb_sizeof_ip * size(a%ja) res = res + psb_sizeof_ip * size(a%irn) res = res + psb_sizeof_ip * size(a%idiag) diff --git a/openacc/psb_c_oacc_vect_mod.F90 b/openacc/psb_c_oacc_vect_mod.F90 index 2aa11db9f..1c6a14011 100644 --- a/openacc/psb_c_oacc_vect_mod.F90 +++ b/openacc/psb_c_oacc_vect_mod.F90 @@ -620,11 +620,11 @@ contains end subroutine inner_gth end subroutine c_oacc_gthzv_x - subroutine c_oacc_ins_v(n, irl, val, dupl, x, info) + subroutine c_oacc_ins_v(n, irl, val, dupl, x, maxr, info) use psi_serial_mod implicit none class(psb_c_vect_oacc), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr class(psb_i_base_vect_type), intent(inout) :: irl class(psb_c_base_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -661,7 +661,7 @@ contains type is (psb_c_vect_oacc) if (vval%is_dev()) call vval%sync() end select - call x%ins(n, irl%v, val%v, dupl, info) + call x%ins(n, irl%v, val%v, dupl, maxr, info) end if if (info /= 0) then @@ -671,11 +671,11 @@ contains end subroutine c_oacc_ins_v - subroutine c_oacc_ins_a(n, irl, val, dupl, x, info) + subroutine c_oacc_ins_a(n, irl, val, dupl, x, maxr, info) use psi_serial_mod implicit none class(psb_c_vect_oacc), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr integer(psb_ipk_), intent(in) :: irl(:) complex(psb_spk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info @@ -684,19 +684,26 @@ contains info = 0 if (x%is_dev()) call x%sync() - call x%psb_c_base_vect_type%ins(n, irl, val, dupl, info) + call x%psb_c_base_vect_type%ins(n, irl, val, dupl, maxr, info) call x%set_host() - end subroutine c_oacc_ins_a - subroutine c_oacc_bld_mn(x, n) + subroutine c_oacc_bld_mn(x, n,scratch) use psb_base_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_c_vect_oacc), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%free(info) call x%all(ione*n, info) if (info /= 0) then @@ -709,13 +716,21 @@ contains end subroutine c_oacc_bld_mn - subroutine c_oacc_bld_x(x, this) + subroutine c_oacc_bld_x(x, this,scratch) use psb_base_mod implicit none complex(psb_spk_), intent(in) :: this(:) class(psb_c_vect_oacc), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%free(info) call psb_realloc(size(this), x%v, info) if (info /= 0) then @@ -730,27 +745,35 @@ contains end subroutine c_oacc_bld_x - subroutine c_oacc_asb_m(n, x, info) + subroutine c_oacc_asb_m(n, x, info, scratch) use psb_base_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_c_vect_oacc), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_mpk_) :: nd info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (x%is_dev()) then nd = size(x%v) if (nd < n) then call x%sync() - call x%psb_c_base_vect_type%asb(n, info) + call x%psb_c_base_vect_type%asb(n, info, scratch=scratch_) if (info == psb_success_) call x%sync() call x%set_host() end if else if (size(x%v) < n) then - call x%psb_c_base_vect_type%asb(n, info) + call x%psb_c_base_vect_type%asb(n, info, scratch=scratch_) if (info == psb_success_) call x%sync() call x%set_host() end if @@ -829,9 +852,10 @@ contains complex(psb_spk_) :: res integer(psb_ipk_) :: i + res = czero !$acc parallel loop reduction(+:res) present(x, y) do i = 1, n - res = res + x(i) * y(i) + res = res + conjg(x(i)) * y(i) end do !$acc end parallel loop end function c_inner_oacc_dot @@ -843,10 +867,10 @@ contains complex(psb_spk_), intent(in) :: y(:) integer(psb_ipk_), intent(in) :: n complex(psb_spk_) :: res - complex(psb_spk_), external :: cdot + complex(psb_spk_), external :: cdotc if (x%is_dev()) call x%sync() - res = cdot(n, y, 1, x%v, 1) + res = cdotc(n, y, 1, x%v, 1) end function c_oacc_dot_a @@ -943,6 +967,7 @@ contains class(psb_c_vect_oacc), intent(out) :: x integer(psb_ipk_), intent(out) :: info + call x%free(info) call psb_realloc(n, x%v, info) if (info /= 0) then info = psb_err_alloc_request_ diff --git a/openacc/psb_d_oacc_csr_mat_mod.F90 b/openacc/psb_d_oacc_csr_mat_mod.F90 index 21907312a..0c689f39a 100644 --- a/openacc/psb_d_oacc_csr_mat_mod.F90 +++ b/openacc/psb_d_oacc_csr_mat_mod.F90 @@ -144,9 +144,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irp)>0) call acc_delete_finalize(a%irp) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irp)>0) then + !$acc exit data delete(a%irp) finalize + end if return end subroutine d_oacc_csr_free_dev_space @@ -257,9 +263,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irp)>0) call acc_copyin(a%irp) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc enter data copyin(a%irp) + end if end subroutine d_oacc_csr_sync_dev_space subroutine d_oacc_csr_sync(a) @@ -275,13 +287,25 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irp)>0) call acc_update_self(a%irp) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update self(a%irp) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irp)>0) call acc_update_device(a%irp) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update device(a%irp) + end if end if call tmpa%set_sync() end subroutine d_oacc_csr_sync diff --git a/openacc/psb_d_oacc_ell_mat_mod.F90 b/openacc/psb_d_oacc_ell_mat_mod.F90 index 021face3e..07ae88ae2 100644 --- a/openacc/psb_d_oacc_ell_mat_mod.F90 +++ b/openacc/psb_d_oacc_ell_mat_mod.F90 @@ -143,10 +143,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn) - if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irn)>0) then + !$acc exit data delete(a%irn) finalize + end if + if (psb_size(a%idiag)>0) then + !$acc exit data delete(a%idiag) finalize + end if return end subroutine d_oacc_ell_free_dev_space @@ -186,10 +194,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irn)>0) call acc_copyin(a%irn) - if (psb_size(a%idiag)>0) call acc_copyin(a%idiag) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc enter data copyin(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc enter data copyin(a%idiag) + end if end subroutine d_oacc_ell_sync_dev_space function d_oacc_ell_is_host(a) result(res) @@ -256,15 +272,31 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irn)>0) call acc_update_self(a%irn) - if (psb_size(a%idiag)>0) call acc_update_self(a%idiag) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update self(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update self(a%idiag) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irn)>0) call acc_update_device(a%irn) - if (psb_size(a%idiag)>0) call acc_update_device(a%idiag) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update device(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update device(a%idiag) + end if end if call tmpa%set_sync() end subroutine d_oacc_ell_sync diff --git a/openacc/psb_d_oacc_vect_mod.F90 b/openacc/psb_d_oacc_vect_mod.F90 index 1e3f07d7d..06fc6a0cd 100644 --- a/openacc/psb_d_oacc_vect_mod.F90 +++ b/openacc/psb_d_oacc_vect_mod.F90 @@ -620,11 +620,11 @@ contains end subroutine inner_gth end subroutine d_oacc_gthzv_x - subroutine d_oacc_ins_v(n, irl, val, dupl, x, info) + subroutine d_oacc_ins_v(n, irl, val, dupl, x, maxr, info) use psi_serial_mod implicit none class(psb_d_vect_oacc), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr class(psb_i_base_vect_type), intent(inout) :: irl class(psb_d_base_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -661,7 +661,7 @@ contains type is (psb_d_vect_oacc) if (vval%is_dev()) call vval%sync() end select - call x%ins(n, irl%v, val%v, dupl, info) + call x%ins(n, irl%v, val%v, dupl, maxr, info) end if if (info /= 0) then @@ -671,11 +671,11 @@ contains end subroutine d_oacc_ins_v - subroutine d_oacc_ins_a(n, irl, val, dupl, x, info) + subroutine d_oacc_ins_a(n, irl, val, dupl, x, maxr, info) use psi_serial_mod implicit none class(psb_d_vect_oacc), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr integer(psb_ipk_), intent(in) :: irl(:) real(psb_dpk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info @@ -684,19 +684,26 @@ contains info = 0 if (x%is_dev()) call x%sync() - call x%psb_d_base_vect_type%ins(n, irl, val, dupl, info) + call x%psb_d_base_vect_type%ins(n, irl, val, dupl, maxr, info) call x%set_host() - end subroutine d_oacc_ins_a - subroutine d_oacc_bld_mn(x, n) + subroutine d_oacc_bld_mn(x, n,scratch) use psb_base_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_d_vect_oacc), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%free(info) call x%all(ione*n, info) if (info /= 0) then @@ -709,13 +716,21 @@ contains end subroutine d_oacc_bld_mn - subroutine d_oacc_bld_x(x, this) + subroutine d_oacc_bld_x(x, this,scratch) use psb_base_mod implicit none real(psb_dpk_), intent(in) :: this(:) class(psb_d_vect_oacc), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%free(info) call psb_realloc(size(this), x%v, info) if (info /= 0) then @@ -730,27 +745,35 @@ contains end subroutine d_oacc_bld_x - subroutine d_oacc_asb_m(n, x, info) + subroutine d_oacc_asb_m(n, x, info, scratch) use psb_base_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_d_vect_oacc), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_mpk_) :: nd info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (x%is_dev()) then nd = size(x%v) if (nd < n) then call x%sync() - call x%psb_d_base_vect_type%asb(n, info) + call x%psb_d_base_vect_type%asb(n, info, scratch=scratch_) if (info == psb_success_) call x%sync() call x%set_host() end if else if (size(x%v) < n) then - call x%psb_d_base_vect_type%asb(n, info) + call x%psb_d_base_vect_type%asb(n, info, scratch=scratch_) if (info == psb_success_) call x%sync() call x%set_host() end if @@ -829,9 +852,10 @@ contains real(psb_dpk_) :: res integer(psb_ipk_) :: i + res = dzero !$acc parallel loop reduction(+:res) present(x, y) do i = 1, n - res = res + x(i) * y(i) + res = res + (x(i)) * y(i) end do !$acc end parallel loop end function d_inner_oacc_dot @@ -943,6 +967,7 @@ contains class(psb_d_vect_oacc), intent(out) :: x integer(psb_ipk_), intent(out) :: info + call x%free(info) call psb_realloc(n, x%v, info) if (info /= 0) then info = psb_err_alloc_request_ diff --git a/openacc/psb_i_oacc_vect_mod.F90 b/openacc/psb_i_oacc_vect_mod.F90 index 344ad931c..5b64f4556 100644 --- a/openacc/psb_i_oacc_vect_mod.F90 +++ b/openacc/psb_i_oacc_vect_mod.F90 @@ -274,11 +274,11 @@ contains end subroutine inner_gth end subroutine i_oacc_gthzv_x - subroutine i_oacc_ins_v(n, irl, val, dupl, x, info) + subroutine i_oacc_ins_v(n, irl, val, dupl, x, maxr, info) use psi_serial_mod implicit none class(psb_i_vect_oacc), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr class(psb_i_base_vect_type), intent(inout) :: irl class(psb_i_base_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -315,7 +315,7 @@ contains type is (psb_i_vect_oacc) if (vval%is_dev()) call vval%sync() end select - call x%ins(n, irl%v, val%v, dupl, info) + call x%ins(n, irl%v, val%v, dupl, maxr, info) end if if (info /= 0) then @@ -325,11 +325,11 @@ contains end subroutine i_oacc_ins_v - subroutine i_oacc_ins_a(n, irl, val, dupl, x, info) + subroutine i_oacc_ins_a(n, irl, val, dupl, x, maxr, info) use psi_serial_mod implicit none class(psb_i_vect_oacc), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr integer(psb_ipk_), intent(in) :: irl(:) integer(psb_ipk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info @@ -338,19 +338,26 @@ contains info = 0 if (x%is_dev()) call x%sync() - call x%psb_i_base_vect_type%ins(n, irl, val, dupl, info) + call x%psb_i_base_vect_type%ins(n, irl, val, dupl, maxr, info) call x%set_host() - end subroutine i_oacc_ins_a - subroutine i_oacc_bld_mn(x, n) + subroutine i_oacc_bld_mn(x, n,scratch) use psb_base_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_i_vect_oacc), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%free(info) call x%all(ione*n, info) if (info /= 0) then @@ -363,13 +370,21 @@ contains end subroutine i_oacc_bld_mn - subroutine i_oacc_bld_x(x, this) + subroutine i_oacc_bld_x(x, this,scratch) use psb_base_mod implicit none integer(psb_ipk_), intent(in) :: this(:) class(psb_i_vect_oacc), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%free(info) call psb_realloc(size(this), x%v, info) if (info /= 0) then @@ -384,27 +399,35 @@ contains end subroutine i_oacc_bld_x - subroutine i_oacc_asb_m(n, x, info) + subroutine i_oacc_asb_m(n, x, info, scratch) use psb_base_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_i_vect_oacc), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_mpk_) :: nd info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (x%is_dev()) then nd = size(x%v) if (nd < n) then call x%sync() - call x%psb_i_base_vect_type%asb(n, info) + call x%psb_i_base_vect_type%asb(n, info, scratch=scratch_) if (info == psb_success_) call x%sync() call x%set_host() end if else if (size(x%v) < n) then - call x%psb_i_base_vect_type%asb(n, info) + call x%psb_i_base_vect_type%asb(n, info, scratch=scratch_) if (info == psb_success_) call x%sync() call x%set_host() end if @@ -547,6 +570,7 @@ contains class(psb_i_vect_oacc), intent(out) :: x integer(psb_ipk_), intent(out) :: info + call x%free(info) call psb_realloc(n, x%v, info) if (info /= 0) then info = psb_err_alloc_request_ diff --git a/openacc/psb_l_oacc_vect_mod.F90 b/openacc/psb_l_oacc_vect_mod.F90 index 85b561a95..536f56721 100644 --- a/openacc/psb_l_oacc_vect_mod.F90 +++ b/openacc/psb_l_oacc_vect_mod.F90 @@ -276,11 +276,11 @@ contains end subroutine inner_gth end subroutine l_oacc_gthzv_x - subroutine l_oacc_ins_v(n, irl, val, dupl, x, info) + subroutine l_oacc_ins_v(n, irl, val, dupl, x, maxr, info) use psi_serial_mod implicit none class(psb_l_vect_oacc), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr class(psb_i_base_vect_type), intent(inout) :: irl class(psb_l_base_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -317,7 +317,7 @@ contains type is (psb_l_vect_oacc) if (vval%is_dev()) call vval%sync() end select - call x%ins(n, irl%v, val%v, dupl, info) + call x%ins(n, irl%v, val%v, dupl, maxr, info) end if if (info /= 0) then @@ -327,11 +327,11 @@ contains end subroutine l_oacc_ins_v - subroutine l_oacc_ins_a(n, irl, val, dupl, x, info) + subroutine l_oacc_ins_a(n, irl, val, dupl, x, maxr, info) use psi_serial_mod implicit none class(psb_l_vect_oacc), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr integer(psb_ipk_), intent(in) :: irl(:) integer(psb_lpk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info @@ -340,19 +340,26 @@ contains info = 0 if (x%is_dev()) call x%sync() - call x%psb_l_base_vect_type%ins(n, irl, val, dupl, info) + call x%psb_l_base_vect_type%ins(n, irl, val, dupl, maxr, info) call x%set_host() - end subroutine l_oacc_ins_a - subroutine l_oacc_bld_mn(x, n) + subroutine l_oacc_bld_mn(x, n,scratch) use psb_base_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_l_vect_oacc), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%free(info) call x%all(ione*n, info) if (info /= 0) then @@ -365,13 +372,21 @@ contains end subroutine l_oacc_bld_mn - subroutine l_oacc_bld_x(x, this) + subroutine l_oacc_bld_x(x, this,scratch) use psb_base_mod implicit none integer(psb_lpk_), intent(in) :: this(:) class(psb_l_vect_oacc), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%free(info) call psb_realloc(size(this), x%v, info) if (info /= 0) then @@ -386,27 +401,35 @@ contains end subroutine l_oacc_bld_x - subroutine l_oacc_asb_m(n, x, info) + subroutine l_oacc_asb_m(n, x, info, scratch) use psb_base_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_l_vect_oacc), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_mpk_) :: nd info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (x%is_dev()) then nd = size(x%v) if (nd < n) then call x%sync() - call x%psb_l_base_vect_type%asb(n, info) + call x%psb_l_base_vect_type%asb(n, info, scratch=scratch_) if (info == psb_success_) call x%sync() call x%set_host() end if else if (size(x%v) < n) then - call x%psb_l_base_vect_type%asb(n, info) + call x%psb_l_base_vect_type%asb(n, info, scratch=scratch_) if (info == psb_success_) call x%sync() call x%set_host() end if @@ -549,6 +572,7 @@ contains class(psb_l_vect_oacc), intent(out) :: x integer(psb_ipk_), intent(out) :: info + call x%free(info) call psb_realloc(n, x%v, info) if (info /= 0) then info = psb_err_alloc_request_ diff --git a/openacc/psb_s_oacc_csr_mat_mod.F90 b/openacc/psb_s_oacc_csr_mat_mod.F90 index d66dca3b6..ce721a774 100644 --- a/openacc/psb_s_oacc_csr_mat_mod.F90 +++ b/openacc/psb_s_oacc_csr_mat_mod.F90 @@ -144,9 +144,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irp)>0) call acc_delete_finalize(a%irp) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irp)>0) then + !$acc exit data delete(a%irp) finalize + end if return end subroutine s_oacc_csr_free_dev_space @@ -257,9 +263,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irp)>0) call acc_copyin(a%irp) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc enter data copyin(a%irp) + end if end subroutine s_oacc_csr_sync_dev_space subroutine s_oacc_csr_sync(a) @@ -275,13 +287,25 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irp)>0) call acc_update_self(a%irp) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update self(a%irp) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irp)>0) call acc_update_device(a%irp) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update device(a%irp) + end if end if call tmpa%set_sync() end subroutine s_oacc_csr_sync diff --git a/openacc/psb_s_oacc_ell_mat_mod.F90 b/openacc/psb_s_oacc_ell_mat_mod.F90 index 600a08a7d..c31f2bb9f 100644 --- a/openacc/psb_s_oacc_ell_mat_mod.F90 +++ b/openacc/psb_s_oacc_ell_mat_mod.F90 @@ -143,10 +143,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn) - if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irn)>0) then + !$acc exit data delete(a%irn) finalize + end if + if (psb_size(a%idiag)>0) then + !$acc exit data delete(a%idiag) finalize + end if return end subroutine s_oacc_ell_free_dev_space @@ -170,7 +178,7 @@ contains if (a%is_dev()) call a%sync() res = 8 - res = res + psb_sizeof_dp * size(a%val) + res = res + psb_sizeof_sp * size(a%val) res = res + psb_sizeof_ip * size(a%ja) res = res + psb_sizeof_ip * size(a%irn) res = res + psb_sizeof_ip * size(a%idiag) @@ -186,10 +194,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irn)>0) call acc_copyin(a%irn) - if (psb_size(a%idiag)>0) call acc_copyin(a%idiag) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc enter data copyin(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc enter data copyin(a%idiag) + end if end subroutine s_oacc_ell_sync_dev_space function s_oacc_ell_is_host(a) result(res) @@ -256,15 +272,31 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irn)>0) call acc_update_self(a%irn) - if (psb_size(a%idiag)>0) call acc_update_self(a%idiag) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update self(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update self(a%idiag) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irn)>0) call acc_update_device(a%irn) - if (psb_size(a%idiag)>0) call acc_update_device(a%idiag) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update device(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update device(a%idiag) + end if end if call tmpa%set_sync() end subroutine s_oacc_ell_sync diff --git a/openacc/psb_s_oacc_hll_mat_mod.F90 b/openacc/psb_s_oacc_hll_mat_mod.F90 index 330332487..3c3f52dee 100644 --- a/openacc/psb_s_oacc_hll_mat_mod.F90 +++ b/openacc/psb_s_oacc_hll_mat_mod.F90 @@ -171,7 +171,7 @@ contains if (a%is_dev()) call a%sync() res = 8 - res = res + psb_sizeof_dp * size(a%val) + res = res + psb_sizeof_sp * size(a%val) res = res + psb_sizeof_ip * size(a%ja) res = res + psb_sizeof_ip * size(a%irn) res = res + psb_sizeof_ip * size(a%idiag) diff --git a/openacc/psb_s_oacc_vect_mod.F90 b/openacc/psb_s_oacc_vect_mod.F90 index b8d9700df..c5bee0d36 100644 --- a/openacc/psb_s_oacc_vect_mod.F90 +++ b/openacc/psb_s_oacc_vect_mod.F90 @@ -620,11 +620,11 @@ contains end subroutine inner_gth end subroutine s_oacc_gthzv_x - subroutine s_oacc_ins_v(n, irl, val, dupl, x, info) + subroutine s_oacc_ins_v(n, irl, val, dupl, x, maxr, info) use psi_serial_mod implicit none class(psb_s_vect_oacc), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr class(psb_i_base_vect_type), intent(inout) :: irl class(psb_s_base_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -661,7 +661,7 @@ contains type is (psb_s_vect_oacc) if (vval%is_dev()) call vval%sync() end select - call x%ins(n, irl%v, val%v, dupl, info) + call x%ins(n, irl%v, val%v, dupl, maxr, info) end if if (info /= 0) then @@ -671,11 +671,11 @@ contains end subroutine s_oacc_ins_v - subroutine s_oacc_ins_a(n, irl, val, dupl, x, info) + subroutine s_oacc_ins_a(n, irl, val, dupl, x, maxr, info) use psi_serial_mod implicit none class(psb_s_vect_oacc), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr integer(psb_ipk_), intent(in) :: irl(:) real(psb_spk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info @@ -684,19 +684,26 @@ contains info = 0 if (x%is_dev()) call x%sync() - call x%psb_s_base_vect_type%ins(n, irl, val, dupl, info) + call x%psb_s_base_vect_type%ins(n, irl, val, dupl, maxr, info) call x%set_host() - end subroutine s_oacc_ins_a - subroutine s_oacc_bld_mn(x, n) + subroutine s_oacc_bld_mn(x, n,scratch) use psb_base_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_s_vect_oacc), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%free(info) call x%all(ione*n, info) if (info /= 0) then @@ -709,13 +716,21 @@ contains end subroutine s_oacc_bld_mn - subroutine s_oacc_bld_x(x, this) + subroutine s_oacc_bld_x(x, this,scratch) use psb_base_mod implicit none real(psb_spk_), intent(in) :: this(:) class(psb_s_vect_oacc), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%free(info) call psb_realloc(size(this), x%v, info) if (info /= 0) then @@ -730,27 +745,35 @@ contains end subroutine s_oacc_bld_x - subroutine s_oacc_asb_m(n, x, info) + subroutine s_oacc_asb_m(n, x, info, scratch) use psb_base_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_s_vect_oacc), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_mpk_) :: nd info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (x%is_dev()) then nd = size(x%v) if (nd < n) then call x%sync() - call x%psb_s_base_vect_type%asb(n, info) + call x%psb_s_base_vect_type%asb(n, info, scratch=scratch_) if (info == psb_success_) call x%sync() call x%set_host() end if else if (size(x%v) < n) then - call x%psb_s_base_vect_type%asb(n, info) + call x%psb_s_base_vect_type%asb(n, info, scratch=scratch_) if (info == psb_success_) call x%sync() call x%set_host() end if @@ -829,9 +852,10 @@ contains real(psb_spk_) :: res integer(psb_ipk_) :: i + res = szero !$acc parallel loop reduction(+:res) present(x, y) do i = 1, n - res = res + x(i) * y(i) + res = res + (x(i)) * y(i) end do !$acc end parallel loop end function s_inner_oacc_dot @@ -943,6 +967,7 @@ contains class(psb_s_vect_oacc), intent(out) :: x integer(psb_ipk_), intent(out) :: info + call x%free(info) call psb_realloc(n, x%v, info) if (info /= 0) then info = psb_err_alloc_request_ diff --git a/openacc/psb_z_oacc_csr_mat_mod.F90 b/openacc/psb_z_oacc_csr_mat_mod.F90 index 3b66787ab..2fef14a6f 100644 --- a/openacc/psb_z_oacc_csr_mat_mod.F90 +++ b/openacc/psb_z_oacc_csr_mat_mod.F90 @@ -144,9 +144,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irp)>0) call acc_delete_finalize(a%irp) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irp)>0) then + !$acc exit data delete(a%irp) finalize + end if return end subroutine z_oacc_csr_free_dev_space @@ -257,9 +263,15 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irp)>0) call acc_copyin(a%irp) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc enter data copyin(a%irp) + end if end subroutine z_oacc_csr_sync_dev_space subroutine z_oacc_csr_sync(a) @@ -275,13 +287,25 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irp)>0) call acc_update_self(a%irp) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update self(a%irp) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irp)>0) call acc_update_device(a%irp) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irp)>0) then + !$acc update device(a%irp) + end if end if call tmpa%set_sync() end subroutine z_oacc_csr_sync diff --git a/openacc/psb_z_oacc_ell_mat_mod.F90 b/openacc/psb_z_oacc_ell_mat_mod.F90 index abfb11e30..a79bebf51 100644 --- a/openacc/psb_z_oacc_ell_mat_mod.F90 +++ b/openacc/psb_z_oacc_ell_mat_mod.F90 @@ -143,10 +143,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_delete_finalize(a%val) - if (psb_size(a%ja)>0) call acc_delete_finalize(a%ja) - if (psb_size(a%irn)>0) call acc_delete_finalize(a%irn) - if (psb_size(a%idiag)>0) call acc_delete_finalize(a%idiag) + if (psb_size(a%val)>0) then + !$acc exit data delete(a%val) finalize + end if + if (psb_size(a%ja)>0) then + !$acc exit data delete(a%ja) finalize + end if + if (psb_size(a%irn)>0) then + !$acc exit data delete(a%irn) finalize + end if + if (psb_size(a%idiag)>0) then + !$acc exit data delete(a%idiag) finalize + end if return end subroutine z_oacc_ell_free_dev_space @@ -170,7 +178,7 @@ contains if (a%is_dev()) call a%sync() res = 8 - res = res + psb_sizeof_dp * size(a%val) + res = res + (2*psb_sizeof_dp) * size(a%val) res = res + psb_sizeof_ip * size(a%ja) res = res + psb_sizeof_ip * size(a%irn) res = res + psb_sizeof_ip * size(a%idiag) @@ -186,10 +194,18 @@ contains ! but with size 0, then CREATE,UPDATE and DELETE ! will fail ! - if (psb_size(a%val)>0) call acc_copyin(a%val) - if (psb_size(a%ja)>0) call acc_copyin(a%ja) - if (psb_size(a%irn)>0) call acc_copyin(a%irn) - if (psb_size(a%idiag)>0) call acc_copyin(a%idiag) + if (psb_size(a%val)>0) then + !$acc enter data copyin(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc enter data copyin(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc enter data copyin(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc enter data copyin(a%idiag) + end if end subroutine z_oacc_ell_sync_dev_space function z_oacc_ell_is_host(a) result(res) @@ -256,15 +272,31 @@ contains ! will fail ! if (a%is_dev()) then - if (psb_size(a%val)>0) call acc_update_self(a%val) - if (psb_size(a%ja)>0) call acc_update_self(a%ja) - if (psb_size(a%irn)>0) call acc_update_self(a%irn) - if (psb_size(a%idiag)>0) call acc_update_self(a%idiag) + if (psb_size(a%val)>0) then + !$acc update self(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update self(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update self(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update self(a%idiag) + end if else if (a%is_host()) then - if (psb_size(a%val)>0) call acc_update_device(a%val) - if (psb_size(a%ja)>0) call acc_update_device(a%ja) - if (psb_size(a%irn)>0) call acc_update_device(a%irn) - if (psb_size(a%idiag)>0) call acc_update_device(a%idiag) + if (psb_size(a%val)>0) then + !$acc update device(a%val) + end if + if (psb_size(a%ja)>0) then + !$acc update device(a%ja) + end if + if (psb_size(a%irn)>0) then + !$acc update device(a%irn) + end if + if (psb_size(a%idiag)>0) then + !$acc update device(a%idiag) + end if end if call tmpa%set_sync() end subroutine z_oacc_ell_sync diff --git a/openacc/psb_z_oacc_hll_mat_mod.F90 b/openacc/psb_z_oacc_hll_mat_mod.F90 index 4c9f1b117..2cce6e2d1 100644 --- a/openacc/psb_z_oacc_hll_mat_mod.F90 +++ b/openacc/psb_z_oacc_hll_mat_mod.F90 @@ -171,7 +171,7 @@ contains if (a%is_dev()) call a%sync() res = 8 - res = res + psb_sizeof_dp * size(a%val) + res = res + (2*psb_sizeof_dp) * size(a%val) res = res + psb_sizeof_ip * size(a%ja) res = res + psb_sizeof_ip * size(a%irn) res = res + psb_sizeof_ip * size(a%idiag) diff --git a/openacc/psb_z_oacc_vect_mod.F90 b/openacc/psb_z_oacc_vect_mod.F90 index a119303d2..b01a1c48e 100644 --- a/openacc/psb_z_oacc_vect_mod.F90 +++ b/openacc/psb_z_oacc_vect_mod.F90 @@ -620,11 +620,11 @@ contains end subroutine inner_gth end subroutine z_oacc_gthzv_x - subroutine z_oacc_ins_v(n, irl, val, dupl, x, info) + subroutine z_oacc_ins_v(n, irl, val, dupl, x, maxr, info) use psi_serial_mod implicit none class(psb_z_vect_oacc), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr class(psb_i_base_vect_type), intent(inout) :: irl class(psb_z_base_vect_type), intent(inout) :: val integer(psb_ipk_), intent(out) :: info @@ -661,7 +661,7 @@ contains type is (psb_z_vect_oacc) if (vval%is_dev()) call vval%sync() end select - call x%ins(n, irl%v, val%v, dupl, info) + call x%ins(n, irl%v, val%v, dupl, maxr, info) end if if (info /= 0) then @@ -671,11 +671,11 @@ contains end subroutine z_oacc_ins_v - subroutine z_oacc_ins_a(n, irl, val, dupl, x, info) + subroutine z_oacc_ins_a(n, irl, val, dupl, x, maxr, info) use psi_serial_mod implicit none class(psb_z_vect_oacc), intent(inout) :: x - integer(psb_ipk_), intent(in) :: n, dupl + integer(psb_ipk_), intent(in) :: n, dupl, maxr integer(psb_ipk_), intent(in) :: irl(:) complex(psb_dpk_), intent(in) :: val(:) integer(psb_ipk_), intent(out) :: info @@ -684,19 +684,26 @@ contains info = 0 if (x%is_dev()) call x%sync() - call x%psb_z_base_vect_type%ins(n, irl, val, dupl, info) + call x%psb_z_base_vect_type%ins(n, irl, val, dupl, maxr, info) call x%set_host() - end subroutine z_oacc_ins_a - subroutine z_oacc_bld_mn(x, n) + subroutine z_oacc_bld_mn(x, n,scratch) use psb_base_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_z_vect_oacc), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%free(info) call x%all(ione*n, info) if (info /= 0) then @@ -709,13 +716,21 @@ contains end subroutine z_oacc_bld_mn - subroutine z_oacc_bld_x(x, this) + subroutine z_oacc_bld_x(x, this,scratch) use psb_base_mod implicit none complex(psb_dpk_), intent(in) :: this(:) class(psb_z_vect_oacc), intent(inout) :: x + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_ipk_) :: info + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if call x%free(info) call psb_realloc(size(this), x%v, info) if (info /= 0) then @@ -730,27 +745,35 @@ contains end subroutine z_oacc_bld_x - subroutine z_oacc_asb_m(n, x, info) + subroutine z_oacc_asb_m(n, x, info, scratch) use psb_base_mod implicit none integer(psb_mpk_), intent(in) :: n class(psb_z_vect_oacc), intent(inout) :: x integer(psb_ipk_), intent(out) :: info + logical, intent(in), optional :: scratch + + logical :: scratch_ integer(psb_mpk_) :: nd info = psb_success_ + if (present(scratch)) then + scratch_ = scratch + else + scratch_ = .false. + end if if (x%is_dev()) then nd = size(x%v) if (nd < n) then call x%sync() - call x%psb_z_base_vect_type%asb(n, info) + call x%psb_z_base_vect_type%asb(n, info, scratch=scratch_) if (info == psb_success_) call x%sync() call x%set_host() end if else if (size(x%v) < n) then - call x%psb_z_base_vect_type%asb(n, info) + call x%psb_z_base_vect_type%asb(n, info, scratch=scratch_) if (info == psb_success_) call x%sync() call x%set_host() end if @@ -829,9 +852,10 @@ contains complex(psb_dpk_) :: res integer(psb_ipk_) :: i + res = zzero !$acc parallel loop reduction(+:res) present(x, y) do i = 1, n - res = res + x(i) * y(i) + res = res + conjg(x(i)) * y(i) end do !$acc end parallel loop end function z_inner_oacc_dot @@ -843,10 +867,10 @@ contains complex(psb_dpk_), intent(in) :: y(:) integer(psb_ipk_), intent(in) :: n complex(psb_dpk_) :: res - complex(psb_dpk_), external :: zdot + complex(psb_dpk_), external :: zdotc if (x%is_dev()) call x%sync() - res = zdot(n, y, 1, x%v, 1) + res = zdotc(n, y, 1, x%v, 1) end function z_oacc_dot_a @@ -943,6 +967,7 @@ contains class(psb_z_vect_oacc), intent(out) :: x integer(psb_ipk_), intent(out) :: info + call x%free(info) call psb_realloc(n, x%v, info) if (info /= 0) then info = psb_err_alloc_request_ diff --git a/prec/Makefile b/prec/Makefile index 5d7523f43..6121840d9 100644 --- a/prec/Makefile +++ b/prec/Makefile @@ -28,8 +28,11 @@ COBJS= FINCLUDES=$(FMFLAG). $(FMFLAG)$(MODDIR) OBJS=$(F90OBJS) $(COBJS) $(MPFOBJS) $(MODOBJS) -objs: $(OBJS) impld - /bin/cp -p $(CPUPDFLAG) *$(.mod) $(MODDIR) +objs: mods $(OBJS) impld + +mods: $(MODOBJS) + $(INSTALL) -p $(CPUPDFLAG) *$(.mod) $(MODDIR) + lib: objs $(MAKE) -C impl lib $(AR) $(HERE)/$(LIBNAME) $(OBJS) diff --git a/prec/impl/psb_c_ainv_bld.f90 b/prec/impl/psb_c_ainv_bld.f90 index 5cf2a45e9..f46d6a76a 100644 --- a/prec/impl/psb_c_ainv_bld.f90 +++ b/prec/impl/psb_c_ainv_bld.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_c_bjacprec_impl.f90 b/prec/impl/psb_c_bjacprec_impl.f90 index 32baf385c..e9a665f7f 100644 --- a/prec/impl/psb_c_bjacprec_impl.f90 +++ b/prec/impl/psb_c_bjacprec_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -71,31 +71,29 @@ subroutine psb_c_bjac_dump(prec,info,prefix,head) end subroutine psb_c_bjac_dump -subroutine psb_c_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) +subroutine psb_c_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) use psb_base_mod use psb_c_bjacprec, psb_protect_name => psb_c_bjac_apply_vect implicit none - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_c_bjac_prec_type), intent(inout) :: prec - complex(psb_spk_),intent(in) :: alpha,beta - type(psb_c_vect_type),intent(inout) :: x - type(psb_c_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) + complex(psb_spk_),intent(in) :: alpha,beta + type(psb_c_vect_type),intent(inout) :: x + type(psb_c_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans ! Local variables - integer(psb_ipk_) :: n_row,n_col - complex(psb_spk_), pointer :: ww(:), aux(:) + integer(psb_ipk_) :: n_row,n_col type(psb_c_vect_type) :: wv, wv1 - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np,me - integer(psb_ipk_) :: err_act, ierr(5) - integer(psb_ipk_) :: debug_level, debug_unit - logical :: do_alloc_wrk - character :: trans_ - character(len=20) :: name='c_bjac_prec_apply' - character(len=20) :: ch_err + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np,me + integer(psb_ipk_) :: err_act, ierr(5) + integer(psb_ipk_) :: debug_level, debug_unit + logical :: do_alloc_wrk + character :: trans_ + character(len=20) :: name='c_bjac_prec_apply' + character(len=20) :: ch_err info = psb_success_ call psb_erractionsave(err_act) @@ -140,18 +138,6 @@ subroutine psb_c_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) end if - if (n_col <= size(work)) then - ww => work(1:n_col) - if ((4*n_col+n_col) <= size(work)) then - aux => work(n_col+1:) - else - allocate(aux(4*n_col),stat=info) - - endif - else - allocate(ww(n_col),aux(4*n_col),stat=info) - endif - if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Allocate') goto 9999 @@ -168,28 +154,28 @@ subroutine psb_c_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) select case(trans_) case('N') call psb_spsm(cone,prec%av(psb_l_pr_),x,czero,wv,desc_data,info,& - & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_,work=aux) + & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_) if(info == psb_success_) call psb_spsm(alpha,prec%av(psb_u_pr_),wv,& & beta,y,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_, work=aux) + & trans=trans_,scale='U',choice=psb_none_) case('T') call psb_spsm(cone,prec%av(psb_u_pr_),x,czero,wv,desc_data,info,& - & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_, work=aux) + & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_) if(info == psb_success_) call psb_spsm(alpha,prec%av(psb_l_pr_),wv,& & beta,y,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_,work=aux) + & trans=trans_,scale='U',choice=psb_none_) case('C') call psb_spsm(cone,prec%av(psb_u_pr_),x,czero,wv,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_, work=aux) + & trans=trans_,scale='U',choice=psb_none_) call wv1%mlt(cone,prec%dv,wv,czero,info,conjgx=trans_) if(info == psb_success_) call psb_spsm(alpha,prec%av(psb_l_pr_),wv1,& & beta,y,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_,work=aux) + & trans=trans_,scale='U',choice=psb_none_) end select if (info /= psb_success_) then @@ -203,20 +189,20 @@ subroutine psb_c_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) select case(trans_) case('N') call psb_spmm(cone,prec%av(psb_l_pr_),x,czero,wv,desc_data,info,& - & trans=trans_,work=aux,doswap=.false.) + & trans=trans_,doswap=.false.) if (info == psb_success_) call wv1%mlt(cone,prec%dv,wv,czero,info) if(info == psb_success_) & & call psb_spmm(alpha,prec%av(psb_u_pr_),wv1,& - & beta,y,desc_data,info, trans=trans_, work=aux,doswap=.false.) + & beta,y,desc_data,info, trans=trans_,doswap=.false.) case('T','C') call psb_spmm(cone,prec%av(psb_l_pr_),x,czero,wv,desc_data,info,& - & trans=trans_,work=aux,doswap=.false.) + & trans=trans_,doswap=.false.) if (info == psb_success_) call wv1%mlt(cone,prec%dv,wv,czero,info) if (info == psb_success_) & & call psb_spmm(alpha,prec%av(psb_u_pr_),wv1, & - & beta,y,desc_data,info,trans=trans_,work=aux,doswap=.false.) + & beta,y,desc_data,info,trans=trans_,doswap=.false.) end select if (info /= psb_success_) then @@ -235,15 +221,6 @@ subroutine psb_c_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) call psb_halo(y,desc_data,info,data=psb_comm_mov_) if (do_alloc_wrk) call prec%free_wrk(info) - if (n_col <= size(work)) then - if ((4*n_col+n_col) <= size(work)) then - else - deallocate(aux) - endif - else - deallocate(ww,aux) - endif - call psb_erractionrestore(err_act) return diff --git a/prec/impl/psb_c_diagprec_impl.f90 b/prec/impl/psb_c_diagprec_impl.f90 index c16f94658..3045575dd 100644 --- a/prec/impl/psb_c_diagprec_impl.f90 +++ b/prec/impl/psb_c_diagprec_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -65,7 +65,7 @@ subroutine psb_c_diag_dump(prec,info,prefix,head) end subroutine psb_c_diag_dump -subroutine psb_c_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) +subroutine psb_c_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) use psb_base_mod use psb_c_diagprec, psb_protect_name => psb_c_diag_apply_vect implicit none @@ -76,7 +76,6 @@ subroutine psb_c_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) type(psb_c_vect_type),intent(inout) :: y integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) integer(psb_ipk_) :: err_act, nrow, ierr(5) character(len=20) :: name='c_diag_prec_apply' complex(psb_spk_), pointer :: ww(:) diff --git a/prec/impl/psb_c_ilu0_fact.f90 b/prec/impl/psb_c_ilu0_fact.f90 index c016359fd..fc4c6182b 100644 --- a/prec/impl/psb_c_ilu0_fact.f90 +++ b/prec/impl/psb_c_ilu0_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -52,7 +52,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_c_iluk_fact.f90 b/prec/impl/psb_c_iluk_fact.f90 index 6c6d8a5f3..2297f6d91 100644 --- a/prec/impl/psb_c_iluk_fact.f90 +++ b/prec/impl/psb_c_iluk_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -52,7 +52,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_c_ilut_fact.f90 b/prec/impl/psb_c_ilut_fact.f90 index 8421ee1c3..03a5bb027 100644 --- a/prec/impl/psb_c_ilut_fact.f90 +++ b/prec/impl/psb_c_ilut_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -52,7 +52,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_c_invk_fact.f90 b/prec/impl/psb_c_invk_fact.f90 index 5c047b181..6c93d11a0 100644 --- a/prec/impl/psb_c_invk_fact.f90 +++ b/prec/impl/psb_c_invk_fact.f90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_c_invt_fact.f90 b/prec/impl/psb_c_invt_fact.f90 index 73e242f6d..db7f0f110 100644 --- a/prec/impl/psb_c_invt_fact.f90 +++ b/prec/impl/psb_c_invt_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_c_nullprec_impl.f90 b/prec/impl/psb_c_nullprec_impl.f90 index 9d87522ad..56448fe19 100644 --- a/prec/impl/psb_c_nullprec_impl.f90 +++ b/prec/impl/psb_c_nullprec_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -29,7 +29,7 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine psb_c_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) +subroutine psb_c_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) use psb_base_mod use psb_c_nullprec, psb_protect_name => psb_c_null_apply_vect implicit none @@ -40,7 +40,6 @@ subroutine psb_c_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) type(psb_c_vect_type),intent(inout) :: y integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) integer(psb_ipk_) :: err_act, nrow, ierr(5) character(len=20) :: name='c_null_prec_apply' diff --git a/prec/impl/psb_c_prec_type_impl.f90 b/prec/impl/psb_c_prec_type_impl.f90 index e82d7dca0..436b56ee3 100644 --- a/prec/impl/psb_c_prec_type_impl.f90 +++ b/prec/impl/psb_c_prec_type_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -45,7 +45,7 @@ !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -62,23 +62,21 @@ !!$ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -subroutine psb_c_apply2_vect(prec,x,y,desc_data,info,trans,work) +subroutine psb_c_apply2_vect(prec,x,y,desc_data,info,trans) use psb_base_mod use psb_c_prec_type, psb_protect_name => psb_c_apply2_vect implicit none - type(psb_desc_type),intent(in) :: desc_data - class(psb_cprec_type), intent(inout) :: prec - type(psb_c_vect_type),intent(inout) :: x - type(psb_c_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) - - character :: trans_ - complex(psb_spk_), pointer :: work_(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_cprec_type), intent(inout) :: prec + type(psb_c_vect_type),intent(inout) :: x + type(psb_c_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans + + character :: trans_ type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np,me - integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: np,me + integer(psb_ipk_) :: err_act character(len=20) :: name name = 'psb_c_apply2v' @@ -94,36 +92,13 @@ subroutine psb_c_apply2_vect(prec,x,y,desc_data,info,trans,work) trans_='N' end if - if (present(work)) then - work_ => work - else - allocate(work_(4*desc_data%get_local_cols()),stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - - end if - if (.not.allocated(prec%prec)) then info = 1124 call psb_errpush(info,name,a_err="preconditioner") goto 9999 end if - call prec%prec%apply(cone,x,czero,y,desc_data,info,& - & trans=trans_,work=work_) - - if (present(work)) then - else - deallocate(work_,stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='DeAllocate') - goto 9999 - end if - end if + call prec%prec%apply(cone,x,czero,y,desc_data,info,trans=trans_) call psb_erractionrestore(err_act) return @@ -133,24 +108,22 @@ subroutine psb_c_apply2_vect(prec,x,y,desc_data,info,trans,work) end subroutine psb_c_apply2_vect -subroutine psb_c_apply1_vect(prec,x,desc_data,info,trans,work) +subroutine psb_c_apply1_vect(prec,x,desc_data,info,trans) use psb_base_mod use psb_c_prec_type, psb_protect_name => psb_c_apply1_vect implicit none - type(psb_desc_type),intent(in) :: desc_data - class(psb_cprec_type), intent(inout) :: prec - type(psb_c_vect_type),intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) - - type(psb_c_vect_type) :: ww - character :: trans_ - complex(psb_spk_), pointer :: work_(:) - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np,me - integer(psb_ipk_) :: err_act - character(len=20) :: name + type(psb_desc_type),intent(in) :: desc_data + class(psb_cprec_type), intent(inout) :: prec + type(psb_c_vect_type),intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans + + type(psb_c_vect_type) :: ww + character :: trans_ + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np,me + integer(psb_ipk_) :: err_act + character(len=20) :: name name = 'psb_c_apply1v' info = psb_success_ @@ -165,18 +138,6 @@ subroutine psb_c_apply1_vect(prec,x,desc_data,info,trans,work) trans_='N' end if - if (present(work)) then - work_ => work - else - allocate(work_(4*desc_data%get_local_cols()),stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - - end if - if (.not.allocated(prec%prec)) then info = 1124 call psb_errpush(info,name,a_err="preconditioner") @@ -185,18 +146,9 @@ subroutine psb_c_apply1_vect(prec,x,desc_data,info,trans,work) call psb_geasb(ww,desc_data,info,mold=x%v,scratch=.true.) if (info == 0) call prec%prec%apply(cone,x,czero,ww,desc_data,info,& - & trans=trans_,work=work_) + & trans=trans_) if (info == 0) call psb_geaxpby(cone,ww,czero,x,desc_data,info) call psb_gefree(ww,desc_data,info) - if (present(work)) then - else - deallocate(work_,stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='DeAllocate') - goto 9999 - end if - end if call psb_erractionrestore(err_act) return @@ -206,7 +158,7 @@ subroutine psb_c_apply1_vect(prec,x,desc_data,info,trans,work) end subroutine psb_c_apply1_vect -subroutine psb_c_apply2v(prec,x,y,desc_data,info,trans,work) +subroutine psb_c_apply2v(prec,x,y,desc_data,info,trans) use psb_base_mod use psb_c_prec_type, psb_protect_name => psb_c_apply2v implicit none @@ -216,10 +168,8 @@ subroutine psb_c_apply2v(prec,x,y,desc_data,info,trans,work) complex(psb_spk_),intent(inout) :: y(:) integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) character :: trans_ - complex(psb_spk_), pointer :: work_(:) type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me integer(psb_ipk_) :: err_act @@ -238,33 +188,12 @@ subroutine psb_c_apply2v(prec,x,y,desc_data,info,trans,work) trans_='N' end if - if (present(work)) then - work_ => work - else - allocate(work_(4*desc_data%get_local_cols()),stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - - end if - if (.not.allocated(prec%prec)) then info = 1124 call psb_errpush(info,name,a_err="preconditioner") goto 9999 end if - call prec%prec%apply(cone,x,czero,y,desc_data,info,trans_,work=work_) - if (present(work)) then - else - deallocate(work_,stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='DeAllocate') - goto 9999 - end if - end if + call prec%prec%apply(cone,x,czero,y,desc_data,info,trans_) call psb_erractionrestore(err_act) return @@ -313,7 +242,7 @@ subroutine psb_c_apply1v(prec,x,desc_data,info,trans) goto 9999 end if call prec%prec%apply(cone,x,czero,ww,desc_data,info,& - & trans_,work=w1) + & trans_) if(info /= psb_success_) goto 9999 x(:) = ww(:) deallocate(ww,W1,stat=info) diff --git a/prec/impl/psb_c_sp_drop.f90 b/prec/impl/psb_c_sp_drop.f90 index fda59cc71..1ab54a864 100644 --- a/prec/impl/psb_c_sp_drop.f90 +++ b/prec/impl/psb_c_sp_drop.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_c_sparsify.f90 b/prec/impl/psb_c_sparsify.f90 index 4962f337d..f0e8c3bb3 100644 --- a/prec/impl/psb_c_sparsify.f90 +++ b/prec/impl/psb_c_sparsify.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_cprecbld.f90 b/prec/impl/psb_cprecbld.f90 index 3c3bf8bee..1a93dd187 100644 --- a/prec/impl/psb_cprecbld.f90 +++ b/prec/impl/psb_cprecbld.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,10 +35,10 @@ subroutine psb_cprecbld(a,desc_a,p,info,amold,vmold,imold) use psb_c_prec_type, psb_protect_name => psb_cprecbld Implicit None - type(psb_cspmat_type), intent(in), target :: a - type(psb_desc_type), intent(inout), target :: desc_a - class(psb_cprec_type),intent(inout), target :: p - integer(psb_ipk_), intent(out) :: info + type(psb_cspmat_type), intent(inout), target :: a + type(psb_desc_type), intent(inout), target :: desc_a + class(psb_cprec_type),intent(inout), target :: p + integer(psb_ipk_), intent(out) :: info class(psb_c_base_sparse_mat), intent(in), optional :: amold class(psb_c_base_vect_type), intent(in), optional :: vmold class(psb_i_base_vect_type), intent(in), optional :: imold diff --git a/prec/impl/psb_cprecinit.f90 b/prec/impl/psb_cprecinit.f90 index 63b4d51bb..efa9aec2e 100644 --- a/prec/impl/psb_cprecinit.f90 +++ b/prec/impl/psb_cprecinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_crwclip.f90 b/prec/impl/psb_crwclip.f90 index ade1171f6..de2b4ee42 100644 --- a/prec/impl/psb_crwclip.f90 +++ b/prec/impl/psb_crwclip.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_csparse_biconjg_llk.F90 b/prec/impl/psb_csparse_biconjg_llk.F90 index 98110cd1c..00da11c71 100644 --- a/prec/impl/psb_csparse_biconjg_llk.F90 +++ b/prec/impl/psb_csparse_biconjg_llk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_csparse_biconjg_llk_noth.F90 b/prec/impl/psb_csparse_biconjg_llk_noth.F90 index 5fe472eb8..f148fea13 100644 --- a/prec/impl/psb_csparse_biconjg_llk_noth.F90 +++ b/prec/impl/psb_csparse_biconjg_llk_noth.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_csparse_biconjg_mlk.F90 b/prec/impl/psb_csparse_biconjg_mlk.F90 index 58838c82b..b8e67c476 100644 --- a/prec/impl/psb_csparse_biconjg_mlk.F90 +++ b/prec/impl/psb_csparse_biconjg_mlk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_csparse_biconjg_s_ft_llk.F90 b/prec/impl/psb_csparse_biconjg_s_ft_llk.F90 index 64af2ed52..0c9195018 100644 --- a/prec/impl/psb_csparse_biconjg_s_ft_llk.F90 +++ b/prec/impl/psb_csparse_biconjg_s_ft_llk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_csparse_biconjg_s_llk.F90 b/prec/impl/psb_csparse_biconjg_s_llk.F90 index b38b2a0c8..b9974c40a 100644 --- a/prec/impl/psb_csparse_biconjg_s_llk.F90 +++ b/prec/impl/psb_csparse_biconjg_s_llk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_d_ainv_bld.f90 b/prec/impl/psb_d_ainv_bld.f90 index 6c175d25a..931c2ec89 100644 --- a/prec/impl/psb_d_ainv_bld.f90 +++ b/prec/impl/psb_d_ainv_bld.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_d_bjacprec_impl.f90 b/prec/impl/psb_d_bjacprec_impl.f90 index ec866dbe1..d98ac056b 100644 --- a/prec/impl/psb_d_bjacprec_impl.f90 +++ b/prec/impl/psb_d_bjacprec_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -71,31 +71,29 @@ subroutine psb_d_bjac_dump(prec,info,prefix,head) end subroutine psb_d_bjac_dump -subroutine psb_d_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) +subroutine psb_d_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) use psb_base_mod use psb_d_bjacprec, psb_protect_name => psb_d_bjac_apply_vect implicit none - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_d_bjac_prec_type), intent(inout) :: prec - real(psb_dpk_),intent(in) :: alpha,beta - type(psb_d_vect_type),intent(inout) :: x - type(psb_d_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) + real(psb_dpk_),intent(in) :: alpha,beta + type(psb_d_vect_type),intent(inout) :: x + type(psb_d_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans ! Local variables - integer(psb_ipk_) :: n_row,n_col - real(psb_dpk_), pointer :: ww(:), aux(:) + integer(psb_ipk_) :: n_row,n_col type(psb_d_vect_type) :: wv, wv1 - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np,me - integer(psb_ipk_) :: err_act, ierr(5) - integer(psb_ipk_) :: debug_level, debug_unit - logical :: do_alloc_wrk - character :: trans_ - character(len=20) :: name='d_bjac_prec_apply' - character(len=20) :: ch_err + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np,me + integer(psb_ipk_) :: err_act, ierr(5) + integer(psb_ipk_) :: debug_level, debug_unit + logical :: do_alloc_wrk + character :: trans_ + character(len=20) :: name='d_bjac_prec_apply' + character(len=20) :: ch_err info = psb_success_ call psb_erractionsave(err_act) @@ -140,18 +138,6 @@ subroutine psb_d_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) end if - if (n_col <= size(work)) then - ww => work(1:n_col) - if ((4*n_col+n_col) <= size(work)) then - aux => work(n_col+1:) - else - allocate(aux(4*n_col),stat=info) - - endif - else - allocate(ww(n_col),aux(4*n_col),stat=info) - endif - if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Allocate') goto 9999 @@ -168,28 +154,28 @@ subroutine psb_d_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) select case(trans_) case('N') call psb_spsm(done,prec%av(psb_l_pr_),x,dzero,wv,desc_data,info,& - & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_,work=aux) + & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_) if(info == psb_success_) call psb_spsm(alpha,prec%av(psb_u_pr_),wv,& & beta,y,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_, work=aux) + & trans=trans_,scale='U',choice=psb_none_) case('T') call psb_spsm(done,prec%av(psb_u_pr_),x,dzero,wv,desc_data,info,& - & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_, work=aux) + & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_) if(info == psb_success_) call psb_spsm(alpha,prec%av(psb_l_pr_),wv,& & beta,y,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_,work=aux) + & trans=trans_,scale='U',choice=psb_none_) case('C') call psb_spsm(done,prec%av(psb_u_pr_),x,dzero,wv,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_, work=aux) + & trans=trans_,scale='U',choice=psb_none_) call wv1%mlt(done,prec%dv,wv,dzero,info,conjgx=trans_) if(info == psb_success_) call psb_spsm(alpha,prec%av(psb_l_pr_),wv1,& & beta,y,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_,work=aux) + & trans=trans_,scale='U',choice=psb_none_) end select if (info /= psb_success_) then @@ -203,20 +189,20 @@ subroutine psb_d_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) select case(trans_) case('N') call psb_spmm(done,prec%av(psb_l_pr_),x,dzero,wv,desc_data,info,& - & trans=trans_,work=aux,doswap=.false.) + & trans=trans_,doswap=.false.) if (info == psb_success_) call wv1%mlt(done,prec%dv,wv,dzero,info) if(info == psb_success_) & & call psb_spmm(alpha,prec%av(psb_u_pr_),wv1,& - & beta,y,desc_data,info, trans=trans_, work=aux,doswap=.false.) + & beta,y,desc_data,info, trans=trans_,doswap=.false.) case('T','C') call psb_spmm(done,prec%av(psb_l_pr_),x,dzero,wv,desc_data,info,& - & trans=trans_,work=aux,doswap=.false.) + & trans=trans_,doswap=.false.) if (info == psb_success_) call wv1%mlt(done,prec%dv,wv,dzero,info) if (info == psb_success_) & & call psb_spmm(alpha,prec%av(psb_u_pr_),wv1, & - & beta,y,desc_data,info,trans=trans_,work=aux,doswap=.false.) + & beta,y,desc_data,info,trans=trans_,doswap=.false.) end select if (info /= psb_success_) then @@ -235,15 +221,6 @@ subroutine psb_d_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) call psb_halo(y,desc_data,info,data=psb_comm_mov_) if (do_alloc_wrk) call prec%free_wrk(info) - if (n_col <= size(work)) then - if ((4*n_col+n_col) <= size(work)) then - else - deallocate(aux) - endif - else - deallocate(ww,aux) - endif - call psb_erractionrestore(err_act) return diff --git a/prec/impl/psb_d_diagprec_impl.f90 b/prec/impl/psb_d_diagprec_impl.f90 index 3a6e32f9e..3e1521f9e 100644 --- a/prec/impl/psb_d_diagprec_impl.f90 +++ b/prec/impl/psb_d_diagprec_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -65,7 +65,7 @@ subroutine psb_d_diag_dump(prec,info,prefix,head) end subroutine psb_d_diag_dump -subroutine psb_d_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) +subroutine psb_d_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) use psb_base_mod use psb_d_diagprec, psb_protect_name => psb_d_diag_apply_vect implicit none @@ -76,7 +76,6 @@ subroutine psb_d_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) type(psb_d_vect_type),intent(inout) :: y integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) integer(psb_ipk_) :: err_act, nrow, ierr(5) character(len=20) :: name='d_diag_prec_apply' real(psb_dpk_), pointer :: ww(:) diff --git a/prec/impl/psb_d_ilu0_fact.f90 b/prec/impl/psb_d_ilu0_fact.f90 index dde22249e..f9562c530 100644 --- a/prec/impl/psb_d_ilu0_fact.f90 +++ b/prec/impl/psb_d_ilu0_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -52,7 +52,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_d_iluk_fact.f90 b/prec/impl/psb_d_iluk_fact.f90 index dc837ba91..5afeb786c 100644 --- a/prec/impl/psb_d_iluk_fact.f90 +++ b/prec/impl/psb_d_iluk_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -52,7 +52,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_d_ilut_fact.f90 b/prec/impl/psb_d_ilut_fact.f90 index cd185e806..8d221a020 100644 --- a/prec/impl/psb_d_ilut_fact.f90 +++ b/prec/impl/psb_d_ilut_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -52,7 +52,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_d_invk_fact.f90 b/prec/impl/psb_d_invk_fact.f90 index f1a09985d..14c0a1c9e 100644 --- a/prec/impl/psb_d_invk_fact.f90 +++ b/prec/impl/psb_d_invk_fact.f90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_d_invt_fact.f90 b/prec/impl/psb_d_invt_fact.f90 index 83aa73ffc..5aaa24faf 100644 --- a/prec/impl/psb_d_invt_fact.f90 +++ b/prec/impl/psb_d_invt_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_d_nullprec_impl.f90 b/prec/impl/psb_d_nullprec_impl.f90 index b98229328..507f3eeb5 100644 --- a/prec/impl/psb_d_nullprec_impl.f90 +++ b/prec/impl/psb_d_nullprec_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -29,7 +29,7 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine psb_d_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) +subroutine psb_d_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) use psb_base_mod use psb_d_nullprec, psb_protect_name => psb_d_null_apply_vect implicit none @@ -40,7 +40,6 @@ subroutine psb_d_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) type(psb_d_vect_type),intent(inout) :: y integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) integer(psb_ipk_) :: err_act, nrow, ierr(5) character(len=20) :: name='c_null_prec_apply' diff --git a/prec/impl/psb_d_prec_type_impl.f90 b/prec/impl/psb_d_prec_type_impl.f90 index 69e480797..0eb6e0707 100644 --- a/prec/impl/psb_d_prec_type_impl.f90 +++ b/prec/impl/psb_d_prec_type_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -45,7 +45,7 @@ !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -62,23 +62,21 @@ !!$ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -subroutine psb_d_apply2_vect(prec,x,y,desc_data,info,trans,work) +subroutine psb_d_apply2_vect(prec,x,y,desc_data,info,trans) use psb_base_mod use psb_d_prec_type, psb_protect_name => psb_d_apply2_vect implicit none - type(psb_desc_type),intent(in) :: desc_data - class(psb_dprec_type), intent(inout) :: prec - type(psb_d_vect_type),intent(inout) :: x - type(psb_d_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) - - character :: trans_ - real(psb_dpk_), pointer :: work_(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_dprec_type), intent(inout) :: prec + type(psb_d_vect_type),intent(inout) :: x + type(psb_d_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans + + character :: trans_ type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np,me - integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: np,me + integer(psb_ipk_) :: err_act character(len=20) :: name name = 'psb_d_apply2v' @@ -94,36 +92,13 @@ subroutine psb_d_apply2_vect(prec,x,y,desc_data,info,trans,work) trans_='N' end if - if (present(work)) then - work_ => work - else - allocate(work_(4*desc_data%get_local_cols()),stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - - end if - if (.not.allocated(prec%prec)) then info = 1124 call psb_errpush(info,name,a_err="preconditioner") goto 9999 end if - call prec%prec%apply(done,x,dzero,y,desc_data,info,& - & trans=trans_,work=work_) - - if (present(work)) then - else - deallocate(work_,stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='DeAllocate') - goto 9999 - end if - end if + call prec%prec%apply(done,x,dzero,y,desc_data,info,trans=trans_) call psb_erractionrestore(err_act) return @@ -133,24 +108,22 @@ subroutine psb_d_apply2_vect(prec,x,y,desc_data,info,trans,work) end subroutine psb_d_apply2_vect -subroutine psb_d_apply1_vect(prec,x,desc_data,info,trans,work) +subroutine psb_d_apply1_vect(prec,x,desc_data,info,trans) use psb_base_mod use psb_d_prec_type, psb_protect_name => psb_d_apply1_vect implicit none - type(psb_desc_type),intent(in) :: desc_data - class(psb_dprec_type), intent(inout) :: prec - type(psb_d_vect_type),intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) - - type(psb_d_vect_type) :: ww - character :: trans_ - real(psb_dpk_), pointer :: work_(:) - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np,me - integer(psb_ipk_) :: err_act - character(len=20) :: name + type(psb_desc_type),intent(in) :: desc_data + class(psb_dprec_type), intent(inout) :: prec + type(psb_d_vect_type),intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans + + type(psb_d_vect_type) :: ww + character :: trans_ + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np,me + integer(psb_ipk_) :: err_act + character(len=20) :: name name = 'psb_d_apply1v' info = psb_success_ @@ -165,18 +138,6 @@ subroutine psb_d_apply1_vect(prec,x,desc_data,info,trans,work) trans_='N' end if - if (present(work)) then - work_ => work - else - allocate(work_(4*desc_data%get_local_cols()),stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - - end if - if (.not.allocated(prec%prec)) then info = 1124 call psb_errpush(info,name,a_err="preconditioner") @@ -185,18 +146,9 @@ subroutine psb_d_apply1_vect(prec,x,desc_data,info,trans,work) call psb_geasb(ww,desc_data,info,mold=x%v,scratch=.true.) if (info == 0) call prec%prec%apply(done,x,dzero,ww,desc_data,info,& - & trans=trans_,work=work_) + & trans=trans_) if (info == 0) call psb_geaxpby(done,ww,dzero,x,desc_data,info) call psb_gefree(ww,desc_data,info) - if (present(work)) then - else - deallocate(work_,stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='DeAllocate') - goto 9999 - end if - end if call psb_erractionrestore(err_act) return @@ -206,7 +158,7 @@ subroutine psb_d_apply1_vect(prec,x,desc_data,info,trans,work) end subroutine psb_d_apply1_vect -subroutine psb_d_apply2v(prec,x,y,desc_data,info,trans,work) +subroutine psb_d_apply2v(prec,x,y,desc_data,info,trans) use psb_base_mod use psb_d_prec_type, psb_protect_name => psb_d_apply2v implicit none @@ -216,10 +168,8 @@ subroutine psb_d_apply2v(prec,x,y,desc_data,info,trans,work) real(psb_dpk_),intent(inout) :: y(:) integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) character :: trans_ - real(psb_dpk_), pointer :: work_(:) type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me integer(psb_ipk_) :: err_act @@ -238,33 +188,12 @@ subroutine psb_d_apply2v(prec,x,y,desc_data,info,trans,work) trans_='N' end if - if (present(work)) then - work_ => work - else - allocate(work_(4*desc_data%get_local_cols()),stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - - end if - if (.not.allocated(prec%prec)) then info = 1124 call psb_errpush(info,name,a_err="preconditioner") goto 9999 end if - call prec%prec%apply(done,x,dzero,y,desc_data,info,trans_,work=work_) - if (present(work)) then - else - deallocate(work_,stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='DeAllocate') - goto 9999 - end if - end if + call prec%prec%apply(done,x,dzero,y,desc_data,info,trans_) call psb_erractionrestore(err_act) return @@ -313,7 +242,7 @@ subroutine psb_d_apply1v(prec,x,desc_data,info,trans) goto 9999 end if call prec%prec%apply(done,x,dzero,ww,desc_data,info,& - & trans_,work=w1) + & trans_) if(info /= psb_success_) goto 9999 x(:) = ww(:) deallocate(ww,W1,stat=info) diff --git a/prec/impl/psb_d_sp_drop.f90 b/prec/impl/psb_d_sp_drop.f90 index 67c49b6f5..84551b855 100644 --- a/prec/impl/psb_d_sp_drop.f90 +++ b/prec/impl/psb_d_sp_drop.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_d_sparsify.f90 b/prec/impl/psb_d_sparsify.f90 index de4628ba1..e2d378a82 100644 --- a/prec/impl/psb_d_sparsify.f90 +++ b/prec/impl/psb_d_sparsify.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_dprecbld.f90 b/prec/impl/psb_dprecbld.f90 index c37a05e9f..b663694e3 100644 --- a/prec/impl/psb_dprecbld.f90 +++ b/prec/impl/psb_dprecbld.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,10 +35,10 @@ subroutine psb_dprecbld(a,desc_a,p,info,amold,vmold,imold) use psb_d_prec_type, psb_protect_name => psb_dprecbld Implicit None - type(psb_dspmat_type), intent(in), target :: a - type(psb_desc_type), intent(inout), target :: desc_a - class(psb_dprec_type),intent(inout), target :: p - integer(psb_ipk_), intent(out) :: info + type(psb_dspmat_type), intent(inout), target :: a + type(psb_desc_type), intent(inout), target :: desc_a + class(psb_dprec_type),intent(inout), target :: p + integer(psb_ipk_), intent(out) :: info class(psb_d_base_sparse_mat), intent(in), optional :: amold class(psb_d_base_vect_type), intent(in), optional :: vmold class(psb_i_base_vect_type), intent(in), optional :: imold diff --git a/prec/impl/psb_dprecinit.f90 b/prec/impl/psb_dprecinit.f90 index 260a4f511..fe9f6e9d0 100644 --- a/prec/impl/psb_dprecinit.f90 +++ b/prec/impl/psb_dprecinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_drwclip.f90 b/prec/impl/psb_drwclip.f90 index 97aea4289..57872c7d0 100644 --- a/prec/impl/psb_drwclip.f90 +++ b/prec/impl/psb_drwclip.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_dsparse_biconjg_llk.F90 b/prec/impl/psb_dsparse_biconjg_llk.F90 index 919f64ab1..2459d234b 100644 --- a/prec/impl/psb_dsparse_biconjg_llk.F90 +++ b/prec/impl/psb_dsparse_biconjg_llk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_dsparse_biconjg_llk_noth.F90 b/prec/impl/psb_dsparse_biconjg_llk_noth.F90 index 447cb68f2..764eadab5 100644 --- a/prec/impl/psb_dsparse_biconjg_llk_noth.F90 +++ b/prec/impl/psb_dsparse_biconjg_llk_noth.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_dsparse_biconjg_mlk.F90 b/prec/impl/psb_dsparse_biconjg_mlk.F90 index aae56a5a9..faf5e5073 100644 --- a/prec/impl/psb_dsparse_biconjg_mlk.F90 +++ b/prec/impl/psb_dsparse_biconjg_mlk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_dsparse_biconjg_s_ft_llk.F90 b/prec/impl/psb_dsparse_biconjg_s_ft_llk.F90 index fbf4bc025..07c87d40c 100644 --- a/prec/impl/psb_dsparse_biconjg_s_ft_llk.F90 +++ b/prec/impl/psb_dsparse_biconjg_s_ft_llk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_dsparse_biconjg_s_llk.F90 b/prec/impl/psb_dsparse_biconjg_s_llk.F90 index 72257d445..78016233a 100644 --- a/prec/impl/psb_dsparse_biconjg_s_llk.F90 +++ b/prec/impl/psb_dsparse_biconjg_s_llk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_s_ainv_bld.f90 b/prec/impl/psb_s_ainv_bld.f90 index 0ed9e9e84..07d469fa3 100644 --- a/prec/impl/psb_s_ainv_bld.f90 +++ b/prec/impl/psb_s_ainv_bld.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_s_bjacprec_impl.f90 b/prec/impl/psb_s_bjacprec_impl.f90 index d4a4fd171..ee48003f4 100644 --- a/prec/impl/psb_s_bjacprec_impl.f90 +++ b/prec/impl/psb_s_bjacprec_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -71,31 +71,29 @@ subroutine psb_s_bjac_dump(prec,info,prefix,head) end subroutine psb_s_bjac_dump -subroutine psb_s_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) +subroutine psb_s_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) use psb_base_mod use psb_s_bjacprec, psb_protect_name => psb_s_bjac_apply_vect implicit none - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_s_bjac_prec_type), intent(inout) :: prec - real(psb_spk_),intent(in) :: alpha,beta - type(psb_s_vect_type),intent(inout) :: x - type(psb_s_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) + real(psb_spk_),intent(in) :: alpha,beta + type(psb_s_vect_type),intent(inout) :: x + type(psb_s_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans ! Local variables - integer(psb_ipk_) :: n_row,n_col - real(psb_spk_), pointer :: ww(:), aux(:) + integer(psb_ipk_) :: n_row,n_col type(psb_s_vect_type) :: wv, wv1 - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np,me - integer(psb_ipk_) :: err_act, ierr(5) - integer(psb_ipk_) :: debug_level, debug_unit - logical :: do_alloc_wrk - character :: trans_ - character(len=20) :: name='s_bjac_prec_apply' - character(len=20) :: ch_err + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np,me + integer(psb_ipk_) :: err_act, ierr(5) + integer(psb_ipk_) :: debug_level, debug_unit + logical :: do_alloc_wrk + character :: trans_ + character(len=20) :: name='s_bjac_prec_apply' + character(len=20) :: ch_err info = psb_success_ call psb_erractionsave(err_act) @@ -140,18 +138,6 @@ subroutine psb_s_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) end if - if (n_col <= size(work)) then - ww => work(1:n_col) - if ((4*n_col+n_col) <= size(work)) then - aux => work(n_col+1:) - else - allocate(aux(4*n_col),stat=info) - - endif - else - allocate(ww(n_col),aux(4*n_col),stat=info) - endif - if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Allocate') goto 9999 @@ -168,28 +154,28 @@ subroutine psb_s_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) select case(trans_) case('N') call psb_spsm(sone,prec%av(psb_l_pr_),x,szero,wv,desc_data,info,& - & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_,work=aux) + & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_) if(info == psb_success_) call psb_spsm(alpha,prec%av(psb_u_pr_),wv,& & beta,y,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_, work=aux) + & trans=trans_,scale='U',choice=psb_none_) case('T') call psb_spsm(sone,prec%av(psb_u_pr_),x,szero,wv,desc_data,info,& - & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_, work=aux) + & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_) if(info == psb_success_) call psb_spsm(alpha,prec%av(psb_l_pr_),wv,& & beta,y,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_,work=aux) + & trans=trans_,scale='U',choice=psb_none_) case('C') call psb_spsm(sone,prec%av(psb_u_pr_),x,szero,wv,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_, work=aux) + & trans=trans_,scale='U',choice=psb_none_) call wv1%mlt(sone,prec%dv,wv,szero,info,conjgx=trans_) if(info == psb_success_) call psb_spsm(alpha,prec%av(psb_l_pr_),wv1,& & beta,y,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_,work=aux) + & trans=trans_,scale='U',choice=psb_none_) end select if (info /= psb_success_) then @@ -203,20 +189,20 @@ subroutine psb_s_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) select case(trans_) case('N') call psb_spmm(sone,prec%av(psb_l_pr_),x,szero,wv,desc_data,info,& - & trans=trans_,work=aux,doswap=.false.) + & trans=trans_,doswap=.false.) if (info == psb_success_) call wv1%mlt(sone,prec%dv,wv,szero,info) if(info == psb_success_) & & call psb_spmm(alpha,prec%av(psb_u_pr_),wv1,& - & beta,y,desc_data,info, trans=trans_, work=aux,doswap=.false.) + & beta,y,desc_data,info, trans=trans_,doswap=.false.) case('T','C') call psb_spmm(sone,prec%av(psb_l_pr_),x,szero,wv,desc_data,info,& - & trans=trans_,work=aux,doswap=.false.) + & trans=trans_,doswap=.false.) if (info == psb_success_) call wv1%mlt(sone,prec%dv,wv,szero,info) if (info == psb_success_) & & call psb_spmm(alpha,prec%av(psb_u_pr_),wv1, & - & beta,y,desc_data,info,trans=trans_,work=aux,doswap=.false.) + & beta,y,desc_data,info,trans=trans_,doswap=.false.) end select if (info /= psb_success_) then @@ -235,15 +221,6 @@ subroutine psb_s_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) call psb_halo(y,desc_data,info,data=psb_comm_mov_) if (do_alloc_wrk) call prec%free_wrk(info) - if (n_col <= size(work)) then - if ((4*n_col+n_col) <= size(work)) then - else - deallocate(aux) - endif - else - deallocate(ww,aux) - endif - call psb_erractionrestore(err_act) return diff --git a/prec/impl/psb_s_diagprec_impl.f90 b/prec/impl/psb_s_diagprec_impl.f90 index 4074cbff9..2434fb558 100644 --- a/prec/impl/psb_s_diagprec_impl.f90 +++ b/prec/impl/psb_s_diagprec_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -65,7 +65,7 @@ subroutine psb_s_diag_dump(prec,info,prefix,head) end subroutine psb_s_diag_dump -subroutine psb_s_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) +subroutine psb_s_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) use psb_base_mod use psb_s_diagprec, psb_protect_name => psb_s_diag_apply_vect implicit none @@ -76,7 +76,6 @@ subroutine psb_s_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) type(psb_s_vect_type),intent(inout) :: y integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) integer(psb_ipk_) :: err_act, nrow, ierr(5) character(len=20) :: name='s_diag_prec_apply' real(psb_spk_), pointer :: ww(:) diff --git a/prec/impl/psb_s_ilu0_fact.f90 b/prec/impl/psb_s_ilu0_fact.f90 index d9ce1298e..590ae1d92 100644 --- a/prec/impl/psb_s_ilu0_fact.f90 +++ b/prec/impl/psb_s_ilu0_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -52,7 +52,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_s_iluk_fact.f90 b/prec/impl/psb_s_iluk_fact.f90 index 67fb8ada2..67f32f1f5 100644 --- a/prec/impl/psb_s_iluk_fact.f90 +++ b/prec/impl/psb_s_iluk_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -52,7 +52,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_s_ilut_fact.f90 b/prec/impl/psb_s_ilut_fact.f90 index 3d1111033..fdb2b3367 100644 --- a/prec/impl/psb_s_ilut_fact.f90 +++ b/prec/impl/psb_s_ilut_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -52,7 +52,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_s_invk_fact.f90 b/prec/impl/psb_s_invk_fact.f90 index 4e7bb755a..d5b85a0b1 100644 --- a/prec/impl/psb_s_invk_fact.f90 +++ b/prec/impl/psb_s_invk_fact.f90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_s_invt_fact.f90 b/prec/impl/psb_s_invt_fact.f90 index f311860da..2df810028 100644 --- a/prec/impl/psb_s_invt_fact.f90 +++ b/prec/impl/psb_s_invt_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_s_nullprec_impl.f90 b/prec/impl/psb_s_nullprec_impl.f90 index f95c34fd2..c2d3e9488 100644 --- a/prec/impl/psb_s_nullprec_impl.f90 +++ b/prec/impl/psb_s_nullprec_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -29,7 +29,7 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine psb_s_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) +subroutine psb_s_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) use psb_base_mod use psb_s_nullprec, psb_protect_name => psb_s_null_apply_vect implicit none @@ -40,7 +40,6 @@ subroutine psb_s_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) type(psb_s_vect_type),intent(inout) :: y integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) integer(psb_ipk_) :: err_act, nrow, ierr(5) character(len=20) :: name='c_null_prec_apply' diff --git a/prec/impl/psb_s_prec_type_impl.f90 b/prec/impl/psb_s_prec_type_impl.f90 index 4272ba753..9ab884a85 100644 --- a/prec/impl/psb_s_prec_type_impl.f90 +++ b/prec/impl/psb_s_prec_type_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -45,7 +45,7 @@ !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -62,23 +62,21 @@ !!$ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -subroutine psb_s_apply2_vect(prec,x,y,desc_data,info,trans,work) +subroutine psb_s_apply2_vect(prec,x,y,desc_data,info,trans) use psb_base_mod use psb_s_prec_type, psb_protect_name => psb_s_apply2_vect implicit none - type(psb_desc_type),intent(in) :: desc_data - class(psb_sprec_type), intent(inout) :: prec - type(psb_s_vect_type),intent(inout) :: x - type(psb_s_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) - - character :: trans_ - real(psb_spk_), pointer :: work_(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_sprec_type), intent(inout) :: prec + type(psb_s_vect_type),intent(inout) :: x + type(psb_s_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans + + character :: trans_ type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np,me - integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: np,me + integer(psb_ipk_) :: err_act character(len=20) :: name name = 'psb_s_apply2v' @@ -94,36 +92,13 @@ subroutine psb_s_apply2_vect(prec,x,y,desc_data,info,trans,work) trans_='N' end if - if (present(work)) then - work_ => work - else - allocate(work_(4*desc_data%get_local_cols()),stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - - end if - if (.not.allocated(prec%prec)) then info = 1124 call psb_errpush(info,name,a_err="preconditioner") goto 9999 end if - call prec%prec%apply(sone,x,szero,y,desc_data,info,& - & trans=trans_,work=work_) - - if (present(work)) then - else - deallocate(work_,stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='DeAllocate') - goto 9999 - end if - end if + call prec%prec%apply(sone,x,szero,y,desc_data,info,trans=trans_) call psb_erractionrestore(err_act) return @@ -133,24 +108,22 @@ subroutine psb_s_apply2_vect(prec,x,y,desc_data,info,trans,work) end subroutine psb_s_apply2_vect -subroutine psb_s_apply1_vect(prec,x,desc_data,info,trans,work) +subroutine psb_s_apply1_vect(prec,x,desc_data,info,trans) use psb_base_mod use psb_s_prec_type, psb_protect_name => psb_s_apply1_vect implicit none - type(psb_desc_type),intent(in) :: desc_data - class(psb_sprec_type), intent(inout) :: prec - type(psb_s_vect_type),intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) - - type(psb_s_vect_type) :: ww - character :: trans_ - real(psb_spk_), pointer :: work_(:) - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np,me - integer(psb_ipk_) :: err_act - character(len=20) :: name + type(psb_desc_type),intent(in) :: desc_data + class(psb_sprec_type), intent(inout) :: prec + type(psb_s_vect_type),intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans + + type(psb_s_vect_type) :: ww + character :: trans_ + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np,me + integer(psb_ipk_) :: err_act + character(len=20) :: name name = 'psb_s_apply1v' info = psb_success_ @@ -165,18 +138,6 @@ subroutine psb_s_apply1_vect(prec,x,desc_data,info,trans,work) trans_='N' end if - if (present(work)) then - work_ => work - else - allocate(work_(4*desc_data%get_local_cols()),stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - - end if - if (.not.allocated(prec%prec)) then info = 1124 call psb_errpush(info,name,a_err="preconditioner") @@ -185,18 +146,9 @@ subroutine psb_s_apply1_vect(prec,x,desc_data,info,trans,work) call psb_geasb(ww,desc_data,info,mold=x%v,scratch=.true.) if (info == 0) call prec%prec%apply(sone,x,szero,ww,desc_data,info,& - & trans=trans_,work=work_) + & trans=trans_) if (info == 0) call psb_geaxpby(sone,ww,szero,x,desc_data,info) call psb_gefree(ww,desc_data,info) - if (present(work)) then - else - deallocate(work_,stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='DeAllocate') - goto 9999 - end if - end if call psb_erractionrestore(err_act) return @@ -206,7 +158,7 @@ subroutine psb_s_apply1_vect(prec,x,desc_data,info,trans,work) end subroutine psb_s_apply1_vect -subroutine psb_s_apply2v(prec,x,y,desc_data,info,trans,work) +subroutine psb_s_apply2v(prec,x,y,desc_data,info,trans) use psb_base_mod use psb_s_prec_type, psb_protect_name => psb_s_apply2v implicit none @@ -216,10 +168,8 @@ subroutine psb_s_apply2v(prec,x,y,desc_data,info,trans,work) real(psb_spk_),intent(inout) :: y(:) integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) character :: trans_ - real(psb_spk_), pointer :: work_(:) type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me integer(psb_ipk_) :: err_act @@ -238,33 +188,12 @@ subroutine psb_s_apply2v(prec,x,y,desc_data,info,trans,work) trans_='N' end if - if (present(work)) then - work_ => work - else - allocate(work_(4*desc_data%get_local_cols()),stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - - end if - if (.not.allocated(prec%prec)) then info = 1124 call psb_errpush(info,name,a_err="preconditioner") goto 9999 end if - call prec%prec%apply(sone,x,szero,y,desc_data,info,trans_,work=work_) - if (present(work)) then - else - deallocate(work_,stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='DeAllocate') - goto 9999 - end if - end if + call prec%prec%apply(sone,x,szero,y,desc_data,info,trans_) call psb_erractionrestore(err_act) return @@ -313,7 +242,7 @@ subroutine psb_s_apply1v(prec,x,desc_data,info,trans) goto 9999 end if call prec%prec%apply(sone,x,szero,ww,desc_data,info,& - & trans_,work=w1) + & trans_) if(info /= psb_success_) goto 9999 x(:) = ww(:) deallocate(ww,W1,stat=info) diff --git a/prec/impl/psb_s_sp_drop.f90 b/prec/impl/psb_s_sp_drop.f90 index bc297d085..104f88f81 100644 --- a/prec/impl/psb_s_sp_drop.f90 +++ b/prec/impl/psb_s_sp_drop.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_s_sparsify.f90 b/prec/impl/psb_s_sparsify.f90 index f829fbf21..4a722d805 100644 --- a/prec/impl/psb_s_sparsify.f90 +++ b/prec/impl/psb_s_sparsify.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_sprecbld.f90 b/prec/impl/psb_sprecbld.f90 index a878c16c2..77c2143c5 100644 --- a/prec/impl/psb_sprecbld.f90 +++ b/prec/impl/psb_sprecbld.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,10 +35,10 @@ subroutine psb_sprecbld(a,desc_a,p,info,amold,vmold,imold) use psb_s_prec_type, psb_protect_name => psb_sprecbld Implicit None - type(psb_sspmat_type), intent(in), target :: a - type(psb_desc_type), intent(inout), target :: desc_a - class(psb_sprec_type),intent(inout), target :: p - integer(psb_ipk_), intent(out) :: info + type(psb_sspmat_type), intent(inout), target :: a + type(psb_desc_type), intent(inout), target :: desc_a + class(psb_sprec_type),intent(inout), target :: p + integer(psb_ipk_), intent(out) :: info class(psb_s_base_sparse_mat), intent(in), optional :: amold class(psb_s_base_vect_type), intent(in), optional :: vmold class(psb_i_base_vect_type), intent(in), optional :: imold diff --git a/prec/impl/psb_sprecinit.f90 b/prec/impl/psb_sprecinit.f90 index 32641bbbd..9d1265695 100644 --- a/prec/impl/psb_sprecinit.f90 +++ b/prec/impl/psb_sprecinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_srwclip.f90 b/prec/impl/psb_srwclip.f90 index f57207d7e..ab943aa46 100644 --- a/prec/impl/psb_srwclip.f90 +++ b/prec/impl/psb_srwclip.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_ssparse_biconjg_llk.F90 b/prec/impl/psb_ssparse_biconjg_llk.F90 index 6269cdc84..b533d5ef4 100644 --- a/prec/impl/psb_ssparse_biconjg_llk.F90 +++ b/prec/impl/psb_ssparse_biconjg_llk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_ssparse_biconjg_llk_noth.F90 b/prec/impl/psb_ssparse_biconjg_llk_noth.F90 index 0683750ad..b2728301f 100644 --- a/prec/impl/psb_ssparse_biconjg_llk_noth.F90 +++ b/prec/impl/psb_ssparse_biconjg_llk_noth.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_ssparse_biconjg_mlk.F90 b/prec/impl/psb_ssparse_biconjg_mlk.F90 index 7fc2db48c..c8236cca4 100644 --- a/prec/impl/psb_ssparse_biconjg_mlk.F90 +++ b/prec/impl/psb_ssparse_biconjg_mlk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_ssparse_biconjg_s_ft_llk.F90 b/prec/impl/psb_ssparse_biconjg_s_ft_llk.F90 index e8287e84b..4b1fa37bc 100644 --- a/prec/impl/psb_ssparse_biconjg_s_ft_llk.F90 +++ b/prec/impl/psb_ssparse_biconjg_s_ft_llk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_ssparse_biconjg_s_llk.F90 b/prec/impl/psb_ssparse_biconjg_s_llk.F90 index 42e710895..49ab6e6aa 100644 --- a/prec/impl/psb_ssparse_biconjg_s_llk.F90 +++ b/prec/impl/psb_ssparse_biconjg_s_llk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_z_ainv_bld.f90 b/prec/impl/psb_z_ainv_bld.f90 index 4762a5f75..c147c5329 100644 --- a/prec/impl/psb_z_ainv_bld.f90 +++ b/prec/impl/psb_z_ainv_bld.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_z_bjacprec_impl.f90 b/prec/impl/psb_z_bjacprec_impl.f90 index 3533f1e31..ea6e7926b 100644 --- a/prec/impl/psb_z_bjacprec_impl.f90 +++ b/prec/impl/psb_z_bjacprec_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -71,31 +71,29 @@ subroutine psb_z_bjac_dump(prec,info,prefix,head) end subroutine psb_z_bjac_dump -subroutine psb_z_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) +subroutine psb_z_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) use psb_base_mod use psb_z_bjacprec, psb_protect_name => psb_z_bjac_apply_vect implicit none - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_z_bjac_prec_type), intent(inout) :: prec - complex(psb_dpk_),intent(in) :: alpha,beta - type(psb_z_vect_type),intent(inout) :: x - type(psb_z_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) + complex(psb_dpk_),intent(in) :: alpha,beta + type(psb_z_vect_type),intent(inout) :: x + type(psb_z_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans ! Local variables - integer(psb_ipk_) :: n_row,n_col - complex(psb_dpk_), pointer :: ww(:), aux(:) + integer(psb_ipk_) :: n_row,n_col type(psb_z_vect_type) :: wv, wv1 - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np,me - integer(psb_ipk_) :: err_act, ierr(5) - integer(psb_ipk_) :: debug_level, debug_unit - logical :: do_alloc_wrk - character :: trans_ - character(len=20) :: name='z_bjac_prec_apply' - character(len=20) :: ch_err + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np,me + integer(psb_ipk_) :: err_act, ierr(5) + integer(psb_ipk_) :: debug_level, debug_unit + logical :: do_alloc_wrk + character :: trans_ + character(len=20) :: name='z_bjac_prec_apply' + character(len=20) :: ch_err info = psb_success_ call psb_erractionsave(err_act) @@ -140,18 +138,6 @@ subroutine psb_z_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) end if - if (n_col <= size(work)) then - ww => work(1:n_col) - if ((4*n_col+n_col) <= size(work)) then - aux => work(n_col+1:) - else - allocate(aux(4*n_col),stat=info) - - endif - else - allocate(ww(n_col),aux(4*n_col),stat=info) - endif - if (info /= psb_success_) then call psb_errpush(psb_err_from_subroutine_,name,a_err='Allocate') goto 9999 @@ -168,28 +154,28 @@ subroutine psb_z_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) select case(trans_) case('N') call psb_spsm(zone,prec%av(psb_l_pr_),x,zzero,wv,desc_data,info,& - & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_,work=aux) + & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_) if(info == psb_success_) call psb_spsm(alpha,prec%av(psb_u_pr_),wv,& & beta,y,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_, work=aux) + & trans=trans_,scale='U',choice=psb_none_) case('T') call psb_spsm(zone,prec%av(psb_u_pr_),x,zzero,wv,desc_data,info,& - & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_, work=aux) + & trans=trans_,scale='L',diag=prec%dv,choice=psb_none_) if(info == psb_success_) call psb_spsm(alpha,prec%av(psb_l_pr_),wv,& & beta,y,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_,work=aux) + & trans=trans_,scale='U',choice=psb_none_) case('C') call psb_spsm(zone,prec%av(psb_u_pr_),x,zzero,wv,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_, work=aux) + & trans=trans_,scale='U',choice=psb_none_) call wv1%mlt(zone,prec%dv,wv,zzero,info,conjgx=trans_) if(info == psb_success_) call psb_spsm(alpha,prec%av(psb_l_pr_),wv1,& & beta,y,desc_data,info,& - & trans=trans_,scale='U',choice=psb_none_,work=aux) + & trans=trans_,scale='U',choice=psb_none_) end select if (info /= psb_success_) then @@ -203,20 +189,20 @@ subroutine psb_z_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) select case(trans_) case('N') call psb_spmm(zone,prec%av(psb_l_pr_),x,zzero,wv,desc_data,info,& - & trans=trans_,work=aux,doswap=.false.) + & trans=trans_,doswap=.false.) if (info == psb_success_) call wv1%mlt(zone,prec%dv,wv,zzero,info) if(info == psb_success_) & & call psb_spmm(alpha,prec%av(psb_u_pr_),wv1,& - & beta,y,desc_data,info, trans=trans_, work=aux,doswap=.false.) + & beta,y,desc_data,info, trans=trans_,doswap=.false.) case('T','C') call psb_spmm(zone,prec%av(psb_l_pr_),x,zzero,wv,desc_data,info,& - & trans=trans_,work=aux,doswap=.false.) + & trans=trans_,doswap=.false.) if (info == psb_success_) call wv1%mlt(zone,prec%dv,wv,zzero,info) if (info == psb_success_) & & call psb_spmm(alpha,prec%av(psb_u_pr_),wv1, & - & beta,y,desc_data,info,trans=trans_,work=aux,doswap=.false.) + & beta,y,desc_data,info,trans=trans_,doswap=.false.) end select if (info /= psb_success_) then @@ -235,15 +221,6 @@ subroutine psb_z_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) call psb_halo(y,desc_data,info,data=psb_comm_mov_) if (do_alloc_wrk) call prec%free_wrk(info) - if (n_col <= size(work)) then - if ((4*n_col+n_col) <= size(work)) then - else - deallocate(aux) - endif - else - deallocate(ww,aux) - endif - call psb_erractionrestore(err_act) return diff --git a/prec/impl/psb_z_diagprec_impl.f90 b/prec/impl/psb_z_diagprec_impl.f90 index 15776b526..daf0f7bc1 100644 --- a/prec/impl/psb_z_diagprec_impl.f90 +++ b/prec/impl/psb_z_diagprec_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -65,7 +65,7 @@ subroutine psb_z_diag_dump(prec,info,prefix,head) end subroutine psb_z_diag_dump -subroutine psb_z_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) +subroutine psb_z_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) use psb_base_mod use psb_z_diagprec, psb_protect_name => psb_z_diag_apply_vect implicit none @@ -76,7 +76,6 @@ subroutine psb_z_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) type(psb_z_vect_type),intent(inout) :: y integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) integer(psb_ipk_) :: err_act, nrow, ierr(5) character(len=20) :: name='z_diag_prec_apply' complex(psb_dpk_), pointer :: ww(:) diff --git a/prec/impl/psb_z_ilu0_fact.f90 b/prec/impl/psb_z_ilu0_fact.f90 index 997a5e054..6039e7ffd 100644 --- a/prec/impl/psb_z_ilu0_fact.f90 +++ b/prec/impl/psb_z_ilu0_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -52,7 +52,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_z_iluk_fact.f90 b/prec/impl/psb_z_iluk_fact.f90 index a5540880b..2d30eff99 100644 --- a/prec/impl/psb_z_iluk_fact.f90 +++ b/prec/impl/psb_z_iluk_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -52,7 +52,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_z_ilut_fact.f90 b/prec/impl/psb_z_ilut_fact.f90 index 0c2785157..ad2467841 100644 --- a/prec/impl/psb_z_ilut_fact.f90 +++ b/prec/impl/psb_z_ilut_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -52,7 +52,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_z_invk_fact.f90 b/prec/impl/psb_z_invk_fact.f90 index 99489acd1..21d3b6091 100644 --- a/prec/impl/psb_z_invk_fact.f90 +++ b/prec/impl/psb_z_invk_fact.f90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_z_invt_fact.f90 b/prec/impl/psb_z_invt_fact.f90 index bed713aeb..c3708979c 100644 --- a/prec/impl/psb_z_invt_fact.f90 +++ b/prec/impl/psb_z_invt_fact.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_z_nullprec_impl.f90 b/prec/impl/psb_z_nullprec_impl.f90 index 0306f35dc..dde2cee3a 100644 --- a/prec/impl/psb_z_nullprec_impl.f90 +++ b/prec/impl/psb_z_nullprec_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -29,7 +29,7 @@ ! POSSIBILITY OF SUCH DAMAGE. ! ! -subroutine psb_z_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) +subroutine psb_z_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) use psb_base_mod use psb_z_nullprec, psb_protect_name => psb_z_null_apply_vect implicit none @@ -40,7 +40,6 @@ subroutine psb_z_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) type(psb_z_vect_type),intent(inout) :: y integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) integer(psb_ipk_) :: err_act, nrow, ierr(5) character(len=20) :: name='c_null_prec_apply' diff --git a/prec/impl/psb_z_prec_type_impl.f90 b/prec/impl/psb_z_prec_type_impl.f90 index 00f0b05e1..abbd2ace4 100644 --- a/prec/impl/psb_z_prec_type_impl.f90 +++ b/prec/impl/psb_z_prec_type_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -45,7 +45,7 @@ !!$ documentation and/or other materials provided with the distribution. !!$ 3. The name of the PSBLAS group or the names of its contributors may !!$ not be used to endorse or promote products derived from this -!!$ software without specific written permission. +!!$ software without specific prior written permission. !!$ !!$ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS !!$ ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -62,23 +62,21 @@ !!$ !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -subroutine psb_z_apply2_vect(prec,x,y,desc_data,info,trans,work) +subroutine psb_z_apply2_vect(prec,x,y,desc_data,info,trans) use psb_base_mod use psb_z_prec_type, psb_protect_name => psb_z_apply2_vect implicit none - type(psb_desc_type),intent(in) :: desc_data - class(psb_zprec_type), intent(inout) :: prec - type(psb_z_vect_type),intent(inout) :: x - type(psb_z_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) - - character :: trans_ - complex(psb_dpk_), pointer :: work_(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_zprec_type), intent(inout) :: prec + type(psb_z_vect_type),intent(inout) :: x + type(psb_z_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans + + character :: trans_ type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np,me - integer(psb_ipk_) :: err_act + integer(psb_ipk_) :: np,me + integer(psb_ipk_) :: err_act character(len=20) :: name name = 'psb_z_apply2v' @@ -94,36 +92,13 @@ subroutine psb_z_apply2_vect(prec,x,y,desc_data,info,trans,work) trans_='N' end if - if (present(work)) then - work_ => work - else - allocate(work_(4*desc_data%get_local_cols()),stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - - end if - if (.not.allocated(prec%prec)) then info = 1124 call psb_errpush(info,name,a_err="preconditioner") goto 9999 end if - call prec%prec%apply(zone,x,zzero,y,desc_data,info,& - & trans=trans_,work=work_) - - if (present(work)) then - else - deallocate(work_,stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='DeAllocate') - goto 9999 - end if - end if + call prec%prec%apply(zone,x,zzero,y,desc_data,info,trans=trans_) call psb_erractionrestore(err_act) return @@ -133,24 +108,22 @@ subroutine psb_z_apply2_vect(prec,x,y,desc_data,info,trans,work) end subroutine psb_z_apply2_vect -subroutine psb_z_apply1_vect(prec,x,desc_data,info,trans,work) +subroutine psb_z_apply1_vect(prec,x,desc_data,info,trans) use psb_base_mod use psb_z_prec_type, psb_protect_name => psb_z_apply1_vect implicit none - type(psb_desc_type),intent(in) :: desc_data - class(psb_zprec_type), intent(inout) :: prec - type(psb_z_vect_type),intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) - - type(psb_z_vect_type) :: ww - character :: trans_ - complex(psb_dpk_), pointer :: work_(:) - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: np,me - integer(psb_ipk_) :: err_act - character(len=20) :: name + type(psb_desc_type),intent(in) :: desc_data + class(psb_zprec_type), intent(inout) :: prec + type(psb_z_vect_type),intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans + + type(psb_z_vect_type) :: ww + character :: trans_ + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: np,me + integer(psb_ipk_) :: err_act + character(len=20) :: name name = 'psb_z_apply1v' info = psb_success_ @@ -165,18 +138,6 @@ subroutine psb_z_apply1_vect(prec,x,desc_data,info,trans,work) trans_='N' end if - if (present(work)) then - work_ => work - else - allocate(work_(4*desc_data%get_local_cols()),stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - - end if - if (.not.allocated(prec%prec)) then info = 1124 call psb_errpush(info,name,a_err="preconditioner") @@ -185,18 +146,9 @@ subroutine psb_z_apply1_vect(prec,x,desc_data,info,trans,work) call psb_geasb(ww,desc_data,info,mold=x%v,scratch=.true.) if (info == 0) call prec%prec%apply(zone,x,zzero,ww,desc_data,info,& - & trans=trans_,work=work_) + & trans=trans_) if (info == 0) call psb_geaxpby(zone,ww,zzero,x,desc_data,info) call psb_gefree(ww,desc_data,info) - if (present(work)) then - else - deallocate(work_,stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='DeAllocate') - goto 9999 - end if - end if call psb_erractionrestore(err_act) return @@ -206,7 +158,7 @@ subroutine psb_z_apply1_vect(prec,x,desc_data,info,trans,work) end subroutine psb_z_apply1_vect -subroutine psb_z_apply2v(prec,x,y,desc_data,info,trans,work) +subroutine psb_z_apply2v(prec,x,y,desc_data,info,trans) use psb_base_mod use psb_z_prec_type, psb_protect_name => psb_z_apply2v implicit none @@ -216,10 +168,8 @@ subroutine psb_z_apply2v(prec,x,y,desc_data,info,trans,work) complex(psb_dpk_),intent(inout) :: y(:) integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) character :: trans_ - complex(psb_dpk_), pointer :: work_(:) type(psb_ctxt_type) :: ctxt integer(psb_ipk_) :: np,me integer(psb_ipk_) :: err_act @@ -238,33 +188,12 @@ subroutine psb_z_apply2v(prec,x,y,desc_data,info,trans,work) trans_='N' end if - if (present(work)) then - work_ => work - else - allocate(work_(4*desc_data%get_local_cols()),stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='Allocate') - goto 9999 - end if - - end if - if (.not.allocated(prec%prec)) then info = 1124 call psb_errpush(info,name,a_err="preconditioner") goto 9999 end if - call prec%prec%apply(zone,x,zzero,y,desc_data,info,trans_,work=work_) - if (present(work)) then - else - deallocate(work_,stat=info) - if (info /= psb_success_) then - info = psb_err_from_subroutine_ - call psb_errpush(info,name,a_err='DeAllocate') - goto 9999 - end if - end if + call prec%prec%apply(zone,x,zzero,y,desc_data,info,trans_) call psb_erractionrestore(err_act) return @@ -313,7 +242,7 @@ subroutine psb_z_apply1v(prec,x,desc_data,info,trans) goto 9999 end if call prec%prec%apply(zone,x,zzero,ww,desc_data,info,& - & trans_,work=w1) + & trans_) if(info /= psb_success_) goto 9999 x(:) = ww(:) deallocate(ww,W1,stat=info) diff --git a/prec/impl/psb_z_sp_drop.f90 b/prec/impl/psb_z_sp_drop.f90 index 754c76ccb..855deea45 100644 --- a/prec/impl/psb_z_sp_drop.f90 +++ b/prec/impl/psb_z_sp_drop.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_z_sparsify.f90 b/prec/impl/psb_z_sparsify.f90 index fe29230f2..e83ffa28a 100644 --- a/prec/impl/psb_z_sparsify.f90 +++ b/prec/impl/psb_z_sparsify.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_zprecbld.f90 b/prec/impl/psb_zprecbld.f90 index 3c5849475..4e324cfe5 100644 --- a/prec/impl/psb_zprecbld.f90 +++ b/prec/impl/psb_zprecbld.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -35,10 +35,10 @@ subroutine psb_zprecbld(a,desc_a,p,info,amold,vmold,imold) use psb_z_prec_type, psb_protect_name => psb_zprecbld Implicit None - type(psb_zspmat_type), intent(in), target :: a - type(psb_desc_type), intent(inout), target :: desc_a - class(psb_zprec_type),intent(inout), target :: p - integer(psb_ipk_), intent(out) :: info + type(psb_zspmat_type), intent(inout), target :: a + type(psb_desc_type), intent(inout), target :: desc_a + class(psb_zprec_type),intent(inout), target :: p + integer(psb_ipk_), intent(out) :: info class(psb_z_base_sparse_mat), intent(in), optional :: amold class(psb_z_base_vect_type), intent(in), optional :: vmold class(psb_i_base_vect_type), intent(in), optional :: imold diff --git a/prec/impl/psb_zprecinit.f90 b/prec/impl/psb_zprecinit.f90 index 167a43ecc..1746a8881 100644 --- a/prec/impl/psb_zprecinit.f90 +++ b/prec/impl/psb_zprecinit.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_zrwclip.f90 b/prec/impl/psb_zrwclip.f90 index 574ebcf82..287a08116 100644 --- a/prec/impl/psb_zrwclip.f90 +++ b/prec/impl/psb_zrwclip.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_zsparse_biconjg_llk.F90 b/prec/impl/psb_zsparse_biconjg_llk.F90 index 2d3a90cbe..c39003b09 100644 --- a/prec/impl/psb_zsparse_biconjg_llk.F90 +++ b/prec/impl/psb_zsparse_biconjg_llk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_zsparse_biconjg_llk_noth.F90 b/prec/impl/psb_zsparse_biconjg_llk_noth.F90 index 65975a246..7f93208a6 100644 --- a/prec/impl/psb_zsparse_biconjg_llk_noth.F90 +++ b/prec/impl/psb_zsparse_biconjg_llk_noth.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_zsparse_biconjg_mlk.F90 b/prec/impl/psb_zsparse_biconjg_mlk.F90 index 52c30c2a9..49a4a2af9 100644 --- a/prec/impl/psb_zsparse_biconjg_mlk.F90 +++ b/prec/impl/psb_zsparse_biconjg_mlk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_zsparse_biconjg_s_ft_llk.F90 b/prec/impl/psb_zsparse_biconjg_s_ft_llk.F90 index 541a755c1..37c89f87d 100644 --- a/prec/impl/psb_zsparse_biconjg_s_ft_llk.F90 +++ b/prec/impl/psb_zsparse_biconjg_s_ft_llk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/impl/psb_zsparse_biconjg_s_llk.F90 b/prec/impl/psb_zsparse_biconjg_s_llk.F90 index e4d6624a1..98130285a 100644 --- a/prec/impl/psb_zsparse_biconjg_s_llk.F90 +++ b/prec/impl/psb_zsparse_biconjg_s_llk.F90 @@ -17,7 +17,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_c_ainv_fact_mod.f90 b/prec/psb_c_ainv_fact_mod.f90 index 200ff5616..f248d97f7 100644 --- a/prec/psb_c_ainv_fact_mod.f90 +++ b/prec/psb_c_ainv_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_c_ainv_tools_mod.f90 b/prec/psb_c_ainv_tools_mod.f90 index a68d6d695..3f2f14984 100644 --- a/prec/psb_c_ainv_tools_mod.f90 +++ b/prec/psb_c_ainv_tools_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_c_base_prec_mod.f90 b/prec/psb_c_base_prec_mod.f90 index 4358d5c2a..34dceebf4 100644 --- a/prec/psb_c_base_prec_mod.f90 +++ b/prec/psb_c_base_prec_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -78,20 +78,18 @@ module psb_c_base_prec_mod & psb_c_base_get_nzeros abstract interface - subroutine psb_c_base_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_c_base_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import psb_ipk_, psb_spk_, psb_desc_type, psb_c_vect_type, & & psb_c_base_vect_type, psb_cspmat_type, psb_c_base_prec_type,& & psb_c_base_sparse_mat implicit none - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_c_base_prec_type), intent(inout) :: prec - complex(psb_spk_),intent(in) :: alpha, beta - type(psb_c_vect_type),intent(inout) :: x - type(psb_c_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) - + complex(psb_spk_),intent(in) :: alpha, beta + type(psb_c_vect_type),intent(inout) :: x + type(psb_c_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_c_base_apply_vect end interface diff --git a/prec/psb_c_biconjg_mod.F90 b/prec/psb_c_biconjg_mod.F90 index e6fdaa95e..c2cdd7224 100644 --- a/prec/psb_c_biconjg_mod.F90 +++ b/prec/psb_c_biconjg_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -83,7 +83,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_c_bjacprec.f90 b/prec/psb_c_bjacprec.f90 index 8d6893522..3d8c7296e 100644 --- a/prec/psb_c_bjacprec.f90 +++ b/prec/psb_c_bjacprec.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -77,16 +77,15 @@ module psb_c_bjacprec end interface interface - subroutine psb_c_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_c_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_c_bjac_prec_type, psb_c_vect_type, psb_spk_ - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_c_bjac_prec_type), intent(inout) :: prec - complex(psb_spk_),intent(in) :: alpha,beta - type(psb_c_vect_type),intent(inout) :: x - type(psb_c_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) + complex(psb_spk_),intent(in) :: alpha,beta + type(psb_c_vect_type),intent(inout) :: x + type(psb_c_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_c_bjac_apply_vect end interface diff --git a/prec/psb_c_diagprec.f90 b/prec/psb_c_diagprec.f90 index 9af9e2f97..0a6cbcc3a 100644 --- a/prec/psb_c_diagprec.f90 +++ b/prec/psb_c_diagprec.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -56,7 +56,7 @@ module psb_c_diagprec interface - subroutine psb_c_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_c_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_c_diag_prec_type, psb_c_vect_type, psb_spk_ type(psb_desc_type),intent(in) :: desc_data class(psb_c_diag_prec_type), intent(inout) :: prec @@ -65,7 +65,6 @@ module psb_c_diagprec type(psb_c_vect_type),intent(inout) :: y integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) end subroutine psb_c_diag_apply_vect end interface diff --git a/prec/psb_c_ilu_fact_mod.f90 b/prec/psb_c_ilu_fact_mod.f90 index 0fae1fc5f..51aaaa2cc 100644 --- a/prec/psb_c_ilu_fact_mod.f90 +++ b/prec/psb_c_ilu_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_c_invk_fact_mod.f90 b/prec/psb_c_invk_fact_mod.f90 index 620a8adf7..2df812d46 100644 --- a/prec/psb_c_invk_fact_mod.f90 +++ b/prec/psb_c_invk_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_c_invt_fact_mod.f90 b/prec/psb_c_invt_fact_mod.f90 index 841c39b1b..43a904918 100644 --- a/prec/psb_c_invt_fact_mod.f90 +++ b/prec/psb_c_invt_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_c_nullprec.f90 b/prec/psb_c_nullprec.f90 index 56bbca583..225d87ccb 100644 --- a/prec/psb_c_nullprec.f90 +++ b/prec/psb_c_nullprec.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,16 +51,15 @@ module psb_c_nullprec interface - subroutine psb_c_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_c_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_c_null_prec_type, psb_c_vect_type, psb_spk_ - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_c_null_prec_type), intent(inout) :: prec - type(psb_c_vect_type),intent(inout) :: x - complex(psb_spk_),intent(in) :: alpha, beta - type(psb_c_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) + type(psb_c_vect_type),intent(inout) :: x + complex(psb_spk_),intent(in) :: alpha, beta + type(psb_c_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_c_null_apply_vect end interface diff --git a/prec/psb_c_prec_mod.f90 b/prec/psb_c_prec_mod.f90 index 8d9c9d1d5..c27187082 100644 --- a/prec/psb_c_prec_mod.f90 +++ b/prec/psb_c_prec_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_c_prec_type.f90 b/prec/psb_c_prec_type.f90 index 9c5e1cdc8..1097ea67f 100644 --- a/prec/psb_c_prec_type.f90 +++ b/prec/psb_c_prec_type.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,7 +85,7 @@ module psb_c_prec_type & psb_c_base_sparse_mat, psb_spk_, psb_c_base_vect_type, & & psb_cprec_type, psb_i_base_vect_type implicit none - type(psb_cspmat_type), intent(in), target :: a + type(psb_cspmat_type), intent(inout), target :: a type(psb_desc_type), intent(inout), target :: desc_a class(psb_cprec_type), intent(inout), target :: prec integer(psb_ipk_), intent(out) :: info @@ -108,51 +108,48 @@ module psb_c_prec_type end interface interface - subroutine psb_c_apply2_vect(prec,x,y,desc_data,info,trans,work) + subroutine psb_c_apply2_vect(prec,x,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_cprec_type, psb_c_vect_type, psb_spk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_cprec_type), intent(inout) :: prec - type(psb_c_vect_type),intent(inout) :: x - type(psb_c_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_cprec_type), intent(inout) :: prec + type(psb_c_vect_type),intent(inout) :: x + type(psb_c_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_c_apply2_vect end interface interface - subroutine psb_c_apply1_vect(prec,x,desc_data,info,trans,work) + subroutine psb_c_apply1_vect(prec,x,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_cprec_type, psb_c_vect_type, psb_spk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_cprec_type), intent(inout) :: prec - type(psb_c_vect_type),intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_cprec_type), intent(inout) :: prec + type(psb_c_vect_type),intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_c_apply1_vect end interface interface - subroutine psb_c_apply2v(prec,x,y,desc_data,info,trans,work) + subroutine psb_c_apply2v(prec,x,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_cprec_type, psb_c_vect_type, psb_spk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_cprec_type), intent(inout) :: prec - complex(psb_spk_),intent(inout) :: x(:) - complex(psb_spk_),intent(inout) :: y(:) - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_spk_),intent(inout), optional, target :: work(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_cprec_type), intent(inout) :: prec + complex(psb_spk_),intent(inout) :: x(:) + complex(psb_spk_),intent(inout) :: y(:) + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_c_apply2v end interface interface subroutine psb_c_apply1v(prec,x,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_cprec_type, psb_c_vect_type, psb_spk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_cprec_type), intent(inout) :: prec - complex(psb_spk_),intent(inout) :: x(:) - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans + type(psb_desc_type),intent(in) :: desc_data + class(psb_cprec_type), intent(inout) :: prec + complex(psb_spk_),intent(inout) :: x(:) + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_c_apply1v end interface diff --git a/prec/psb_d_ainv_fact_mod.f90 b/prec/psb_d_ainv_fact_mod.f90 index 8eb6fbc87..198280736 100644 --- a/prec/psb_d_ainv_fact_mod.f90 +++ b/prec/psb_d_ainv_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_d_ainv_tools_mod.f90 b/prec/psb_d_ainv_tools_mod.f90 index 7329533b7..546334440 100644 --- a/prec/psb_d_ainv_tools_mod.f90 +++ b/prec/psb_d_ainv_tools_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_d_base_prec_mod.f90 b/prec/psb_d_base_prec_mod.f90 index e38691939..6d7792cf6 100644 --- a/prec/psb_d_base_prec_mod.f90 +++ b/prec/psb_d_base_prec_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -78,20 +78,18 @@ module psb_d_base_prec_mod & psb_d_base_get_nzeros abstract interface - subroutine psb_d_base_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_d_base_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import psb_ipk_, psb_dpk_, psb_desc_type, psb_d_vect_type, & & psb_d_base_vect_type, psb_dspmat_type, psb_d_base_prec_type,& & psb_d_base_sparse_mat implicit none - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_d_base_prec_type), intent(inout) :: prec - real(psb_dpk_),intent(in) :: alpha, beta - type(psb_d_vect_type),intent(inout) :: x - type(psb_d_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) - + real(psb_dpk_),intent(in) :: alpha, beta + type(psb_d_vect_type),intent(inout) :: x + type(psb_d_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_d_base_apply_vect end interface diff --git a/prec/psb_d_biconjg_mod.F90 b/prec/psb_d_biconjg_mod.F90 index 696ecbaa9..eb6579e0b 100644 --- a/prec/psb_d_biconjg_mod.F90 +++ b/prec/psb_d_biconjg_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -83,7 +83,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_d_bjacprec.f90 b/prec/psb_d_bjacprec.f90 index 6ca35ec8c..ab15b2e1d 100644 --- a/prec/psb_d_bjacprec.f90 +++ b/prec/psb_d_bjacprec.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -77,16 +77,15 @@ module psb_d_bjacprec end interface interface - subroutine psb_d_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_d_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_d_bjac_prec_type, psb_d_vect_type, psb_dpk_ - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_d_bjac_prec_type), intent(inout) :: prec - real(psb_dpk_),intent(in) :: alpha,beta - type(psb_d_vect_type),intent(inout) :: x - type(psb_d_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) + real(psb_dpk_),intent(in) :: alpha,beta + type(psb_d_vect_type),intent(inout) :: x + type(psb_d_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_d_bjac_apply_vect end interface diff --git a/prec/psb_d_diagprec.f90 b/prec/psb_d_diagprec.f90 index 268b104c4..dd266c222 100644 --- a/prec/psb_d_diagprec.f90 +++ b/prec/psb_d_diagprec.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -56,7 +56,7 @@ module psb_d_diagprec interface - subroutine psb_d_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_d_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_d_diag_prec_type, psb_d_vect_type, psb_dpk_ type(psb_desc_type),intent(in) :: desc_data class(psb_d_diag_prec_type), intent(inout) :: prec @@ -65,7 +65,6 @@ module psb_d_diagprec type(psb_d_vect_type),intent(inout) :: y integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) end subroutine psb_d_diag_apply_vect end interface diff --git a/prec/psb_d_ilu_fact_mod.f90 b/prec/psb_d_ilu_fact_mod.f90 index 6354573d0..77cefb352 100644 --- a/prec/psb_d_ilu_fact_mod.f90 +++ b/prec/psb_d_ilu_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_d_invk_fact_mod.f90 b/prec/psb_d_invk_fact_mod.f90 index 2bd97198c..fa54e5db4 100644 --- a/prec/psb_d_invk_fact_mod.f90 +++ b/prec/psb_d_invk_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_d_invt_fact_mod.f90 b/prec/psb_d_invt_fact_mod.f90 index f38c1c2b5..55a2bc479 100644 --- a/prec/psb_d_invt_fact_mod.f90 +++ b/prec/psb_d_invt_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_d_nullprec.f90 b/prec/psb_d_nullprec.f90 index 7e94e0ef6..fcbd26028 100644 --- a/prec/psb_d_nullprec.f90 +++ b/prec/psb_d_nullprec.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,16 +51,15 @@ module psb_d_nullprec interface - subroutine psb_d_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_d_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_d_null_prec_type, psb_d_vect_type, psb_dpk_ - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_d_null_prec_type), intent(inout) :: prec - type(psb_d_vect_type),intent(inout) :: x - real(psb_dpk_),intent(in) :: alpha, beta - type(psb_d_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) + type(psb_d_vect_type),intent(inout) :: x + real(psb_dpk_),intent(in) :: alpha, beta + type(psb_d_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_d_null_apply_vect end interface diff --git a/prec/psb_d_prec_mod.f90 b/prec/psb_d_prec_mod.f90 index 3f1a59d8a..23a3f3523 100644 --- a/prec/psb_d_prec_mod.f90 +++ b/prec/psb_d_prec_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_d_prec_type.f90 b/prec/psb_d_prec_type.f90 index 708b33f33..3db41f4e6 100644 --- a/prec/psb_d_prec_type.f90 +++ b/prec/psb_d_prec_type.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,7 +85,7 @@ module psb_d_prec_type & psb_d_base_sparse_mat, psb_dpk_, psb_d_base_vect_type, & & psb_dprec_type, psb_i_base_vect_type implicit none - type(psb_dspmat_type), intent(in), target :: a + type(psb_dspmat_type), intent(inout), target :: a type(psb_desc_type), intent(inout), target :: desc_a class(psb_dprec_type), intent(inout), target :: prec integer(psb_ipk_), intent(out) :: info @@ -108,51 +108,48 @@ module psb_d_prec_type end interface interface - subroutine psb_d_apply2_vect(prec,x,y,desc_data,info,trans,work) + subroutine psb_d_apply2_vect(prec,x,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_dprec_type, psb_d_vect_type, psb_dpk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_dprec_type), intent(inout) :: prec - type(psb_d_vect_type),intent(inout) :: x - type(psb_d_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_dprec_type), intent(inout) :: prec + type(psb_d_vect_type),intent(inout) :: x + type(psb_d_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_d_apply2_vect end interface interface - subroutine psb_d_apply1_vect(prec,x,desc_data,info,trans,work) + subroutine psb_d_apply1_vect(prec,x,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_dprec_type, psb_d_vect_type, psb_dpk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_dprec_type), intent(inout) :: prec - type(psb_d_vect_type),intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_dprec_type), intent(inout) :: prec + type(psb_d_vect_type),intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_d_apply1_vect end interface interface - subroutine psb_d_apply2v(prec,x,y,desc_data,info,trans,work) + subroutine psb_d_apply2v(prec,x,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_dprec_type, psb_d_vect_type, psb_dpk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_dprec_type), intent(inout) :: prec - real(psb_dpk_),intent(inout) :: x(:) - real(psb_dpk_),intent(inout) :: y(:) - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_dpk_),intent(inout), optional, target :: work(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_dprec_type), intent(inout) :: prec + real(psb_dpk_),intent(inout) :: x(:) + real(psb_dpk_),intent(inout) :: y(:) + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_d_apply2v end interface interface subroutine psb_d_apply1v(prec,x,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_dprec_type, psb_d_vect_type, psb_dpk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_dprec_type), intent(inout) :: prec - real(psb_dpk_),intent(inout) :: x(:) - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans + type(psb_desc_type),intent(in) :: desc_data + class(psb_dprec_type), intent(inout) :: prec + real(psb_dpk_),intent(inout) :: x(:) + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_d_apply1v end interface diff --git a/prec/psb_prec_const_mod.f90 b/prec/psb_prec_const_mod.f90 index d74c5bf0e..9ad231cea 100644 --- a/prec/psb_prec_const_mod.f90 +++ b/prec/psb_prec_const_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_prec_mod.f90 b/prec/psb_prec_mod.f90 index 86bf50581..00ecb904e 100644 --- a/prec/psb_prec_mod.f90 +++ b/prec/psb_prec_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_prec_type.f90 b/prec/psb_prec_type.f90 index 0c8212462..9d8edfafd 100644 --- a/prec/psb_prec_type.f90 +++ b/prec/psb_prec_type.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_s_ainv_fact_mod.f90 b/prec/psb_s_ainv_fact_mod.f90 index bc7f1d126..02a59b1a5 100644 --- a/prec/psb_s_ainv_fact_mod.f90 +++ b/prec/psb_s_ainv_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_s_ainv_tools_mod.f90 b/prec/psb_s_ainv_tools_mod.f90 index caa501641..ff00548ac 100644 --- a/prec/psb_s_ainv_tools_mod.f90 +++ b/prec/psb_s_ainv_tools_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_s_base_prec_mod.f90 b/prec/psb_s_base_prec_mod.f90 index 36af2787a..488cc5192 100644 --- a/prec/psb_s_base_prec_mod.f90 +++ b/prec/psb_s_base_prec_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -78,20 +78,18 @@ module psb_s_base_prec_mod & psb_s_base_get_nzeros abstract interface - subroutine psb_s_base_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_s_base_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import psb_ipk_, psb_spk_, psb_desc_type, psb_s_vect_type, & & psb_s_base_vect_type, psb_sspmat_type, psb_s_base_prec_type,& & psb_s_base_sparse_mat implicit none - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_s_base_prec_type), intent(inout) :: prec - real(psb_spk_),intent(in) :: alpha, beta - type(psb_s_vect_type),intent(inout) :: x - type(psb_s_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) - + real(psb_spk_),intent(in) :: alpha, beta + type(psb_s_vect_type),intent(inout) :: x + type(psb_s_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_s_base_apply_vect end interface diff --git a/prec/psb_s_biconjg_mod.F90 b/prec/psb_s_biconjg_mod.F90 index 46fe3a0a5..63eb7ad80 100644 --- a/prec/psb_s_biconjg_mod.F90 +++ b/prec/psb_s_biconjg_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -83,7 +83,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_s_bjacprec.f90 b/prec/psb_s_bjacprec.f90 index 5173ddd20..b919cf215 100644 --- a/prec/psb_s_bjacprec.f90 +++ b/prec/psb_s_bjacprec.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -77,16 +77,15 @@ module psb_s_bjacprec end interface interface - subroutine psb_s_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_s_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_s_bjac_prec_type, psb_s_vect_type, psb_spk_ - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_s_bjac_prec_type), intent(inout) :: prec - real(psb_spk_),intent(in) :: alpha,beta - type(psb_s_vect_type),intent(inout) :: x - type(psb_s_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) + real(psb_spk_),intent(in) :: alpha,beta + type(psb_s_vect_type),intent(inout) :: x + type(psb_s_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_s_bjac_apply_vect end interface diff --git a/prec/psb_s_diagprec.f90 b/prec/psb_s_diagprec.f90 index 022d831d5..b5804d088 100644 --- a/prec/psb_s_diagprec.f90 +++ b/prec/psb_s_diagprec.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -56,7 +56,7 @@ module psb_s_diagprec interface - subroutine psb_s_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_s_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_s_diag_prec_type, psb_s_vect_type, psb_spk_ type(psb_desc_type),intent(in) :: desc_data class(psb_s_diag_prec_type), intent(inout) :: prec @@ -65,7 +65,6 @@ module psb_s_diagprec type(psb_s_vect_type),intent(inout) :: y integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) end subroutine psb_s_diag_apply_vect end interface diff --git a/prec/psb_s_ilu_fact_mod.f90 b/prec/psb_s_ilu_fact_mod.f90 index 4021adc9b..c5fe00d4e 100644 --- a/prec/psb_s_ilu_fact_mod.f90 +++ b/prec/psb_s_ilu_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_s_invk_fact_mod.f90 b/prec/psb_s_invk_fact_mod.f90 index 6b0d35531..835a39d3b 100644 --- a/prec/psb_s_invk_fact_mod.f90 +++ b/prec/psb_s_invk_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_s_invt_fact_mod.f90 b/prec/psb_s_invt_fact_mod.f90 index 2c9ce38c6..aa27ab4c1 100644 --- a/prec/psb_s_invt_fact_mod.f90 +++ b/prec/psb_s_invt_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_s_nullprec.f90 b/prec/psb_s_nullprec.f90 index 9907eb7ab..ab610a57f 100644 --- a/prec/psb_s_nullprec.f90 +++ b/prec/psb_s_nullprec.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,16 +51,15 @@ module psb_s_nullprec interface - subroutine psb_s_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_s_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_s_null_prec_type, psb_s_vect_type, psb_spk_ - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_s_null_prec_type), intent(inout) :: prec - type(psb_s_vect_type),intent(inout) :: x - real(psb_spk_),intent(in) :: alpha, beta - type(psb_s_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) + type(psb_s_vect_type),intent(inout) :: x + real(psb_spk_),intent(in) :: alpha, beta + type(psb_s_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_s_null_apply_vect end interface diff --git a/prec/psb_s_prec_mod.f90 b/prec/psb_s_prec_mod.f90 index 858db9ecf..cc8b1130c 100644 --- a/prec/psb_s_prec_mod.f90 +++ b/prec/psb_s_prec_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_s_prec_type.f90 b/prec/psb_s_prec_type.f90 index 9b6ee231b..d761db9ce 100644 --- a/prec/psb_s_prec_type.f90 +++ b/prec/psb_s_prec_type.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,7 +85,7 @@ module psb_s_prec_type & psb_s_base_sparse_mat, psb_spk_, psb_s_base_vect_type, & & psb_sprec_type, psb_i_base_vect_type implicit none - type(psb_sspmat_type), intent(in), target :: a + type(psb_sspmat_type), intent(inout), target :: a type(psb_desc_type), intent(inout), target :: desc_a class(psb_sprec_type), intent(inout), target :: prec integer(psb_ipk_), intent(out) :: info @@ -108,51 +108,48 @@ module psb_s_prec_type end interface interface - subroutine psb_s_apply2_vect(prec,x,y,desc_data,info,trans,work) + subroutine psb_s_apply2_vect(prec,x,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_sprec_type, psb_s_vect_type, psb_spk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_sprec_type), intent(inout) :: prec - type(psb_s_vect_type),intent(inout) :: x - type(psb_s_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_sprec_type), intent(inout) :: prec + type(psb_s_vect_type),intent(inout) :: x + type(psb_s_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_s_apply2_vect end interface interface - subroutine psb_s_apply1_vect(prec,x,desc_data,info,trans,work) + subroutine psb_s_apply1_vect(prec,x,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_sprec_type, psb_s_vect_type, psb_spk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_sprec_type), intent(inout) :: prec - type(psb_s_vect_type),intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_sprec_type), intent(inout) :: prec + type(psb_s_vect_type),intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_s_apply1_vect end interface interface - subroutine psb_s_apply2v(prec,x,y,desc_data,info,trans,work) + subroutine psb_s_apply2v(prec,x,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_sprec_type, psb_s_vect_type, psb_spk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_sprec_type), intent(inout) :: prec - real(psb_spk_),intent(inout) :: x(:) - real(psb_spk_),intent(inout) :: y(:) - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - real(psb_spk_),intent(inout), optional, target :: work(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_sprec_type), intent(inout) :: prec + real(psb_spk_),intent(inout) :: x(:) + real(psb_spk_),intent(inout) :: y(:) + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_s_apply2v end interface interface subroutine psb_s_apply1v(prec,x,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_sprec_type, psb_s_vect_type, psb_spk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_sprec_type), intent(inout) :: prec - real(psb_spk_),intent(inout) :: x(:) - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans + type(psb_desc_type),intent(in) :: desc_data + class(psb_sprec_type), intent(inout) :: prec + real(psb_spk_),intent(inout) :: x(:) + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_s_apply1v end interface diff --git a/prec/psb_z_ainv_fact_mod.f90 b/prec/psb_z_ainv_fact_mod.f90 index 490fe1322..77db6e75b 100644 --- a/prec/psb_z_ainv_fact_mod.f90 +++ b/prec/psb_z_ainv_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_z_ainv_tools_mod.f90 b/prec/psb_z_ainv_tools_mod.f90 index f611c2a73..66650b817 100644 --- a/prec/psb_z_ainv_tools_mod.f90 +++ b/prec/psb_z_ainv_tools_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_z_base_prec_mod.f90 b/prec/psb_z_base_prec_mod.f90 index ddf67630d..09fbfd32a 100644 --- a/prec/psb_z_base_prec_mod.f90 +++ b/prec/psb_z_base_prec_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -78,20 +78,18 @@ module psb_z_base_prec_mod & psb_z_base_get_nzeros abstract interface - subroutine psb_z_base_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_z_base_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import psb_ipk_, psb_dpk_, psb_desc_type, psb_z_vect_type, & & psb_z_base_vect_type, psb_zspmat_type, psb_z_base_prec_type,& & psb_z_base_sparse_mat implicit none - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_z_base_prec_type), intent(inout) :: prec - complex(psb_dpk_),intent(in) :: alpha, beta - type(psb_z_vect_type),intent(inout) :: x - type(psb_z_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) - + complex(psb_dpk_),intent(in) :: alpha, beta + type(psb_z_vect_type),intent(inout) :: x + type(psb_z_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_z_base_apply_vect end interface diff --git a/prec/psb_z_biconjg_mod.F90 b/prec/psb_z_biconjg_mod.F90 index bb193f577..8a7db5fd1 100644 --- a/prec/psb_z_biconjg_mod.F90 +++ b/prec/psb_z_biconjg_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -83,7 +83,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_z_bjacprec.f90 b/prec/psb_z_bjacprec.f90 index d8ff09bba..22c6d198f 100644 --- a/prec/psb_z_bjacprec.f90 +++ b/prec/psb_z_bjacprec.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -77,16 +77,15 @@ module psb_z_bjacprec end interface interface - subroutine psb_z_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_z_bjac_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_z_bjac_prec_type, psb_z_vect_type, psb_dpk_ - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_z_bjac_prec_type), intent(inout) :: prec - complex(psb_dpk_),intent(in) :: alpha,beta - type(psb_z_vect_type),intent(inout) :: x - type(psb_z_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) + complex(psb_dpk_),intent(in) :: alpha,beta + type(psb_z_vect_type),intent(inout) :: x + type(psb_z_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_z_bjac_apply_vect end interface diff --git a/prec/psb_z_diagprec.f90 b/prec/psb_z_diagprec.f90 index 26ae3c383..73f18cd35 100644 --- a/prec/psb_z_diagprec.f90 +++ b/prec/psb_z_diagprec.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -56,7 +56,7 @@ module psb_z_diagprec interface - subroutine psb_z_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_z_diag_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_z_diag_prec_type, psb_z_vect_type, psb_dpk_ type(psb_desc_type),intent(in) :: desc_data class(psb_z_diag_prec_type), intent(inout) :: prec @@ -65,7 +65,6 @@ module psb_z_diagprec type(psb_z_vect_type),intent(inout) :: y integer(psb_ipk_), intent(out) :: info character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) end subroutine psb_z_diag_apply_vect end interface diff --git a/prec/psb_z_ilu_fact_mod.f90 b/prec/psb_z_ilu_fact_mod.f90 index 4793b43bd..b8658d3a4 100644 --- a/prec/psb_z_ilu_fact_mod.f90 +++ b/prec/psb_z_ilu_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,7 +51,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_z_invk_fact_mod.f90 b/prec/psb_z_invk_fact_mod.f90 index 0a1e5fafb..6b83e5ffd 100644 --- a/prec/psb_z_invk_fact_mod.f90 +++ b/prec/psb_z_invk_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_z_invt_fact_mod.f90 b/prec/psb_z_invt_fact_mod.f90 index 1cdf32f48..f90f2d04c 100644 --- a/prec/psb_z_invt_fact_mod.f90 +++ b/prec/psb_z_invt_fact_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -48,7 +48,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the AMG4PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_z_nullprec.f90 b/prec/psb_z_nullprec.f90 index 56b5329ff..415741688 100644 --- a/prec/psb_z_nullprec.f90 +++ b/prec/psb_z_nullprec.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -51,16 +51,15 @@ module psb_z_nullprec interface - subroutine psb_z_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans,work) + subroutine psb_z_null_apply_vect(alpha,prec,x,beta,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_z_null_prec_type, psb_z_vect_type, psb_dpk_ - type(psb_desc_type),intent(in) :: desc_data + type(psb_desc_type),intent(in) :: desc_data class(psb_z_null_prec_type), intent(inout) :: prec - type(psb_z_vect_type),intent(inout) :: x - complex(psb_dpk_),intent(in) :: alpha, beta - type(psb_z_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) + type(psb_z_vect_type),intent(inout) :: x + complex(psb_dpk_),intent(in) :: alpha, beta + type(psb_z_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_z_null_apply_vect end interface diff --git a/prec/psb_z_prec_mod.f90 b/prec/psb_z_prec_mod.f90 index 1f0909aae..95cc5dd68 100644 --- a/prec/psb_z_prec_mod.f90 +++ b/prec/psb_z_prec_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/prec/psb_z_prec_type.f90 b/prec/psb_z_prec_type.f90 index 7fa396ed4..1f17896d3 100644 --- a/prec/psb_z_prec_type.f90 +++ b/prec/psb_z_prec_type.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -85,7 +85,7 @@ module psb_z_prec_type & psb_z_base_sparse_mat, psb_dpk_, psb_z_base_vect_type, & & psb_zprec_type, psb_i_base_vect_type implicit none - type(psb_zspmat_type), intent(in), target :: a + type(psb_zspmat_type), intent(inout), target :: a type(psb_desc_type), intent(inout), target :: desc_a class(psb_zprec_type), intent(inout), target :: prec integer(psb_ipk_), intent(out) :: info @@ -108,51 +108,48 @@ module psb_z_prec_type end interface interface - subroutine psb_z_apply2_vect(prec,x,y,desc_data,info,trans,work) + subroutine psb_z_apply2_vect(prec,x,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_zprec_type, psb_z_vect_type, psb_dpk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_zprec_type), intent(inout) :: prec - type(psb_z_vect_type),intent(inout) :: x - type(psb_z_vect_type),intent(inout) :: y - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_zprec_type), intent(inout) :: prec + type(psb_z_vect_type),intent(inout) :: x + type(psb_z_vect_type),intent(inout) :: y + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_z_apply2_vect end interface interface - subroutine psb_z_apply1_vect(prec,x,desc_data,info,trans,work) + subroutine psb_z_apply1_vect(prec,x,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_zprec_type, psb_z_vect_type, psb_dpk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_zprec_type), intent(inout) :: prec - type(psb_z_vect_type),intent(inout) :: x - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_zprec_type), intent(inout) :: prec + type(psb_z_vect_type),intent(inout) :: x + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_z_apply1_vect end interface interface - subroutine psb_z_apply2v(prec,x,y,desc_data,info,trans,work) + subroutine psb_z_apply2v(prec,x,y,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_zprec_type, psb_z_vect_type, psb_dpk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_zprec_type), intent(inout) :: prec - complex(psb_dpk_),intent(inout) :: x(:) - complex(psb_dpk_),intent(inout) :: y(:) - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans - complex(psb_dpk_),intent(inout), optional, target :: work(:) + type(psb_desc_type),intent(in) :: desc_data + class(psb_zprec_type), intent(inout) :: prec + complex(psb_dpk_),intent(inout) :: x(:) + complex(psb_dpk_),intent(inout) :: y(:) + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_z_apply2v end interface interface subroutine psb_z_apply1v(prec,x,desc_data,info,trans) import :: psb_ipk_, psb_desc_type, psb_zprec_type, psb_z_vect_type, psb_dpk_ - type(psb_desc_type),intent(in) :: desc_data - class(psb_zprec_type), intent(inout) :: prec - complex(psb_dpk_),intent(inout) :: x(:) - integer(psb_ipk_), intent(out) :: info - character(len=1), optional :: trans + type(psb_desc_type),intent(in) :: desc_data + class(psb_zprec_type), intent(inout) :: prec + complex(psb_dpk_),intent(inout) :: x(:) + integer(psb_ipk_), intent(out) :: info + character(len=1), optional :: trans end subroutine psb_z_apply1v end interface diff --git a/rsb/Makefile b/rsb/Makefile old mode 100755 new mode 100644 diff --git a/rsb/impl/Makefile b/rsb/impl/Makefile old mode 100755 new mode 100644 diff --git a/rsb/impl/psb_d_cp_rsb_from_coo.F90 b/rsb/impl/psb_d_cp_rsb_from_coo.F90 index 145928779..6d2f995ee 100644 --- a/rsb/impl/psb_d_cp_rsb_from_coo.F90 +++ b/rsb/impl/psb_d_cp_rsb_from_coo.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/rsb/impl/psb_d_cp_rsb_to_coo.f90 b/rsb/impl/psb_d_cp_rsb_to_coo.f90 index 3747100ff..d37147ac0 100644 --- a/rsb/impl/psb_d_cp_rsb_to_coo.f90 +++ b/rsb/impl/psb_d_cp_rsb_to_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/rsb/impl/psb_d_mv_rsb_from_coo.f90 b/rsb/impl/psb_d_mv_rsb_from_coo.f90 index 9de74ec77..4f71b4c82 100644 --- a/rsb/impl/psb_d_mv_rsb_from_coo.f90 +++ b/rsb/impl/psb_d_mv_rsb_from_coo.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/rsb/impl/psb_d_rsb_csmv.F90 b/rsb/impl/psb_d_rsb_csmv.F90 index f5dbba97a..817447600 100644 --- a/rsb/impl/psb_d_rsb_csmv.F90 +++ b/rsb/impl/psb_d_rsb_csmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/rsb/psb_d_rsb_mat_mod.f90 b/rsb/psb_d_rsb_mat_mod.f90 index e06f8e1d4..64356b443 100644 --- a/rsb/psb_d_rsb_mat_mod.f90 +++ b/rsb/psb_d_rsb_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/rsb/psb_rsb_mod.F90 b/rsb/psb_rsb_mod.F90 index 73db825a2..caec384c2 100644 --- a/rsb/psb_rsb_mod.F90 +++ b/rsb/psb_rsb_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/rsb/psb_rsb_penv_mod.F90 b/rsb/psb_rsb_penv_mod.F90 index 12a56d838..cf57df567 100644 --- a/rsb/psb_rsb_penv_mod.F90 +++ b/rsb/psb_rsb_penv_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/rsb/rsb_int.c b/rsb/rsb_int.c index dc4a80269..2143ee464 100644 --- a/rsb/rsb_int.c +++ b/rsb/rsb_int.c @@ -14,7 +14,7 @@ /* documentation and/or other materials provided with the distribution. */ /* 3. The name of the PSBLAS group or the names of its contributors may */ /* not be used to endorse or promote products derived from this */ - /* software without specific written permission. */ + /* software without specific prior written permission. */ /* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */ /* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED */ diff --git a/rsb/rsb_mod.F90 b/rsb/rsb_mod.F90 index e52526546..42a567396 100644 --- a/rsb/rsb_mod.F90 +++ b/rsb/rsb_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/comm/.gitignore b/test/comm/.gitignore new file mode 100644 index 000000000..a899a643e --- /dev/null +++ b/test/comm/.gitignore @@ -0,0 +1,3 @@ +**/massif/* +**/**/massif/* +*.kcg \ No newline at end of file diff --git a/test/comm/README.md b/test/comm/README.md new file mode 100644 index 000000000..c2acd017b --- /dev/null +++ b/test/comm/README.md @@ -0,0 +1,23 @@ +Communication scheme tests +========================== + +This directory contains tests created after adding multiple communication schemes +to PSBLAS. + +The goal is to exercise and compare communication patterns at different layers: + +- direct halo exchange (`psi_swapdata`) +- overlap exchange for transpose/SpMV workflows (`psi_swaptran` + `psi_swapdata`) +- full Krylov solver runs (`CG`) using different comm schemes. + +Communication schemes covered in this area: + +- `psb_comm_isend_irecv_` (baseline point-to-point) +- `psb_comm_ineighbor_alltoallv_` (neighbor collective) +- `psb_comm_persistent_ineighbor_alltoallv_` (persistent neighbor collective) + +See: + +- `swapdata/` for a direct halo-exchange test. +- `spmv/` for an overlap SpMV test that uses different communication schemes. +- `cg/` for a conjugate-gradient solve-time comparison across the three schemes. diff --git a/test/comm/cg/Makefile b/test/comm/cg/Makefile new file mode 100644 index 000000000..6bc3ee304 --- /dev/null +++ b/test/comm/cg/Makefile @@ -0,0 +1,37 @@ +INSTALLDIR=../../.. +INCDIR=$(INSTALLDIR)/include/ +MODDIR=$(INSTALLDIR)/modules/ +include $(INCDIR)/Make.inc.psblas + +LIBDIR=$(INSTALLDIR)/lib/ +PSBLAS_LIB= -L$(LIBDIR) $(LCUDA) -lpsb_util -lpsb_linsolve -lpsb_prec -lpsb_base -lpsb_cuda -lpsb_ext +LDLIBS=$(PSBGPULDLIBS) + +FINCLUDES=$(FMFLAG)$(MODDIR) $(FMFLAG). + +NP ?= 4 +IDIM ?= 40 + +PROGSRC=psb_comm_cg_test.F90 +TOBJS=psb_comm_cg_test.o + +EXEDIR=./runs +EXE=psb_comm_cg_test + +all: runsd $(EXE) + +runsd: + (if test ! -d runs ; then mkdir runs; fi) + +psb_comm_cg_test.o: $(PROGSRC) + $(FC) $(FCOPT) $(FINCLUDES) $(FDEFINES) $(FCUDEFINES) -c $(PROGSRC) -o $@ + +$(EXE): $(TOBJS) + $(FLINK) $(LOPT) $(TOBJS) -o $(EXE) $(PSBLAS_LIB) $(LDLIBS) + /bin/mv $(EXE) $(EXEDIR) + +run: all + mpirun -np $(NP) $(EXEDIR)/$(EXE) $(IDIM) + +clean: + /bin/rm -f $(TOBJS) *$(.mod) $(EXEDIR)/$(EXE) diff --git a/test/comm/cg/README.md b/test/comm/cg/README.md new file mode 100644 index 000000000..0f09dad5b --- /dev/null +++ b/test/comm/cg/README.md @@ -0,0 +1,45 @@ +CG no-preconditioner communication test +======================================= + +This test lives under `test/comm/cg` and builds a local executable: + +- source: `psb_comm_cg_test.F90` +- executable: `runs/psb_comm_cg_test` + +Behavior: + +- generates a 3D PDE matrix using local `psb_d_gen_pde3d` (double precision) +- solves with `CG` +- uses preconditioner `NONE` +- runs CG three times, changing communication scheme of `x` each run + +Communication pattern used in this test: + +1. reset solution vector +2. set communication scheme on `x%v%comm_handle` +3. run full `psb_krylov('CG', ...)` +4. collect and compare solve time + +Schemes compared: + +- `psb_comm_isend_irecv_` +- `psb_comm_ineighbor_alltoallv_` +- `psb_comm_persistent_ineighbor_alltoallv_` + +How to run +---------- + +From this directory: + +- `make run` (defaults: `NP=4`, `IDIM=40`) +- `make run NP=8 IDIM=80` + +Default PDE-generated matrix: + +- `./runs/psb_comm_cg_test [idim] [nrep] [nwarm] [itmax] [--gpu=TRUE|FALSE]` + +External matrix input: + +- `./runs/psb_comm_cg_test [idim] [nrep] [nwarm] [itmax] --matrix= [--fmt=MM|HB] [--gpu=TRUE|FALSE]` + +When `--matrix` is provided, the test reads and distributes that matrix and ignores the PDE generator. diff --git a/test/comm/cg/psb_c_comm_cg_test.F90 b/test/comm/cg/psb_c_comm_cg_test.F90 new file mode 100644 index 000000000..22f92414b --- /dev/null +++ b/test/comm/cg/psb_c_comm_cg_test.F90 @@ -0,0 +1,974 @@ +program psb_c_comm_cg_test + use psb_base_mod + use psb_util_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + use psb_prec_mod + use psb_linsolve_mod + use psb_comm_factory_mod + use psb_comm_schemes_mod, only: psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_, psb_comm_rma_pull_, psb_comm_rma_push_ + use, intrinsic :: ieee_arithmetic + + implicit none + + type(psb_ctxt_type) :: ctxt + type(psb_ctxt_type) :: desc_ctxt + type(psb_cspmat_type) :: a + type(psb_desc_type) :: desc_a + type(psb_c_vect_type) :: b, x + type(psb_cprec_type) :: prec +#ifdef PSB_HAVE_CUDA + type(psb_c_vect_cuda) :: vmold + type(psb_i_vect_cuda) :: imold + type(psb_c_cuda_hlg_sparse_mat), target :: ahlg + class(psb_c_base_sparse_mat), pointer :: agmold +#endif + + integer(psb_ipk_) :: info, my_rank, np + integer(psb_ipk_) :: desc_me, desc_np + integer(psb_ipk_) :: idim, itmax, itrace, istop, iter + integer(psb_ipk_) :: scheme_idx, prec_idx, rep, nrep, nwarm + integer(psb_ipk_), parameter :: n_schemes=5, n_precs=2 + integer(psb_ipk_), allocatable :: iter_count(:,:,:), solve_info(:,:,:) + integer(psb_ipk_) :: scheme_type(n_schemes) + real(psb_spk_) :: eps, err, t_start, t_elapsed + real(psb_spk_), allocatable :: prec_init_time(:,:,:), prec_bld_time(:,:,:) + real(psb_spk_), allocatable :: comm_set_time(:,:,:), krylov_time(:,:,:) + real(psb_spk_), allocatable :: setup_time(:,:,:), solve_time(:,:,:) + real(psb_spk_), allocatable :: total_time(:,:,:), final_error(:,:,:) + real(psb_spk_), allocatable :: krylov_it_time(:,:,:), total_it_time(:,:,:) + real(psb_spk_) :: iter_denom + real(psb_spk_) :: avg_t, std_t, med_t, p10_t, p90_t, min_t, max_t + character(len=25) :: scheme_name(n_schemes) + character(len=12) :: prec_type(n_precs) + character(len=20) :: prec_name(n_precs) + character(len=5) :: afmt + character(len=256) :: arg + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + character(len=16) :: gpu_arg + logical :: setup_done + logical :: use_gpu + logical :: use_external_matrix + + info = psb_success_ + afmt = 'CSR' + idim = 40 + itmax = 1000 + nrep = 5 + nwarm = 1 + ! Disable per-iteration tracing; avoids modulo-by-zero paths in some logging branches. + itrace = -1 + istop = 2 + eps = 1.0e-6_psb_spk_ + matrix_file = '' + matrix_fmt = 'MM' + use_external_matrix = .false. +#ifdef PSB_HAVE_CUDA + use_gpu = .true. +#else + use_gpu = .false. +#endif + scheme_type = (/ psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_ , psb_comm_rma_pull_, psb_comm_rma_push_ /) + scheme_name(1) = 'isend_irecv' + scheme_name(2) = 'ineighbor_alltoallv' + scheme_name(3) = 'persistent_ineighbor_a2av' + scheme_name(4) = 'psb_comm_rma_pull_' + scheme_name(5) = 'psb_comm_rma_push_' + + prec_type(1) = 'NONE' + prec_type(2) = 'DIAG' + prec_name(1) = 'none' + prec_name(2) = 'diag' + + call get_command_argument(1,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) idim + if (info /= 0) then + idim = 40 + info = psb_success_ + end if + end if + call get_command_argument(2,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) nrep + if ((info /= 0).or.(nrep <= 0)) then + nrep = 7 + info = psb_success_ + end if + end if + call get_command_argument(3,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) nwarm + if ((info /= 0).or.(nwarm < 0)) then + nwarm = 1 + info = psb_success_ + end if + end if + call get_command_argument(4,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) itmax + if ((info /= 0).or.(itmax <= 0)) then + itmax = 1000 + info = psb_success_ + end if + end if + + call parse_gpu_arg(use_gpu, info) + if (info /= psb_success_) then + write(psb_err_unit,'("Invalid value for --gpu option. Use --gpu=TRUE or --gpu=FALSE")') + stop 1 + end if + call parse_matrix_arg(matrix_file, matrix_fmt, info) + if (info /= psb_success_) then + write(psb_err_unit,'("Invalid matrix options. Use --matrix= [--fmt=MM|HB]")') + stop 1 + end if + use_external_matrix = (len_trim(matrix_file) > 0) + ! call psb_set_debug_level(psb_debug_ext_) + + + ! call probe_ieee('before psb_init') + call psb_init(ctxt) +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_init(ctxt) +#endif + ! call probe_ieee('after psb_init') + call clear_ieee_flags() + ! call probe_ieee('after clear_ieee_flags') + call psb_info(ctxt, my_rank, np) + +#ifndef PSB_HAVE_CUDA + if (use_gpu .and. my_rank == psb_root_) then + write(psb_out_unit,'("Warning: --gpu=TRUE requested but this executable was built without CUDA support. Running on CPU.")') + end if + use_gpu = .false. +#endif + + allocate(setup_time(n_precs,n_schemes,nrep), solve_time(n_precs,n_schemes,nrep), & + & total_time(n_precs,n_schemes,nrep), final_error(n_precs,n_schemes,nrep), & + & krylov_it_time(n_precs,n_schemes,nrep), total_it_time(n_precs,n_schemes,nrep), & + & iter_count(n_precs,n_schemes,nrep), solve_info(n_precs,n_schemes,nrep), & + & prec_init_time(n_precs,n_schemes,nrep), prec_bld_time(n_precs,n_schemes,nrep), & + & comm_set_time(n_precs,n_schemes,nrep), krylov_time(n_precs,n_schemes,nrep), stat=info) + if (info /= psb_success_) stop 1 + + if (my_rank == psb_root_) then + write(psb_out_unit,*) 'Welcome to PSBLAS version: ', psb_version_string_ + write(psb_out_unit,*) 'This is the comm/cg test program' + if (use_external_matrix) then + write(psb_out_unit,'("Input matrix : ",a)') trim(matrix_file) + write(psb_out_unit,'("Input format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'("Grid dimensions : ",i4," x ",i4," x ",i4)') idim,idim,idim + end if + write(psb_out_unit,'("Number of processors : ",i0)') np + write(psb_out_unit,'("Iterative method : CG")') + write(psb_out_unit,'("Preconditioners : NONE, DIAG")') + write(psb_out_unit,'("Max iterations (CG) : ",i0)') itmax + write(psb_out_unit,'("Repetitions : ",i0)') nrep + write(psb_out_unit,'("Warmup solves : ",i0)') nwarm + write(psb_out_unit,'("GPU enabled : ",l1)') use_gpu + write(psb_out_unit,'(" ")') + write(psb_out_unit,'("Usage: ./psb_c_comm_cg_test [idim] [nrep] [nwarm] [itmax] ",& + &"[--gpu=TRUE|FALSE] [--matrix=] [--fmt=MM|HB]")') + write(psb_out_unit,'(" ")') + end if + + call psb_barrier(ctxt) + if (use_external_matrix) then + call load_external_matrix(ctxt, matrix_file, matrix_fmt, a, b, x, desc_a, afmt, info) + else + ! call probe_ieee('before psb_c_gen_pde3d') + call psb_c_gen_pde3d(ctxt,idim,a,b,x,desc_a,afmt,info) + ! call probe_ieee('after psb_c_gen_pde3d') + end if + if (info /= psb_success_) goto 9999 + +#ifdef PSB_HAVE_CUDA + if (use_gpu) then + agmold => ahlg + call a%cscnv(info,mold=agmold) + if (info /= psb_success_) goto 9999 + call desc_a%cnv(mold=imold) + if (info /= psb_success_) goto 9999 + call x%cnv(mold=vmold) + if (info /= psb_success_) goto 9999 + call b%cnv(mold=vmold) + if (info /= psb_success_) goto 9999 + end if +#endif + + do prec_idx = 1, n_precs + do scheme_idx = 1, n_schemes + do rep = 1, nrep + t_start = psb_wtime() + ! Set default scheme on the descriptor: all vectors that lazy-init during + ! this solve (including internal CG vectors r, p, q, z) will use this scheme. + call desc_a%set_comm_scheme(scheme_type(scheme_idx), info) + if (info /= psb_success_) goto 9999 + ! Free x comm_handle so it also re-initializes from desc_a%comm_type + ! (it may already be allocated from a previous rep). + if (allocated(x%v%comm_handle)) call psb_comm_free(x%v%comm_handle, info) + if (info /= psb_success_) goto 9999 + comm_set_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + + call psb_geaxpby(czero,b,czero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + + t_start = psb_wtime() + call prec%init(ctxt,trim(prec_type(prec_idx)),info) + if (info /= psb_success_) goto 9999 + + prec_init_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,prec_init_time(prec_idx,scheme_idx,rep)) + + t_start = psb_wtime() + call prec%build(a,desc_a,info) + if (info /= psb_success_) goto 9999 + prec_bld_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,prec_bld_time(prec_idx,scheme_idx,rep)) + + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object not allocated after build' + goto 9999 + end if + + + call psb_amx(ctxt,comm_set_time(prec_idx,scheme_idx,rep)) + + if (info /= psb_success_) goto 9999 + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object lost after psb_comm_set' + goto 9999 + end if + + setup_time(prec_idx,scheme_idx,rep) = prec_init_time(prec_idx,scheme_idx,rep) + & + & prec_bld_time(prec_idx,scheme_idx,rep) + comm_set_time(prec_idx,scheme_idx,rep) + + call psb_geaxpby(czero,b,czero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + t_start = psb_wtime() + call psb_krylov('CG',a,prec,b,x,eps,desc_a,info,& + & itmax=itmax,iter=iter,err=err,itrace=itrace,istop=istop) + krylov_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,krylov_time(prec_idx,scheme_idx,rep)) + + if (info /= psb_success_) goto 9999 + + ! Verify x used the descriptor scheme (lazy init should have fired during CG). + if (allocated(x%v%comm_handle)) then + if (x%v%comm_handle%comm_type /= scheme_type(scheme_idx)) then + if (my_rank == psb_root_) & + write(psb_err_unit,'("SCHEME MISMATCH rank=",i0," expected=",i0," got=",i0)') & + my_rank, scheme_type(scheme_idx), x%v%comm_handle%comm_type + info = psb_err_internal_error_ + goto 9999 + else + if (my_rank == psb_root_ .and. rep == 1) & + write(psb_out_unit,'(" [OK] x comm_handle matches scheme: ",a)') & + trim(scheme_name(scheme_idx)) + end if + end if + + call psb_geaxpby(czero,b,czero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object lost before psb_krylov' + goto 9999 + end if + + call prec%free(info) + if (info /= psb_success_) goto 9999 + + solve_time(prec_idx,scheme_idx,rep) = krylov_time(prec_idx,scheme_idx,rep) + total_time(prec_idx,scheme_idx,rep) = setup_time(prec_idx,scheme_idx,rep) + & + & solve_time(prec_idx,scheme_idx,rep) + iter_count(prec_idx,scheme_idx,rep) = iter + iter_denom = real(max(iter,1_psb_ipk_),psb_spk_) + krylov_it_time(prec_idx,scheme_idx,rep) = solve_time(prec_idx,scheme_idx,rep)/iter_denom + total_it_time(prec_idx,scheme_idx,rep) = total_time(prec_idx,scheme_idx,rep)/iter_denom + final_error(prec_idx,scheme_idx,rep) = err + solve_info(prec_idx,scheme_idx,rep) = info + + if (info /= psb_success_) goto 9999 + end do + end do + end do + + if (my_rank == psb_root_) then + write(psb_out_unit,'(" ")') + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'("CG TIMING STATISTICS - FINAL RESULTS TABLE")') + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'("Legend:")') + write(psb_out_unit,'(" - Each phase time for one repetition is reduced with max across MPI ranks.")') + write(psb_out_unit,'(" - Minimum/Average/Maximum/Std Dev are computed across repetitions.")') + write(psb_out_unit,'(" - KrylovPerIter = KrylovSolve/iterations; TotalPerIter = TotalTime/iterations.")') + + do prec_idx = 1, n_precs + write(psb_out_unit,'(" ")') + write(psb_out_unit,'("Preconditioner: ",a)') trim(prec_name(prec_idx)) + write(psb_out_unit,'(100("-"))') + + ! Print header + write(psb_out_unit,'(a25,a18,a18,a18,a18,a18)') & + & 'Scheme', 'Phase', 'Minimum [s]', 'Average [s]', 'Maximum [s]', 'Std Dev [s]' + write(psb_out_unit,'(100("-"))') + + do scheme_idx = 1, n_schemes + ! Preconditioner init phase + call compute_stats(prec_init_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & trim(scheme_name(scheme_idx)), 'Prec Init', min_t, avg_t, max_t, std_t + + ! Preconditioner build phase + call compute_stats(prec_bld_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Prec Build', min_t, avg_t, max_t, std_t + + ! Communication setup phase + call compute_stats(comm_set_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Comm Setup', min_t, avg_t, max_t, std_t + + ! Total setup phase + call compute_stats(setup_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'SetupTotal', min_t, avg_t, max_t, std_t + + ! Krylov solve phase (this is the actual solver) + call compute_stats(krylov_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'KrylovSolve', min_t, avg_t, max_t, std_t + + ! Krylov solve normalized per actual CG iteration + call compute_stats(krylov_it_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'KrylovPerIter', min_t, avg_t, max_t, std_t + + ! Total phase statistics + call compute_stats(total_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'TotalTime', min_t, avg_t, max_t, std_t + + ! Total (setup+solve) normalized per actual CG iteration + call compute_stats(total_it_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'TotalPerIter', min_t, avg_t, max_t, std_t + + ! Final error and convergence info + call compute_stats(final_error(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Final Error', min_t, avg_t, max_t, std_t + write(psb_out_unit,'(a25,a18,"Iterations: ",i8," Info code: ",i6)') & + & ' ', ' ', iter_count(prec_idx,scheme_idx,nrep), solve_info(prec_idx,scheme_idx,nrep) + + write(psb_out_unit,'(100("-"))') + end do + end do + + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'(" ")') + end if + + call psb_gefree(b,desc_a,info) + call psb_gefree(x,desc_a,info) + call psb_spfree(a,desc_a,info) + call psb_precfree(prec,info) + call psb_cdfree(desc_a,info) + deallocate(setup_time,solve_time,total_time,final_error,iter_count,solve_info, & + & prec_init_time,prec_bld_time,comm_set_time,krylov_time, & + & krylov_it_time,total_it_time) + + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_exit() +#endif + call psb_exit(ctxt) + stop + +9999 call psb_error(ctxt) + stop 1 + +contains + + subroutine sort_real_inplace(v) + real(psb_spk_), intent(inout) :: v(:) + integer(psb_ipk_) :: i, j + real(psb_spk_) :: key + + do i = 2, size(v) + key = v(i) + j = i - 1 + do while (j >= 1) + if (v(j) <= key) exit + v(j+1) = v(j) + j = j - 1 + end do + v(j+1) = key + end do + end subroutine sort_real_inplace + + subroutine compute_stats(vals,mean_v,std_v,median_v,p10_v,p90_v,min_v,max_v) + real(psb_spk_), intent(in) :: vals(:) + real(psb_spk_), intent(out) :: mean_v,std_v,median_v,p10_v,p90_v,min_v,max_v + real(psb_spk_), allocatable :: tmp(:) + integer(psb_ipk_) :: n, idx10, idx90 + + n = size(vals) + if (n <= 0) then + mean_v = szero; std_v = szero; median_v = szero + p10_v = szero; p90_v = szero; min_v = szero; max_v = szero + return + end if + + mean_v = sum(vals)/real(n,psb_spk_) + if (n > 1) then + std_v = sqrt(sum((vals-mean_v)**2)/real(n-1,psb_spk_)) + else + std_v = szero + end if + + allocate(tmp(n)) + tmp = vals + call sort_real_inplace(tmp) + + if (mod(n,2) == 0) then + median_v = (tmp(n/2)+tmp(n/2+1))/2.0_psb_spk_ + else + median_v = tmp((n+1)/2) + end if + + idx10 = int(ceiling(0.10_psb_spk_*real(n,psb_spk_)),kind=psb_ipk_) + idx90 = int(ceiling(0.90_psb_spk_*real(n,psb_spk_)),kind=psb_ipk_) + idx10 = max(1_psb_ipk_,min(n,idx10)) + idx90 = max(1_psb_ipk_,min(n,idx90)) + p10_v = tmp(idx10) + p90_v = tmp(idx90) + min_v = tmp(1) + max_v = tmp(n) + + deallocate(tmp) + end subroutine compute_stats + + function b1(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = szero + end function b1 + + function b2(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = szero + end function b2 + + function b3(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = szero + end function b3 + + function cfun(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = szero + end function cfun + + function a1(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = sone/80 + end function a1 + + function a2(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = sone/80 + end function a2 + + function a3(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = sone/80 + end function a3 + + function gfun(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = szero + if (x == sone) then + val = sone + else if (x == szero) then + val = exp(y**2-z**2) + end if + end function gfun + + subroutine probe_ieee(where) + character(len=*), intent(in) :: where + logical :: invalid_flag, divzero_flag, overflow_flag, underflow_flag + + call ieee_get_flag(ieee_invalid, invalid_flag) + call ieee_get_flag(ieee_divide_by_zero, divzero_flag) + call ieee_get_flag(ieee_overflow, overflow_flag) + call ieee_get_flag(ieee_underflow, underflow_flag) + + if (invalid_flag .or. divzero_flag .or. overflow_flag .or. underflow_flag) then + write(psb_out_unit,'("IEEE probe [",a,"] invalid=",l1,", div0=",l1,", overflow=",l1,", underflow=",l1)') & + trim(where), invalid_flag, divzero_flag, overflow_flag, underflow_flag + end if + end subroutine probe_ieee + + subroutine clear_ieee_flags() + call ieee_set_flag(ieee_invalid, .false.) + call ieee_set_flag(ieee_divide_by_zero, .false.) + call ieee_set_flag(ieee_overflow, .false.) + call ieee_set_flag(ieee_underflow, .false.) + end subroutine clear_ieee_flags + + subroutine parse_gpu_arg(use_gpu, info) + logical, intent(inout) :: use_gpu + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: i, argc + character(len=256) :: carg, uarg, val + + info = psb_success_ + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i,carg) + uarg = psb_toupper(trim(carg)) + if (index(uarg,'--GPU=') == 1) then + val = psb_toupper(adjustl(carg(7:len_trim(carg)))) + select case (trim(val)) + case ('TRUE','T','1','YES','Y','ON') + use_gpu = .true. + case ('FALSE','F','0','NO','N','OFF') + use_gpu = .false. + case default + info = psb_err_internal_error_ + return + end select + end if + end do + end subroutine parse_gpu_arg + + subroutine parse_matrix_arg(matrix_file, matrix_fmt, info) + character(len=*), intent(inout) :: matrix_file + character(len=*), intent(inout) :: matrix_fmt + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: i, argc + character(len=256) :: carg, uarg, val + + info = psb_success_ + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i,carg) + uarg = psb_toupper(trim(carg)) + + if (index(uarg,'--MATRIX=') == 1) then + matrix_file = adjustl(carg(10:len_trim(carg))) + else if (trim(uarg) == '--MATRIX') then + if (i < argc) then + call get_command_argument(i+1,matrix_file) + else + info = psb_err_internal_error_ + return + end if + else if (index(uarg,'--FMT=') == 1) then + val = psb_toupper(adjustl(carg(7:len_trim(carg)))) + if ((trim(val) == 'MM') .or. (trim(val) == 'HB')) then + matrix_fmt = trim(val) + else + info = psb_err_internal_error_ + return + end if + else if (trim(uarg) == '--FMT') then + if (i < argc) then + call get_command_argument(i+1,val) + val = psb_toupper(trim(val)) + if ((trim(val) == 'MM') .or. (trim(val) == 'HB')) then + matrix_fmt = trim(val) + else + info = psb_err_internal_error_ + return + end if + else + info = psb_err_internal_error_ + return + end if + end if + end do + end subroutine parse_matrix_arg + + subroutine load_external_matrix(ctxt, matrix_file, matrix_fmt, a, bv, xv, desc_a, afmt, info) + type(psb_ctxt_type), intent(in) :: ctxt + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + type(psb_cspmat_type), intent(out) :: a + type(psb_c_vect_type), intent(out) :: bv, xv + type(psb_desc_type), intent(out) :: desc_a + character(len=*), intent(in) :: afmt + integer(psb_ipk_), intent(out) :: info + + type(psb_lcspmat_type) :: aux_a + complex(psb_spk_), allocatable :: rhs_glob(:), x_glob(:) + integer(psb_lpk_) :: nrows, ncols + + info = psb_success_ + + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + return + end select + if (info /= psb_success_) return + + nrows = aux_a%get_nrows() + ncols = aux_a%get_ncols() + if (nrows /= ncols) then + write(psb_err_unit,'("Input matrix must be square for CG: ",a)') trim(matrix_file) + info = psb_err_internal_error_ + return + end if + + call psb_matdist(aux_a, a, ctxt, desc_a, info, fmt=afmt, parts=part_block) + if (info /= psb_success_) return + + call psb_geall(xv,desc_a,info) + if (info /= psb_success_) return + call psb_geall(bv,desc_a,info) + if (info /= psb_success_) return + + allocate(rhs_glob(nrows), x_glob(ncols), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + return + end if + rhs_glob = cone + x_glob = czero + + call psb_scatter(rhs_glob,bv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + call psb_scatter(x_glob,xv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + + deallocate(rhs_glob, x_glob) + end subroutine load_external_matrix + + subroutine psb_c_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info) + implicit none + integer(psb_ipk_), intent(in) :: idim + type(psb_cspmat_type), intent(out) :: a + type(psb_c_vect_type), intent(out) :: xv,bv + type(psb_desc_type), intent(out) :: desc_a + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(out) :: info + character(len=*), intent(in) :: afmt + + integer(psb_ipk_), parameter :: nb=20 + complex(psb_spk_) :: zt(nb) + real(psb_spk_) :: x,y,z + integer(psb_lpk_) :: m,n,glob_row + integer(psb_ipk_) :: nnz,nlr,i,ii,ib,k + integer(psb_ipk_) :: ix,iy,iz + integer(psb_ipk_) :: np, my_rank, nr, nt + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + complex(psb_spk_), allocatable :: val(:) + real(psb_spk_) :: deltah, sqdeltah, deltah2 + real(psb_spk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err, tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, my_rank, np) + + if (idim <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='idim must be > 0') + goto 9999 + end if + if (np <= 0) then + info = psb_err_context_error_ + call psb_errpush(info,name,a_err='invalid context: np <= 0') + goto 9999 + end if + if (my_rank < 0) then + info = psb_err_context_error_ + call psb_errpush(info,name,a_err='invalid context: my_rank < 0') + goto 9999 + end if + + deltah = sone/(idim+2) + sqdeltah = deltah*deltah + deltah2 = 2.0e0_psb_spk_*deltah + + if (abs(deltah) <= tiny(deltah)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: deltah ~ 0') + goto 9999 + end if + if (abs(sqdeltah) <= tiny(sqdeltah)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: sqdeltah ~ 0') + goto 9999 + end if + if (abs(deltah2) <= tiny(deltah2)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: deltah2 ~ 0') + goto 9999 + end if + + m = idim*idim*idim + n = m + if (n <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid global size: n <= 0') + goto 9999 + end if + nnz = ((n*9)/(np)) + if (nnz <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid local nnz estimate: nnz <= 0') + goto 9999 + end if + if(my_rank == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + + nt = (m+np-1)/np + nr = max(0,min(nt,m-(my_rank*nt))) + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) my_rank, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + call psb_barrier(ctxt) + t0 = psb_wtime() + ! call probe_ieee('enter psb_cdall') + call psb_cdall(ctxt,desc_a,info,nl=nr) + ! call probe_ieee('after psb_cdall') + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz) + ! call probe_ieee('after psb_spall') + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + allocate(val(20*nb),irow(20*nb),icol(20*nb),stat=info) + if (info /= psb_success_) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + glob_row=myidx(i) + + if (mod(glob_row,(idim*idim)) == 0) then + ix = glob_row/(idim*idim) + else + ix = glob_row/(idim*idim)+1 + endif + if (mod((glob_row-(ix-1)*idim*idim),idim) == 0) then + iy = (glob_row-(ix-1)*idim*idim)/idim + else + iy = (glob_row-(ix-1)*idim*idim)/idim+1 + endif + iz = glob_row-(ix-1)*idim*idim-(iy-1)*idim + + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = czero + + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = gfun(szero,y,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-2)*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = gfun(x,szero,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-2)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = gfun(x,y,szero)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz-1) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff)=2.0e0_psb_spk_*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah + cfun(x,y,z) + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + + val(icoeff) = -a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = gfun(x,y,sone)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz+1) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = gfun(x,sone,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+iy*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix == idim) then + zt(k) = gfun(sone,y,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = ix*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + end do + + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + ! call probe_ieee('after psb_spins') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_spins, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + ! call probe_ieee('after psb_geins bv') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_geins bv, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + zt(:)=czero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + ! call probe_ieee('after psb_geins xv') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_geins xv, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + ! call probe_ieee('before psb_cdasb') + call psb_cdasb(desc_a,info) + ! call probe_ieee('after psb_cdasb') + tcdasb = psb_wtime()-t1 + + call psb_barrier(ctxt) + t1 = psb_wtime() + ! call probe_ieee('before psb_spasb') + if (info == psb_success_) call psb_spasb(a,desc_a,info,afmt=afmt) + ! call probe_ieee('after psb_spasb') + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) call psb_geasb(xv,desc_a,info) + if (info == psb_success_) call psb_geasb(bv,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(my_rank == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")') tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psb_c_gen_pde3d + +end program psb_c_comm_cg_test diff --git a/test/comm/cg/psb_comm_cg_test.F90 b/test/comm/cg/psb_comm_cg_test.F90 new file mode 100644 index 000000000..345728390 --- /dev/null +++ b/test/comm/cg/psb_comm_cg_test.F90 @@ -0,0 +1,973 @@ +program psb_comm_cg_test + use psb_base_mod + use psb_util_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + use psb_prec_mod + use psb_linsolve_mod + use psb_comm_factory_mod + use psb_comm_schemes_mod, only: psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_, psb_comm_rma_pull_, psb_comm_rma_push_ + use, intrinsic :: ieee_arithmetic + + implicit none + + type(psb_ctxt_type) :: ctxt + type(psb_ctxt_type) :: desc_ctxt + type(psb_dspmat_type) :: a + type(psb_desc_type) :: desc_a + type(psb_d_vect_type) :: b, x + type(psb_dprec_type) :: prec +#ifdef PSB_HAVE_CUDA + type(psb_d_vect_cuda) :: vmold + type(psb_i_vect_cuda) :: imold + type(psb_d_cuda_hlg_sparse_mat), target :: ahlg + class(psb_d_base_sparse_mat), pointer :: agmold +#endif + + integer(psb_ipk_) :: info, my_rank, np + integer(psb_ipk_) :: desc_me, desc_np + integer(psb_ipk_) :: idim, itmax, itrace, istop, iter + integer(psb_ipk_) :: scheme_idx, prec_idx, rep, nrep, nwarm + integer(psb_ipk_), parameter :: n_schemes=5, n_precs=2 + integer(psb_ipk_), allocatable :: iter_count(:,:,:), solve_info(:,:,:) + integer(psb_ipk_) :: scheme_type(n_schemes) + real(psb_dpk_) :: eps, err, t_start, t_elapsed + real(psb_dpk_), allocatable :: prec_init_time(:,:,:), prec_bld_time(:,:,:) + real(psb_dpk_), allocatable :: comm_set_time(:,:,:), krylov_time(:,:,:) + real(psb_dpk_), allocatable :: setup_time(:,:,:), solve_time(:,:,:) + real(psb_dpk_), allocatable :: total_time(:,:,:), final_error(:,:,:) + real(psb_dpk_), allocatable :: krylov_it_time(:,:,:), total_it_time(:,:,:) + real(psb_dpk_) :: iter_denom + real(psb_dpk_) :: avg_t, std_t, med_t, p10_t, p90_t, min_t, max_t + character(len=25) :: scheme_name(n_schemes) + character(len=12) :: prec_type(n_precs) + character(len=20) :: prec_name(n_precs) + character(len=5) :: afmt + character(len=256) :: arg + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + character(len=16) :: gpu_arg + logical :: setup_done + logical :: use_gpu + logical :: use_external_matrix + + info = psb_success_ + afmt = 'CSR' + idim = 40 + itmax = 1000 + nrep = 5 + nwarm = 1 + ! Disable per-iteration tracing; avoids modulo-by-zero paths in some logging branches. + itrace = -1 + istop = 2 + eps = 1.d-6 + matrix_file = '' + matrix_fmt = 'MM' + use_external_matrix = .false. +#ifdef PSB_HAVE_CUDA + use_gpu = .true. +#else + use_gpu = .false. +#endif + scheme_type = (/ psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_ , psb_comm_rma_pull_, psb_comm_rma_push_ /) + scheme_name(1) = 'isend_irecv' + scheme_name(2) = 'ineighbor_alltoallv' + scheme_name(3) = 'persistent_ineighbor_a2av' + scheme_name(4) = 'psb_comm_rma_pull_' + scheme_name(5) = 'psb_comm_rma_push_' + + prec_type(1) = 'NONE' + prec_type(2) = 'DIAG' + prec_name(1) = 'none' + prec_name(2) = 'diag' + + call get_command_argument(1,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) idim + if (info /= 0) then + idim = 40 + info = psb_success_ + end if + end if + call get_command_argument(2,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) nrep + if ((info /= 0).or.(nrep <= 0)) then + nrep = 7 + info = psb_success_ + end if + end if + call get_command_argument(3,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) nwarm + if ((info /= 0).or.(nwarm < 0)) then + nwarm = 1 + info = psb_success_ + end if + end if + call get_command_argument(4,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) itmax + if ((info /= 0).or.(itmax <= 0)) then + itmax = 1000 + info = psb_success_ + end if + end if + + call parse_gpu_arg(use_gpu, info) + if (info /= psb_success_) then + write(psb_err_unit,'("Invalid value for --gpu option. Use --gpu=TRUE or --gpu=FALSE")') + stop 1 + end if + call parse_matrix_arg(matrix_file, matrix_fmt, info) + if (info /= psb_success_) then + write(psb_err_unit,'("Invalid matrix options. Use --matrix= [--fmt=MM|HB]")') + stop 1 + end if + use_external_matrix = (len_trim(matrix_file) > 0) + ! call psb_set_debug_level(psb_debug_ext_) + + + ! call probe_ieee('before psb_init') + call psb_init(ctxt) +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_init(ctxt) +#endif + ! call probe_ieee('after psb_init') + call clear_ieee_flags() + ! call probe_ieee('after clear_ieee_flags') + call psb_info(ctxt, my_rank, np) + +#ifndef PSB_HAVE_CUDA + if (use_gpu .and. my_rank == psb_root_) then + write(psb_out_unit,'("Warning: --gpu=TRUE requested but this executable was built without CUDA support. Running on CPU.")') + end if + use_gpu = .false. +#endif + + allocate(setup_time(n_precs,n_schemes,nrep), solve_time(n_precs,n_schemes,nrep), & + & total_time(n_precs,n_schemes,nrep), final_error(n_precs,n_schemes,nrep), & + & krylov_it_time(n_precs,n_schemes,nrep), total_it_time(n_precs,n_schemes,nrep), & + & iter_count(n_precs,n_schemes,nrep), solve_info(n_precs,n_schemes,nrep), & + & prec_init_time(n_precs,n_schemes,nrep), prec_bld_time(n_precs,n_schemes,nrep), & + & comm_set_time(n_precs,n_schemes,nrep), krylov_time(n_precs,n_schemes,nrep), stat=info) + if (info /= psb_success_) stop 1 + + if (my_rank == psb_root_) then + write(psb_out_unit,*) 'Welcome to PSBLAS version: ', psb_version_string_ + write(psb_out_unit,*) 'This is the comm/cg test program' + if (use_external_matrix) then + write(psb_out_unit,'("Input matrix : ",a)') trim(matrix_file) + write(psb_out_unit,'("Input format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'("Grid dimensions : ",i4," x ",i4," x ",i4)') idim,idim,idim + end if + write(psb_out_unit,'("Number of processors : ",i0)') np + write(psb_out_unit,'("Iterative method : CG")') + write(psb_out_unit,'("Preconditioners : NONE, DIAG")') + write(psb_out_unit,'("Max iterations (CG) : ",i0)') itmax + write(psb_out_unit,'("Repetitions : ",i0)') nrep + write(psb_out_unit,'("Warmup solves : ",i0)') nwarm + write(psb_out_unit,'("GPU enabled : ",l1)') use_gpu + write(psb_out_unit,'(" ")') + write(psb_out_unit,'("Usage: ./psb_comm_cg_test [idim] [nrep] [nwarm] [itmax] ",& + &"[--gpu=TRUE|FALSE] [--matrix=] [--fmt=MM|HB]")') + write(psb_out_unit,'(" ")') + end if + + call psb_barrier(ctxt) + if (use_external_matrix) then + call load_external_matrix(ctxt, matrix_file, matrix_fmt, a, b, x, desc_a, afmt, info) + else + ! call probe_ieee('before psb_d_gen_pde3d') + call psb_d_gen_pde3d(ctxt,idim,a,b,x,desc_a,afmt,info) + ! call probe_ieee('after psb_d_gen_pde3d') + end if + if (info /= psb_success_) goto 9999 + +#ifdef PSB_HAVE_CUDA + if (use_gpu) then + agmold => ahlg + call a%cscnv(info,mold=agmold) + if (info /= psb_success_) goto 9999 + call desc_a%cnv(mold=imold) + if (info /= psb_success_) goto 9999 + call x%cnv(mold=vmold) + if (info /= psb_success_) goto 9999 + call b%cnv(mold=vmold) + if (info /= psb_success_) goto 9999 + end if +#endif + + do prec_idx = 1, n_precs + do scheme_idx = 1, n_schemes + do rep = 1, nrep + t_start = psb_wtime() + ! Set default scheme on the descriptor: all vectors that lazy-init during + ! this solve (including internal CG vectors r, p, q, z) will use this scheme. + call desc_a%set_comm_scheme(scheme_type(scheme_idx), info) + if (info /= psb_success_) goto 9999 + ! Free x comm_handle so it also re-initializes from desc_a%comm_type + ! (it may already be allocated from a previous rep). + if (allocated(x%v%comm_handle)) call psb_comm_free(x%v%comm_handle, info) + if (info /= psb_success_) goto 9999 + comm_set_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + + call psb_geaxpby(dzero,b,dzero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + + t_start = psb_wtime() + call prec%init(ctxt,trim(prec_type(prec_idx)),info) + if (info /= psb_success_) goto 9999 + + prec_init_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,prec_init_time(prec_idx,scheme_idx,rep)) + + t_start = psb_wtime() + call prec%build(a,desc_a,info) + if (info /= psb_success_) goto 9999 + prec_bld_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,prec_bld_time(prec_idx,scheme_idx,rep)) + + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object not allocated after build' + goto 9999 + end if + + + call psb_amx(ctxt,comm_set_time(prec_idx,scheme_idx,rep)) + + if (info /= psb_success_) goto 9999 + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object lost after psb_comm_set' + goto 9999 + end if + + setup_time(prec_idx,scheme_idx,rep) = prec_init_time(prec_idx,scheme_idx,rep) + & + & prec_bld_time(prec_idx,scheme_idx,rep) + comm_set_time(prec_idx,scheme_idx,rep) + + call psb_geaxpby(dzero,b,dzero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + t_start = psb_wtime() + call psb_krylov('CG',a,prec,b,x,eps,desc_a,info,& + & itmax=itmax,iter=iter,err=err,itrace=itrace,istop=istop) + krylov_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,krylov_time(prec_idx,scheme_idx,rep)) + + if (info /= psb_success_) goto 9999 + + ! Verify x used the descriptor scheme (lazy init should have fired during CG). + if (allocated(x%v%comm_handle)) then + if (x%v%comm_handle%comm_type /= scheme_type(scheme_idx)) then + if (my_rank == psb_root_) & + write(psb_err_unit,'("SCHEME MISMATCH rank=",i0," expected=",i0," got=",i0)') & + my_rank, scheme_type(scheme_idx), x%v%comm_handle%comm_type + info = psb_err_internal_error_ + goto 9999 + else + if (my_rank == psb_root_ .and. rep == 1) & + write(psb_out_unit,'(" [OK] x comm_handle matches scheme: ",a)') & + trim(scheme_name(scheme_idx)) + end if + end if + + call psb_geaxpby(dzero,b,dzero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object lost before psb_krylov' + goto 9999 + end if + + call prec%free(info) + if (info /= psb_success_) goto 9999 + + solve_time(prec_idx,scheme_idx,rep) = krylov_time(prec_idx,scheme_idx,rep) + total_time(prec_idx,scheme_idx,rep) = setup_time(prec_idx,scheme_idx,rep) + & + & solve_time(prec_idx,scheme_idx,rep) + iter_count(prec_idx,scheme_idx,rep) = iter + iter_denom = real(max(iter,1_psb_ipk_),psb_dpk_) + krylov_it_time(prec_idx,scheme_idx,rep) = solve_time(prec_idx,scheme_idx,rep)/iter_denom + total_it_time(prec_idx,scheme_idx,rep) = total_time(prec_idx,scheme_idx,rep)/iter_denom + final_error(prec_idx,scheme_idx,rep) = err + solve_info(prec_idx,scheme_idx,rep) = info + + if (info /= psb_success_) goto 9999 + end do + end do + end do + + if (my_rank == psb_root_) then + write(psb_out_unit,'(" ")') + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'("CG TIMING STATISTICS - FINAL RESULTS TABLE")') + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'("Legend:")') + write(psb_out_unit,'(" - Each phase time for one repetition is reduced with max across MPI ranks.")') + write(psb_out_unit,'(" - Minimum/Average/Maximum/Std Dev are computed across repetitions.")') + write(psb_out_unit,'(" - KrylovPerIter = KrylovSolve/iterations; TotalPerIter = TotalTime/iterations.")') + + do prec_idx = 1, n_precs + write(psb_out_unit,'(" ")') + write(psb_out_unit,'("Preconditioner: ",a)') trim(prec_name(prec_idx)) + write(psb_out_unit,'(100("-"))') + + ! Print header + write(psb_out_unit,'(a25,a18,a18,a18,a18,a18)') & + & 'Scheme', 'Phase', 'Minimum [s]', 'Average [s]', 'Maximum [s]', 'Std Dev [s]' + write(psb_out_unit,'(100("-"))') + + do scheme_idx = 1, n_schemes + ! Preconditioner init phase + call compute_stats(prec_init_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & trim(scheme_name(scheme_idx)), 'Prec Init', min_t, avg_t, max_t, std_t + + ! Preconditioner build phase + call compute_stats(prec_bld_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Prec Build', min_t, avg_t, max_t, std_t + + ! Communication setup phase + call compute_stats(comm_set_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Comm Setup', min_t, avg_t, max_t, std_t + + ! Total setup phase + call compute_stats(setup_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'SetupTotal', min_t, avg_t, max_t, std_t + + ! Krylov solve phase (this is the actual solver) + call compute_stats(krylov_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'KrylovSolve', min_t, avg_t, max_t, std_t + + ! Krylov solve normalized per actual CG iteration + call compute_stats(krylov_it_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'KrylovPerIter', min_t, avg_t, max_t, std_t + + ! Total phase statistics + call compute_stats(total_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'TotalTime', min_t, avg_t, max_t, std_t + + ! Total (setup+solve) normalized per actual CG iteration + call compute_stats(total_it_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'TotalPerIter', min_t, avg_t, max_t, std_t + + ! Final error and convergence info + call compute_stats(final_error(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Final Error', min_t, avg_t, max_t, std_t + write(psb_out_unit,'(a25,a18,"Iterations: ",i8," Info code: ",i6)') & + & ' ', ' ', iter_count(prec_idx,scheme_idx,nrep), solve_info(prec_idx,scheme_idx,nrep) + + write(psb_out_unit,'(100("-"))') + end do + end do + + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'(" ")') + end if + + call psb_gefree(b,desc_a,info) + call psb_gefree(x,desc_a,info) + call psb_spfree(a,desc_a,info) + call psb_precfree(prec,info) + call psb_cdfree(desc_a,info) + deallocate(setup_time,solve_time,total_time,final_error,iter_count,solve_info, & + & prec_init_time,prec_bld_time,comm_set_time,krylov_time, & + & krylov_it_time,total_it_time) + + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_exit() +#endif + call psb_exit(ctxt) + stop + +9999 call psb_error(ctxt) + stop 1 + +contains + + subroutine sort_real_inplace(v) + real(psb_dpk_), intent(inout) :: v(:) + integer(psb_ipk_) :: i, j + real(psb_dpk_) :: key + + do i = 2, size(v) + key = v(i) + j = i - 1 + do while (j >= 1) + if (v(j) <= key) exit + v(j+1) = v(j) + j = j - 1 + end do + v(j+1) = key + end do + end subroutine sort_real_inplace + + subroutine compute_stats(vals,mean_v,std_v,median_v,p10_v,p90_v,min_v,max_v) + real(psb_dpk_), intent(in) :: vals(:) + real(psb_dpk_), intent(out) :: mean_v,std_v,median_v,p10_v,p90_v,min_v,max_v + real(psb_dpk_), allocatable :: tmp(:) + integer(psb_ipk_) :: n, idx10, idx90 + + n = size(vals) + if (n <= 0) then + mean_v = dzero; std_v = dzero; median_v = dzero + p10_v = dzero; p90_v = dzero; min_v = dzero; max_v = dzero + return + end if + + mean_v = sum(vals)/real(n,psb_dpk_) + if (n > 1) then + std_v = sqrt(sum((vals-mean_v)**2)/real(n-1,psb_dpk_)) + else + std_v = dzero + end if + + allocate(tmp(n)) + tmp = vals + call sort_real_inplace(tmp) + + if (mod(n,2) == 0) then + median_v = (tmp(n/2)+tmp(n/2+1))/2.0_psb_dpk_ + else + median_v = tmp((n+1)/2) + end if + + idx10 = int(ceiling(0.10_psb_dpk_*real(n,psb_dpk_)),kind=psb_ipk_) + idx90 = int(ceiling(0.90_psb_dpk_*real(n,psb_dpk_)),kind=psb_ipk_) + idx10 = max(1_psb_ipk_,min(n,idx10)) + idx90 = max(1_psb_ipk_,min(n,idx90)) + p10_v = tmp(idx10) + p90_v = tmp(idx90) + min_v = tmp(1) + max_v = tmp(n) + + deallocate(tmp) + end subroutine compute_stats + + function b1(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + end function b1 + + function b2(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + end function b2 + + function b3(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + end function b3 + + function cfun(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + end function cfun + + function a1(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = done/80 + end function a1 + + function a2(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = done/80 + end function a2 + + function a3(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = done/80 + end function a3 + + function gfun(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + if (x == done) then + val = done + else if (x == dzero) then + val = exp(y**2-z**2) + end if + end function gfun + + subroutine probe_ieee(where) + character(len=*), intent(in) :: where + logical :: invalid_flag, divzero_flag, overflow_flag, underflow_flag + + call ieee_get_flag(ieee_invalid, invalid_flag) + call ieee_get_flag(ieee_divide_by_zero, divzero_flag) + call ieee_get_flag(ieee_overflow, overflow_flag) + call ieee_get_flag(ieee_underflow, underflow_flag) + + if (invalid_flag .or. divzero_flag .or. overflow_flag .or. underflow_flag) then + write(psb_out_unit,'("IEEE probe [",a,"] invalid=",l1,", div0=",l1,", overflow=",l1,", underflow=",l1)') & + trim(where), invalid_flag, divzero_flag, overflow_flag, underflow_flag + end if + end subroutine probe_ieee + + subroutine clear_ieee_flags() + call ieee_set_flag(ieee_invalid, .false.) + call ieee_set_flag(ieee_divide_by_zero, .false.) + call ieee_set_flag(ieee_overflow, .false.) + call ieee_set_flag(ieee_underflow, .false.) + end subroutine clear_ieee_flags + + subroutine parse_gpu_arg(use_gpu, info) + logical, intent(inout) :: use_gpu + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: i, argc + character(len=256) :: carg, uarg, val + + info = psb_success_ + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i,carg) + uarg = psb_toupper(trim(carg)) + if (index(uarg,'--GPU=') == 1) then + val = psb_toupper(adjustl(carg(7:len_trim(carg)))) + select case (trim(val)) + case ('TRUE','T','1','YES','Y','ON') + use_gpu = .true. + case ('FALSE','F','0','NO','N','OFF') + use_gpu = .false. + case default + info = psb_err_internal_error_ + return + end select + end if + end do + end subroutine parse_gpu_arg + + subroutine parse_matrix_arg(matrix_file, matrix_fmt, info) + character(len=*), intent(inout) :: matrix_file + character(len=*), intent(inout) :: matrix_fmt + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: i, argc + character(len=256) :: carg, uarg, val + + info = psb_success_ + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i,carg) + uarg = psb_toupper(trim(carg)) + + if (index(uarg,'--MATRIX=') == 1) then + matrix_file = adjustl(carg(10:len_trim(carg))) + else if (trim(uarg) == '--MATRIX') then + if (i < argc) then + call get_command_argument(i+1,matrix_file) + else + info = psb_err_internal_error_ + return + end if + else if (index(uarg,'--FMT=') == 1) then + val = psb_toupper(adjustl(carg(7:len_trim(carg)))) + if ((trim(val) == 'MM') .or. (trim(val) == 'HB')) then + matrix_fmt = trim(val) + else + info = psb_err_internal_error_ + return + end if + else if (trim(uarg) == '--FMT') then + if (i < argc) then + call get_command_argument(i+1,val) + val = psb_toupper(trim(val)) + if ((trim(val) == 'MM') .or. (trim(val) == 'HB')) then + matrix_fmt = trim(val) + else + info = psb_err_internal_error_ + return + end if + else + info = psb_err_internal_error_ + return + end if + end if + end do + end subroutine parse_matrix_arg + + subroutine load_external_matrix(ctxt, matrix_file, matrix_fmt, a, bv, xv, desc_a, afmt, info) + type(psb_ctxt_type), intent(in) :: ctxt + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + type(psb_dspmat_type), intent(out) :: a + type(psb_d_vect_type), intent(out) :: bv, xv + type(psb_desc_type), intent(out) :: desc_a + character(len=*), intent(in) :: afmt + integer(psb_ipk_), intent(out) :: info + + type(psb_ldspmat_type) :: aux_a + real(psb_dpk_), allocatable :: rhs_glob(:), x_glob(:) + integer(psb_lpk_) :: nrows, ncols + + info = psb_success_ + + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + return + end select + if (info /= psb_success_) return + + nrows = aux_a%get_nrows() + ncols = aux_a%get_ncols() + if (nrows /= ncols) then + write(psb_err_unit,'("Input matrix must be square for CG: ",a)') trim(matrix_file) + info = psb_err_internal_error_ + return + end if + + call psb_matdist(aux_a, a, ctxt, desc_a, info, fmt=afmt, parts=part_block) + if (info /= psb_success_) return + + call psb_geall(xv,desc_a,info) + if (info /= psb_success_) return + call psb_geall(bv,desc_a,info) + if (info /= psb_success_) return + + allocate(rhs_glob(nrows), x_glob(ncols), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + return + end if + rhs_glob = done + x_glob = dzero + + call psb_scatter(rhs_glob,bv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + call psb_scatter(x_glob,xv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + + deallocate(rhs_glob, x_glob) + end subroutine load_external_matrix + + subroutine psb_d_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info) + implicit none + integer(psb_ipk_), intent(in) :: idim + type(psb_dspmat_type), intent(out) :: a + type(psb_d_vect_type), intent(out) :: xv,bv + type(psb_desc_type), intent(out) :: desc_a + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(out) :: info + character(len=*), intent(in) :: afmt + + integer(psb_ipk_), parameter :: nb=20 + real(psb_dpk_) :: zt(nb),x,y,z + integer(psb_lpk_) :: m,n,glob_row + integer(psb_ipk_) :: nnz,nlr,i,ii,ib,k + integer(psb_ipk_) :: ix,iy,iz + integer(psb_ipk_) :: np, my_rank, nr, nt + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + real(psb_dpk_), allocatable :: val(:) + real(psb_dpk_) :: deltah, sqdeltah, deltah2 + real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err, tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, my_rank, np) + + if (idim <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='idim must be > 0') + goto 9999 + end if + if (np <= 0) then + info = psb_err_context_error_ + call psb_errpush(info,name,a_err='invalid context: np <= 0') + goto 9999 + end if + if (my_rank < 0) then + info = psb_err_context_error_ + call psb_errpush(info,name,a_err='invalid context: my_rank < 0') + goto 9999 + end if + + deltah = done/(idim+2) + sqdeltah = deltah*deltah + deltah2 = 2.d0*deltah + + if (abs(deltah) <= tiny(deltah)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: deltah ~ 0') + goto 9999 + end if + if (abs(sqdeltah) <= tiny(sqdeltah)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: sqdeltah ~ 0') + goto 9999 + end if + if (abs(deltah2) <= tiny(deltah2)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: deltah2 ~ 0') + goto 9999 + end if + + m = idim*idim*idim + n = m + if (n <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid global size: n <= 0') + goto 9999 + end if + nnz = ((n*9)/(np)) + if (nnz <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid local nnz estimate: nnz <= 0') + goto 9999 + end if + if(my_rank == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + + nt = (m+np-1)/np + nr = max(0,min(nt,m-(my_rank*nt))) + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) my_rank, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + call psb_barrier(ctxt) + t0 = psb_wtime() + ! call probe_ieee('enter psb_cdall') + call psb_cdall(ctxt,desc_a,info,nl=nr) + ! call probe_ieee('after psb_cdall') + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz) + ! call probe_ieee('after psb_spall') + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + allocate(val(20*nb),irow(20*nb),icol(20*nb),stat=info) + if (info /= psb_success_) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + glob_row=myidx(i) + + if (mod(glob_row,(idim*idim)) == 0) then + ix = glob_row/(idim*idim) + else + ix = glob_row/(idim*idim)+1 + endif + if (mod((glob_row-(ix-1)*idim*idim),idim) == 0) then + iy = (glob_row-(ix-1)*idim*idim)/idim + else + iy = (glob_row-(ix-1)*idim*idim)/idim+1 + endif + iz = glob_row-(ix-1)*idim*idim-(iy-1)*idim + + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = dzero + + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = gfun(dzero,y,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-2)*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = gfun(x,dzero,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-2)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = gfun(x,y,dzero)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz-1) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff)=2.d0*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah + cfun(x,y,z) + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + + val(icoeff) = -a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = gfun(x,y,done)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz+1) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = gfun(x,done,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+iy*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix == idim) then + zt(k) = gfun(done,y,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = ix*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + end do + + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + ! call probe_ieee('after psb_spins') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_spins, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + ! call probe_ieee('after psb_geins bv') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_geins bv, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + zt(:)=dzero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + ! call probe_ieee('after psb_geins xv') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_geins xv, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + ! call probe_ieee('before psb_cdasb') + call psb_cdasb(desc_a,info) + ! call probe_ieee('after psb_cdasb') + tcdasb = psb_wtime()-t1 + + call psb_barrier(ctxt) + t1 = psb_wtime() + ! call probe_ieee('before psb_spasb') + if (info == psb_success_) call psb_spasb(a,desc_a,info,afmt=afmt) + ! call probe_ieee('after psb_spasb') + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) call psb_geasb(xv,desc_a,info) + if (info == psb_success_) call psb_geasb(bv,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(my_rank == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")') tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psb_d_gen_pde3d + +end program psb_comm_cg_test diff --git a/test/comm/cg/psb_d_comm_cg_test.F90 b/test/comm/cg/psb_d_comm_cg_test.F90 new file mode 100644 index 000000000..0da9575de --- /dev/null +++ b/test/comm/cg/psb_d_comm_cg_test.F90 @@ -0,0 +1,974 @@ +program psb_d_comm_cg_test + use psb_base_mod + use psb_util_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + use psb_prec_mod + use psb_linsolve_mod + use psb_comm_factory_mod + use psb_comm_schemes_mod, only: psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_, psb_comm_rma_pull_, psb_comm_rma_push_ + use, intrinsic :: ieee_arithmetic + + implicit none + + type(psb_ctxt_type) :: ctxt + type(psb_ctxt_type) :: desc_ctxt + type(psb_dspmat_type) :: a + type(psb_desc_type) :: desc_a + type(psb_d_vect_type) :: b, x + type(psb_dprec_type) :: prec +#ifdef PSB_HAVE_CUDA + type(psb_d_vect_cuda) :: vmold + type(psb_i_vect_cuda) :: imold + type(psb_d_cuda_hlg_sparse_mat), target :: ahlg + class(psb_d_base_sparse_mat), pointer :: agmold +#endif + + integer(psb_ipk_) :: info, my_rank, np + integer(psb_ipk_) :: desc_me, desc_np + integer(psb_ipk_) :: idim, itmax, itrace, istop, iter + integer(psb_ipk_) :: scheme_idx, prec_idx, rep, nrep, nwarm + integer(psb_ipk_), parameter :: n_schemes=5, n_precs=2 + integer(psb_ipk_), allocatable :: iter_count(:,:,:), solve_info(:,:,:) + integer(psb_ipk_) :: scheme_type(n_schemes) + real(psb_dpk_) :: eps, err, t_start, t_elapsed + real(psb_dpk_), allocatable :: prec_init_time(:,:,:), prec_bld_time(:,:,:) + real(psb_dpk_), allocatable :: comm_set_time(:,:,:), krylov_time(:,:,:) + real(psb_dpk_), allocatable :: setup_time(:,:,:), solve_time(:,:,:) + real(psb_dpk_), allocatable :: total_time(:,:,:), final_error(:,:,:) + real(psb_dpk_), allocatable :: krylov_it_time(:,:,:), total_it_time(:,:,:) + real(psb_dpk_) :: iter_denom + real(psb_dpk_) :: avg_t, std_t, med_t, p10_t, p90_t, min_t, max_t + character(len=25) :: scheme_name(n_schemes) + character(len=12) :: prec_type(n_precs) + character(len=20) :: prec_name(n_precs) + character(len=5) :: afmt + character(len=256) :: arg + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + character(len=16) :: gpu_arg + logical :: setup_done + logical :: use_gpu + logical :: use_external_matrix + + info = psb_success_ + afmt = 'CSR' + idim = 40 + itmax = 1000 + nrep = 5 + nwarm = 1 + ! Disable per-iteration tracing; avoids modulo-by-zero paths in some logging branches. + itrace = -1 + istop = 2 + eps = 1.0e-6_psb_dpk_ + matrix_file = '' + matrix_fmt = 'MM' + use_external_matrix = .false. +#ifdef PSB_HAVE_CUDA + use_gpu = .true. +#else + use_gpu = .false. +#endif + scheme_type = (/ psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_ , psb_comm_rma_pull_, psb_comm_rma_push_ /) + scheme_name(1) = 'isend_irecv' + scheme_name(2) = 'ineighbor_alltoallv' + scheme_name(3) = 'persistent_ineighbor_a2av' + scheme_name(4) = 'psb_comm_rma_pull_' + scheme_name(5) = 'psb_comm_rma_push_' + + prec_type(1) = 'NONE' + prec_type(2) = 'DIAG' + prec_name(1) = 'none' + prec_name(2) = 'diag' + + call get_command_argument(1,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) idim + if (info /= 0) then + idim = 40 + info = psb_success_ + end if + end if + call get_command_argument(2,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) nrep + if ((info /= 0).or.(nrep <= 0)) then + nrep = 7 + info = psb_success_ + end if + end if + call get_command_argument(3,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) nwarm + if ((info /= 0).or.(nwarm < 0)) then + nwarm = 1 + info = psb_success_ + end if + end if + call get_command_argument(4,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) itmax + if ((info /= 0).or.(itmax <= 0)) then + itmax = 1000 + info = psb_success_ + end if + end if + + call parse_gpu_arg(use_gpu, info) + if (info /= psb_success_) then + write(psb_err_unit,'("Invalid value for --gpu option. Use --gpu=TRUE or --gpu=FALSE")') + stop 1 + end if + call parse_matrix_arg(matrix_file, matrix_fmt, info) + if (info /= psb_success_) then + write(psb_err_unit,'("Invalid matrix options. Use --matrix= [--fmt=MM|HB]")') + stop 1 + end if + use_external_matrix = (len_trim(matrix_file) > 0) + ! call psb_set_debug_level(psb_debug_ext_) + + + ! call probe_ieee('before psb_init') + call psb_init(ctxt) +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_init(ctxt) +#endif + ! call probe_ieee('after psb_init') + call clear_ieee_flags() + ! call probe_ieee('after clear_ieee_flags') + call psb_info(ctxt, my_rank, np) + +#ifndef PSB_HAVE_CUDA + if (use_gpu .and. my_rank == psb_root_) then + write(psb_out_unit,'("Warning: --gpu=TRUE requested but this executable was built without CUDA support. Running on CPU.")') + end if + use_gpu = .false. +#endif + + allocate(setup_time(n_precs,n_schemes,nrep), solve_time(n_precs,n_schemes,nrep), & + & total_time(n_precs,n_schemes,nrep), final_error(n_precs,n_schemes,nrep), & + & krylov_it_time(n_precs,n_schemes,nrep), total_it_time(n_precs,n_schemes,nrep), & + & iter_count(n_precs,n_schemes,nrep), solve_info(n_precs,n_schemes,nrep), & + & prec_init_time(n_precs,n_schemes,nrep), prec_bld_time(n_precs,n_schemes,nrep), & + & comm_set_time(n_precs,n_schemes,nrep), krylov_time(n_precs,n_schemes,nrep), stat=info) + if (info /= psb_success_) stop 1 + + if (my_rank == psb_root_) then + write(psb_out_unit,*) 'Welcome to PSBLAS version: ', psb_version_string_ + write(psb_out_unit,*) 'This is the comm/cg test program' + if (use_external_matrix) then + write(psb_out_unit,'("Input matrix : ",a)') trim(matrix_file) + write(psb_out_unit,'("Input format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'("Grid dimensions : ",i4," x ",i4," x ",i4)') idim,idim,idim + end if + write(psb_out_unit,'("Number of processors : ",i0)') np + write(psb_out_unit,'("Iterative method : CG")') + write(psb_out_unit,'("Preconditioners : NONE, DIAG")') + write(psb_out_unit,'("Max iterations (CG) : ",i0)') itmax + write(psb_out_unit,'("Repetitions : ",i0)') nrep + write(psb_out_unit,'("Warmup solves : ",i0)') nwarm + write(psb_out_unit,'("GPU enabled : ",l1)') use_gpu + write(psb_out_unit,'(" ")') + write(psb_out_unit,'("Usage: ./psb_d_comm_cg_test [idim] [nrep] [nwarm] [itmax] ",& + &"[--gpu=TRUE|FALSE] [--matrix=] [--fmt=MM|HB]")') + write(psb_out_unit,'(" ")') + end if + + call psb_barrier(ctxt) + if (use_external_matrix) then + call load_external_matrix(ctxt, matrix_file, matrix_fmt, a, b, x, desc_a, afmt, info) + else + ! call probe_ieee('before psb_d_gen_pde3d') + call psb_d_gen_pde3d(ctxt,idim,a,b,x,desc_a,afmt,info) + ! call probe_ieee('after psb_d_gen_pde3d') + end if + if (info /= psb_success_) goto 9999 + +#ifdef PSB_HAVE_CUDA + if (use_gpu) then + agmold => ahlg + call a%cscnv(info,mold=agmold) + if (info /= psb_success_) goto 9999 + call desc_a%cnv(mold=imold) + if (info /= psb_success_) goto 9999 + call x%cnv(mold=vmold) + if (info /= psb_success_) goto 9999 + call b%cnv(mold=vmold) + if (info /= psb_success_) goto 9999 + end if +#endif + + do prec_idx = 1, n_precs + do scheme_idx = 1, n_schemes + do rep = 1, nrep + t_start = psb_wtime() + ! Set default scheme on the descriptor: all vectors that lazy-init during + ! this solve (including internal CG vectors r, p, q, z) will use this scheme. + call desc_a%set_comm_scheme(scheme_type(scheme_idx), info) + if (info /= psb_success_) goto 9999 + ! Free x comm_handle so it also re-initializes from desc_a%comm_type + ! (it may already be allocated from a previous rep). + if (allocated(x%v%comm_handle)) call psb_comm_free(x%v%comm_handle, info) + if (info /= psb_success_) goto 9999 + comm_set_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + + call psb_geaxpby(dzero,b,dzero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + + t_start = psb_wtime() + call prec%init(ctxt,trim(prec_type(prec_idx)),info) + if (info /= psb_success_) goto 9999 + + prec_init_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,prec_init_time(prec_idx,scheme_idx,rep)) + + t_start = psb_wtime() + call prec%build(a,desc_a,info) + if (info /= psb_success_) goto 9999 + prec_bld_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,prec_bld_time(prec_idx,scheme_idx,rep)) + + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object not allocated after build' + goto 9999 + end if + + + call psb_amx(ctxt,comm_set_time(prec_idx,scheme_idx,rep)) + + if (info /= psb_success_) goto 9999 + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object lost after psb_comm_set' + goto 9999 + end if + + setup_time(prec_idx,scheme_idx,rep) = prec_init_time(prec_idx,scheme_idx,rep) + & + & prec_bld_time(prec_idx,scheme_idx,rep) + comm_set_time(prec_idx,scheme_idx,rep) + + call psb_geaxpby(dzero,b,dzero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + t_start = psb_wtime() + call psb_krylov('CG',a,prec,b,x,eps,desc_a,info,& + & itmax=itmax,iter=iter,err=err,itrace=itrace,istop=istop) + krylov_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,krylov_time(prec_idx,scheme_idx,rep)) + + if (info /= psb_success_) goto 9999 + + ! Verify x used the descriptor scheme (lazy init should have fired during CG). + if (allocated(x%v%comm_handle)) then + if (x%v%comm_handle%comm_type /= scheme_type(scheme_idx)) then + if (my_rank == psb_root_) & + write(psb_err_unit,'("SCHEME MISMATCH rank=",i0," expected=",i0," got=",i0)') & + my_rank, scheme_type(scheme_idx), x%v%comm_handle%comm_type + info = psb_err_internal_error_ + goto 9999 + else + if (my_rank == psb_root_ .and. rep == 1) & + write(psb_out_unit,'(" [OK] x comm_handle matches scheme: ",a)') & + trim(scheme_name(scheme_idx)) + end if + end if + + call psb_geaxpby(dzero,b,dzero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object lost before psb_krylov' + goto 9999 + end if + + call prec%free(info) + if (info /= psb_success_) goto 9999 + + solve_time(prec_idx,scheme_idx,rep) = krylov_time(prec_idx,scheme_idx,rep) + total_time(prec_idx,scheme_idx,rep) = setup_time(prec_idx,scheme_idx,rep) + & + & solve_time(prec_idx,scheme_idx,rep) + iter_count(prec_idx,scheme_idx,rep) = iter + iter_denom = real(max(iter,1_psb_ipk_),psb_dpk_) + krylov_it_time(prec_idx,scheme_idx,rep) = solve_time(prec_idx,scheme_idx,rep)/iter_denom + total_it_time(prec_idx,scheme_idx,rep) = total_time(prec_idx,scheme_idx,rep)/iter_denom + final_error(prec_idx,scheme_idx,rep) = err + solve_info(prec_idx,scheme_idx,rep) = info + + if (info /= psb_success_) goto 9999 + end do + end do + end do + + if (my_rank == psb_root_) then + write(psb_out_unit,'(" ")') + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'("CG TIMING STATISTICS - FINAL RESULTS TABLE")') + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'("Legend:")') + write(psb_out_unit,'(" - Each phase time for one repetition is reduced with max across MPI ranks.")') + write(psb_out_unit,'(" - Minimum/Average/Maximum/Std Dev are computed across repetitions.")') + write(psb_out_unit,'(" - KrylovPerIter = KrylovSolve/iterations; TotalPerIter = TotalTime/iterations.")') + + do prec_idx = 1, n_precs + write(psb_out_unit,'(" ")') + write(psb_out_unit,'("Preconditioner: ",a)') trim(prec_name(prec_idx)) + write(psb_out_unit,'(100("-"))') + + ! Print header + write(psb_out_unit,'(a25,a18,a18,a18,a18,a18)') & + & 'Scheme', 'Phase', 'Minimum [s]', 'Average [s]', 'Maximum [s]', 'Std Dev [s]' + write(psb_out_unit,'(100("-"))') + + do scheme_idx = 1, n_schemes + ! Preconditioner init phase + call compute_stats(prec_init_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & trim(scheme_name(scheme_idx)), 'Prec Init', min_t, avg_t, max_t, std_t + + ! Preconditioner build phase + call compute_stats(prec_bld_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Prec Build', min_t, avg_t, max_t, std_t + + ! Communication setup phase + call compute_stats(comm_set_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Comm Setup', min_t, avg_t, max_t, std_t + + ! Total setup phase + call compute_stats(setup_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'SetupTotal', min_t, avg_t, max_t, std_t + + ! Krylov solve phase (this is the actual solver) + call compute_stats(krylov_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'KrylovSolve', min_t, avg_t, max_t, std_t + + ! Krylov solve normalized per actual CG iteration + call compute_stats(krylov_it_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'KrylovPerIter', min_t, avg_t, max_t, std_t + + ! Total phase statistics + call compute_stats(total_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'TotalTime', min_t, avg_t, max_t, std_t + + ! Total (setup+solve) normalized per actual CG iteration + call compute_stats(total_it_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'TotalPerIter', min_t, avg_t, max_t, std_t + + ! Final error and convergence info + call compute_stats(final_error(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Final Error', min_t, avg_t, max_t, std_t + write(psb_out_unit,'(a25,a18,"Iterations: ",i8," Info code: ",i6)') & + & ' ', ' ', iter_count(prec_idx,scheme_idx,nrep), solve_info(prec_idx,scheme_idx,nrep) + + write(psb_out_unit,'(100("-"))') + end do + end do + + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'(" ")') + end if + + call psb_gefree(b,desc_a,info) + call psb_gefree(x,desc_a,info) + call psb_spfree(a,desc_a,info) + call psb_precfree(prec,info) + call psb_cdfree(desc_a,info) + deallocate(setup_time,solve_time,total_time,final_error,iter_count,solve_info, & + & prec_init_time,prec_bld_time,comm_set_time,krylov_time, & + & krylov_it_time,total_it_time) + + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_exit() +#endif + call psb_exit(ctxt) + stop + +9999 call psb_error(ctxt) + stop 1 + +contains + + subroutine sort_real_inplace(v) + real(psb_dpk_), intent(inout) :: v(:) + integer(psb_ipk_) :: i, j + real(psb_dpk_) :: key + + do i = 2, size(v) + key = v(i) + j = i - 1 + do while (j >= 1) + if (v(j) <= key) exit + v(j+1) = v(j) + j = j - 1 + end do + v(j+1) = key + end do + end subroutine sort_real_inplace + + subroutine compute_stats(vals,mean_v,std_v,median_v,p10_v,p90_v,min_v,max_v) + real(psb_dpk_), intent(in) :: vals(:) + real(psb_dpk_), intent(out) :: mean_v,std_v,median_v,p10_v,p90_v,min_v,max_v + real(psb_dpk_), allocatable :: tmp(:) + integer(psb_ipk_) :: n, idx10, idx90 + + n = size(vals) + if (n <= 0) then + mean_v = dzero; std_v = dzero; median_v = dzero + p10_v = dzero; p90_v = dzero; min_v = dzero; max_v = dzero + return + end if + + mean_v = sum(vals)/real(n,psb_dpk_) + if (n > 1) then + std_v = sqrt(sum((vals-mean_v)**2)/real(n-1,psb_dpk_)) + else + std_v = dzero + end if + + allocate(tmp(n)) + tmp = vals + call sort_real_inplace(tmp) + + if (mod(n,2) == 0) then + median_v = (tmp(n/2)+tmp(n/2+1))/2.0_psb_dpk_ + else + median_v = tmp((n+1)/2) + end if + + idx10 = int(ceiling(0.10_psb_dpk_*real(n,psb_dpk_)),kind=psb_ipk_) + idx90 = int(ceiling(0.90_psb_dpk_*real(n,psb_dpk_)),kind=psb_ipk_) + idx10 = max(1_psb_ipk_,min(n,idx10)) + idx90 = max(1_psb_ipk_,min(n,idx90)) + p10_v = tmp(idx10) + p90_v = tmp(idx90) + min_v = tmp(1) + max_v = tmp(n) + + deallocate(tmp) + end subroutine compute_stats + + function b1(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + end function b1 + + function b2(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + end function b2 + + function b3(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + end function b3 + + function cfun(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + end function cfun + + function a1(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = done/80 + end function a1 + + function a2(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = done/80 + end function a2 + + function a3(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = done/80 + end function a3 + + function gfun(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + if (x == done) then + val = done + else if (x == dzero) then + val = exp(y**2-z**2) + end if + end function gfun + + subroutine probe_ieee(where) + character(len=*), intent(in) :: where + logical :: invalid_flag, divzero_flag, overflow_flag, underflow_flag + + call ieee_get_flag(ieee_invalid, invalid_flag) + call ieee_get_flag(ieee_divide_by_zero, divzero_flag) + call ieee_get_flag(ieee_overflow, overflow_flag) + call ieee_get_flag(ieee_underflow, underflow_flag) + + if (invalid_flag .or. divzero_flag .or. overflow_flag .or. underflow_flag) then + write(psb_out_unit,'("IEEE probe [",a,"] invalid=",l1,", div0=",l1,", overflow=",l1,", underflow=",l1)') & + trim(where), invalid_flag, divzero_flag, overflow_flag, underflow_flag + end if + end subroutine probe_ieee + + subroutine clear_ieee_flags() + call ieee_set_flag(ieee_invalid, .false.) + call ieee_set_flag(ieee_divide_by_zero, .false.) + call ieee_set_flag(ieee_overflow, .false.) + call ieee_set_flag(ieee_underflow, .false.) + end subroutine clear_ieee_flags + + subroutine parse_gpu_arg(use_gpu, info) + logical, intent(inout) :: use_gpu + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: i, argc + character(len=256) :: carg, uarg, val + + info = psb_success_ + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i,carg) + uarg = psb_toupper(trim(carg)) + if (index(uarg,'--GPU=') == 1) then + val = psb_toupper(adjustl(carg(7:len_trim(carg)))) + select case (trim(val)) + case ('TRUE','T','1','YES','Y','ON') + use_gpu = .true. + case ('FALSE','F','0','NO','N','OFF') + use_gpu = .false. + case default + info = psb_err_internal_error_ + return + end select + end if + end do + end subroutine parse_gpu_arg + + subroutine parse_matrix_arg(matrix_file, matrix_fmt, info) + character(len=*), intent(inout) :: matrix_file + character(len=*), intent(inout) :: matrix_fmt + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: i, argc + character(len=256) :: carg, uarg, val + + info = psb_success_ + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i,carg) + uarg = psb_toupper(trim(carg)) + + if (index(uarg,'--MATRIX=') == 1) then + matrix_file = adjustl(carg(10:len_trim(carg))) + else if (trim(uarg) == '--MATRIX') then + if (i < argc) then + call get_command_argument(i+1,matrix_file) + else + info = psb_err_internal_error_ + return + end if + else if (index(uarg,'--FMT=') == 1) then + val = psb_toupper(adjustl(carg(7:len_trim(carg)))) + if ((trim(val) == 'MM') .or. (trim(val) == 'HB')) then + matrix_fmt = trim(val) + else + info = psb_err_internal_error_ + return + end if + else if (trim(uarg) == '--FMT') then + if (i < argc) then + call get_command_argument(i+1,val) + val = psb_toupper(trim(val)) + if ((trim(val) == 'MM') .or. (trim(val) == 'HB')) then + matrix_fmt = trim(val) + else + info = psb_err_internal_error_ + return + end if + else + info = psb_err_internal_error_ + return + end if + end if + end do + end subroutine parse_matrix_arg + + subroutine load_external_matrix(ctxt, matrix_file, matrix_fmt, a, bv, xv, desc_a, afmt, info) + type(psb_ctxt_type), intent(in) :: ctxt + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + type(psb_dspmat_type), intent(out) :: a + type(psb_d_vect_type), intent(out) :: bv, xv + type(psb_desc_type), intent(out) :: desc_a + character(len=*), intent(in) :: afmt + integer(psb_ipk_), intent(out) :: info + + type(psb_ldspmat_type) :: aux_a + real(psb_dpk_), allocatable :: rhs_glob(:), x_glob(:) + integer(psb_lpk_) :: nrows, ncols + + info = psb_success_ + + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + return + end select + if (info /= psb_success_) return + + nrows = aux_a%get_nrows() + ncols = aux_a%get_ncols() + if (nrows /= ncols) then + write(psb_err_unit,'("Input matrix must be square for CG: ",a)') trim(matrix_file) + info = psb_err_internal_error_ + return + end if + + call psb_matdist(aux_a, a, ctxt, desc_a, info, fmt=afmt, parts=part_block) + if (info /= psb_success_) return + + call psb_geall(xv,desc_a,info) + if (info /= psb_success_) return + call psb_geall(bv,desc_a,info) + if (info /= psb_success_) return + + allocate(rhs_glob(nrows), x_glob(ncols), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + return + end if + rhs_glob = done + x_glob = dzero + + call psb_scatter(rhs_glob,bv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + call psb_scatter(x_glob,xv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + + deallocate(rhs_glob, x_glob) + end subroutine load_external_matrix + + subroutine psb_d_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info) + implicit none + integer(psb_ipk_), intent(in) :: idim + type(psb_dspmat_type), intent(out) :: a + type(psb_d_vect_type), intent(out) :: xv,bv + type(psb_desc_type), intent(out) :: desc_a + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(out) :: info + character(len=*), intent(in) :: afmt + + integer(psb_ipk_), parameter :: nb=20 + real(psb_dpk_) :: zt(nb) + real(psb_dpk_) :: x,y,z + integer(psb_lpk_) :: m,n,glob_row + integer(psb_ipk_) :: nnz,nlr,i,ii,ib,k + integer(psb_ipk_) :: ix,iy,iz + integer(psb_ipk_) :: np, my_rank, nr, nt + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + real(psb_dpk_), allocatable :: val(:) + real(psb_dpk_) :: deltah, sqdeltah, deltah2 + real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err, tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, my_rank, np) + + if (idim <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='idim must be > 0') + goto 9999 + end if + if (np <= 0) then + info = psb_err_context_error_ + call psb_errpush(info,name,a_err='invalid context: np <= 0') + goto 9999 + end if + if (my_rank < 0) then + info = psb_err_context_error_ + call psb_errpush(info,name,a_err='invalid context: my_rank < 0') + goto 9999 + end if + + deltah = done/(idim+2) + sqdeltah = deltah*deltah + deltah2 = 2.0e0_psb_dpk_*deltah + + if (abs(deltah) <= tiny(deltah)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: deltah ~ 0') + goto 9999 + end if + if (abs(sqdeltah) <= tiny(sqdeltah)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: sqdeltah ~ 0') + goto 9999 + end if + if (abs(deltah2) <= tiny(deltah2)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: deltah2 ~ 0') + goto 9999 + end if + + m = idim*idim*idim + n = m + if (n <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid global size: n <= 0') + goto 9999 + end if + nnz = ((n*9)/(np)) + if (nnz <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid local nnz estimate: nnz <= 0') + goto 9999 + end if + if(my_rank == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + + nt = (m+np-1)/np + nr = max(0,min(nt,m-(my_rank*nt))) + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) my_rank, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + call psb_barrier(ctxt) + t0 = psb_wtime() + ! call probe_ieee('enter psb_cdall') + call psb_cdall(ctxt,desc_a,info,nl=nr) + ! call probe_ieee('after psb_cdall') + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz) + ! call probe_ieee('after psb_spall') + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + allocate(val(20*nb),irow(20*nb),icol(20*nb),stat=info) + if (info /= psb_success_) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + glob_row=myidx(i) + + if (mod(glob_row,(idim*idim)) == 0) then + ix = glob_row/(idim*idim) + else + ix = glob_row/(idim*idim)+1 + endif + if (mod((glob_row-(ix-1)*idim*idim),idim) == 0) then + iy = (glob_row-(ix-1)*idim*idim)/idim + else + iy = (glob_row-(ix-1)*idim*idim)/idim+1 + endif + iz = glob_row-(ix-1)*idim*idim-(iy-1)*idim + + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = dzero + + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = gfun(dzero,y,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-2)*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = gfun(x,dzero,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-2)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = gfun(x,y,dzero)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz-1) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff)=2.0e0_psb_dpk_*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah + cfun(x,y,z) + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + + val(icoeff) = -a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = gfun(x,y,done)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz+1) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = gfun(x,done,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+iy*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix == idim) then + zt(k) = gfun(done,y,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = ix*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + end do + + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + ! call probe_ieee('after psb_spins') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_spins, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + ! call probe_ieee('after psb_geins bv') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_geins bv, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + zt(:)=dzero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + ! call probe_ieee('after psb_geins xv') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_geins xv, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + ! call probe_ieee('before psb_cdasb') + call psb_cdasb(desc_a,info) + ! call probe_ieee('after psb_cdasb') + tcdasb = psb_wtime()-t1 + + call psb_barrier(ctxt) + t1 = psb_wtime() + ! call probe_ieee('before psb_spasb') + if (info == psb_success_) call psb_spasb(a,desc_a,info,afmt=afmt) + ! call probe_ieee('after psb_spasb') + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) call psb_geasb(xv,desc_a,info) + if (info == psb_success_) call psb_geasb(bv,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(my_rank == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")') tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psb_d_gen_pde3d + +end program psb_d_comm_cg_test diff --git a/test/comm/cg/psb_s_comm_cg_test.F90 b/test/comm/cg/psb_s_comm_cg_test.F90 new file mode 100644 index 000000000..4728bda4b --- /dev/null +++ b/test/comm/cg/psb_s_comm_cg_test.F90 @@ -0,0 +1,974 @@ +program psb_s_comm_cg_test + use psb_base_mod + use psb_util_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + use psb_prec_mod + use psb_linsolve_mod + use psb_comm_factory_mod + use psb_comm_schemes_mod, only: psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_, psb_comm_rma_pull_, psb_comm_rma_push_ + use, intrinsic :: ieee_arithmetic + + implicit none + + type(psb_ctxt_type) :: ctxt + type(psb_ctxt_type) :: desc_ctxt + type(psb_sspmat_type) :: a + type(psb_desc_type) :: desc_a + type(psb_s_vect_type) :: b, x + type(psb_sprec_type) :: prec +#ifdef PSB_HAVE_CUDA + type(psb_s_vect_cuda) :: vmold + type(psb_i_vect_cuda) :: imold + type(psb_s_cuda_hlg_sparse_mat), target :: ahlg + class(psb_s_base_sparse_mat), pointer :: agmold +#endif + + integer(psb_ipk_) :: info, my_rank, np + integer(psb_ipk_) :: desc_me, desc_np + integer(psb_ipk_) :: idim, itmax, itrace, istop, iter + integer(psb_ipk_) :: scheme_idx, prec_idx, rep, nrep, nwarm + integer(psb_ipk_), parameter :: n_schemes=5, n_precs=2 + integer(psb_ipk_), allocatable :: iter_count(:,:,:), solve_info(:,:,:) + integer(psb_ipk_) :: scheme_type(n_schemes) + real(psb_spk_) :: eps, err, t_start, t_elapsed + real(psb_spk_), allocatable :: prec_init_time(:,:,:), prec_bld_time(:,:,:) + real(psb_spk_), allocatable :: comm_set_time(:,:,:), krylov_time(:,:,:) + real(psb_spk_), allocatable :: setup_time(:,:,:), solve_time(:,:,:) + real(psb_spk_), allocatable :: total_time(:,:,:), final_error(:,:,:) + real(psb_spk_), allocatable :: krylov_it_time(:,:,:), total_it_time(:,:,:) + real(psb_spk_) :: iter_denom + real(psb_spk_) :: avg_t, std_t, med_t, p10_t, p90_t, min_t, max_t + character(len=25) :: scheme_name(n_schemes) + character(len=12) :: prec_type(n_precs) + character(len=20) :: prec_name(n_precs) + character(len=5) :: afmt + character(len=256) :: arg + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + character(len=16) :: gpu_arg + logical :: setup_done + logical :: use_gpu + logical :: use_external_matrix + + info = psb_success_ + afmt = 'CSR' + idim = 40 + itmax = 1000 + nrep = 5 + nwarm = 1 + ! Disable per-iteration tracing; avoids modulo-by-zero paths in some logging branches. + itrace = -1 + istop = 2 + eps = 1.0e-6_psb_spk_ + matrix_file = '' + matrix_fmt = 'MM' + use_external_matrix = .false. +#ifdef PSB_HAVE_CUDA + use_gpu = .true. +#else + use_gpu = .false. +#endif + scheme_type = (/ psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_ , psb_comm_rma_pull_, psb_comm_rma_push_ /) + scheme_name(1) = 'isend_irecv' + scheme_name(2) = 'ineighbor_alltoallv' + scheme_name(3) = 'persistent_ineighbor_a2av' + scheme_name(4) = 'psb_comm_rma_pull_' + scheme_name(5) = 'psb_comm_rma_push_' + + prec_type(1) = 'NONE' + prec_type(2) = 'DIAG' + prec_name(1) = 'none' + prec_name(2) = 'diag' + + call get_command_argument(1,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) idim + if (info /= 0) then + idim = 40 + info = psb_success_ + end if + end if + call get_command_argument(2,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) nrep + if ((info /= 0).or.(nrep <= 0)) then + nrep = 7 + info = psb_success_ + end if + end if + call get_command_argument(3,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) nwarm + if ((info /= 0).or.(nwarm < 0)) then + nwarm = 1 + info = psb_success_ + end if + end if + call get_command_argument(4,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) itmax + if ((info /= 0).or.(itmax <= 0)) then + itmax = 1000 + info = psb_success_ + end if + end if + + call parse_gpu_arg(use_gpu, info) + if (info /= psb_success_) then + write(psb_err_unit,'("Invalid value for --gpu option. Use --gpu=TRUE or --gpu=FALSE")') + stop 1 + end if + call parse_matrix_arg(matrix_file, matrix_fmt, info) + if (info /= psb_success_) then + write(psb_err_unit,'("Invalid matrix options. Use --matrix= [--fmt=MM|HB]")') + stop 1 + end if + use_external_matrix = (len_trim(matrix_file) > 0) + ! call psb_set_debug_level(psb_debug_ext_) + + + ! call probe_ieee('before psb_init') + call psb_init(ctxt) +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_init(ctxt) +#endif + ! call probe_ieee('after psb_init') + call clear_ieee_flags() + ! call probe_ieee('after clear_ieee_flags') + call psb_info(ctxt, my_rank, np) + +#ifndef PSB_HAVE_CUDA + if (use_gpu .and. my_rank == psb_root_) then + write(psb_out_unit,'("Warning: --gpu=TRUE requested but this executable was built without CUDA support. Running on CPU.")') + end if + use_gpu = .false. +#endif + + allocate(setup_time(n_precs,n_schemes,nrep), solve_time(n_precs,n_schemes,nrep), & + & total_time(n_precs,n_schemes,nrep), final_error(n_precs,n_schemes,nrep), & + & krylov_it_time(n_precs,n_schemes,nrep), total_it_time(n_precs,n_schemes,nrep), & + & iter_count(n_precs,n_schemes,nrep), solve_info(n_precs,n_schemes,nrep), & + & prec_init_time(n_precs,n_schemes,nrep), prec_bld_time(n_precs,n_schemes,nrep), & + & comm_set_time(n_precs,n_schemes,nrep), krylov_time(n_precs,n_schemes,nrep), stat=info) + if (info /= psb_success_) stop 1 + + if (my_rank == psb_root_) then + write(psb_out_unit,*) 'Welcome to PSBLAS version: ', psb_version_string_ + write(psb_out_unit,*) 'This is the comm/cg test program' + if (use_external_matrix) then + write(psb_out_unit,'("Input matrix : ",a)') trim(matrix_file) + write(psb_out_unit,'("Input format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'("Grid dimensions : ",i4," x ",i4," x ",i4)') idim,idim,idim + end if + write(psb_out_unit,'("Number of processors : ",i0)') np + write(psb_out_unit,'("Iterative method : CG")') + write(psb_out_unit,'("Preconditioners : NONE, DIAG")') + write(psb_out_unit,'("Max iterations (CG) : ",i0)') itmax + write(psb_out_unit,'("Repetitions : ",i0)') nrep + write(psb_out_unit,'("Warmup solves : ",i0)') nwarm + write(psb_out_unit,'("GPU enabled : ",l1)') use_gpu + write(psb_out_unit,'(" ")') + write(psb_out_unit,'("Usage: ./psb_s_comm_cg_test [idim] [nrep] [nwarm] [itmax] ",& + &"[--gpu=TRUE|FALSE] [--matrix=] [--fmt=MM|HB]")') + write(psb_out_unit,'(" ")') + end if + + call psb_barrier(ctxt) + if (use_external_matrix) then + call load_external_matrix(ctxt, matrix_file, matrix_fmt, a, b, x, desc_a, afmt, info) + else + ! call probe_ieee('before psb_s_gen_pde3d') + call psb_s_gen_pde3d(ctxt,idim,a,b,x,desc_a,afmt,info) + ! call probe_ieee('after psb_s_gen_pde3d') + end if + if (info /= psb_success_) goto 9999 + +#ifdef PSB_HAVE_CUDA + if (use_gpu) then + agmold => ahlg + call a%cscnv(info,mold=agmold) + if (info /= psb_success_) goto 9999 + call desc_a%cnv(mold=imold) + if (info /= psb_success_) goto 9999 + call x%cnv(mold=vmold) + if (info /= psb_success_) goto 9999 + call b%cnv(mold=vmold) + if (info /= psb_success_) goto 9999 + end if +#endif + + do prec_idx = 1, n_precs + do scheme_idx = 1, n_schemes + do rep = 1, nrep + t_start = psb_wtime() + ! Set default scheme on the descriptor: all vectors that lazy-init during + ! this solve (including internal CG vectors r, p, q, z) will use this scheme. + call desc_a%set_comm_scheme(scheme_type(scheme_idx), info) + if (info /= psb_success_) goto 9999 + ! Free x comm_handle so it also re-initializes from desc_a%comm_type + ! (it may already be allocated from a previous rep). + if (allocated(x%v%comm_handle)) call psb_comm_free(x%v%comm_handle, info) + if (info /= psb_success_) goto 9999 + comm_set_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + + call psb_geaxpby(szero,b,szero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + + t_start = psb_wtime() + call prec%init(ctxt,trim(prec_type(prec_idx)),info) + if (info /= psb_success_) goto 9999 + + prec_init_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,prec_init_time(prec_idx,scheme_idx,rep)) + + t_start = psb_wtime() + call prec%build(a,desc_a,info) + if (info /= psb_success_) goto 9999 + prec_bld_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,prec_bld_time(prec_idx,scheme_idx,rep)) + + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object not allocated after build' + goto 9999 + end if + + + call psb_amx(ctxt,comm_set_time(prec_idx,scheme_idx,rep)) + + if (info /= psb_success_) goto 9999 + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object lost after psb_comm_set' + goto 9999 + end if + + setup_time(prec_idx,scheme_idx,rep) = prec_init_time(prec_idx,scheme_idx,rep) + & + & prec_bld_time(prec_idx,scheme_idx,rep) + comm_set_time(prec_idx,scheme_idx,rep) + + call psb_geaxpby(szero,b,szero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + t_start = psb_wtime() + call psb_krylov('CG',a,prec,b,x,eps,desc_a,info,& + & itmax=itmax,iter=iter,err=err,itrace=itrace,istop=istop) + krylov_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,krylov_time(prec_idx,scheme_idx,rep)) + + if (info /= psb_success_) goto 9999 + + ! Verify x used the descriptor scheme (lazy init should have fired during CG). + if (allocated(x%v%comm_handle)) then + if (x%v%comm_handle%comm_type /= scheme_type(scheme_idx)) then + if (my_rank == psb_root_) & + write(psb_err_unit,'("SCHEME MISMATCH rank=",i0," expected=",i0," got=",i0)') & + my_rank, scheme_type(scheme_idx), x%v%comm_handle%comm_type + info = psb_err_internal_error_ + goto 9999 + else + if (my_rank == psb_root_ .and. rep == 1) & + write(psb_out_unit,'(" [OK] x comm_handle matches scheme: ",a)') & + trim(scheme_name(scheme_idx)) + end if + end if + + call psb_geaxpby(szero,b,szero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object lost before psb_krylov' + goto 9999 + end if + + call prec%free(info) + if (info /= psb_success_) goto 9999 + + solve_time(prec_idx,scheme_idx,rep) = krylov_time(prec_idx,scheme_idx,rep) + total_time(prec_idx,scheme_idx,rep) = setup_time(prec_idx,scheme_idx,rep) + & + & solve_time(prec_idx,scheme_idx,rep) + iter_count(prec_idx,scheme_idx,rep) = iter + iter_denom = real(max(iter,1_psb_ipk_),psb_spk_) + krylov_it_time(prec_idx,scheme_idx,rep) = solve_time(prec_idx,scheme_idx,rep)/iter_denom + total_it_time(prec_idx,scheme_idx,rep) = total_time(prec_idx,scheme_idx,rep)/iter_denom + final_error(prec_idx,scheme_idx,rep) = err + solve_info(prec_idx,scheme_idx,rep) = info + + if (info /= psb_success_) goto 9999 + end do + end do + end do + + if (my_rank == psb_root_) then + write(psb_out_unit,'(" ")') + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'("CG TIMING STATISTICS - FINAL RESULTS TABLE")') + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'("Legend:")') + write(psb_out_unit,'(" - Each phase time for one repetition is reduced with max across MPI ranks.")') + write(psb_out_unit,'(" - Minimum/Average/Maximum/Std Dev are computed across repetitions.")') + write(psb_out_unit,'(" - KrylovPerIter = KrylovSolve/iterations; TotalPerIter = TotalTime/iterations.")') + + do prec_idx = 1, n_precs + write(psb_out_unit,'(" ")') + write(psb_out_unit,'("Preconditioner: ",a)') trim(prec_name(prec_idx)) + write(psb_out_unit,'(100("-"))') + + ! Print header + write(psb_out_unit,'(a25,a18,a18,a18,a18,a18)') & + & 'Scheme', 'Phase', 'Minimum [s]', 'Average [s]', 'Maximum [s]', 'Std Dev [s]' + write(psb_out_unit,'(100("-"))') + + do scheme_idx = 1, n_schemes + ! Preconditioner init phase + call compute_stats(prec_init_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & trim(scheme_name(scheme_idx)), 'Prec Init', min_t, avg_t, max_t, std_t + + ! Preconditioner build phase + call compute_stats(prec_bld_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Prec Build', min_t, avg_t, max_t, std_t + + ! Communication setup phase + call compute_stats(comm_set_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Comm Setup', min_t, avg_t, max_t, std_t + + ! Total setup phase + call compute_stats(setup_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'SetupTotal', min_t, avg_t, max_t, std_t + + ! Krylov solve phase (this is the actual solver) + call compute_stats(krylov_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'KrylovSolve', min_t, avg_t, max_t, std_t + + ! Krylov solve normalized per actual CG iteration + call compute_stats(krylov_it_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'KrylovPerIter', min_t, avg_t, max_t, std_t + + ! Total phase statistics + call compute_stats(total_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'TotalTime', min_t, avg_t, max_t, std_t + + ! Total (setup+solve) normalized per actual CG iteration + call compute_stats(total_it_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'TotalPerIter', min_t, avg_t, max_t, std_t + + ! Final error and convergence info + call compute_stats(final_error(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Final Error', min_t, avg_t, max_t, std_t + write(psb_out_unit,'(a25,a18,"Iterations: ",i8," Info code: ",i6)') & + & ' ', ' ', iter_count(prec_idx,scheme_idx,nrep), solve_info(prec_idx,scheme_idx,nrep) + + write(psb_out_unit,'(100("-"))') + end do + end do + + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'(" ")') + end if + + call psb_gefree(b,desc_a,info) + call psb_gefree(x,desc_a,info) + call psb_spfree(a,desc_a,info) + call psb_precfree(prec,info) + call psb_cdfree(desc_a,info) + deallocate(setup_time,solve_time,total_time,final_error,iter_count,solve_info, & + & prec_init_time,prec_bld_time,comm_set_time,krylov_time, & + & krylov_it_time,total_it_time) + + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_exit() +#endif + call psb_exit(ctxt) + stop + +9999 call psb_error(ctxt) + stop 1 + +contains + + subroutine sort_real_inplace(v) + real(psb_spk_), intent(inout) :: v(:) + integer(psb_ipk_) :: i, j + real(psb_spk_) :: key + + do i = 2, size(v) + key = v(i) + j = i - 1 + do while (j >= 1) + if (v(j) <= key) exit + v(j+1) = v(j) + j = j - 1 + end do + v(j+1) = key + end do + end subroutine sort_real_inplace + + subroutine compute_stats(vals,mean_v,std_v,median_v,p10_v,p90_v,min_v,max_v) + real(psb_spk_), intent(in) :: vals(:) + real(psb_spk_), intent(out) :: mean_v,std_v,median_v,p10_v,p90_v,min_v,max_v + real(psb_spk_), allocatable :: tmp(:) + integer(psb_ipk_) :: n, idx10, idx90 + + n = size(vals) + if (n <= 0) then + mean_v = szero; std_v = szero; median_v = szero + p10_v = szero; p90_v = szero; min_v = szero; max_v = szero + return + end if + + mean_v = sum(vals)/real(n,psb_spk_) + if (n > 1) then + std_v = sqrt(sum((vals-mean_v)**2)/real(n-1,psb_spk_)) + else + std_v = szero + end if + + allocate(tmp(n)) + tmp = vals + call sort_real_inplace(tmp) + + if (mod(n,2) == 0) then + median_v = (tmp(n/2)+tmp(n/2+1))/2.0_psb_spk_ + else + median_v = tmp((n+1)/2) + end if + + idx10 = int(ceiling(0.10_psb_spk_*real(n,psb_spk_)),kind=psb_ipk_) + idx90 = int(ceiling(0.90_psb_spk_*real(n,psb_spk_)),kind=psb_ipk_) + idx10 = max(1_psb_ipk_,min(n,idx10)) + idx90 = max(1_psb_ipk_,min(n,idx90)) + p10_v = tmp(idx10) + p90_v = tmp(idx90) + min_v = tmp(1) + max_v = tmp(n) + + deallocate(tmp) + end subroutine compute_stats + + function b1(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = szero + end function b1 + + function b2(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = szero + end function b2 + + function b3(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = szero + end function b3 + + function cfun(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = szero + end function cfun + + function a1(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = sone/80 + end function a1 + + function a2(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = sone/80 + end function a2 + + function a3(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = sone/80 + end function a3 + + function gfun(x,y,z) result(val) + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + val = szero + if (x == sone) then + val = sone + else if (x == szero) then + val = exp(y**2-z**2) + end if + end function gfun + + subroutine probe_ieee(where) + character(len=*), intent(in) :: where + logical :: invalid_flag, divzero_flag, overflow_flag, underflow_flag + + call ieee_get_flag(ieee_invalid, invalid_flag) + call ieee_get_flag(ieee_divide_by_zero, divzero_flag) + call ieee_get_flag(ieee_overflow, overflow_flag) + call ieee_get_flag(ieee_underflow, underflow_flag) + + if (invalid_flag .or. divzero_flag .or. overflow_flag .or. underflow_flag) then + write(psb_out_unit,'("IEEE probe [",a,"] invalid=",l1,", div0=",l1,", overflow=",l1,", underflow=",l1)') & + trim(where), invalid_flag, divzero_flag, overflow_flag, underflow_flag + end if + end subroutine probe_ieee + + subroutine clear_ieee_flags() + call ieee_set_flag(ieee_invalid, .false.) + call ieee_set_flag(ieee_divide_by_zero, .false.) + call ieee_set_flag(ieee_overflow, .false.) + call ieee_set_flag(ieee_underflow, .false.) + end subroutine clear_ieee_flags + + subroutine parse_gpu_arg(use_gpu, info) + logical, intent(inout) :: use_gpu + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: i, argc + character(len=256) :: carg, uarg, val + + info = psb_success_ + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i,carg) + uarg = psb_toupper(trim(carg)) + if (index(uarg,'--GPU=') == 1) then + val = psb_toupper(adjustl(carg(7:len_trim(carg)))) + select case (trim(val)) + case ('TRUE','T','1','YES','Y','ON') + use_gpu = .true. + case ('FALSE','F','0','NO','N','OFF') + use_gpu = .false. + case default + info = psb_err_internal_error_ + return + end select + end if + end do + end subroutine parse_gpu_arg + + subroutine parse_matrix_arg(matrix_file, matrix_fmt, info) + character(len=*), intent(inout) :: matrix_file + character(len=*), intent(inout) :: matrix_fmt + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: i, argc + character(len=256) :: carg, uarg, val + + info = psb_success_ + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i,carg) + uarg = psb_toupper(trim(carg)) + + if (index(uarg,'--MATRIX=') == 1) then + matrix_file = adjustl(carg(10:len_trim(carg))) + else if (trim(uarg) == '--MATRIX') then + if (i < argc) then + call get_command_argument(i+1,matrix_file) + else + info = psb_err_internal_error_ + return + end if + else if (index(uarg,'--FMT=') == 1) then + val = psb_toupper(adjustl(carg(7:len_trim(carg)))) + if ((trim(val) == 'MM') .or. (trim(val) == 'HB')) then + matrix_fmt = trim(val) + else + info = psb_err_internal_error_ + return + end if + else if (trim(uarg) == '--FMT') then + if (i < argc) then + call get_command_argument(i+1,val) + val = psb_toupper(trim(val)) + if ((trim(val) == 'MM') .or. (trim(val) == 'HB')) then + matrix_fmt = trim(val) + else + info = psb_err_internal_error_ + return + end if + else + info = psb_err_internal_error_ + return + end if + end if + end do + end subroutine parse_matrix_arg + + subroutine load_external_matrix(ctxt, matrix_file, matrix_fmt, a, bv, xv, desc_a, afmt, info) + type(psb_ctxt_type), intent(in) :: ctxt + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + type(psb_sspmat_type), intent(out) :: a + type(psb_s_vect_type), intent(out) :: bv, xv + type(psb_desc_type), intent(out) :: desc_a + character(len=*), intent(in) :: afmt + integer(psb_ipk_), intent(out) :: info + + type(psb_lsspmat_type) :: aux_a + real(psb_spk_), allocatable :: rhs_glob(:), x_glob(:) + integer(psb_lpk_) :: nrows, ncols + + info = psb_success_ + + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + return + end select + if (info /= psb_success_) return + + nrows = aux_a%get_nrows() + ncols = aux_a%get_ncols() + if (nrows /= ncols) then + write(psb_err_unit,'("Input matrix must be square for CG: ",a)') trim(matrix_file) + info = psb_err_internal_error_ + return + end if + + call psb_matdist(aux_a, a, ctxt, desc_a, info, fmt=afmt, parts=part_block) + if (info /= psb_success_) return + + call psb_geall(xv,desc_a,info) + if (info /= psb_success_) return + call psb_geall(bv,desc_a,info) + if (info /= psb_success_) return + + allocate(rhs_glob(nrows), x_glob(ncols), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + return + end if + rhs_glob = sone + x_glob = szero + + call psb_scatter(rhs_glob,bv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + call psb_scatter(x_glob,xv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + + deallocate(rhs_glob, x_glob) + end subroutine load_external_matrix + + subroutine psb_s_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info) + implicit none + integer(psb_ipk_), intent(in) :: idim + type(psb_sspmat_type), intent(out) :: a + type(psb_s_vect_type), intent(out) :: xv,bv + type(psb_desc_type), intent(out) :: desc_a + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(out) :: info + character(len=*), intent(in) :: afmt + + integer(psb_ipk_), parameter :: nb=20 + real(psb_spk_) :: zt(nb) + real(psb_spk_) :: x,y,z + integer(psb_lpk_) :: m,n,glob_row + integer(psb_ipk_) :: nnz,nlr,i,ii,ib,k + integer(psb_ipk_) :: ix,iy,iz + integer(psb_ipk_) :: np, my_rank, nr, nt + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + real(psb_spk_), allocatable :: val(:) + real(psb_spk_) :: deltah, sqdeltah, deltah2 + real(psb_spk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err, tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, my_rank, np) + + if (idim <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='idim must be > 0') + goto 9999 + end if + if (np <= 0) then + info = psb_err_context_error_ + call psb_errpush(info,name,a_err='invalid context: np <= 0') + goto 9999 + end if + if (my_rank < 0) then + info = psb_err_context_error_ + call psb_errpush(info,name,a_err='invalid context: my_rank < 0') + goto 9999 + end if + + deltah = sone/(idim+2) + sqdeltah = deltah*deltah + deltah2 = 2.0e0_psb_spk_*deltah + + if (abs(deltah) <= tiny(deltah)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: deltah ~ 0') + goto 9999 + end if + if (abs(sqdeltah) <= tiny(sqdeltah)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: sqdeltah ~ 0') + goto 9999 + end if + if (abs(deltah2) <= tiny(deltah2)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: deltah2 ~ 0') + goto 9999 + end if + + m = idim*idim*idim + n = m + if (n <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid global size: n <= 0') + goto 9999 + end if + nnz = ((n*9)/(np)) + if (nnz <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid local nnz estimate: nnz <= 0') + goto 9999 + end if + if(my_rank == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + + nt = (m+np-1)/np + nr = max(0,min(nt,m-(my_rank*nt))) + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) my_rank, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + call psb_barrier(ctxt) + t0 = psb_wtime() + ! call probe_ieee('enter psb_cdall') + call psb_cdall(ctxt,desc_a,info,nl=nr) + ! call probe_ieee('after psb_cdall') + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz) + ! call probe_ieee('after psb_spall') + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + allocate(val(20*nb),irow(20*nb),icol(20*nb),stat=info) + if (info /= psb_success_) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + glob_row=myidx(i) + + if (mod(glob_row,(idim*idim)) == 0) then + ix = glob_row/(idim*idim) + else + ix = glob_row/(idim*idim)+1 + endif + if (mod((glob_row-(ix-1)*idim*idim),idim) == 0) then + iy = (glob_row-(ix-1)*idim*idim)/idim + else + iy = (glob_row-(ix-1)*idim*idim)/idim+1 + endif + iz = glob_row-(ix-1)*idim*idim-(iy-1)*idim + + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = szero + + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = gfun(szero,y,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-2)*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = gfun(x,szero,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-2)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = gfun(x,y,szero)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz-1) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff)=2.0e0_psb_spk_*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah + cfun(x,y,z) + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + + val(icoeff) = -a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = gfun(x,y,sone)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz+1) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = gfun(x,sone,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+iy*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix == idim) then + zt(k) = gfun(sone,y,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = ix*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + end do + + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + ! call probe_ieee('after psb_spins') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_spins, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + ! call probe_ieee('after psb_geins bv') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_geins bv, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + zt(:)=szero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + ! call probe_ieee('after psb_geins xv') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_geins xv, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + ! call probe_ieee('before psb_cdasb') + call psb_cdasb(desc_a,info) + ! call probe_ieee('after psb_cdasb') + tcdasb = psb_wtime()-t1 + + call psb_barrier(ctxt) + t1 = psb_wtime() + ! call probe_ieee('before psb_spasb') + if (info == psb_success_) call psb_spasb(a,desc_a,info,afmt=afmt) + ! call probe_ieee('after psb_spasb') + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) call psb_geasb(xv,desc_a,info) + if (info == psb_success_) call psb_geasb(bv,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(my_rank == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")') tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psb_s_gen_pde3d + +end program psb_s_comm_cg_test diff --git a/test/comm/cg/psb_z_comm_cg_test.F90 b/test/comm/cg/psb_z_comm_cg_test.F90 new file mode 100644 index 000000000..937b515c1 --- /dev/null +++ b/test/comm/cg/psb_z_comm_cg_test.F90 @@ -0,0 +1,974 @@ +program psb_z_comm_cg_test + use psb_base_mod + use psb_util_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + use psb_prec_mod + use psb_linsolve_mod + use psb_comm_factory_mod + use psb_comm_schemes_mod, only: psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_, psb_comm_rma_pull_, psb_comm_rma_push_ + use, intrinsic :: ieee_arithmetic + + implicit none + + type(psb_ctxt_type) :: ctxt + type(psb_ctxt_type) :: desc_ctxt + type(psb_zspmat_type) :: a + type(psb_desc_type) :: desc_a + type(psb_z_vect_type) :: b, x + type(psb_zprec_type) :: prec +#ifdef PSB_HAVE_CUDA + type(psb_z_vect_cuda) :: vmold + type(psb_i_vect_cuda) :: imold + type(psb_z_cuda_hlg_sparse_mat), target :: ahlg + class(psb_z_base_sparse_mat), pointer :: agmold +#endif + + integer(psb_ipk_) :: info, my_rank, np + integer(psb_ipk_) :: desc_me, desc_np + integer(psb_ipk_) :: idim, itmax, itrace, istop, iter + integer(psb_ipk_) :: scheme_idx, prec_idx, rep, nrep, nwarm + integer(psb_ipk_), parameter :: n_schemes=5, n_precs=2 + integer(psb_ipk_), allocatable :: iter_count(:,:,:), solve_info(:,:,:) + integer(psb_ipk_) :: scheme_type(n_schemes) + real(psb_dpk_) :: eps, err, t_start, t_elapsed + real(psb_dpk_), allocatable :: prec_init_time(:,:,:), prec_bld_time(:,:,:) + real(psb_dpk_), allocatable :: comm_set_time(:,:,:), krylov_time(:,:,:) + real(psb_dpk_), allocatable :: setup_time(:,:,:), solve_time(:,:,:) + real(psb_dpk_), allocatable :: total_time(:,:,:), final_error(:,:,:) + real(psb_dpk_), allocatable :: krylov_it_time(:,:,:), total_it_time(:,:,:) + real(psb_dpk_) :: iter_denom + real(psb_dpk_) :: avg_t, std_t, med_t, p10_t, p90_t, min_t, max_t + character(len=25) :: scheme_name(n_schemes) + character(len=12) :: prec_type(n_precs) + character(len=20) :: prec_name(n_precs) + character(len=5) :: afmt + character(len=256) :: arg + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + character(len=16) :: gpu_arg + logical :: setup_done + logical :: use_gpu + logical :: use_external_matrix + + info = psb_success_ + afmt = 'CSR' + idim = 40 + itmax = 1000 + nrep = 5 + nwarm = 1 + ! Disable per-iteration tracing; avoids modulo-by-zero paths in some logging branches. + itrace = -1 + istop = 2 + eps = 1.0e-6_psb_dpk_ + matrix_file = '' + matrix_fmt = 'MM' + use_external_matrix = .false. +#ifdef PSB_HAVE_CUDA + use_gpu = .true. +#else + use_gpu = .false. +#endif + scheme_type = (/ psb_comm_isend_irecv_, psb_comm_ineighbor_alltoallv_, & + & psb_comm_persistent_ineighbor_alltoallv_ , psb_comm_rma_pull_, psb_comm_rma_push_ /) + scheme_name(1) = 'isend_irecv' + scheme_name(2) = 'ineighbor_alltoallv' + scheme_name(3) = 'persistent_ineighbor_a2av' + scheme_name(4) = 'psb_comm_rma_pull_' + scheme_name(5) = 'psb_comm_rma_push_' + + prec_type(1) = 'NONE' + prec_type(2) = 'DIAG' + prec_name(1) = 'none' + prec_name(2) = 'diag' + + call get_command_argument(1,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) idim + if (info /= 0) then + idim = 40 + info = psb_success_ + end if + end if + call get_command_argument(2,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) nrep + if ((info /= 0).or.(nrep <= 0)) then + nrep = 7 + info = psb_success_ + end if + end if + call get_command_argument(3,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) nwarm + if ((info /= 0).or.(nwarm < 0)) then + nwarm = 1 + info = psb_success_ + end if + end if + call get_command_argument(4,arg) + if (len_trim(arg) > 0) then + read(arg,*,iostat=info) itmax + if ((info /= 0).or.(itmax <= 0)) then + itmax = 1000 + info = psb_success_ + end if + end if + + call parse_gpu_arg(use_gpu, info) + if (info /= psb_success_) then + write(psb_err_unit,'("Invalid value for --gpu option. Use --gpu=TRUE or --gpu=FALSE")') + stop 1 + end if + call parse_matrix_arg(matrix_file, matrix_fmt, info) + if (info /= psb_success_) then + write(psb_err_unit,'("Invalid matrix options. Use --matrix= [--fmt=MM|HB]")') + stop 1 + end if + use_external_matrix = (len_trim(matrix_file) > 0) + ! call psb_set_debug_level(psb_debug_ext_) + + + ! call probe_ieee('before psb_init') + call psb_init(ctxt) +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_init(ctxt) +#endif + ! call probe_ieee('after psb_init') + call clear_ieee_flags() + ! call probe_ieee('after clear_ieee_flags') + call psb_info(ctxt, my_rank, np) + +#ifndef PSB_HAVE_CUDA + if (use_gpu .and. my_rank == psb_root_) then + write(psb_out_unit,'("Warning: --gpu=TRUE requested but this executable was built without CUDA support. Running on CPU.")') + end if + use_gpu = .false. +#endif + + allocate(setup_time(n_precs,n_schemes,nrep), solve_time(n_precs,n_schemes,nrep), & + & total_time(n_precs,n_schemes,nrep), final_error(n_precs,n_schemes,nrep), & + & krylov_it_time(n_precs,n_schemes,nrep), total_it_time(n_precs,n_schemes,nrep), & + & iter_count(n_precs,n_schemes,nrep), solve_info(n_precs,n_schemes,nrep), & + & prec_init_time(n_precs,n_schemes,nrep), prec_bld_time(n_precs,n_schemes,nrep), & + & comm_set_time(n_precs,n_schemes,nrep), krylov_time(n_precs,n_schemes,nrep), stat=info) + if (info /= psb_success_) stop 1 + + if (my_rank == psb_root_) then + write(psb_out_unit,*) 'Welcome to PSBLAS version: ', psb_version_string_ + write(psb_out_unit,*) 'This is the comm/cg test program' + if (use_external_matrix) then + write(psb_out_unit,'("Input matrix : ",a)') trim(matrix_file) + write(psb_out_unit,'("Input format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'("Grid dimensions : ",i4," x ",i4," x ",i4)') idim,idim,idim + end if + write(psb_out_unit,'("Number of processors : ",i0)') np + write(psb_out_unit,'("Iterative method : CG")') + write(psb_out_unit,'("Preconditioners : NONE, DIAG")') + write(psb_out_unit,'("Max iterations (CG) : ",i0)') itmax + write(psb_out_unit,'("Repetitions : ",i0)') nrep + write(psb_out_unit,'("Warmup solves : ",i0)') nwarm + write(psb_out_unit,'("GPU enabled : ",l1)') use_gpu + write(psb_out_unit,'(" ")') + write(psb_out_unit,'("Usage: ./psb_z_comm_cg_test [idim] [nrep] [nwarm] [itmax] ",& + &"[--gpu=TRUE|FALSE] [--matrix=] [--fmt=MM|HB]")') + write(psb_out_unit,'(" ")') + end if + + call psb_barrier(ctxt) + if (use_external_matrix) then + call load_external_matrix(ctxt, matrix_file, matrix_fmt, a, b, x, desc_a, afmt, info) + else + ! call probe_ieee('before psb_z_gen_pde3d') + call psb_z_gen_pde3d(ctxt,idim,a,b,x,desc_a,afmt,info) + ! call probe_ieee('after psb_z_gen_pde3d') + end if + if (info /= psb_success_) goto 9999 + +#ifdef PSB_HAVE_CUDA + if (use_gpu) then + agmold => ahlg + call a%cscnv(info,mold=agmold) + if (info /= psb_success_) goto 9999 + call desc_a%cnv(mold=imold) + if (info /= psb_success_) goto 9999 + call x%cnv(mold=vmold) + if (info /= psb_success_) goto 9999 + call b%cnv(mold=vmold) + if (info /= psb_success_) goto 9999 + end if +#endif + + do prec_idx = 1, n_precs + do scheme_idx = 1, n_schemes + do rep = 1, nrep + t_start = psb_wtime() + ! Set default scheme on the descriptor: all vectors that lazy-init during + ! this solve (including internal CG vectors r, p, q, z) will use this scheme. + call desc_a%set_comm_scheme(scheme_type(scheme_idx), info) + if (info /= psb_success_) goto 9999 + ! Free x comm_handle so it also re-initializes from desc_a%comm_type + ! (it may already be allocated from a previous rep). + if (allocated(x%v%comm_handle)) call psb_comm_free(x%v%comm_handle, info) + if (info /= psb_success_) goto 9999 + comm_set_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + + call psb_geaxpby(zzero,b,zzero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + + t_start = psb_wtime() + call prec%init(ctxt,trim(prec_type(prec_idx)),info) + if (info /= psb_success_) goto 9999 + + prec_init_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,prec_init_time(prec_idx,scheme_idx,rep)) + + t_start = psb_wtime() + call prec%build(a,desc_a,info) + if (info /= psb_success_) goto 9999 + prec_bld_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,prec_bld_time(prec_idx,scheme_idx,rep)) + + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object not allocated after build' + goto 9999 + end if + + + call psb_amx(ctxt,comm_set_time(prec_idx,scheme_idx,rep)) + + if (info /= psb_success_) goto 9999 + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object lost after psb_comm_set' + goto 9999 + end if + + setup_time(prec_idx,scheme_idx,rep) = prec_init_time(prec_idx,scheme_idx,rep) + & + & prec_bld_time(prec_idx,scheme_idx,rep) + comm_set_time(prec_idx,scheme_idx,rep) + + call psb_geaxpby(zzero,b,zzero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + t_start = psb_wtime() + call psb_krylov('CG',a,prec,b,x,eps,desc_a,info,& + & itmax=itmax,iter=iter,err=err,itrace=itrace,istop=istop) + krylov_time(prec_idx,scheme_idx,rep) = psb_wtime() - t_start + call psb_amx(ctxt,krylov_time(prec_idx,scheme_idx,rep)) + + if (info /= psb_success_) goto 9999 + + ! Verify x used the descriptor scheme (lazy init should have fired during CG). + if (allocated(x%v%comm_handle)) then + if (x%v%comm_handle%comm_type /= scheme_type(scheme_idx)) then + if (my_rank == psb_root_) & + write(psb_err_unit,'("SCHEME MISMATCH rank=",i0," expected=",i0," got=",i0)') & + my_rank, scheme_type(scheme_idx), x%v%comm_handle%comm_type + info = psb_err_internal_error_ + goto 9999 + else + if (my_rank == psb_root_ .and. rep == 1) & + write(psb_out_unit,'(" [OK] x comm_handle matches scheme: ",a)') & + trim(scheme_name(scheme_idx)) + end if + end if + + call psb_geaxpby(zzero,b,zzero,x,desc_a,info) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + if (.not.allocated(prec%prec)) then + info = psb_err_internal_error_ + write(psb_err_unit,*) 'Preconditioner object lost before psb_krylov' + goto 9999 + end if + + call prec%free(info) + if (info /= psb_success_) goto 9999 + + solve_time(prec_idx,scheme_idx,rep) = krylov_time(prec_idx,scheme_idx,rep) + total_time(prec_idx,scheme_idx,rep) = setup_time(prec_idx,scheme_idx,rep) + & + & solve_time(prec_idx,scheme_idx,rep) + iter_count(prec_idx,scheme_idx,rep) = iter + iter_denom = real(max(iter,1_psb_ipk_),psb_dpk_) + krylov_it_time(prec_idx,scheme_idx,rep) = solve_time(prec_idx,scheme_idx,rep)/iter_denom + total_it_time(prec_idx,scheme_idx,rep) = total_time(prec_idx,scheme_idx,rep)/iter_denom + final_error(prec_idx,scheme_idx,rep) = err + solve_info(prec_idx,scheme_idx,rep) = info + + if (info /= psb_success_) goto 9999 + end do + end do + end do + + if (my_rank == psb_root_) then + write(psb_out_unit,'(" ")') + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'("CG TIMING STATISTICS - FINAL RESULTS TABLE")') + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'("Legend:")') + write(psb_out_unit,'(" - Each phase time for one repetition is reduced with max across MPI ranks.")') + write(psb_out_unit,'(" - Minimum/Average/Maximum/Std Dev are computed across repetitions.")') + write(psb_out_unit,'(" - KrylovPerIter = KrylovSolve/iterations; TotalPerIter = TotalTime/iterations.")') + + do prec_idx = 1, n_precs + write(psb_out_unit,'(" ")') + write(psb_out_unit,'("Preconditioner: ",a)') trim(prec_name(prec_idx)) + write(psb_out_unit,'(100("-"))') + + ! Print header + write(psb_out_unit,'(a25,a18,a18,a18,a18,a18)') & + & 'Scheme', 'Phase', 'Minimum [s]', 'Average [s]', 'Maximum [s]', 'Std Dev [s]' + write(psb_out_unit,'(100("-"))') + + do scheme_idx = 1, n_schemes + ! Preconditioner init phase + call compute_stats(prec_init_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & trim(scheme_name(scheme_idx)), 'Prec Init', min_t, avg_t, max_t, std_t + + ! Preconditioner build phase + call compute_stats(prec_bld_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Prec Build', min_t, avg_t, max_t, std_t + + ! Communication setup phase + call compute_stats(comm_set_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Comm Setup', min_t, avg_t, max_t, std_t + + ! Total setup phase + call compute_stats(setup_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'SetupTotal', min_t, avg_t, max_t, std_t + + ! Krylov solve phase (this is the actual solver) + call compute_stats(krylov_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'KrylovSolve', min_t, avg_t, max_t, std_t + + ! Krylov solve normalized per actual CG iteration + call compute_stats(krylov_it_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'KrylovPerIter', min_t, avg_t, max_t, std_t + + ! Total phase statistics + call compute_stats(total_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'TotalTime', min_t, avg_t, max_t, std_t + + ! Total (setup+solve) normalized per actual CG iteration + call compute_stats(total_it_time(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'TotalPerIter', min_t, avg_t, max_t, std_t + + ! Final error and convergence info + call compute_stats(final_error(prec_idx,scheme_idx,:),avg_t,std_t,med_t,p10_t,p90_t,min_t,max_t) + write(psb_out_unit,'(a25,a18,es18.10,es18.10,es18.10,es18.10)') & + & ' ', 'Final Error', min_t, avg_t, max_t, std_t + write(psb_out_unit,'(a25,a18,"Iterations: ",i8," Info code: ",i6)') & + & ' ', ' ', iter_count(prec_idx,scheme_idx,nrep), solve_info(prec_idx,scheme_idx,nrep) + + write(psb_out_unit,'(100("-"))') + end do + end do + + write(psb_out_unit,'(100("="))') + write(psb_out_unit,'(" ")') + end if + + call psb_gefree(b,desc_a,info) + call psb_gefree(x,desc_a,info) + call psb_spfree(a,desc_a,info) + call psb_precfree(prec,info) + call psb_cdfree(desc_a,info) + deallocate(setup_time,solve_time,total_time,final_error,iter_count,solve_info, & + & prec_init_time,prec_bld_time,comm_set_time,krylov_time, & + & krylov_it_time,total_it_time) + + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_exit() +#endif + call psb_exit(ctxt) + stop + +9999 call psb_error(ctxt) + stop 1 + +contains + + subroutine sort_real_inplace(v) + real(psb_dpk_), intent(inout) :: v(:) + integer(psb_ipk_) :: i, j + real(psb_dpk_) :: key + + do i = 2, size(v) + key = v(i) + j = i - 1 + do while (j >= 1) + if (v(j) <= key) exit + v(j+1) = v(j) + j = j - 1 + end do + v(j+1) = key + end do + end subroutine sort_real_inplace + + subroutine compute_stats(vals,mean_v,std_v,median_v,p10_v,p90_v,min_v,max_v) + real(psb_dpk_), intent(in) :: vals(:) + real(psb_dpk_), intent(out) :: mean_v,std_v,median_v,p10_v,p90_v,min_v,max_v + real(psb_dpk_), allocatable :: tmp(:) + integer(psb_ipk_) :: n, idx10, idx90 + + n = size(vals) + if (n <= 0) then + mean_v = dzero; std_v = dzero; median_v = dzero + p10_v = dzero; p90_v = dzero; min_v = dzero; max_v = dzero + return + end if + + mean_v = sum(vals)/real(n,psb_dpk_) + if (n > 1) then + std_v = sqrt(sum((vals-mean_v)**2)/real(n-1,psb_dpk_)) + else + std_v = dzero + end if + + allocate(tmp(n)) + tmp = vals + call sort_real_inplace(tmp) + + if (mod(n,2) == 0) then + median_v = (tmp(n/2)+tmp(n/2+1))/2.0_psb_dpk_ + else + median_v = tmp((n+1)/2) + end if + + idx10 = int(ceiling(0.10_psb_dpk_*real(n,psb_dpk_)),kind=psb_ipk_) + idx90 = int(ceiling(0.90_psb_dpk_*real(n,psb_dpk_)),kind=psb_ipk_) + idx10 = max(1_psb_ipk_,min(n,idx10)) + idx90 = max(1_psb_ipk_,min(n,idx90)) + p10_v = tmp(idx10) + p90_v = tmp(idx90) + min_v = tmp(1) + max_v = tmp(n) + + deallocate(tmp) + end subroutine compute_stats + + function b1(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + end function b1 + + function b2(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + end function b2 + + function b3(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + end function b3 + + function cfun(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + end function cfun + + function a1(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = done/80 + end function a1 + + function a2(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = done/80 + end function a2 + + function a3(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = done/80 + end function a3 + + function gfun(x,y,z) result(val) + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + val = dzero + if (x == done) then + val = done + else if (x == dzero) then + val = exp(y**2-z**2) + end if + end function gfun + + subroutine probe_ieee(where) + character(len=*), intent(in) :: where + logical :: invalid_flag, divzero_flag, overflow_flag, underflow_flag + + call ieee_get_flag(ieee_invalid, invalid_flag) + call ieee_get_flag(ieee_divide_by_zero, divzero_flag) + call ieee_get_flag(ieee_overflow, overflow_flag) + call ieee_get_flag(ieee_underflow, underflow_flag) + + if (invalid_flag .or. divzero_flag .or. overflow_flag .or. underflow_flag) then + write(psb_out_unit,'("IEEE probe [",a,"] invalid=",l1,", div0=",l1,", overflow=",l1,", underflow=",l1)') & + trim(where), invalid_flag, divzero_flag, overflow_flag, underflow_flag + end if + end subroutine probe_ieee + + subroutine clear_ieee_flags() + call ieee_set_flag(ieee_invalid, .false.) + call ieee_set_flag(ieee_divide_by_zero, .false.) + call ieee_set_flag(ieee_overflow, .false.) + call ieee_set_flag(ieee_underflow, .false.) + end subroutine clear_ieee_flags + + subroutine parse_gpu_arg(use_gpu, info) + logical, intent(inout) :: use_gpu + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: i, argc + character(len=256) :: carg, uarg, val + + info = psb_success_ + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i,carg) + uarg = psb_toupper(trim(carg)) + if (index(uarg,'--GPU=') == 1) then + val = psb_toupper(adjustl(carg(7:len_trim(carg)))) + select case (trim(val)) + case ('TRUE','T','1','YES','Y','ON') + use_gpu = .true. + case ('FALSE','F','0','NO','N','OFF') + use_gpu = .false. + case default + info = psb_err_internal_error_ + return + end select + end if + end do + end subroutine parse_gpu_arg + + subroutine parse_matrix_arg(matrix_file, matrix_fmt, info) + character(len=*), intent(inout) :: matrix_file + character(len=*), intent(inout) :: matrix_fmt + integer(psb_ipk_), intent(out) :: info + integer(psb_ipk_) :: i, argc + character(len=256) :: carg, uarg, val + + info = psb_success_ + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i,carg) + uarg = psb_toupper(trim(carg)) + + if (index(uarg,'--MATRIX=') == 1) then + matrix_file = adjustl(carg(10:len_trim(carg))) + else if (trim(uarg) == '--MATRIX') then + if (i < argc) then + call get_command_argument(i+1,matrix_file) + else + info = psb_err_internal_error_ + return + end if + else if (index(uarg,'--FMT=') == 1) then + val = psb_toupper(adjustl(carg(7:len_trim(carg)))) + if ((trim(val) == 'MM') .or. (trim(val) == 'HB')) then + matrix_fmt = trim(val) + else + info = psb_err_internal_error_ + return + end if + else if (trim(uarg) == '--FMT') then + if (i < argc) then + call get_command_argument(i+1,val) + val = psb_toupper(trim(val)) + if ((trim(val) == 'MM') .or. (trim(val) == 'HB')) then + matrix_fmt = trim(val) + else + info = psb_err_internal_error_ + return + end if + else + info = psb_err_internal_error_ + return + end if + end if + end do + end subroutine parse_matrix_arg + + subroutine load_external_matrix(ctxt, matrix_file, matrix_fmt, a, bv, xv, desc_a, afmt, info) + type(psb_ctxt_type), intent(in) :: ctxt + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + type(psb_zspmat_type), intent(out) :: a + type(psb_z_vect_type), intent(out) :: bv, xv + type(psb_desc_type), intent(out) :: desc_a + character(len=*), intent(in) :: afmt + integer(psb_ipk_), intent(out) :: info + + type(psb_lzspmat_type) :: aux_a + complex(psb_dpk_), allocatable :: rhs_glob(:), x_glob(:) + integer(psb_lpk_) :: nrows, ncols + + info = psb_success_ + + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + return + end select + if (info /= psb_success_) return + + nrows = aux_a%get_nrows() + ncols = aux_a%get_ncols() + if (nrows /= ncols) then + write(psb_err_unit,'("Input matrix must be square for CG: ",a)') trim(matrix_file) + info = psb_err_internal_error_ + return + end if + + call psb_matdist(aux_a, a, ctxt, desc_a, info, fmt=afmt, parts=part_block) + if (info /= psb_success_) return + + call psb_geall(xv,desc_a,info) + if (info /= psb_success_) return + call psb_geall(bv,desc_a,info) + if (info /= psb_success_) return + + allocate(rhs_glob(nrows), x_glob(ncols), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + return + end if + rhs_glob = zone + x_glob = zzero + + call psb_scatter(rhs_glob,bv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + call psb_scatter(x_glob,xv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + + deallocate(rhs_glob, x_glob) + end subroutine load_external_matrix + + subroutine psb_z_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info) + implicit none + integer(psb_ipk_), intent(in) :: idim + type(psb_zspmat_type), intent(out) :: a + type(psb_z_vect_type), intent(out) :: xv,bv + type(psb_desc_type), intent(out) :: desc_a + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_), intent(out) :: info + character(len=*), intent(in) :: afmt + + integer(psb_ipk_), parameter :: nb=20 + complex(psb_dpk_) :: zt(nb) + real(psb_dpk_) :: x,y,z + integer(psb_lpk_) :: m,n,glob_row + integer(psb_ipk_) :: nnz,nlr,i,ii,ib,k + integer(psb_ipk_) :: ix,iy,iz + integer(psb_ipk_) :: np, my_rank, nr, nt + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + complex(psb_dpk_), allocatable :: val(:) + real(psb_dpk_) :: deltah, sqdeltah, deltah2 + real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + character(len=20) :: name, ch_err, tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, my_rank, np) + + if (idim <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='idim must be > 0') + goto 9999 + end if + if (np <= 0) then + info = psb_err_context_error_ + call psb_errpush(info,name,a_err='invalid context: np <= 0') + goto 9999 + end if + if (my_rank < 0) then + info = psb_err_context_error_ + call psb_errpush(info,name,a_err='invalid context: my_rank < 0') + goto 9999 + end if + + deltah = done/(idim+2) + sqdeltah = deltah*deltah + deltah2 = 2.0e0_psb_dpk_*deltah + + if (abs(deltah) <= tiny(deltah)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: deltah ~ 0') + goto 9999 + end if + if (abs(sqdeltah) <= tiny(sqdeltah)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: sqdeltah ~ 0') + goto 9999 + end if + if (abs(deltah2) <= tiny(deltah2)) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid mesh spacing: deltah2 ~ 0') + goto 9999 + end if + + m = idim*idim*idim + n = m + if (n <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid global size: n <= 0') + goto 9999 + end if + nnz = ((n*9)/(np)) + if (nnz <= 0) then + info = psb_err_internal_error_ + call psb_errpush(info,name,a_err='invalid local nnz estimate: nnz <= 0') + goto 9999 + end if + if(my_rank == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + + nt = (m+np-1)/np + nr = max(0,min(nt,m-(my_rank*nt))) + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) my_rank, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + call psb_barrier(ctxt) + t0 = psb_wtime() + ! call probe_ieee('enter psb_cdall') + call psb_cdall(ctxt,desc_a,info,nl=nr) + ! call probe_ieee('after psb_cdall') + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz) + ! call probe_ieee('after psb_spall') + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + allocate(val(20*nb),irow(20*nb),icol(20*nb),stat=info) + if (info /= psb_success_) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + glob_row=myidx(i) + + if (mod(glob_row,(idim*idim)) == 0) then + ix = glob_row/(idim*idim) + else + ix = glob_row/(idim*idim)+1 + endif + if (mod((glob_row-(ix-1)*idim*idim),idim) == 0) then + iy = (glob_row-(ix-1)*idim*idim)/idim + else + iy = (glob_row-(ix-1)*idim*idim)/idim+1 + endif + iz = glob_row-(ix-1)*idim*idim-(iy-1)*idim + + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = zzero + + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = gfun(dzero,y,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-2)*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = gfun(x,dzero,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-2)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = gfun(x,y,dzero)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz-1) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff)=2.0e0_psb_dpk_*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah + cfun(x,y,z) + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + + val(icoeff) = -a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = gfun(x,y,done)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+(iy-1)*idim+(iz+1) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = gfun(x,done,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = (ix-1)*idim*idim+iy*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + val(icoeff) = -a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix == idim) then + zt(k) = gfun(done,y,z)*(-val(icoeff)) + zt(k) + else + icol(icoeff) = ix*idim*idim+(iy-1)*idim+iz + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + end do + + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + ! call probe_ieee('after psb_spins') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_spins, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + ! call probe_ieee('after psb_geins bv') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_geins bv, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + zt(:)=zzero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + ! call probe_ieee('after psb_geins xv') + if(info /= psb_success_) then + write(psb_err_unit,'("INSERT FAIL rank=",i0,", call=psb_geins xv, ii=",i0,", ib=",i0,", icoeff=",i0)') & + my_rank, ii, ib, icoeff + write(psb_err_unit,'(" glob_row=",i0,", ix=",i0,", iy=",i0,", iz=",i0)') glob_row, ix, iy, iz + exit + end if + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + ! call probe_ieee('before psb_cdasb') + call psb_cdasb(desc_a,info) + ! call probe_ieee('after psb_cdasb') + tcdasb = psb_wtime()-t1 + + call psb_barrier(ctxt) + t1 = psb_wtime() + ! call probe_ieee('before psb_spasb') + if (info == psb_success_) call psb_spasb(a,desc_a,info,afmt=afmt) + ! call probe_ieee('after psb_spasb') + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) call psb_geasb(xv,desc_a,info) + if (info == psb_success_) call psb_geasb(bv,desc_a,info) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(my_rank == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")') tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + end if + + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + return + end subroutine psb_z_gen_pde3d + +end program psb_z_comm_cg_test diff --git a/test/comm/spmv/Makefile b/test/comm/spmv/Makefile new file mode 100644 index 000000000..dd1df48b8 --- /dev/null +++ b/test/comm/spmv/Makefile @@ -0,0 +1,37 @@ +INSTALLDIR=../../.. +INCDIR=$(INSTALLDIR)/include/ +MODDIR=$(INSTALLDIR)/modules/ +include $(INCDIR)/Make.inc.psblas +# +# Libraries used +# +LIBDIR=$(INSTALLDIR)/lib/ +PSBLAS_LIB= -L$(LIBDIR) -lpsb_util -lpsb_linsolve -lpsb_prec -lpsb_cuda -lpsb_ext -lpsb_base +LDLIBS=$(PSBGPULDLIBS) + +FINCLUDES=$(FMFLAG)$(MODDIR) $(FMFLAG). + +TOBJS=psb_spmv_test.o + +EXEDIR=./runs + +all: runsd spmv_overlap + +runsd: + (if test ! -d runs ; then mkdir runs; fi) + +psb_spmv_test.o: psb_spmv_test.f90 + $(FC) $(FCOPT) -cpp $(FINCLUDES) $(FDEFINES) $(FCUDEFINES) -c $< -o $@ + +spmv_overlap: $(TOBJS) + $(FLINK) $(LOPT) $(TOBJS) -o spmv_overlap $(PSBLAS_LIB) $(LDLIBS) + /bin/mv spmv_overlap $(EXEDIR) + /bin/cp -f $(EXEDIR)/spmv_overlap $(EXEDIR)/psb_spmv_kernel + +clean: + /bin/rm -f $(TOBJS) $(TOBJS_API) *$(.mod) $(EXEDIR)/spmv_overlap $(EXEDIR)/psb_spmv_kernel + +lib: + (cd ../../; make library) +verycleanlib: + (cd ../../; make veryclean) \ No newline at end of file diff --git a/test/comm/spmv/README.md b/test/comm/spmv/README.md new file mode 100644 index 000000000..d6800c119 --- /dev/null +++ b/test/comm/spmv/README.md @@ -0,0 +1,31 @@ +spmv overlap communication test +=============================== + +This test was added after introducing different communication schemes in PSBLAS. + +It exercises the overlapped SpMV communication path inside `psb_spmm`. + +Communication pattern: + +- split exchange/computation flow (`start` + local compute + `wait`) +- halo/overlap update through internal swap routines used by SpMV kernels +- same matrix/vector workload repeated across schemes for timing comparison + +Communication schemes compared: + +- `psb_comm_isend_irecv_` +- `psb_comm_ineighbor_alltoallv_` +- `psb_comm_persistent_ineighbor_alltoallv_` + +Unlike `swapdata/`, which checks direct halo exchange, this test covers the +overlapped SpMV workflow. + +Run options +----------- + +- Default PDE-generated matrix: `./runs/psb_spmv_kernel [--gpu=TRUE|FALSE] [--nooverlap]` +- External matrix: `./runs/psb_spmv_kernel [--gpu=TRUE|FALSE] --matrix= [--fmt=MM|HB] [--nooverlap]` + +The overlap path is enabled by default; pass `--nooverlap` to force the non-overlapped halo-update path. + +When `--matrix` is provided, the benchmark reads and distributes that matrix instead of generating the 3D PDE test matrix. diff --git a/test/comm/spmv/psb_c_spmv_test.f90 b/test/comm/spmv/psb_c_spmv_test.f90 new file mode 100644 index 000000000..1560017c4 --- /dev/null +++ b/test/comm/spmv/psb_c_spmv_test.f90 @@ -0,0 +1,917 @@ +!> Test program for overlapping communication and computation with psb_spmm. +!! +!! +module psb_cspmv_overlap_test + + use psb_base_mod + use psb_util_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + + implicit none + + interface + function c_func_3d(x,y,z) result(val) + import :: psb_spk_ + real(psb_spk_), intent(in) :: x,y,z + complex(psb_spk_) :: val + end function c_func_3d + end interface + +contains + + + function c_null_func_3d(x,y,z) result(val) + + real(psb_spk_), intent(in) :: x,y,z + complex(psb_spk_) :: val + + val = czero + + end function c_null_func_3d + ! + ! functions parametrizing the differential equation + ! + + ! + ! Note: b1, b2 and b3 are the coefficients of the first + ! derivative of the unknown function. The default + ! we apply here is to have them zero, so that the resulting + ! matrix is symmetric/hermitian and suitable for + ! testing with CG and FCG. + ! When testing methods for non-hermitian matrices you can + ! change the B1/B2/B3 functions to e.g. sone/sqrt((3*sone)) + ! + function b1(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: b1 + real(psb_spk_), intent(in) :: x,y,z + b1=szero + end function b1 + function b2(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: b2 + real(psb_spk_), intent(in) :: x,y,z + b2=szero + end function b2 + function b3(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: b3 + real(psb_spk_), intent(in) :: x,y,z + b3=szero + end function b3 + function c(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: c + real(psb_spk_), intent(in) :: x,y,z + c=szero + end function c + function a1(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: a1 + real(psb_spk_), intent(in) :: x,y,z + a1=sone/80 + end function a1 + function a2(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: a2 + real(psb_spk_), intent(in) :: x,y,z + a2=sone/80 + end function a2 + function a3(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: a3 + real(psb_spk_), intent(in) :: x,y,z + a3=sone/80 + end function a3 + function g(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: g + real(psb_spk_), intent(in) :: x,y,z + g = szero + if (x == sone) then + g = sone + else if (x == szero) then + g = exp(y**2-z**2) + end if + end function g + + ! + ! subroutine to allocate and fill in the coefficient matrix and + ! the rhs. + ! + subroutine psb_c_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info,& + & f,amold,vmold,imold,partition,nrl,iv,tnd) + use psb_base_mod + use psb_util_mod + ! + ! Discretizes the partial differential equation + ! + ! a1 dd(u) a2 dd(u) a3 dd(u) b1 d(u) b2 d(u) b3 d(u) + ! - ------ - ------ - ------ + ----- + ------ + ------ + c u = f + ! dxdx dydy dzdz dx dy dz + ! + ! with Dirichlet boundary conditions + ! u = g + ! + ! on the unit cube 0<=x,y,z<=1. + ! + ! + ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. + ! + implicit none + integer(psb_ipk_) :: idim + type(psb_cspmat_type) :: a + type(psb_c_vect_type) :: xv,bv + type(psb_desc_type) :: desc_a + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: info + character(len=*) :: afmt + procedure(c_func_3d), optional :: f + class(psb_c_base_sparse_mat), optional :: amold + class(psb_c_base_vect_type), optional :: vmold + class(psb_i_base_vect_type), optional :: imold + integer(psb_ipk_), optional :: partition, nrl,iv(:) + logical, optional :: tnd + ! Local variables. + + integer(psb_ipk_), parameter :: nb=20 + type(psb_c_csc_sparse_mat) :: acsc + type(psb_c_coo_sparse_mat) :: acoo + type(psb_c_csr_sparse_mat) :: acsr + complex(psb_spk_) :: zt(nb) + real(psb_spk_) :: x,y,z + integer(psb_ipk_) :: nnz,nr,nlr,i,j,ii,ib,k, partition_ + integer(psb_lpk_) :: m,n,glob_row,nt + integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner + ! For 3D partition + ! Note: integer control variables going directly into an MPI call + ! must be 4 bytes, i.e. psb_mpk_ + integer(psb_mpk_) :: npdims(3), npp, minfo + integer(psb_ipk_) :: npx,npy,npz, iamx,iamy,iamz,mynx,myny,mynz + integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) + ! Process grid + integer(psb_ipk_) :: np, iam, nth + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + complex(psb_spk_), allocatable :: val(:) + ! deltah dimension of each grid cell + ! deltat discretization time + real(psb_spk_) :: deltah, sqdeltah, deltah2 + real(psb_spk_), parameter :: rhs=szero,one=sone,zero=szero + real(psb_spk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + procedure(c_func_3d), pointer :: f_ + logical :: tnd_ + character(len=20) :: name, ch_err,tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, iam, np) + + + if (present(f)) then + f_ => f + else + f_ => c_null_func_3d + end if + + deltah = sone/(idim+1) + sqdeltah = deltah*deltah + deltah2 = (2*sone)* deltah + + if (present(partition)) then + if ((1<= partition).and.(partition <= 3)) then + partition_ = partition + else + write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' + partition_ = 3 + end if + else + partition_ = 3 + end if + + tnd_ = .false. + if (present(tnd)) tnd_ = tnd + + ! initialize array descriptor and sparse matrix storage. provide an + ! estimate of the number of non zeroes + + m = (1_psb_lpk_*idim)*idim*idim + n = m + nnz = ((n*7)/(np)) + if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + t0 = psb_wtime() + select case(partition_) + case(1) + ! A BLOCK partition + if (present(nrl)) then + nr = nrl + else + ! + ! Using a simple BLOCK distribution. + ! + nt = (m+np-1)/np + nr = max(0,min(nt,m-(iam*nt))) + end if + + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! First example of use of CDALL: specify for each process a number of + ! contiguous rows + ! + call psb_cdall(ctxt,desc_a,info,nl=nr) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(2) + ! A partition defined by the user through IV + + if (present(iv)) then + if (size(iv) /= m) then + write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + else + write(psb_err_unit,*) iam, 'Initialization error: IV not present' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! Second example of use of CDALL: specify for each row the + ! process that owns it + ! + call psb_cdall(ctxt,desc_a,info,vg=iv) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(3) + ! A 3-dimensional partition + + ! A nifty MPI function will split the process list + npdims = 0 + call mpi_dims_create(np,3,npdims,info) + npx = npdims(1) + npy = npdims(2) + npz = npdims(3) + + allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) + ! We can reuse idx2ijk for process indices as well. + call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) + ! Now let's split the 3D cube in hexahedra + call dist1Didx(bndx,idim,npx) + mynx = bndx(iamx+1)-bndx(iamx) + call dist1Didx(bndy,idim,npy) + myny = bndy(iamy+1)-bndy(iamy) + call dist1Didx(bndz,idim,npz) + mynz = bndz(iamz+1)-bndz(iamz) + + ! How many indices do I own? + nlr = mynx*myny*mynz + allocate(myidx(nlr)) + ! Now, let's generate the list of indices I own + nr = 0 + do i=bndx(iamx),bndx(iamx+1)-1 + do j=bndy(iamy),bndy(iamy+1)-1 + do k=bndz(iamz),bndz(iamz+1)-1 + nr = nr + 1 + call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) + end do + end do + end do + if (nr /= nlr) then + write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& + & nr,nlr,mynx,myny,mynz + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + end if + + ! + ! Third example of use of CDALL: specify for each process + ! the set of global indices it owns. + ! + call psb_cdall(ctxt,desc_a,info,vl=myidx) + + case default + write(psb_err_unit,*) iam, 'Initialization error: should not get here' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end select + + + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz) + ! define rhs from boundary conditions; also build initial guess + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + ! we build an auxiliary matrix consisting of one row at a + ! time; just a small matrix. might be extended to generate + ! a bunch of rows per call. + ! + allocate(val(20*nb),irow(20*nb),& + &icol(20*nb),stat=info) + if (info /= psb_success_ ) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + + ! loop over rows belonging to current process in a block + ! distribution. + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + ! local matrix pointer + glob_row=myidx(i) + ! compute gridpoint coordinates + call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) + ! x, y, z coordinates + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = f_(x,y,z) + ! internal point: build discretization + ! + ! term depending on (x-1,y,z) + ! + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = g(szero,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y-1,z) + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = g(x,szero,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y,z-1) + val(icoeff)=-a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = g(x,y,szero)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + ! term depending on (x,y,z) + val(icoeff)=(2*sone)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & + & + c(x,y,z) + call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + ! term depending on (x,y,z+1) + val(icoeff)=-a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = g(x,y,sone)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y+1,z) + val(icoeff)=-a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = g(x,sone,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x+1,y,z) + val(icoeff)=-a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix==idim) then + zt(k) = g(sone,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + end do + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + if(info /= psb_success_) exit + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + if(info /= psb_success_) exit + zt(:)=czero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + if(info /= psb_success_) exit + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + if (present(imold)) then + call psb_cdasb(desc_a,info,mold=imold) + else + call psb_cdasb(desc_a,info) + end if + tcdasb = psb_wtime()-t1 + call psb_barrier(ctxt) + t1 = psb_wtime() + if (info == psb_success_) then + if (present(amold)) then + call psb_spasb(a,desc_a,info,mold=amold) + else + call psb_spasb(a,desc_a,info,afmt=afmt) + end if + end if + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) then + if (present(vmold)) then + call psb_geasb(xv,desc_a,info,mold=vmold) + if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) + else + call psb_geasb(xv,desc_a,info) + if (info == psb_success_) call psb_geasb(bv,desc_a,info) + end if + end if + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(iam == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")')& + & tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + + end if + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psb_c_gen_pde3d + + subroutine run_spmv_kernel(ctxt,use_gpu,matrix_file,matrix_fmt,cpu_fmt,gpu_fmt,idim_in,times_in,do_swap,comm_mode) + use psb_base_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + implicit none + + type(psb_ctxt_type), intent(in) :: ctxt + logical, intent(in) :: use_gpu + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + character(len=*), intent(in) :: cpu_fmt + character(len=*), intent(in) :: gpu_fmt + integer(psb_ipk_), intent(in) :: idim_in, times_in + logical, intent(in) :: do_swap + character(len=*), intent(in) :: comm_mode + + type(psb_cspmat_type) :: a + type(psb_c_vect_type) :: x, y + type(psb_desc_type) :: desc_a + character(len=8) :: afmt + character(len=64) :: env_buf + integer(psb_ipk_) :: my_rank, np, info, err_act + integer(psb_ipk_) :: idim, times, i + integer :: env_len, env_status, ios + complex(psb_spk_) :: alpha, beta + real(psb_spk_) :: t0, t1, dt, avg_t + logical :: use_external_matrix + + integer(psb_ipk_) :: comm_type + +#ifdef PSB_HAVE_CUDA + type(psb_c_vect_cuda) :: cuda_vector_mold + type(psb_i_vect_cuda) :: cuda_index_mold + type(psb_c_cuda_elg_sparse_mat), target :: cuda_ell_sparse_mold + type(psb_c_cuda_csrg_sparse_mat), target :: cuda_csr_sparse_mold + type(psb_c_cuda_hdiag_sparse_mat), target :: cuda_hdia_sparse_mold + type(psb_c_cuda_hlg_sparse_mat), target :: cuda_hll_sparse_mold + class(psb_c_base_sparse_mat), pointer :: cuda_sparse_mold +#endif + + select case(psb_toupper(trim(comm_mode))) + case('P2P','ISEND_IRECV') + comm_type = psb_comm_isend_irecv_ + case('NEIGHBOR','INEIGHBOR_ALLTOALLV') + comm_type = psb_comm_ineighbor_alltoallv_ + case('PNEIGHBOR','PERSISTENT','PERSISTENT_INEIGHBOR_A2AV') + comm_type = psb_comm_persistent_ineighbor_alltoallv_ + case('MPI_GET','RMA_PULL') + comm_type = psb_comm_rma_pull_ + case('MPI_PUT','RMA_PUSH') + comm_type = psb_comm_rma_push_ + case default + comm_type = psb_comm_isend_irecv_ + if (my_rank == psb_root_) then + write(psb_err_unit,'("Unknown comm backend: ",a,", defaulting to P2P")') trim(comm_mode) + end if + end select + + info = psb_success_ + afmt = psb_toupper(trim(cpu_fmt)) + if (len_trim(afmt) == 0) afmt = 'CSR' + if (idim_in > 0) then + idim = idim_in + else + idim = 10 + end if + + if (times_in > 0) then + times = times_in + else + times = 100 + end if + alpha = cone + beta = czero + + call psb_erractionsave(err_act) + call psb_info(ctxt, my_rank, np) + use_external_matrix = (len_trim(matrix_file) > 0) + + if (idim_in <= 0) then + call get_environment_variable('IDIM', env_buf, length=env_len, status=env_status) + if ((env_status == 0) .and. (env_len > 0)) then + read(env_buf(1:env_len), *, iostat=ios) idim + if ((ios /= 0) .or. (idim < 2)) idim = 10 + end if + end if + + if (times_in <= 0) then + call get_environment_variable('TIMES', env_buf, length=env_len, status=env_status) + if ((env_status == 0) .and. (env_len > 0)) then + read(env_buf(1:env_len), *, iostat=ios) times + if ((ios /= 0) .or. (times < 1)) times = 100 + end if + end if + + call psb_barrier(ctxt) + if (use_external_matrix) then + call load_external_matrix(ctxt, matrix_file, matrix_fmt, a, y, x, desc_a, afmt, info) + else + call psb_c_gen_pde3d(ctxt,idim,a,y,x,desc_a,afmt,info) + end if + if (info /= psb_success_) goto 9999 + + call psb_comm_set(comm_type,x%v%comm_handle,info) + if (info /= psb_success_) goto 9999 + +#ifdef PSB_HAVE_CUDA + if (use_gpu) then + select case(psb_toupper(trim(gpu_fmt))) + case('ELG') + cuda_sparse_mold => cuda_ell_sparse_mold + case('CSRG') + cuda_sparse_mold => cuda_csr_sparse_mold + case('HDIAG','HDIA') + cuda_sparse_mold => cuda_hdia_sparse_mold + case default + cuda_sparse_mold => cuda_hll_sparse_mold + end select + call a%cscnv(info,mold=cuda_sparse_mold) + if (info /= psb_success_) goto 9999 + call desc_a%cnv(mold=cuda_index_mold) + if (info /= psb_success_) goto 9999 + call x%cnv(mold=cuda_vector_mold) + if (info /= psb_success_) goto 9999 + call y%cnv(mold=cuda_vector_mold) + if (info /= psb_success_) goto 9999 + end if +#endif + + ! warm-up + call psb_spmm(alpha, a, x, beta, y, desc_a, info, doswap=do_swap) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + t0 = psb_wtime() + do i = 1, times + call psb_spmm(alpha, a, x, beta, y, desc_a, info, doswap=do_swap) + if (info /= psb_success_) exit + end do + t1 = psb_wtime() + if (info /= psb_success_) goto 9999 + + dt = t1 - t0 + call psb_amx(ctxt, dt) + avg_t = dt / real(times, psb_spk_) + + if (my_rank == psb_root_) then + if (do_swap) then + write(psb_out_unit,'(/,"SpMV benchmark (overlap)")') + else + write(psb_out_unit,'(/,"SpMV benchmark (no overlap)")') + end if + write(psb_out_unit,'(" cpu matrix fmt : ",a)') trim(afmt) + if (use_gpu) write(psb_out_unit,'(" gpu matrix fmt : ",a)') trim(psb_toupper(trim(gpu_fmt))) + if (use_external_matrix) then + write(psb_out_unit,'(" matrix file : ",a)') trim(matrix_file) + write(psb_out_unit,'(" matrix format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'(" idim : ",i0)') idim + end if + write(psb_out_unit,'(" global non zeros : ",i0)') a%get_nzeros() + write(psb_out_unit,'(" global rows : ",i0)') a%get_nrows() + write(psb_out_unit,'(" global cols : ",i0)') a%get_ncols() + write(psb_out_unit,'(" repetitions : ",i0)') times + write(psb_out_unit,'(" comm backend : ",a)') trim(psb_toupper(trim(comm_mode))) + write(psb_out_unit,'(" total time [s] : ",es12.5)') dt + write(psb_out_unit,'(" avg time [s] : ",es12.5)') avg_t + end if + + call psb_gefree(y, desc_a, info) + call psb_gefree(x, desc_a, info) + call psb_spfree(a, desc_a, info) + call psb_cdfree(desc_a, info) + call psb_erractionrestore(err_act) + return + +9999 call psb_error(ctxt) + call psb_error_handler(ctxt, err_act) + end subroutine run_spmv_kernel + + subroutine load_external_matrix(ctxt, matrix_file, matrix_fmt, a, bv, xv, desc_a, afmt, info) + type(psb_ctxt_type), intent(in) :: ctxt + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + type(psb_cspmat_type), intent(out) :: a + type(psb_c_vect_type), intent(out) :: bv, xv + type(psb_desc_type), intent(out) :: desc_a + character(len=*), intent(in) :: afmt + integer(psb_ipk_), intent(out) :: info + + type(psb_lcspmat_type) :: aux_a + complex(psb_spk_), allocatable :: rhs_glob(:), x_glob(:) + integer(psb_lpk_) :: nrows, ncols + + info = psb_success_ + + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + return + end select + if (info /= psb_success_) return + + nrows = aux_a%get_nrows() + ncols = aux_a%get_ncols() + if (nrows /= ncols) then + write(psb_err_unit,'("Input matrix must be square: ",a)') trim(matrix_file) + info = psb_err_internal_error_ + return + end if + + call psb_matdist(aux_a, a, ctxt, desc_a, info, fmt=afmt, parts=part_block) + if (info /= psb_success_) return + + call psb_geall(xv,desc_a,info) + if (info /= psb_success_) return + call psb_geall(bv,desc_a,info) + if (info /= psb_success_) return + + allocate(rhs_glob(nrows), x_glob(ncols), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + return + end if + rhs_glob = cone + x_glob = czero + + call psb_scatter(rhs_glob,bv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + call psb_scatter(x_glob,xv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + + deallocate(rhs_glob, x_glob) + end subroutine load_external_matrix + +end module psb_cspmv_overlap_test + +program psb_c_spmv_kernel + use psb_cspmv_overlap_test + use psb_base_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + implicit none + + type(psb_ctxt_type) :: ctxt + logical :: use_gpu + integer(psb_ipk_) :: my_rank, np, k + integer :: ios + character(len=256) :: arg + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + character(len=8) :: cpu_fmt + character(len=8) :: gpu_fmt + integer(psb_ipk_) :: idim_arg, times_arg + logical :: do_overlap + integer :: kmode + integer, parameter :: n_comm_modes = 5 + character(len=20), parameter :: comm_modes(n_comm_modes) = [character(len=20) :: & + & 'P2P', 'NEIGHBOR', 'PNEIGHBOR', 'MPI_GET', 'MPI_PUT'] + + idim_arg = -1 + times_arg = -1 + + matrix_file = '' + matrix_fmt = 'MM' + cpu_fmt = 'CSR' + gpu_fmt = 'HLG' + do_overlap = .true. + + call psb_init(ctxt) + call psb_info(ctxt, my_rank, np) + +#ifdef PSB_HAVE_CUDA + use_gpu = .true. +#else + use_gpu = .false. +#endif + + do k = 1, command_argument_count() + call get_command_argument(k, arg) + if (index(psb_toupper(trim(arg)), '--GPU=') == 1) then + select case (psb_toupper(adjustl(arg(7:len_trim(arg))))) + case ('TRUE','T','1','YES','Y','ON') + use_gpu = .true. + case ('FALSE','F','0','NO','N','OFF') + use_gpu = .false. + end select + else if (index(psb_toupper(trim(arg)), '--MATRIX=') == 1) then + matrix_file = adjustl(arg(10:len_trim(arg))) + else if (index(psb_toupper(trim(arg)), '--FMT=') == 1) then + arg = psb_toupper(adjustl(arg(7:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (index(psb_toupper(trim(arg)), '--MTX_FMT=') == 1) then + arg = psb_toupper(adjustl(arg(10:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (index(psb_toupper(trim(arg)), '--DIM=') == 1) then + read(arg(7:len_trim(arg)),*,iostat=ios) idim_arg + if ((ios /= 0) .or. (idim_arg < 2)) idim_arg = -1 + else if (index(psb_toupper(trim(arg)), '--TIMES=') == 1) then + read(arg(9:len_trim(arg)),*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + else if (index(psb_toupper(trim(arg)), '--ITERS=') == 1) then + read(arg(9:len_trim(arg)),*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + else if (index(psb_toupper(trim(arg)), '--CPU_FORMAT=') == 1) then + cpu_fmt = psb_toupper(adjustl(arg(14:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--CPU_FMT=') == 1) then + cpu_fmt = psb_toupper(adjustl(arg(11:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--GPU_FORMAT=') == 1) then + gpu_fmt = psb_toupper(adjustl(arg(14:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--GPU_FMT=') == 1) then + gpu_fmt = psb_toupper(adjustl(arg(11:len_trim(arg)))) + else if ((trim(psb_toupper(arg)) == '--NOOVERLAP') .or. (trim(psb_toupper(arg)) == '--NO_OVERLAP')) then + do_overlap = .false. + else if ((trim(psb_toupper(arg)) == '--OVERLAP') .or. (trim(psb_toupper(arg)) == '--SWAP')) then + do_overlap = .true. + else if (trim(psb_toupper(arg)) == '--MATRIX') then + if (k < command_argument_count()) call get_command_argument(k+1,matrix_file) + else if (trim(psb_toupper(arg)) == '--FMT') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + else if (trim(psb_toupper(arg)) == '--MTX_FMT') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + else if (trim(psb_toupper(arg)) == '--DIM') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + read(arg,*,iostat=ios) idim_arg + if ((ios /= 0) .or. (idim_arg < 2)) idim_arg = -1 + end if + else if ((trim(psb_toupper(arg)) == '--TIMES') .or. (trim(psb_toupper(arg)) == '--ITERS')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + read(arg,*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + end if + else if ((trim(psb_toupper(arg)) == '--CPU_FORMAT') .or. (trim(psb_toupper(arg)) == '--CPU_FMT')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + cpu_fmt = psb_toupper(trim(arg)) + end if + else if ((trim(psb_toupper(arg)) == '--GPU_FORMAT') .or. (trim(psb_toupper(arg)) == '--GPU_FMT')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + gpu_fmt = psb_toupper(trim(arg)) + end if + end if + end do + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_init(ctxt) +#else + use_gpu = .false. +#endif + + if (my_rank == psb_root_) then + write(psb_out_unit,*) 'Welcome to PSBLAS version: ', psb_version_string_ + write(psb_out_unit,*) 'This is the psb_c_spmv_kernel sample program' + write(psb_out_unit,'("GPU enabled : ",l1)') use_gpu + write(psb_out_unit,'("Usage: ./psb_c_spmv_kernel [--gpu=TRUE|FALSE] [--dim=N] [--times=N] ",& + &"[--cpu_fmt=CSR|COO|CSC|ELL|HLL] [--gpu_fmt=HLL|ELL|CSR|HDIA] [--matrix=] [--fmt=MM|HB] ",& + &"[--overlap|--nooverlap] (runs all comm backends)")') + end if + + do kmode = 1, n_comm_modes + if (my_rank == psb_root_) then + write(psb_out_unit,'(/,"=== Backend sweep: ",a," ===")') trim(comm_modes(kmode)) + end if + call run_spmv_kernel(ctxt, use_gpu, matrix_file, matrix_fmt, cpu_fmt, gpu_fmt, & + & idim_arg, times_arg, do_overlap, comm_modes(kmode)) + end do + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_exit() +#endif + call psb_exit(ctxt) +end program psb_c_spmv_kernel diff --git a/test/comm/spmv/psb_d_spmv_test.f90 b/test/comm/spmv/psb_d_spmv_test.f90 new file mode 100644 index 000000000..88b1cf9d3 --- /dev/null +++ b/test/comm/spmv/psb_d_spmv_test.f90 @@ -0,0 +1,917 @@ +!> Test program for overlapping communication and computation with psb_spmm. +!! +!! +module psb_dspmv_overlap_test + + use psb_base_mod + use psb_util_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + + implicit none + + interface + function d_func_3d(x,y,z) result(val) + import :: psb_dpk_ + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + end function d_func_3d + end interface + +contains + + + function d_null_func_3d(x,y,z) result(val) + + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + + val = dzero + + end function d_null_func_3d + ! + ! functions parametrizing the differential equation + ! + + ! + ! Note: b1, b2 and b3 are the coefficients of the first + ! derivative of the unknown function. The default + ! we apply here is to have them zero, so that the resulting + ! matrix is symmetric/hermitian and suitable for + ! testing with CG and FCG. + ! When testing methods for non-hermitian matrices you can + ! change the B1/B2/B3 functions to e.g. done/sqrt((3*done)) + ! + function b1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b1 + real(psb_dpk_), intent(in) :: x,y,z + b1=dzero + end function b1 + function b2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b2 + real(psb_dpk_), intent(in) :: x,y,z + b2=dzero + end function b2 + function b3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b3 + real(psb_dpk_), intent(in) :: x,y,z + b3=dzero + end function b3 + function c(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: c + real(psb_dpk_), intent(in) :: x,y,z + c=dzero + end function c + function a1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a1 + real(psb_dpk_), intent(in) :: x,y,z + a1=done/80 + end function a1 + function a2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a2 + real(psb_dpk_), intent(in) :: x,y,z + a2=done/80 + end function a2 + function a3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a3 + real(psb_dpk_), intent(in) :: x,y,z + a3=done/80 + end function a3 + function g(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: g + real(psb_dpk_), intent(in) :: x,y,z + g = dzero + if (x == done) then + g = done + else if (x == dzero) then + g = exp(y**2-z**2) + end if + end function g + + ! + ! subroutine to allocate and fill in the coefficient matrix and + ! the rhs. + ! + subroutine psb_d_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info,& + & f,amold,vmold,imold,partition,nrl,iv,tnd) + use psb_base_mod + use psb_util_mod + ! + ! Discretizes the partial differential equation + ! + ! a1 dd(u) a2 dd(u) a3 dd(u) b1 d(u) b2 d(u) b3 d(u) + ! - ------ - ------ - ------ + ----- + ------ + ------ + c u = f + ! dxdx dydy dzdz dx dy dz + ! + ! with Dirichlet boundary conditions + ! u = g + ! + ! on the unit cube 0<=x,y,z<=1. + ! + ! + ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. + ! + implicit none + integer(psb_ipk_) :: idim + type(psb_dspmat_type) :: a + type(psb_d_vect_type) :: xv,bv + type(psb_desc_type) :: desc_a + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: info + character(len=*) :: afmt + procedure(d_func_3d), optional :: f + class(psb_d_base_sparse_mat), optional :: amold + class(psb_d_base_vect_type), optional :: vmold + class(psb_i_base_vect_type), optional :: imold + integer(psb_ipk_), optional :: partition, nrl,iv(:) + logical, optional :: tnd + ! Local variables. + + integer(psb_ipk_), parameter :: nb=20 + type(psb_d_csc_sparse_mat) :: acsc + type(psb_d_coo_sparse_mat) :: acoo + type(psb_d_csr_sparse_mat) :: acsr + real(psb_dpk_) :: zt(nb) + real(psb_dpk_) :: x,y,z + integer(psb_ipk_) :: nnz,nr,nlr,i,j,ii,ib,k, partition_ + integer(psb_lpk_) :: m,n,glob_row,nt + integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner + ! For 3D partition + ! Note: integer control variables going directly into an MPI call + ! must be 4 bytes, i.e. psb_mpk_ + integer(psb_mpk_) :: npdims(3), npp, minfo + integer(psb_ipk_) :: npx,npy,npz, iamx,iamy,iamz,mynx,myny,mynz + integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) + ! Process grid + integer(psb_ipk_) :: np, iam, nth + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + real(psb_dpk_), allocatable :: val(:) + ! deltah dimension of each grid cell + ! deltat discretization time + real(psb_dpk_) :: deltah, sqdeltah, deltah2 + real(psb_dpk_), parameter :: rhs=dzero,one=done,zero=dzero + real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + procedure(d_func_3d), pointer :: f_ + logical :: tnd_ + character(len=20) :: name, ch_err,tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, iam, np) + + + if (present(f)) then + f_ => f + else + f_ => d_null_func_3d + end if + + deltah = done/(idim+1) + sqdeltah = deltah*deltah + deltah2 = (2*done)* deltah + + if (present(partition)) then + if ((1<= partition).and.(partition <= 3)) then + partition_ = partition + else + write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' + partition_ = 3 + end if + else + partition_ = 3 + end if + + tnd_ = .false. + if (present(tnd)) tnd_ = tnd + + ! initialize array descriptor and sparse matrix storage. provide an + ! estimate of the number of non zeroes + + m = (1_psb_lpk_*idim)*idim*idim + n = m + nnz = ((n*7)/(np)) + if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + t0 = psb_wtime() + select case(partition_) + case(1) + ! A BLOCK partition + if (present(nrl)) then + nr = nrl + else + ! + ! Using a simple BLOCK distribution. + ! + nt = (m+np-1)/np + nr = max(0,min(nt,m-(iam*nt))) + end if + + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! First example of use of CDALL: specify for each process a number of + ! contiguous rows + ! + call psb_cdall(ctxt,desc_a,info,nl=nr) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(2) + ! A partition defined by the user through IV + + if (present(iv)) then + if (size(iv) /= m) then + write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + else + write(psb_err_unit,*) iam, 'Initialization error: IV not present' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! Second example of use of CDALL: specify for each row the + ! process that owns it + ! + call psb_cdall(ctxt,desc_a,info,vg=iv) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(3) + ! A 3-dimensional partition + + ! A nifty MPI function will split the process list + npdims = 0 + call mpi_dims_create(np,3,npdims,info) + npx = npdims(1) + npy = npdims(2) + npz = npdims(3) + + allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) + ! We can reuse idx2ijk for process indices as well. + call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) + ! Now let's split the 3D cube in hexahedra + call dist1Didx(bndx,idim,npx) + mynx = bndx(iamx+1)-bndx(iamx) + call dist1Didx(bndy,idim,npy) + myny = bndy(iamy+1)-bndy(iamy) + call dist1Didx(bndz,idim,npz) + mynz = bndz(iamz+1)-bndz(iamz) + + ! How many indices do I own? + nlr = mynx*myny*mynz + allocate(myidx(nlr)) + ! Now, let's generate the list of indices I own + nr = 0 + do i=bndx(iamx),bndx(iamx+1)-1 + do j=bndy(iamy),bndy(iamy+1)-1 + do k=bndz(iamz),bndz(iamz+1)-1 + nr = nr + 1 + call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) + end do + end do + end do + if (nr /= nlr) then + write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& + & nr,nlr,mynx,myny,mynz + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + end if + + ! + ! Third example of use of CDALL: specify for each process + ! the set of global indices it owns. + ! + call psb_cdall(ctxt,desc_a,info,vl=myidx) + + case default + write(psb_err_unit,*) iam, 'Initialization error: should not get here' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end select + + + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz) + ! define rhs from boundary conditions; also build initial guess + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + ! we build an auxiliary matrix consisting of one row at a + ! time; just a small matrix. might be extended to generate + ! a bunch of rows per call. + ! + allocate(val(20*nb),irow(20*nb),& + &icol(20*nb),stat=info) + if (info /= psb_success_ ) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + + ! loop over rows belonging to current process in a block + ! distribution. + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + ! local matrix pointer + glob_row=myidx(i) + ! compute gridpoint coordinates + call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) + ! x, y, z coordinates + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = f_(x,y,z) + ! internal point: build discretization + ! + ! term depending on (x-1,y,z) + ! + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = g(dzero,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y-1,z) + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = g(x,dzero,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y,z-1) + val(icoeff)=-a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = g(x,y,dzero)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + ! term depending on (x,y,z) + val(icoeff)=(2*done)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & + & + c(x,y,z) + call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + ! term depending on (x,y,z+1) + val(icoeff)=-a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = g(x,y,done)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y+1,z) + val(icoeff)=-a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = g(x,done,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x+1,y,z) + val(icoeff)=-a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix==idim) then + zt(k) = g(done,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + end do + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + if(info /= psb_success_) exit + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + if(info /= psb_success_) exit + zt(:)=dzero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + if(info /= psb_success_) exit + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + if (present(imold)) then + call psb_cdasb(desc_a,info,mold=imold) + else + call psb_cdasb(desc_a,info) + end if + tcdasb = psb_wtime()-t1 + call psb_barrier(ctxt) + t1 = psb_wtime() + if (info == psb_success_) then + if (present(amold)) then + call psb_spasb(a,desc_a,info,mold=amold) + else + call psb_spasb(a,desc_a,info,afmt=afmt) + end if + end if + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) then + if (present(vmold)) then + call psb_geasb(xv,desc_a,info,mold=vmold) + if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) + else + call psb_geasb(xv,desc_a,info) + if (info == psb_success_) call psb_geasb(bv,desc_a,info) + end if + end if + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(iam == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")')& + & tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + + end if + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psb_d_gen_pde3d + + subroutine run_spmv_kernel(ctxt,use_gpu,matrix_file,matrix_fmt,cpu_fmt,gpu_fmt,idim_in,times_in,do_swap,comm_mode) + use psb_base_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + implicit none + + type(psb_ctxt_type), intent(in) :: ctxt + logical, intent(in) :: use_gpu + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + character(len=*), intent(in) :: cpu_fmt + character(len=*), intent(in) :: gpu_fmt + integer(psb_ipk_), intent(in) :: idim_in, times_in + logical, intent(in) :: do_swap + character(len=*), intent(in) :: comm_mode + + type(psb_dspmat_type) :: a + type(psb_d_vect_type) :: x, y + type(psb_desc_type) :: desc_a + character(len=8) :: afmt + character(len=64) :: env_buf + integer(psb_ipk_) :: my_rank, np, info, err_act + integer(psb_ipk_) :: idim, times, i + integer :: env_len, env_status, ios + real(psb_dpk_) :: alpha, beta + real(psb_dpk_) :: t0, t1, dt, avg_t + logical :: use_external_matrix + + integer(psb_ipk_) :: comm_type + +#ifdef PSB_HAVE_CUDA + type(psb_d_vect_cuda) :: cuda_vector_mold + type(psb_i_vect_cuda) :: cuda_index_mold + type(psb_d_cuda_elg_sparse_mat), target :: cuda_ell_sparse_mold + type(psb_d_cuda_csrg_sparse_mat), target :: cuda_csr_sparse_mold + type(psb_d_cuda_hdiag_sparse_mat), target :: cuda_hdia_sparse_mold + type(psb_d_cuda_hlg_sparse_mat), target :: cuda_hll_sparse_mold + class(psb_d_base_sparse_mat), pointer :: cuda_sparse_mold +#endif + + select case(psb_toupper(trim(comm_mode))) + case('P2P','ISEND_IRECV') + comm_type = psb_comm_isend_irecv_ + case('NEIGHBOR','INEIGHBOR_ALLTOALLV') + comm_type = psb_comm_ineighbor_alltoallv_ + case('PNEIGHBOR','PERSISTENT','PERSISTENT_INEIGHBOR_A2AV') + comm_type = psb_comm_persistent_ineighbor_alltoallv_ + case('MPI_GET','RMA_PULL') + comm_type = psb_comm_rma_pull_ + case('MPI_PUT','RMA_PUSH') + comm_type = psb_comm_rma_push_ + case default + comm_type = psb_comm_isend_irecv_ + if (my_rank == psb_root_) then + write(psb_err_unit,'("Unknown comm backend: ",a,", defaulting to P2P")') trim(comm_mode) + end if + end select + + info = psb_success_ + afmt = psb_toupper(trim(cpu_fmt)) + if (len_trim(afmt) == 0) afmt = 'CSR' + if (idim_in > 0) then + idim = idim_in + else + idim = 10 + end if + + if (times_in > 0) then + times = times_in + else + times = 100 + end if + alpha = done + beta = dzero + + call psb_erractionsave(err_act) + call psb_info(ctxt, my_rank, np) + use_external_matrix = (len_trim(matrix_file) > 0) + + if (idim_in <= 0) then + call get_environment_variable('IDIM', env_buf, length=env_len, status=env_status) + if ((env_status == 0) .and. (env_len > 0)) then + read(env_buf(1:env_len), *, iostat=ios) idim + if ((ios /= 0) .or. (idim < 2)) idim = 10 + end if + end if + + if (times_in <= 0) then + call get_environment_variable('TIMES', env_buf, length=env_len, status=env_status) + if ((env_status == 0) .and. (env_len > 0)) then + read(env_buf(1:env_len), *, iostat=ios) times + if ((ios /= 0) .or. (times < 1)) times = 100 + end if + end if + + call psb_barrier(ctxt) + if (use_external_matrix) then + call load_external_matrix(ctxt, matrix_file, matrix_fmt, a, y, x, desc_a, afmt, info) + else + call psb_d_gen_pde3d(ctxt,idim,a,y,x,desc_a,afmt,info) + end if + if (info /= psb_success_) goto 9999 + + call psb_comm_set(comm_type,x%v%comm_handle,info) + if (info /= psb_success_) goto 9999 + +#ifdef PSB_HAVE_CUDA + if (use_gpu) then + select case(psb_toupper(trim(gpu_fmt))) + case('ELG') + cuda_sparse_mold => cuda_ell_sparse_mold + case('CSRG') + cuda_sparse_mold => cuda_csr_sparse_mold + case('HDIAG','HDIA') + cuda_sparse_mold => cuda_hdia_sparse_mold + case default + cuda_sparse_mold => cuda_hll_sparse_mold + end select + call a%cscnv(info,mold=cuda_sparse_mold) + if (info /= psb_success_) goto 9999 + call desc_a%cnv(mold=cuda_index_mold) + if (info /= psb_success_) goto 9999 + call x%cnv(mold=cuda_vector_mold) + if (info /= psb_success_) goto 9999 + call y%cnv(mold=cuda_vector_mold) + if (info /= psb_success_) goto 9999 + end if +#endif + + ! warm-up + call psb_spmm(alpha, a, x, beta, y, desc_a, info, doswap=do_swap) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + t0 = psb_wtime() + do i = 1, times + call psb_spmm(alpha, a, x, beta, y, desc_a, info, doswap=do_swap) + if (info /= psb_success_) exit + end do + t1 = psb_wtime() + if (info /= psb_success_) goto 9999 + + dt = t1 - t0 + call psb_amx(ctxt, dt) + avg_t = dt / real(times, psb_dpk_) + + if (my_rank == psb_root_) then + if (do_swap) then + write(psb_out_unit,'(/,"SpMV benchmark (overlap)")') + else + write(psb_out_unit,'(/,"SpMV benchmark (no overlap)")') + end if + write(psb_out_unit,'(" cpu matrix fmt : ",a)') trim(afmt) + if (use_gpu) write(psb_out_unit,'(" gpu matrix fmt : ",a)') trim(psb_toupper(trim(gpu_fmt))) + if (use_external_matrix) then + write(psb_out_unit,'(" matrix file : ",a)') trim(matrix_file) + write(psb_out_unit,'(" matrix format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'(" idim : ",i0)') idim + end if + write(psb_out_unit,'(" global non zeros : ",i0)') a%get_nzeros() + write(psb_out_unit,'(" global rows : ",i0)') a%get_nrows() + write(psb_out_unit,'(" global cols : ",i0)') a%get_ncols() + write(psb_out_unit,'(" repetitions : ",i0)') times + write(psb_out_unit,'(" comm backend : ",a)') trim(psb_toupper(trim(comm_mode))) + write(psb_out_unit,'(" total time [s] : ",es12.5)') dt + write(psb_out_unit,'(" avg time [s] : ",es12.5)') avg_t + end if + + call psb_gefree(y, desc_a, info) + call psb_gefree(x, desc_a, info) + call psb_spfree(a, desc_a, info) + call psb_cdfree(desc_a, info) + call psb_erractionrestore(err_act) + return + +9999 call psb_error(ctxt) + call psb_error_handler(ctxt, err_act) + end subroutine run_spmv_kernel + + subroutine load_external_matrix(ctxt, matrix_file, matrix_fmt, a, bv, xv, desc_a, afmt, info) + type(psb_ctxt_type), intent(in) :: ctxt + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + type(psb_dspmat_type), intent(out) :: a + type(psb_d_vect_type), intent(out) :: bv, xv + type(psb_desc_type), intent(out) :: desc_a + character(len=*), intent(in) :: afmt + integer(psb_ipk_), intent(out) :: info + + type(psb_ldspmat_type) :: aux_a + real(psb_dpk_), allocatable :: rhs_glob(:), x_glob(:) + integer(psb_lpk_) :: nrows, ncols + + info = psb_success_ + + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + return + end select + if (info /= psb_success_) return + + nrows = aux_a%get_nrows() + ncols = aux_a%get_ncols() + if (nrows /= ncols) then + write(psb_err_unit,'("Input matrix must be square: ",a)') trim(matrix_file) + info = psb_err_internal_error_ + return + end if + + call psb_matdist(aux_a, a, ctxt, desc_a, info, fmt=afmt, parts=part_block) + if (info /= psb_success_) return + + call psb_geall(xv,desc_a,info) + if (info /= psb_success_) return + call psb_geall(bv,desc_a,info) + if (info /= psb_success_) return + + allocate(rhs_glob(nrows), x_glob(ncols), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + return + end if + rhs_glob = done + x_glob = dzero + + call psb_scatter(rhs_glob,bv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + call psb_scatter(x_glob,xv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + + deallocate(rhs_glob, x_glob) + end subroutine load_external_matrix + +end module psb_dspmv_overlap_test + +program psb_d_spmv_kernel + use psb_dspmv_overlap_test + use psb_base_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + implicit none + + type(psb_ctxt_type) :: ctxt + logical :: use_gpu + integer(psb_ipk_) :: my_rank, np, k + integer :: ios + character(len=256) :: arg + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + character(len=8) :: cpu_fmt + character(len=8) :: gpu_fmt + integer(psb_ipk_) :: idim_arg, times_arg + logical :: do_overlap + integer :: kmode + integer, parameter :: n_comm_modes = 5 + character(len=20), parameter :: comm_modes(n_comm_modes) = [character(len=20) :: & + & 'P2P', 'NEIGHBOR', 'PNEIGHBOR', 'MPI_GET', 'MPI_PUT'] + + idim_arg = -1 + times_arg = -1 + + matrix_file = '' + matrix_fmt = 'MM' + cpu_fmt = 'CSR' + gpu_fmt = 'HLG' + do_overlap = .true. + + call psb_init(ctxt) + call psb_info(ctxt, my_rank, np) + +#ifdef PSB_HAVE_CUDA + use_gpu = .true. +#else + use_gpu = .false. +#endif + + do k = 1, command_argument_count() + call get_command_argument(k, arg) + if (index(psb_toupper(trim(arg)), '--GPU=') == 1) then + select case (psb_toupper(adjustl(arg(7:len_trim(arg))))) + case ('TRUE','T','1','YES','Y','ON') + use_gpu = .true. + case ('FALSE','F','0','NO','N','OFF') + use_gpu = .false. + end select + else if (index(psb_toupper(trim(arg)), '--MATRIX=') == 1) then + matrix_file = adjustl(arg(10:len_trim(arg))) + else if (index(psb_toupper(trim(arg)), '--FMT=') == 1) then + arg = psb_toupper(adjustl(arg(7:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (index(psb_toupper(trim(arg)), '--MTX_FMT=') == 1) then + arg = psb_toupper(adjustl(arg(10:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (index(psb_toupper(trim(arg)), '--DIM=') == 1) then + read(arg(7:len_trim(arg)),*,iostat=ios) idim_arg + if ((ios /= 0) .or. (idim_arg < 2)) idim_arg = -1 + else if (index(psb_toupper(trim(arg)), '--TIMES=') == 1) then + read(arg(9:len_trim(arg)),*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + else if (index(psb_toupper(trim(arg)), '--ITERS=') == 1) then + read(arg(9:len_trim(arg)),*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + else if (index(psb_toupper(trim(arg)), '--CPU_FORMAT=') == 1) then + cpu_fmt = psb_toupper(adjustl(arg(14:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--CPU_FMT=') == 1) then + cpu_fmt = psb_toupper(adjustl(arg(11:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--GPU_FORMAT=') == 1) then + gpu_fmt = psb_toupper(adjustl(arg(14:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--GPU_FMT=') == 1) then + gpu_fmt = psb_toupper(adjustl(arg(11:len_trim(arg)))) + else if ((trim(psb_toupper(arg)) == '--NOOVERLAP') .or. (trim(psb_toupper(arg)) == '--NO_OVERLAP')) then + do_overlap = .false. + else if ((trim(psb_toupper(arg)) == '--OVERLAP') .or. (trim(psb_toupper(arg)) == '--SWAP')) then + do_overlap = .true. + else if (trim(psb_toupper(arg)) == '--MATRIX') then + if (k < command_argument_count()) call get_command_argument(k+1,matrix_file) + else if (trim(psb_toupper(arg)) == '--FMT') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + else if (trim(psb_toupper(arg)) == '--MTX_FMT') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + else if (trim(psb_toupper(arg)) == '--DIM') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + read(arg,*,iostat=ios) idim_arg + if ((ios /= 0) .or. (idim_arg < 2)) idim_arg = -1 + end if + else if ((trim(psb_toupper(arg)) == '--TIMES') .or. (trim(psb_toupper(arg)) == '--ITERS')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + read(arg,*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + end if + else if ((trim(psb_toupper(arg)) == '--CPU_FORMAT') .or. (trim(psb_toupper(arg)) == '--CPU_FMT')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + cpu_fmt = psb_toupper(trim(arg)) + end if + else if ((trim(psb_toupper(arg)) == '--GPU_FORMAT') .or. (trim(psb_toupper(arg)) == '--GPU_FMT')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + gpu_fmt = psb_toupper(trim(arg)) + end if + end if + end do + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_init(ctxt) +#else + use_gpu = .false. +#endif + + if (my_rank == psb_root_) then + write(psb_out_unit,*) 'Welcome to PSBLAS version: ', psb_version_string_ + write(psb_out_unit,*) 'This is the psb_d_spmv_kernel sample program' + write(psb_out_unit,'("GPU enabled : ",l1)') use_gpu + write(psb_out_unit,'("Usage: ./psb_d_spmv_kernel [--gpu=TRUE|FALSE] [--dim=N] [--times=N] ",& + &"[--cpu_fmt=CSR|COO|CSC|ELL|HLL] [--gpu_fmt=HLL|ELL|CSR|HDIA] [--matrix=] [--fmt=MM|HB] ",& + &"[--overlap|--nooverlap] (runs all comm backends)")') + end if + + do kmode = 1, n_comm_modes + if (my_rank == psb_root_) then + write(psb_out_unit,'(/,"=== Backend sweep: ",a," ===")') trim(comm_modes(kmode)) + end if + call run_spmv_kernel(ctxt, use_gpu, matrix_file, matrix_fmt, cpu_fmt, gpu_fmt, & + & idim_arg, times_arg, do_overlap, comm_modes(kmode)) + end do + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_exit() +#endif + call psb_exit(ctxt) +end program psb_d_spmv_kernel diff --git a/test/comm/spmv/psb_s_spmv_test.f90 b/test/comm/spmv/psb_s_spmv_test.f90 new file mode 100644 index 000000000..95c79cc1c --- /dev/null +++ b/test/comm/spmv/psb_s_spmv_test.f90 @@ -0,0 +1,917 @@ +!> Test program for overlapping communication and computation with psb_spmm. +!! +!! +module psb_sspmv_overlap_test + + use psb_base_mod + use psb_util_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + + implicit none + + interface + function s_func_3d(x,y,z) result(val) + import :: psb_spk_ + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + end function s_func_3d + end interface + +contains + + + function s_null_func_3d(x,y,z) result(val) + + real(psb_spk_), intent(in) :: x,y,z + real(psb_spk_) :: val + + val = szero + + end function s_null_func_3d + ! + ! functions parametrizing the differential equation + ! + + ! + ! Note: b1, b2 and b3 are the coefficients of the first + ! derivative of the unknown function. The default + ! we apply here is to have them zero, so that the resulting + ! matrix is symmetric/hermitian and suitable for + ! testing with CG and FCG. + ! When testing methods for non-hermitian matrices you can + ! change the B1/B2/B3 functions to e.g. sone/sqrt((3*sone)) + ! + function b1(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: b1 + real(psb_spk_), intent(in) :: x,y,z + b1=szero + end function b1 + function b2(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: b2 + real(psb_spk_), intent(in) :: x,y,z + b2=szero + end function b2 + function b3(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: b3 + real(psb_spk_), intent(in) :: x,y,z + b3=szero + end function b3 + function c(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: c + real(psb_spk_), intent(in) :: x,y,z + c=szero + end function c + function a1(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: a1 + real(psb_spk_), intent(in) :: x,y,z + a1=sone/80 + end function a1 + function a2(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: a2 + real(psb_spk_), intent(in) :: x,y,z + a2=sone/80 + end function a2 + function a3(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: a3 + real(psb_spk_), intent(in) :: x,y,z + a3=sone/80 + end function a3 + function g(x,y,z) + use psb_base_mod, only : psb_spk_, sone, szero + implicit none + real(psb_spk_) :: g + real(psb_spk_), intent(in) :: x,y,z + g = szero + if (x == sone) then + g = sone + else if (x == szero) then + g = exp(y**2-z**2) + end if + end function g + + ! + ! subroutine to allocate and fill in the coefficient matrix and + ! the rhs. + ! + subroutine psb_s_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info,& + & f,amold,vmold,imold,partition,nrl,iv,tnd) + use psb_base_mod + use psb_util_mod + ! + ! Discretizes the partial differential equation + ! + ! a1 dd(u) a2 dd(u) a3 dd(u) b1 d(u) b2 d(u) b3 d(u) + ! - ------ - ------ - ------ + ----- + ------ + ------ + c u = f + ! dxdx dydy dzdz dx dy dz + ! + ! with Dirichlet boundary conditions + ! u = g + ! + ! on the unit cube 0<=x,y,z<=1. + ! + ! + ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. + ! + implicit none + integer(psb_ipk_) :: idim + type(psb_sspmat_type) :: a + type(psb_s_vect_type) :: xv,bv + type(psb_desc_type) :: desc_a + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: info + character(len=*) :: afmt + procedure(s_func_3d), optional :: f + class(psb_s_base_sparse_mat), optional :: amold + class(psb_s_base_vect_type), optional :: vmold + class(psb_i_base_vect_type), optional :: imold + integer(psb_ipk_), optional :: partition, nrl,iv(:) + logical, optional :: tnd + ! Local variables. + + integer(psb_ipk_), parameter :: nb=20 + type(psb_s_csc_sparse_mat) :: acsc + type(psb_s_coo_sparse_mat) :: acoo + type(psb_s_csr_sparse_mat) :: acsr + real(psb_spk_) :: zt(nb) + real(psb_spk_) :: x,y,z + integer(psb_ipk_) :: nnz,nr,nlr,i,j,ii,ib,k, partition_ + integer(psb_lpk_) :: m,n,glob_row,nt + integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner + ! For 3D partition + ! Note: integer control variables going directly into an MPI call + ! must be 4 bytes, i.e. psb_mpk_ + integer(psb_mpk_) :: npdims(3), npp, minfo + integer(psb_ipk_) :: npx,npy,npz, iamx,iamy,iamz,mynx,myny,mynz + integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) + ! Process grid + integer(psb_ipk_) :: np, iam, nth + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + real(psb_spk_), allocatable :: val(:) + ! deltah dimension of each grid cell + ! deltat discretization time + real(psb_spk_) :: deltah, sqdeltah, deltah2 + real(psb_spk_), parameter :: rhs=szero,one=sone,zero=szero + real(psb_spk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + procedure(s_func_3d), pointer :: f_ + logical :: tnd_ + character(len=20) :: name, ch_err,tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, iam, np) + + + if (present(f)) then + f_ => f + else + f_ => s_null_func_3d + end if + + deltah = sone/(idim+1) + sqdeltah = deltah*deltah + deltah2 = (2*sone)* deltah + + if (present(partition)) then + if ((1<= partition).and.(partition <= 3)) then + partition_ = partition + else + write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' + partition_ = 3 + end if + else + partition_ = 3 + end if + + tnd_ = .false. + if (present(tnd)) tnd_ = tnd + + ! initialize array descriptor and sparse matrix storage. provide an + ! estimate of the number of non zeroes + + m = (1_psb_lpk_*idim)*idim*idim + n = m + nnz = ((n*7)/(np)) + if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + t0 = psb_wtime() + select case(partition_) + case(1) + ! A BLOCK partition + if (present(nrl)) then + nr = nrl + else + ! + ! Using a simple BLOCK distribution. + ! + nt = (m+np-1)/np + nr = max(0,min(nt,m-(iam*nt))) + end if + + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! First example of use of CDALL: specify for each process a number of + ! contiguous rows + ! + call psb_cdall(ctxt,desc_a,info,nl=nr) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(2) + ! A partition defined by the user through IV + + if (present(iv)) then + if (size(iv) /= m) then + write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + else + write(psb_err_unit,*) iam, 'Initialization error: IV not present' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! Second example of use of CDALL: specify for each row the + ! process that owns it + ! + call psb_cdall(ctxt,desc_a,info,vg=iv) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(3) + ! A 3-dimensional partition + + ! A nifty MPI function will split the process list + npdims = 0 + call mpi_dims_create(np,3,npdims,info) + npx = npdims(1) + npy = npdims(2) + npz = npdims(3) + + allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) + ! We can reuse idx2ijk for process indices as well. + call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) + ! Now let's split the 3D cube in hexahedra + call dist1Didx(bndx,idim,npx) + mynx = bndx(iamx+1)-bndx(iamx) + call dist1Didx(bndy,idim,npy) + myny = bndy(iamy+1)-bndy(iamy) + call dist1Didx(bndz,idim,npz) + mynz = bndz(iamz+1)-bndz(iamz) + + ! How many indices do I own? + nlr = mynx*myny*mynz + allocate(myidx(nlr)) + ! Now, let's generate the list of indices I own + nr = 0 + do i=bndx(iamx),bndx(iamx+1)-1 + do j=bndy(iamy),bndy(iamy+1)-1 + do k=bndz(iamz),bndz(iamz+1)-1 + nr = nr + 1 + call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) + end do + end do + end do + if (nr /= nlr) then + write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& + & nr,nlr,mynx,myny,mynz + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + end if + + ! + ! Third example of use of CDALL: specify for each process + ! the set of global indices it owns. + ! + call psb_cdall(ctxt,desc_a,info,vl=myidx) + + case default + write(psb_err_unit,*) iam, 'Initialization error: should not get here' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end select + + + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz) + ! define rhs from boundary conditions; also build initial guess + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + ! we build an auxiliary matrix consisting of one row at a + ! time; just a small matrix. might be extended to generate + ! a bunch of rows per call. + ! + allocate(val(20*nb),irow(20*nb),& + &icol(20*nb),stat=info) + if (info /= psb_success_ ) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + + ! loop over rows belonging to current process in a block + ! distribution. + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + ! local matrix pointer + glob_row=myidx(i) + ! compute gridpoint coordinates + call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) + ! x, y, z coordinates + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = f_(x,y,z) + ! internal point: build discretization + ! + ! term depending on (x-1,y,z) + ! + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = g(szero,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y-1,z) + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = g(x,szero,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y,z-1) + val(icoeff)=-a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = g(x,y,szero)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + ! term depending on (x,y,z) + val(icoeff)=(2*sone)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & + & + c(x,y,z) + call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + ! term depending on (x,y,z+1) + val(icoeff)=-a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = g(x,y,sone)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y+1,z) + val(icoeff)=-a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = g(x,sone,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x+1,y,z) + val(icoeff)=-a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix==idim) then + zt(k) = g(sone,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + end do + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + if(info /= psb_success_) exit + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + if(info /= psb_success_) exit + zt(:)=szero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + if(info /= psb_success_) exit + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + if (present(imold)) then + call psb_cdasb(desc_a,info,mold=imold) + else + call psb_cdasb(desc_a,info) + end if + tcdasb = psb_wtime()-t1 + call psb_barrier(ctxt) + t1 = psb_wtime() + if (info == psb_success_) then + if (present(amold)) then + call psb_spasb(a,desc_a,info,mold=amold) + else + call psb_spasb(a,desc_a,info,afmt=afmt) + end if + end if + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) then + if (present(vmold)) then + call psb_geasb(xv,desc_a,info,mold=vmold) + if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) + else + call psb_geasb(xv,desc_a,info) + if (info == psb_success_) call psb_geasb(bv,desc_a,info) + end if + end if + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(iam == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")')& + & tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + + end if + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psb_s_gen_pde3d + + subroutine run_spmv_kernel(ctxt,use_gpu,matrix_file,matrix_fmt,cpu_fmt,gpu_fmt,idim_in,times_in,do_swap,comm_mode) + use psb_base_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + implicit none + + type(psb_ctxt_type), intent(in) :: ctxt + logical, intent(in) :: use_gpu + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + character(len=*), intent(in) :: cpu_fmt + character(len=*), intent(in) :: gpu_fmt + integer(psb_ipk_), intent(in) :: idim_in, times_in + logical, intent(in) :: do_swap + character(len=*), intent(in) :: comm_mode + + type(psb_sspmat_type) :: a + type(psb_s_vect_type) :: x, y + type(psb_desc_type) :: desc_a + character(len=8) :: afmt + character(len=64) :: env_buf + integer(psb_ipk_) :: my_rank, np, info, err_act + integer(psb_ipk_) :: idim, times, i + integer :: env_len, env_status, ios + real(psb_spk_) :: alpha, beta + real(psb_spk_) :: t0, t1, dt, avg_t + logical :: use_external_matrix + + integer(psb_ipk_) :: comm_type + +#ifdef PSB_HAVE_CUDA + type(psb_s_vect_cuda) :: cuda_vector_mold + type(psb_i_vect_cuda) :: cuda_index_mold + type(psb_s_cuda_elg_sparse_mat), target :: cuda_ell_sparse_mold + type(psb_s_cuda_csrg_sparse_mat), target :: cuda_csr_sparse_mold + type(psb_s_cuda_hdiag_sparse_mat), target :: cuda_hdia_sparse_mold + type(psb_s_cuda_hlg_sparse_mat), target :: cuda_hll_sparse_mold + class(psb_s_base_sparse_mat), pointer :: cuda_sparse_mold +#endif + + select case(psb_toupper(trim(comm_mode))) + case('P2P','ISEND_IRECV') + comm_type = psb_comm_isend_irecv_ + case('NEIGHBOR','INEIGHBOR_ALLTOALLV') + comm_type = psb_comm_ineighbor_alltoallv_ + case('PNEIGHBOR','PERSISTENT','PERSISTENT_INEIGHBOR_A2AV') + comm_type = psb_comm_persistent_ineighbor_alltoallv_ + case('MPI_GET','RMA_PULL') + comm_type = psb_comm_rma_pull_ + case('MPI_PUT','RMA_PUSH') + comm_type = psb_comm_rma_push_ + case default + comm_type = psb_comm_isend_irecv_ + if (my_rank == psb_root_) then + write(psb_err_unit,'("Unknown comm backend: ",a,", defaulting to P2P")') trim(comm_mode) + end if + end select + + info = psb_success_ + afmt = psb_toupper(trim(cpu_fmt)) + if (len_trim(afmt) == 0) afmt = 'CSR' + if (idim_in > 0) then + idim = idim_in + else + idim = 10 + end if + + if (times_in > 0) then + times = times_in + else + times = 100 + end if + alpha = sone + beta = szero + + call psb_erractionsave(err_act) + call psb_info(ctxt, my_rank, np) + use_external_matrix = (len_trim(matrix_file) > 0) + + if (idim_in <= 0) then + call get_environment_variable('IDIM', env_buf, length=env_len, status=env_status) + if ((env_status == 0) .and. (env_len > 0)) then + read(env_buf(1:env_len), *, iostat=ios) idim + if ((ios /= 0) .or. (idim < 2)) idim = 10 + end if + end if + + if (times_in <= 0) then + call get_environment_variable('TIMES', env_buf, length=env_len, status=env_status) + if ((env_status == 0) .and. (env_len > 0)) then + read(env_buf(1:env_len), *, iostat=ios) times + if ((ios /= 0) .or. (times < 1)) times = 100 + end if + end if + + call psb_barrier(ctxt) + if (use_external_matrix) then + call load_external_matrix(ctxt, matrix_file, matrix_fmt, a, y, x, desc_a, afmt, info) + else + call psb_s_gen_pde3d(ctxt,idim,a,y,x,desc_a,afmt,info) + end if + if (info /= psb_success_) goto 9999 + + call psb_comm_set(comm_type,x%v%comm_handle,info) + if (info /= psb_success_) goto 9999 + +#ifdef PSB_HAVE_CUDA + if (use_gpu) then + select case(psb_toupper(trim(gpu_fmt))) + case('ELG') + cuda_sparse_mold => cuda_ell_sparse_mold + case('CSRG') + cuda_sparse_mold => cuda_csr_sparse_mold + case('HDIAG','HDIA') + cuda_sparse_mold => cuda_hdia_sparse_mold + case default + cuda_sparse_mold => cuda_hll_sparse_mold + end select + call a%cscnv(info,mold=cuda_sparse_mold) + if (info /= psb_success_) goto 9999 + call desc_a%cnv(mold=cuda_index_mold) + if (info /= psb_success_) goto 9999 + call x%cnv(mold=cuda_vector_mold) + if (info /= psb_success_) goto 9999 + call y%cnv(mold=cuda_vector_mold) + if (info /= psb_success_) goto 9999 + end if +#endif + + ! warm-up + call psb_spmm(alpha, a, x, beta, y, desc_a, info, doswap=do_swap) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + t0 = psb_wtime() + do i = 1, times + call psb_spmm(alpha, a, x, beta, y, desc_a, info, doswap=do_swap) + if (info /= psb_success_) exit + end do + t1 = psb_wtime() + if (info /= psb_success_) goto 9999 + + dt = t1 - t0 + call psb_amx(ctxt, dt) + avg_t = dt / real(times, psb_spk_) + + if (my_rank == psb_root_) then + if (do_swap) then + write(psb_out_unit,'(/,"SpMV benchmark (overlap)")') + else + write(psb_out_unit,'(/,"SpMV benchmark (no overlap)")') + end if + write(psb_out_unit,'(" cpu matrix fmt : ",a)') trim(afmt) + if (use_gpu) write(psb_out_unit,'(" gpu matrix fmt : ",a)') trim(psb_toupper(trim(gpu_fmt))) + if (use_external_matrix) then + write(psb_out_unit,'(" matrix file : ",a)') trim(matrix_file) + write(psb_out_unit,'(" matrix format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'(" idim : ",i0)') idim + end if + write(psb_out_unit,'(" global non zeros : ",i0)') a%get_nzeros() + write(psb_out_unit,'(" global rows : ",i0)') a%get_nrows() + write(psb_out_unit,'(" global cols : ",i0)') a%get_ncols() + write(psb_out_unit,'(" repetitions : ",i0)') times + write(psb_out_unit,'(" comm backend : ",a)') trim(psb_toupper(trim(comm_mode))) + write(psb_out_unit,'(" total time [s] : ",es12.5)') dt + write(psb_out_unit,'(" avg time [s] : ",es12.5)') avg_t + end if + + call psb_gefree(y, desc_a, info) + call psb_gefree(x, desc_a, info) + call psb_spfree(a, desc_a, info) + call psb_cdfree(desc_a, info) + call psb_erractionrestore(err_act) + return + +9999 call psb_error(ctxt) + call psb_error_handler(ctxt, err_act) + end subroutine run_spmv_kernel + + subroutine load_external_matrix(ctxt, matrix_file, matrix_fmt, a, bv, xv, desc_a, afmt, info) + type(psb_ctxt_type), intent(in) :: ctxt + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + type(psb_sspmat_type), intent(out) :: a + type(psb_s_vect_type), intent(out) :: bv, xv + type(psb_desc_type), intent(out) :: desc_a + character(len=*), intent(in) :: afmt + integer(psb_ipk_), intent(out) :: info + + type(psb_lsspmat_type) :: aux_a + real(psb_spk_), allocatable :: rhs_glob(:), x_glob(:) + integer(psb_lpk_) :: nrows, ncols + + info = psb_success_ + + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + return + end select + if (info /= psb_success_) return + + nrows = aux_a%get_nrows() + ncols = aux_a%get_ncols() + if (nrows /= ncols) then + write(psb_err_unit,'("Input matrix must be square: ",a)') trim(matrix_file) + info = psb_err_internal_error_ + return + end if + + call psb_matdist(aux_a, a, ctxt, desc_a, info, fmt=afmt, parts=part_block) + if (info /= psb_success_) return + + call psb_geall(xv,desc_a,info) + if (info /= psb_success_) return + call psb_geall(bv,desc_a,info) + if (info /= psb_success_) return + + allocate(rhs_glob(nrows), x_glob(ncols), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + return + end if + rhs_glob = sone + x_glob = szero + + call psb_scatter(rhs_glob,bv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + call psb_scatter(x_glob,xv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + + deallocate(rhs_glob, x_glob) + end subroutine load_external_matrix + +end module psb_sspmv_overlap_test + +program psb_s_spmv_kernel + use psb_sspmv_overlap_test + use psb_base_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + implicit none + + type(psb_ctxt_type) :: ctxt + logical :: use_gpu + integer(psb_ipk_) :: my_rank, np, k + integer :: ios + character(len=256) :: arg + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + character(len=8) :: cpu_fmt + character(len=8) :: gpu_fmt + integer(psb_ipk_) :: idim_arg, times_arg + logical :: do_overlap + integer :: kmode + integer, parameter :: n_comm_modes = 5 + character(len=20), parameter :: comm_modes(n_comm_modes) = [character(len=20) :: & + & 'P2P', 'NEIGHBOR', 'PNEIGHBOR', 'MPI_GET', 'MPI_PUT'] + + idim_arg = -1 + times_arg = -1 + + matrix_file = '' + matrix_fmt = 'MM' + cpu_fmt = 'CSR' + gpu_fmt = 'HLG' + do_overlap = .true. + + call psb_init(ctxt) + call psb_info(ctxt, my_rank, np) + +#ifdef PSB_HAVE_CUDA + use_gpu = .true. +#else + use_gpu = .false. +#endif + + do k = 1, command_argument_count() + call get_command_argument(k, arg) + if (index(psb_toupper(trim(arg)), '--GPU=') == 1) then + select case (psb_toupper(adjustl(arg(7:len_trim(arg))))) + case ('TRUE','T','1','YES','Y','ON') + use_gpu = .true. + case ('FALSE','F','0','NO','N','OFF') + use_gpu = .false. + end select + else if (index(psb_toupper(trim(arg)), '--MATRIX=') == 1) then + matrix_file = adjustl(arg(10:len_trim(arg))) + else if (index(psb_toupper(trim(arg)), '--FMT=') == 1) then + arg = psb_toupper(adjustl(arg(7:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (index(psb_toupper(trim(arg)), '--MTX_FMT=') == 1) then + arg = psb_toupper(adjustl(arg(10:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (index(psb_toupper(trim(arg)), '--DIM=') == 1) then + read(arg(7:len_trim(arg)),*,iostat=ios) idim_arg + if ((ios /= 0) .or. (idim_arg < 2)) idim_arg = -1 + else if (index(psb_toupper(trim(arg)), '--TIMES=') == 1) then + read(arg(9:len_trim(arg)),*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + else if (index(psb_toupper(trim(arg)), '--ITERS=') == 1) then + read(arg(9:len_trim(arg)),*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + else if (index(psb_toupper(trim(arg)), '--CPU_FORMAT=') == 1) then + cpu_fmt = psb_toupper(adjustl(arg(14:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--CPU_FMT=') == 1) then + cpu_fmt = psb_toupper(adjustl(arg(11:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--GPU_FORMAT=') == 1) then + gpu_fmt = psb_toupper(adjustl(arg(14:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--GPU_FMT=') == 1) then + gpu_fmt = psb_toupper(adjustl(arg(11:len_trim(arg)))) + else if ((trim(psb_toupper(arg)) == '--NOOVERLAP') .or. (trim(psb_toupper(arg)) == '--NO_OVERLAP')) then + do_overlap = .false. + else if ((trim(psb_toupper(arg)) == '--OVERLAP') .or. (trim(psb_toupper(arg)) == '--SWAP')) then + do_overlap = .true. + else if (trim(psb_toupper(arg)) == '--MATRIX') then + if (k < command_argument_count()) call get_command_argument(k+1,matrix_file) + else if (trim(psb_toupper(arg)) == '--FMT') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + else if (trim(psb_toupper(arg)) == '--MTX_FMT') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + else if (trim(psb_toupper(arg)) == '--DIM') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + read(arg,*,iostat=ios) idim_arg + if ((ios /= 0) .or. (idim_arg < 2)) idim_arg = -1 + end if + else if ((trim(psb_toupper(arg)) == '--TIMES') .or. (trim(psb_toupper(arg)) == '--ITERS')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + read(arg,*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + end if + else if ((trim(psb_toupper(arg)) == '--CPU_FORMAT') .or. (trim(psb_toupper(arg)) == '--CPU_FMT')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + cpu_fmt = psb_toupper(trim(arg)) + end if + else if ((trim(psb_toupper(arg)) == '--GPU_FORMAT') .or. (trim(psb_toupper(arg)) == '--GPU_FMT')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + gpu_fmt = psb_toupper(trim(arg)) + end if + end if + end do + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_init(ctxt) +#else + use_gpu = .false. +#endif + + if (my_rank == psb_root_) then + write(psb_out_unit,*) 'Welcome to PSBLAS version: ', psb_version_string_ + write(psb_out_unit,*) 'This is the psb_s_spmv_kernel sample program' + write(psb_out_unit,'("GPU enabled : ",l1)') use_gpu + write(psb_out_unit,'("Usage: ./psb_s_spmv_kernel [--gpu=TRUE|FALSE] [--dim=N] [--times=N] ",& + &"[--cpu_fmt=CSR|COO|CSC|ELL|HLL] [--gpu_fmt=HLL|ELL|CSR|HDIA] [--matrix=] [--fmt=MM|HB] ",& + &"[--overlap|--nooverlap] (runs all comm backends)")') + end if + + do kmode = 1, n_comm_modes + if (my_rank == psb_root_) then + write(psb_out_unit,'(/,"=== Backend sweep: ",a," ===")') trim(comm_modes(kmode)) + end if + call run_spmv_kernel(ctxt, use_gpu, matrix_file, matrix_fmt, cpu_fmt, gpu_fmt, & + & idim_arg, times_arg, do_overlap, comm_modes(kmode)) + end do + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_exit() +#endif + call psb_exit(ctxt) +end program psb_s_spmv_kernel diff --git a/test/comm/spmv/psb_spmv_test.f90 b/test/comm/spmv/psb_spmv_test.f90 new file mode 100644 index 000000000..5efae0077 --- /dev/null +++ b/test/comm/spmv/psb_spmv_test.f90 @@ -0,0 +1,915 @@ +!> Test program for overlapping communication and computation with psb_spmm. +!! +!! +module psb_spmv_overlap_test + + use psb_base_mod + use psb_util_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + + implicit none + + interface + function d_func_3d(x,y,z) result(val) + import :: psb_dpk_ + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + end function d_func_3d + end interface + +contains + + + function d_null_func_3d(x,y,z) result(val) + + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + + val = dzero + + end function d_null_func_3d + ! + ! functions parametrizing the differential equation + ! + + ! + ! Note: b1, b2 and b3 are the coefficients of the first + ! derivative of the unknown function. The default + ! we apply here is to have them zero, so that the resulting + ! matrix is symmetric/hermitian and suitable for + ! testing with CG and FCG. + ! When testing methods for non-hermitian matrices you can + ! change the B1/B2/B3 functions to e.g. done/sqrt((3*done)) + ! + function b1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b1 + real(psb_dpk_), intent(in) :: x,y,z + b1=dzero + end function b1 + function b2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b2 + real(psb_dpk_), intent(in) :: x,y,z + b2=dzero + end function b2 + function b3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b3 + real(psb_dpk_), intent(in) :: x,y,z + b3=dzero + end function b3 + function c(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: c + real(psb_dpk_), intent(in) :: x,y,z + c=dzero + end function c + function a1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a1 + real(psb_dpk_), intent(in) :: x,y,z + a1=done/80 + end function a1 + function a2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a2 + real(psb_dpk_), intent(in) :: x,y,z + a2=done/80 + end function a2 + function a3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a3 + real(psb_dpk_), intent(in) :: x,y,z + a3=done/80 + end function a3 + function g(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: g + real(psb_dpk_), intent(in) :: x,y,z + g = dzero + if (x == done) then + g = done + else if (x == dzero) then + g = exp(y**2-z**2) + end if + end function g + + ! + ! subroutine to allocate and fill in the coefficient matrix and + ! the rhs. + ! + subroutine psb_d_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info,& + & f,amold,vmold,imold,partition,nrl,iv,tnd) + use psb_base_mod + use psb_util_mod + ! + ! Discretizes the partial differential equation + ! + ! a1 dd(u) a2 dd(u) a3 dd(u) b1 d(u) b2 d(u) b3 d(u) + ! - ------ - ------ - ------ + ----- + ------ + ------ + c u = f + ! dxdx dydy dzdz dx dy dz + ! + ! with Dirichlet boundary conditions + ! u = g + ! + ! on the unit cube 0<=x,y,z<=1. + ! + ! + ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. + ! + implicit none + integer(psb_ipk_) :: idim + type(psb_dspmat_type) :: a + type(psb_d_vect_type) :: xv,bv + type(psb_desc_type) :: desc_a + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: info + character(len=*) :: afmt + procedure(d_func_3d), optional :: f + class(psb_d_base_sparse_mat), optional :: amold + class(psb_d_base_vect_type), optional :: vmold + class(psb_i_base_vect_type), optional :: imold + integer(psb_ipk_), optional :: partition, nrl,iv(:) + logical, optional :: tnd + ! Local variables. + + integer(psb_ipk_), parameter :: nb=20 + type(psb_d_csc_sparse_mat) :: acsc + type(psb_d_coo_sparse_mat) :: acoo + type(psb_d_csr_sparse_mat) :: acsr + real(psb_dpk_) :: zt(nb),x,y,z + integer(psb_ipk_) :: nnz,nr,nlr,i,j,ii,ib,k, partition_ + integer(psb_lpk_) :: m,n,glob_row,nt + integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner + ! For 3D partition + ! Note: integer control variables going directly into an MPI call + ! must be 4 bytes, i.e. psb_mpk_ + integer(psb_mpk_) :: npdims(3), npp, minfo + integer(psb_ipk_) :: npx,npy,npz, iamx,iamy,iamz,mynx,myny,mynz + integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) + ! Process grid + integer(psb_ipk_) :: np, iam, nth + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + real(psb_dpk_), allocatable :: val(:) + ! deltah dimension of each grid cell + ! deltat discretization time + real(psb_dpk_) :: deltah, sqdeltah, deltah2 + real(psb_dpk_), parameter :: rhs=dzero,one=done,zero=dzero + real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + procedure(d_func_3d), pointer :: f_ + logical :: tnd_ + character(len=20) :: name, ch_err,tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, iam, np) + + + if (present(f)) then + f_ => f + else + f_ => d_null_func_3d + end if + + deltah = done/(idim+1) + sqdeltah = deltah*deltah + deltah2 = (2*done)* deltah + + if (present(partition)) then + if ((1<= partition).and.(partition <= 3)) then + partition_ = partition + else + write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' + partition_ = 3 + end if + else + partition_ = 3 + end if + + tnd_ = .false. + if (present(tnd)) tnd_ = tnd + + ! initialize array descriptor and sparse matrix storage. provide an + ! estimate of the number of non zeroes + + m = (1_psb_lpk_*idim)*idim*idim + n = m + nnz = ((n*7)/(np)) + if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + t0 = psb_wtime() + select case(partition_) + case(1) + ! A BLOCK partition + if (present(nrl)) then + nr = nrl + else + ! + ! Using a simple BLOCK distribution. + ! + nt = (m+np-1)/np + nr = max(0,min(nt,m-(iam*nt))) + end if + + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! First example of use of CDALL: specify for each process a number of + ! contiguous rows + ! + call psb_cdall(ctxt,desc_a,info,nl=nr) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(2) + ! A partition defined by the user through IV + + if (present(iv)) then + if (size(iv) /= m) then + write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + else + write(psb_err_unit,*) iam, 'Initialization error: IV not present' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! Second example of use of CDALL: specify for each row the + ! process that owns it + ! + call psb_cdall(ctxt,desc_a,info,vg=iv) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(3) + ! A 3-dimensional partition + + ! A nifty MPI function will split the process list + npdims = 0 + call mpi_dims_create(np,3,npdims,info) + npx = npdims(1) + npy = npdims(2) + npz = npdims(3) + + allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) + ! We can reuse idx2ijk for process indices as well. + call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) + ! Now let's split the 3D cube in hexahedra + call dist1Didx(bndx,idim,npx) + mynx = bndx(iamx+1)-bndx(iamx) + call dist1Didx(bndy,idim,npy) + myny = bndy(iamy+1)-bndy(iamy) + call dist1Didx(bndz,idim,npz) + mynz = bndz(iamz+1)-bndz(iamz) + + ! How many indices do I own? + nlr = mynx*myny*mynz + allocate(myidx(nlr)) + ! Now, let's generate the list of indices I own + nr = 0 + do i=bndx(iamx),bndx(iamx+1)-1 + do j=bndy(iamy),bndy(iamy+1)-1 + do k=bndz(iamz),bndz(iamz+1)-1 + nr = nr + 1 + call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) + end do + end do + end do + if (nr /= nlr) then + write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& + & nr,nlr,mynx,myny,mynz + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + end if + + ! + ! Third example of use of CDALL: specify for each process + ! the set of global indices it owns. + ! + call psb_cdall(ctxt,desc_a,info,vl=myidx) + + case default + write(psb_err_unit,*) iam, 'Initialization error: should not get here' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end select + + + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz) + ! define rhs from boundary conditions; also build initial guess + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + ! we build an auxiliary matrix consisting of one row at a + ! time; just a small matrix. might be extended to generate + ! a bunch of rows per call. + ! + allocate(val(20*nb),irow(20*nb),& + &icol(20*nb),stat=info) + if (info /= psb_success_ ) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + + ! loop over rows belonging to current process in a block + ! distribution. + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + ! local matrix pointer + glob_row=myidx(i) + ! compute gridpoint coordinates + call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) + ! x, y, z coordinates + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = f_(x,y,z) + ! internal point: build discretization + ! + ! term depending on (x-1,y,z) + ! + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = g(dzero,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y-1,z) + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = g(x,dzero,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y,z-1) + val(icoeff)=-a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = g(x,y,dzero)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + ! term depending on (x,y,z) + val(icoeff)=(2*done)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & + & + c(x,y,z) + call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + ! term depending on (x,y,z+1) + val(icoeff)=-a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = g(x,y,done)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y+1,z) + val(icoeff)=-a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = g(x,done,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x+1,y,z) + val(icoeff)=-a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix==idim) then + zt(k) = g(done,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + end do + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + if(info /= psb_success_) exit + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + if(info /= psb_success_) exit + zt(:)=dzero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + if(info /= psb_success_) exit + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + if (present(imold)) then + call psb_cdasb(desc_a,info,mold=imold) + else + call psb_cdasb(desc_a,info) + end if + tcdasb = psb_wtime()-t1 + call psb_barrier(ctxt) + t1 = psb_wtime() + if (info == psb_success_) then + if (present(amold)) then + call psb_spasb(a,desc_a,info,mold=amold) + else + call psb_spasb(a,desc_a,info,afmt=afmt) + end if + end if + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) then + if (present(vmold)) then + call psb_geasb(xv,desc_a,info,mold=vmold) + if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) + else + call psb_geasb(xv,desc_a,info) + if (info == psb_success_) call psb_geasb(bv,desc_a,info) + end if + end if + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(iam == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")')& + & tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + + end if + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psb_d_gen_pde3d + + subroutine run_spmv_kernel(ctxt,use_gpu,matrix_file,matrix_fmt,cpu_fmt,gpu_fmt,idim_in,times_in,do_swap,comm_mode) + use psb_base_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + implicit none + + type(psb_ctxt_type), intent(in) :: ctxt + logical, intent(in) :: use_gpu + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + character(len=*), intent(in) :: cpu_fmt + character(len=*), intent(in) :: gpu_fmt + integer(psb_ipk_), intent(in) :: idim_in, times_in + logical, intent(in) :: do_swap + character(len=*), intent(in) :: comm_mode + + type(psb_dspmat_type) :: a + type(psb_d_vect_type) :: x, y + type(psb_desc_type) :: desc_a + character(len=8) :: afmt + character(len=64) :: env_buf + integer(psb_ipk_) :: my_rank, np, info, err_act + integer(psb_ipk_) :: idim, times, i + integer :: env_len, env_status, ios + real(psb_dpk_) :: alpha, beta, t0, t1, dt, avg_t + logical :: use_external_matrix + + integer(psb_ipk_) :: comm_type + +#ifdef PSB_HAVE_CUDA + type(psb_d_vect_cuda) :: cuda_vector_mold + type(psb_i_vect_cuda) :: cuda_index_mold + type(psb_d_cuda_elg_sparse_mat), target :: cuda_ell_sparse_mold + type(psb_d_cuda_csrg_sparse_mat), target :: cuda_csr_sparse_mold + type(psb_d_cuda_hdiag_sparse_mat), target :: cuda_hdia_sparse_mold + type(psb_d_cuda_hlg_sparse_mat), target :: cuda_hll_sparse_mold + class(psb_d_base_sparse_mat), pointer :: cuda_sparse_mold +#endif + + select case(psb_toupper(trim(comm_mode))) + case('P2P','ISEND_IRECV') + comm_type = psb_comm_isend_irecv_ + case('NEIGHBOR','INEIGHBOR_ALLTOALLV') + comm_type = psb_comm_ineighbor_alltoallv_ + case('PNEIGHBOR','PERSISTENT','PERSISTENT_INEIGHBOR_A2AV') + comm_type = psb_comm_persistent_ineighbor_alltoallv_ + case('MPI_GET','RMA_PULL') + comm_type = psb_comm_rma_pull_ + case('MPI_PUT','RMA_PUSH') + comm_type = psb_comm_rma_push_ + case default + comm_type = psb_comm_isend_irecv_ + if (my_rank == psb_root_) then + write(psb_err_unit,'("Unknown comm backend: ",a,", defaulting to P2P")') trim(comm_mode) + end if + end select + + info = psb_success_ + afmt = psb_toupper(trim(cpu_fmt)) + if (len_trim(afmt) == 0) afmt = 'CSR' + if (idim_in > 0) then + idim = idim_in + else + idim = 10 + end if + + if (times_in > 0) then + times = times_in + else + times = 100 + end if + alpha = done + beta = dzero + + call psb_erractionsave(err_act) + call psb_info(ctxt, my_rank, np) + use_external_matrix = (len_trim(matrix_file) > 0) + + if (idim_in <= 0) then + call get_environment_variable('IDIM', env_buf, length=env_len, status=env_status) + if ((env_status == 0) .and. (env_len > 0)) then + read(env_buf(1:env_len), *, iostat=ios) idim + if ((ios /= 0) .or. (idim < 2)) idim = 10 + end if + end if + + if (times_in <= 0) then + call get_environment_variable('TIMES', env_buf, length=env_len, status=env_status) + if ((env_status == 0) .and. (env_len > 0)) then + read(env_buf(1:env_len), *, iostat=ios) times + if ((ios /= 0) .or. (times < 1)) times = 100 + end if + end if + + call psb_barrier(ctxt) + if (use_external_matrix) then + call load_external_matrix(ctxt, matrix_file, matrix_fmt, a, y, x, desc_a, afmt, info) + else + call psb_d_gen_pde3d(ctxt,idim,a,y,x,desc_a,afmt,info) + end if + if (info /= psb_success_) goto 9999 + + call psb_comm_set(comm_type,x%v%comm_handle,info) + if (info /= psb_success_) goto 9999 + +#ifdef PSB_HAVE_CUDA + if (use_gpu) then + select case(psb_toupper(trim(gpu_fmt))) + case('ELG') + cuda_sparse_mold => cuda_ell_sparse_mold + case('CSRG') + cuda_sparse_mold => cuda_csr_sparse_mold + case('HDIAG','HDIA') + cuda_sparse_mold => cuda_hdia_sparse_mold + case default + cuda_sparse_mold => cuda_hll_sparse_mold + end select + call a%cscnv(info,mold=cuda_sparse_mold) + if (info /= psb_success_) goto 9999 + call desc_a%cnv(mold=cuda_index_mold) + if (info /= psb_success_) goto 9999 + call x%cnv(mold=cuda_vector_mold) + if (info /= psb_success_) goto 9999 + call y%cnv(mold=cuda_vector_mold) + if (info /= psb_success_) goto 9999 + end if +#endif + + ! warm-up + call psb_spmm(alpha, a, x, beta, y, desc_a, info, doswap=do_swap) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + t0 = psb_wtime() + do i = 1, times + call psb_spmm(alpha, a, x, beta, y, desc_a, info, doswap=do_swap) + if (info /= psb_success_) exit + end do + t1 = psb_wtime() + if (info /= psb_success_) goto 9999 + + dt = t1 - t0 + call psb_amx(ctxt, dt) + avg_t = dt / real(times, psb_dpk_) + + if (my_rank == psb_root_) then + if (do_swap) then + write(psb_out_unit,'(/,"SpMV benchmark (overlap)")') + else + write(psb_out_unit,'(/,"SpMV benchmark (no overlap)")') + end if + write(psb_out_unit,'(" cpu matrix fmt : ",a)') trim(afmt) + if (use_gpu) write(psb_out_unit,'(" gpu matrix fmt : ",a)') trim(psb_toupper(trim(gpu_fmt))) + if (use_external_matrix) then + write(psb_out_unit,'(" matrix file : ",a)') trim(matrix_file) + write(psb_out_unit,'(" matrix format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'(" idim : ",i0)') idim + end if + write(psb_out_unit,'(" global non zeros : ",i0)') a%get_nzeros() + write(psb_out_unit,'(" global rows : ",i0)') a%get_nrows() + write(psb_out_unit,'(" global cols : ",i0)') a%get_ncols() + write(psb_out_unit,'(" repetitions : ",i0)') times + write(psb_out_unit,'(" comm backend : ",a)') trim(psb_toupper(trim(comm_mode))) + write(psb_out_unit,'(" total time [s] : ",es12.5)') dt + write(psb_out_unit,'(" avg time [s] : ",es12.5)') avg_t + end if + + call psb_gefree(y, desc_a, info) + call psb_gefree(x, desc_a, info) + call psb_spfree(a, desc_a, info) + call psb_cdfree(desc_a, info) + call psb_erractionrestore(err_act) + return + +9999 call psb_error(ctxt) + call psb_error_handler(ctxt, err_act) + end subroutine run_spmv_kernel + + subroutine load_external_matrix(ctxt, matrix_file, matrix_fmt, a, bv, xv, desc_a, afmt, info) + type(psb_ctxt_type), intent(in) :: ctxt + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + type(psb_dspmat_type), intent(out) :: a + type(psb_d_vect_type), intent(out) :: bv, xv + type(psb_desc_type), intent(out) :: desc_a + character(len=*), intent(in) :: afmt + integer(psb_ipk_), intent(out) :: info + + type(psb_ldspmat_type) :: aux_a + real(psb_dpk_), allocatable :: rhs_glob(:), x_glob(:) + integer(psb_lpk_) :: nrows, ncols + + info = psb_success_ + + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + return + end select + if (info /= psb_success_) return + + nrows = aux_a%get_nrows() + ncols = aux_a%get_ncols() + if (nrows /= ncols) then + write(psb_err_unit,'("Input matrix must be square: ",a)') trim(matrix_file) + info = psb_err_internal_error_ + return + end if + + call psb_matdist(aux_a, a, ctxt, desc_a, info, fmt=afmt, parts=part_block) + if (info /= psb_success_) return + + call psb_geall(xv,desc_a,info) + if (info /= psb_success_) return + call psb_geall(bv,desc_a,info) + if (info /= psb_success_) return + + allocate(rhs_glob(nrows), x_glob(ncols), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + return + end if + rhs_glob = done + x_glob = dzero + + call psb_scatter(rhs_glob,bv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + call psb_scatter(x_glob,xv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + + deallocate(rhs_glob, x_glob) + end subroutine load_external_matrix + +end module psb_spmv_overlap_test + +program psb_spmv_kernel + use psb_spmv_overlap_test + use psb_base_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + implicit none + + type(psb_ctxt_type) :: ctxt + logical :: use_gpu + integer(psb_ipk_) :: my_rank, np, k + integer :: ios + character(len=256) :: arg + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + character(len=8) :: cpu_fmt + character(len=8) :: gpu_fmt + integer(psb_ipk_) :: idim_arg, times_arg + logical :: do_overlap + integer :: kmode + integer, parameter :: n_comm_modes = 5 + character(len=20), parameter :: comm_modes(n_comm_modes) = [character(len=20) :: & + & 'P2P', 'NEIGHBOR', 'PNEIGHBOR', 'MPI_GET', 'MPI_PUT'] + + idim_arg = -1 + times_arg = -1 + + matrix_file = '' + matrix_fmt = 'MM' + cpu_fmt = 'CSR' + gpu_fmt = 'HLG' + do_overlap = .true. + + call psb_init(ctxt) + call psb_info(ctxt, my_rank, np) + +#ifdef PSB_HAVE_CUDA + use_gpu = .true. +#else + use_gpu = .false. +#endif + + do k = 1, command_argument_count() + call get_command_argument(k, arg) + if (index(psb_toupper(trim(arg)), '--GPU=') == 1) then + select case (psb_toupper(adjustl(arg(7:len_trim(arg))))) + case ('TRUE','T','1','YES','Y','ON') + use_gpu = .true. + case ('FALSE','F','0','NO','N','OFF') + use_gpu = .false. + end select + else if (index(psb_toupper(trim(arg)), '--MATRIX=') == 1) then + matrix_file = adjustl(arg(10:len_trim(arg))) + else if (index(psb_toupper(trim(arg)), '--FMT=') == 1) then + arg = psb_toupper(adjustl(arg(7:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (index(psb_toupper(trim(arg)), '--MTX_FMT=') == 1) then + arg = psb_toupper(adjustl(arg(10:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (index(psb_toupper(trim(arg)), '--DIM=') == 1) then + read(arg(7:len_trim(arg)),*,iostat=ios) idim_arg + if ((ios /= 0) .or. (idim_arg < 2)) idim_arg = -1 + else if (index(psb_toupper(trim(arg)), '--TIMES=') == 1) then + read(arg(9:len_trim(arg)),*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + else if (index(psb_toupper(trim(arg)), '--ITERS=') == 1) then + read(arg(9:len_trim(arg)),*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + else if (index(psb_toupper(trim(arg)), '--CPU_FORMAT=') == 1) then + cpu_fmt = psb_toupper(adjustl(arg(14:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--CPU_FMT=') == 1) then + cpu_fmt = psb_toupper(adjustl(arg(11:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--GPU_FORMAT=') == 1) then + gpu_fmt = psb_toupper(adjustl(arg(14:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--GPU_FMT=') == 1) then + gpu_fmt = psb_toupper(adjustl(arg(11:len_trim(arg)))) + else if ((trim(psb_toupper(arg)) == '--NOOVERLAP') .or. (trim(psb_toupper(arg)) == '--NO_OVERLAP')) then + do_overlap = .false. + else if ((trim(psb_toupper(arg)) == '--OVERLAP') .or. (trim(psb_toupper(arg)) == '--SWAP')) then + do_overlap = .true. + else if (trim(psb_toupper(arg)) == '--MATRIX') then + if (k < command_argument_count()) call get_command_argument(k+1,matrix_file) + else if (trim(psb_toupper(arg)) == '--FMT') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + else if (trim(psb_toupper(arg)) == '--MTX_FMT') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + else if (trim(psb_toupper(arg)) == '--DIM') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + read(arg,*,iostat=ios) idim_arg + if ((ios /= 0) .or. (idim_arg < 2)) idim_arg = -1 + end if + else if ((trim(psb_toupper(arg)) == '--TIMES') .or. (trim(psb_toupper(arg)) == '--ITERS')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + read(arg,*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + end if + else if ((trim(psb_toupper(arg)) == '--CPU_FORMAT') .or. (trim(psb_toupper(arg)) == '--CPU_FMT')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + cpu_fmt = psb_toupper(trim(arg)) + end if + else if ((trim(psb_toupper(arg)) == '--GPU_FORMAT') .or. (trim(psb_toupper(arg)) == '--GPU_FMT')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + gpu_fmt = psb_toupper(trim(arg)) + end if + end if + end do + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_init(ctxt) +#else + use_gpu = .false. +#endif + + if (my_rank == psb_root_) then + write(psb_out_unit,*) 'Welcome to PSBLAS version: ', psb_version_string_ + write(psb_out_unit,*) 'This is the psb_spmv_kernel sample program' + write(psb_out_unit,'("GPU enabled : ",l1)') use_gpu + write(psb_out_unit,'("Usage: ./psb_spmv_kernel [--gpu=TRUE|FALSE] [--dim=N] [--times=N] ",& + &"[--cpu_fmt=CSR|COO|CSC|ELL|HLL] [--gpu_fmt=HLL|ELL|CSR|HDIA] [--matrix=] [--fmt=MM|HB] ",& + &"[--overlap|--nooverlap] (runs all comm backends)")') + end if + + do kmode = 1, n_comm_modes + if (my_rank == psb_root_) then + write(psb_out_unit,'(/,"=== Backend sweep: ",a," ===")') trim(comm_modes(kmode)) + end if + call run_spmv_kernel(ctxt, use_gpu, matrix_file, matrix_fmt, cpu_fmt, gpu_fmt, & + & idim_arg, times_arg, do_overlap, comm_modes(kmode)) + end do + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_exit() +#endif + call psb_exit(ctxt) +end program psb_spmv_kernel diff --git a/test/comm/spmv/psb_z_spmv_test.f90 b/test/comm/spmv/psb_z_spmv_test.f90 new file mode 100644 index 000000000..5e41c8f30 --- /dev/null +++ b/test/comm/spmv/psb_z_spmv_test.f90 @@ -0,0 +1,917 @@ +!> Test program for overlapping communication and computation with psb_spmm. +!! +!! +module psb_zspmv_overlap_test + + use psb_base_mod + use psb_util_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + + implicit none + + interface + function z_func_3d(x,y,z) result(val) + import :: psb_dpk_ + real(psb_dpk_), intent(in) :: x,y,z + complex(psb_dpk_) :: val + end function z_func_3d + end interface + +contains + + + function z_null_func_3d(x,y,z) result(val) + + real(psb_dpk_), intent(in) :: x,y,z + complex(psb_dpk_) :: val + + val = zzero + + end function z_null_func_3d + ! + ! functions parametrizing the differential equation + ! + + ! + ! Note: b1, b2 and b3 are the coefficients of the first + ! derivative of the unknown function. The default + ! we apply here is to have them zero, so that the resulting + ! matrix is symmetric/hermitian and suitable for + ! testing with CG and FCG. + ! When testing methods for non-hermitian matrices you can + ! change the B1/B2/B3 functions to e.g. done/sqrt((3*done)) + ! + function b1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b1 + real(psb_dpk_), intent(in) :: x,y,z + b1=dzero + end function b1 + function b2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b2 + real(psb_dpk_), intent(in) :: x,y,z + b2=dzero + end function b2 + function b3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b3 + real(psb_dpk_), intent(in) :: x,y,z + b3=dzero + end function b3 + function c(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: c + real(psb_dpk_), intent(in) :: x,y,z + c=dzero + end function c + function a1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a1 + real(psb_dpk_), intent(in) :: x,y,z + a1=done/80 + end function a1 + function a2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a2 + real(psb_dpk_), intent(in) :: x,y,z + a2=done/80 + end function a2 + function a3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a3 + real(psb_dpk_), intent(in) :: x,y,z + a3=done/80 + end function a3 + function g(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: g + real(psb_dpk_), intent(in) :: x,y,z + g = dzero + if (x == done) then + g = done + else if (x == dzero) then + g = exp(y**2-z**2) + end if + end function g + + ! + ! subroutine to allocate and fill in the coefficient matrix and + ! the rhs. + ! + subroutine psb_z_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info,& + & f,amold,vmold,imold,partition,nrl,iv,tnd) + use psb_base_mod + use psb_util_mod + ! + ! Discretizes the partial differential equation + ! + ! a1 dd(u) a2 dd(u) a3 dd(u) b1 d(u) b2 d(u) b3 d(u) + ! - ------ - ------ - ------ + ----- + ------ + ------ + c u = f + ! dxdx dydy dzdz dx dy dz + ! + ! with Dirichlet boundary conditions + ! u = g + ! + ! on the unit cube 0<=x,y,z<=1. + ! + ! + ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. + ! + implicit none + integer(psb_ipk_) :: idim + type(psb_zspmat_type) :: a + type(psb_z_vect_type) :: xv,bv + type(psb_desc_type) :: desc_a + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: info + character(len=*) :: afmt + procedure(z_func_3d), optional :: f + class(psb_z_base_sparse_mat), optional :: amold + class(psb_z_base_vect_type), optional :: vmold + class(psb_i_base_vect_type), optional :: imold + integer(psb_ipk_), optional :: partition, nrl,iv(:) + logical, optional :: tnd + ! Local variables. + + integer(psb_ipk_), parameter :: nb=20 + type(psb_z_csc_sparse_mat) :: acsc + type(psb_z_coo_sparse_mat) :: acoo + type(psb_z_csr_sparse_mat) :: acsr + complex(psb_dpk_) :: zt(nb) + real(psb_dpk_) :: x,y,z + integer(psb_ipk_) :: nnz,nr,nlr,i,j,ii,ib,k, partition_ + integer(psb_lpk_) :: m,n,glob_row,nt + integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner + ! For 3D partition + ! Note: integer control variables going directly into an MPI call + ! must be 4 bytes, i.e. psb_mpk_ + integer(psb_mpk_) :: npdims(3), npp, minfo + integer(psb_ipk_) :: npx,npy,npz, iamx,iamy,iamz,mynx,myny,mynz + integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) + ! Process grid + integer(psb_ipk_) :: np, iam, nth + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + complex(psb_dpk_), allocatable :: val(:) + ! deltah dimension of each grid cell + ! deltat discretization time + real(psb_dpk_) :: deltah, sqdeltah, deltah2 + real(psb_dpk_), parameter :: rhs=dzero,one=done,zero=dzero + real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + procedure(z_func_3d), pointer :: f_ + logical :: tnd_ + character(len=20) :: name, ch_err,tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, iam, np) + + + if (present(f)) then + f_ => f + else + f_ => z_null_func_3d + end if + + deltah = done/(idim+1) + sqdeltah = deltah*deltah + deltah2 = (2*done)* deltah + + if (present(partition)) then + if ((1<= partition).and.(partition <= 3)) then + partition_ = partition + else + write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' + partition_ = 3 + end if + else + partition_ = 3 + end if + + tnd_ = .false. + if (present(tnd)) tnd_ = tnd + + ! initialize array descriptor and sparse matrix storage. provide an + ! estimate of the number of non zeroes + + m = (1_psb_lpk_*idim)*idim*idim + n = m + nnz = ((n*7)/(np)) + if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + t0 = psb_wtime() + select case(partition_) + case(1) + ! A BLOCK partition + if (present(nrl)) then + nr = nrl + else + ! + ! Using a simple BLOCK distribution. + ! + nt = (m+np-1)/np + nr = max(0,min(nt,m-(iam*nt))) + end if + + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! First example of use of CDALL: specify for each process a number of + ! contiguous rows + ! + call psb_cdall(ctxt,desc_a,info,nl=nr) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(2) + ! A partition defined by the user through IV + + if (present(iv)) then + if (size(iv) /= m) then + write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + else + write(psb_err_unit,*) iam, 'Initialization error: IV not present' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! Second example of use of CDALL: specify for each row the + ! process that owns it + ! + call psb_cdall(ctxt,desc_a,info,vg=iv) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(3) + ! A 3-dimensional partition + + ! A nifty MPI function will split the process list + npdims = 0 + call mpi_dims_create(np,3,npdims,info) + npx = npdims(1) + npy = npdims(2) + npz = npdims(3) + + allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) + ! We can reuse idx2ijk for process indices as well. + call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) + ! Now let's split the 3D cube in hexahedra + call dist1Didx(bndx,idim,npx) + mynx = bndx(iamx+1)-bndx(iamx) + call dist1Didx(bndy,idim,npy) + myny = bndy(iamy+1)-bndy(iamy) + call dist1Didx(bndz,idim,npz) + mynz = bndz(iamz+1)-bndz(iamz) + + ! How many indices do I own? + nlr = mynx*myny*mynz + allocate(myidx(nlr)) + ! Now, let's generate the list of indices I own + nr = 0 + do i=bndx(iamx),bndx(iamx+1)-1 + do j=bndy(iamy),bndy(iamy+1)-1 + do k=bndz(iamz),bndz(iamz+1)-1 + nr = nr + 1 + call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) + end do + end do + end do + if (nr /= nlr) then + write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& + & nr,nlr,mynx,myny,mynz + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + end if + + ! + ! Third example of use of CDALL: specify for each process + ! the set of global indices it owns. + ! + call psb_cdall(ctxt,desc_a,info,vl=myidx) + + case default + write(psb_err_unit,*) iam, 'Initialization error: should not get here' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end select + + + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz) + ! define rhs from boundary conditions; also build initial guess + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + ! we build an auxiliary matrix consisting of one row at a + ! time; just a small matrix. might be extended to generate + ! a bunch of rows per call. + ! + allocate(val(20*nb),irow(20*nb),& + &icol(20*nb),stat=info) + if (info /= psb_success_ ) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + + ! loop over rows belonging to current process in a block + ! distribution. + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + ! local matrix pointer + glob_row=myidx(i) + ! compute gridpoint coordinates + call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) + ! x, y, z coordinates + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = f_(x,y,z) + ! internal point: build discretization + ! + ! term depending on (x-1,y,z) + ! + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = g(dzero,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y-1,z) + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = g(x,dzero,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y,z-1) + val(icoeff)=-a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = g(x,y,dzero)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + ! term depending on (x,y,z) + val(icoeff)=(2*done)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & + & + c(x,y,z) + call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + ! term depending on (x,y,z+1) + val(icoeff)=-a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = g(x,y,done)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y+1,z) + val(icoeff)=-a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = g(x,done,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x+1,y,z) + val(icoeff)=-a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix==idim) then + zt(k) = g(done,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + end do + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + if(info /= psb_success_) exit + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + if(info /= psb_success_) exit + zt(:)=zzero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + if(info /= psb_success_) exit + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + if (present(imold)) then + call psb_cdasb(desc_a,info,mold=imold) + else + call psb_cdasb(desc_a,info) + end if + tcdasb = psb_wtime()-t1 + call psb_barrier(ctxt) + t1 = psb_wtime() + if (info == psb_success_) then + if (present(amold)) then + call psb_spasb(a,desc_a,info,mold=amold) + else + call psb_spasb(a,desc_a,info,afmt=afmt) + end if + end if + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) then + if (present(vmold)) then + call psb_geasb(xv,desc_a,info,mold=vmold) + if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) + else + call psb_geasb(xv,desc_a,info) + if (info == psb_success_) call psb_geasb(bv,desc_a,info) + end if + end if + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(iam == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")')& + & tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + + end if + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psb_z_gen_pde3d + + subroutine run_spmv_kernel(ctxt,use_gpu,matrix_file,matrix_fmt,cpu_fmt,gpu_fmt,idim_in,times_in,do_swap,comm_mode) + use psb_base_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + implicit none + + type(psb_ctxt_type), intent(in) :: ctxt + logical, intent(in) :: use_gpu + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + character(len=*), intent(in) :: cpu_fmt + character(len=*), intent(in) :: gpu_fmt + integer(psb_ipk_), intent(in) :: idim_in, times_in + logical, intent(in) :: do_swap + character(len=*), intent(in) :: comm_mode + + type(psb_zspmat_type) :: a + type(psb_z_vect_type) :: x, y + type(psb_desc_type) :: desc_a + character(len=8) :: afmt + character(len=64) :: env_buf + integer(psb_ipk_) :: my_rank, np, info, err_act + integer(psb_ipk_) :: idim, times, i + integer :: env_len, env_status, ios + complex(psb_dpk_) :: alpha, beta + real(psb_dpk_) :: t0, t1, dt, avg_t + logical :: use_external_matrix + + integer(psb_ipk_) :: comm_type + +#ifdef PSB_HAVE_CUDA + type(psb_z_vect_cuda) :: cuda_vector_mold + type(psb_i_vect_cuda) :: cuda_index_mold + type(psb_z_cuda_elg_sparse_mat), target :: cuda_ell_sparse_mold + type(psb_z_cuda_csrg_sparse_mat), target :: cuda_csr_sparse_mold + type(psb_z_cuda_hdiag_sparse_mat), target :: cuda_hdia_sparse_mold + type(psb_z_cuda_hlg_sparse_mat), target :: cuda_hll_sparse_mold + class(psb_z_base_sparse_mat), pointer :: cuda_sparse_mold +#endif + + select case(psb_toupper(trim(comm_mode))) + case('P2P','ISEND_IRECV') + comm_type = psb_comm_isend_irecv_ + case('NEIGHBOR','INEIGHBOR_ALLTOALLV') + comm_type = psb_comm_ineighbor_alltoallv_ + case('PNEIGHBOR','PERSISTENT','PERSISTENT_INEIGHBOR_A2AV') + comm_type = psb_comm_persistent_ineighbor_alltoallv_ + case('MPI_GET','RMA_PULL') + comm_type = psb_comm_rma_pull_ + case('MPI_PUT','RMA_PUSH') + comm_type = psb_comm_rma_push_ + case default + comm_type = psb_comm_isend_irecv_ + if (my_rank == psb_root_) then + write(psb_err_unit,'("Unknown comm backend: ",a,", defaulting to P2P")') trim(comm_mode) + end if + end select + + info = psb_success_ + afmt = psb_toupper(trim(cpu_fmt)) + if (len_trim(afmt) == 0) afmt = 'CSR' + if (idim_in > 0) then + idim = idim_in + else + idim = 10 + end if + + if (times_in > 0) then + times = times_in + else + times = 100 + end if + alpha = zone + beta = zzero + + call psb_erractionsave(err_act) + call psb_info(ctxt, my_rank, np) + use_external_matrix = (len_trim(matrix_file) > 0) + + if (idim_in <= 0) then + call get_environment_variable('IDIM', env_buf, length=env_len, status=env_status) + if ((env_status == 0) .and. (env_len > 0)) then + read(env_buf(1:env_len), *, iostat=ios) idim + if ((ios /= 0) .or. (idim < 2)) idim = 10 + end if + end if + + if (times_in <= 0) then + call get_environment_variable('TIMES', env_buf, length=env_len, status=env_status) + if ((env_status == 0) .and. (env_len > 0)) then + read(env_buf(1:env_len), *, iostat=ios) times + if ((ios /= 0) .or. (times < 1)) times = 100 + end if + end if + + call psb_barrier(ctxt) + if (use_external_matrix) then + call load_external_matrix(ctxt, matrix_file, matrix_fmt, a, y, x, desc_a, afmt, info) + else + call psb_z_gen_pde3d(ctxt,idim,a,y,x,desc_a,afmt,info) + end if + if (info /= psb_success_) goto 9999 + + call psb_comm_set(comm_type,x%v%comm_handle,info) + if (info /= psb_success_) goto 9999 + +#ifdef PSB_HAVE_CUDA + if (use_gpu) then + select case(psb_toupper(trim(gpu_fmt))) + case('ELG') + cuda_sparse_mold => cuda_ell_sparse_mold + case('CSRG') + cuda_sparse_mold => cuda_csr_sparse_mold + case('HDIAG','HDIA') + cuda_sparse_mold => cuda_hdia_sparse_mold + case default + cuda_sparse_mold => cuda_hll_sparse_mold + end select + call a%cscnv(info,mold=cuda_sparse_mold) + if (info /= psb_success_) goto 9999 + call desc_a%cnv(mold=cuda_index_mold) + if (info /= psb_success_) goto 9999 + call x%cnv(mold=cuda_vector_mold) + if (info /= psb_success_) goto 9999 + call y%cnv(mold=cuda_vector_mold) + if (info /= psb_success_) goto 9999 + end if +#endif + + ! warm-up + call psb_spmm(alpha, a, x, beta, y, desc_a, info, doswap=do_swap) + if (info /= psb_success_) goto 9999 + + call psb_barrier(ctxt) + t0 = psb_wtime() + do i = 1, times + call psb_spmm(alpha, a, x, beta, y, desc_a, info, doswap=do_swap) + if (info /= psb_success_) exit + end do + t1 = psb_wtime() + if (info /= psb_success_) goto 9999 + + dt = t1 - t0 + call psb_amx(ctxt, dt) + avg_t = dt / real(times, psb_dpk_) + + if (my_rank == psb_root_) then + if (do_swap) then + write(psb_out_unit,'(/,"SpMV benchmark (overlap)")') + else + write(psb_out_unit,'(/,"SpMV benchmark (no overlap)")') + end if + write(psb_out_unit,'(" cpu matrix fmt : ",a)') trim(afmt) + if (use_gpu) write(psb_out_unit,'(" gpu matrix fmt : ",a)') trim(psb_toupper(trim(gpu_fmt))) + if (use_external_matrix) then + write(psb_out_unit,'(" matrix file : ",a)') trim(matrix_file) + write(psb_out_unit,'(" matrix format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'(" idim : ",i0)') idim + end if + write(psb_out_unit,'(" global non zeros : ",i0)') a%get_nzeros() + write(psb_out_unit,'(" global rows : ",i0)') a%get_nrows() + write(psb_out_unit,'(" global cols : ",i0)') a%get_ncols() + write(psb_out_unit,'(" repetitions : ",i0)') times + write(psb_out_unit,'(" comm backend : ",a)') trim(psb_toupper(trim(comm_mode))) + write(psb_out_unit,'(" total time [s] : ",es12.5)') dt + write(psb_out_unit,'(" avg time [s] : ",es12.5)') avg_t + end if + + call psb_gefree(y, desc_a, info) + call psb_gefree(x, desc_a, info) + call psb_spfree(a, desc_a, info) + call psb_cdfree(desc_a, info) + call psb_erractionrestore(err_act) + return + +9999 call psb_error(ctxt) + call psb_error_handler(ctxt, err_act) + end subroutine run_spmv_kernel + + subroutine load_external_matrix(ctxt, matrix_file, matrix_fmt, a, bv, xv, desc_a, afmt, info) + type(psb_ctxt_type), intent(in) :: ctxt + character(len=*), intent(in) :: matrix_file + character(len=*), intent(in) :: matrix_fmt + type(psb_zspmat_type), intent(out) :: a + type(psb_z_vect_type), intent(out) :: bv, xv + type(psb_desc_type), intent(out) :: desc_a + character(len=*), intent(in) :: afmt + integer(psb_ipk_), intent(out) :: info + + type(psb_lzspmat_type) :: aux_a + complex(psb_dpk_), allocatable :: rhs_glob(:), x_glob(:) + integer(psb_lpk_) :: nrows, ncols + + info = psb_success_ + + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + return + end select + if (info /= psb_success_) return + + nrows = aux_a%get_nrows() + ncols = aux_a%get_ncols() + if (nrows /= ncols) then + write(psb_err_unit,'("Input matrix must be square: ",a)') trim(matrix_file) + info = psb_err_internal_error_ + return + end if + + call psb_matdist(aux_a, a, ctxt, desc_a, info, fmt=afmt, parts=part_block) + if (info /= psb_success_) return + + call psb_geall(xv,desc_a,info) + if (info /= psb_success_) return + call psb_geall(bv,desc_a,info) + if (info /= psb_success_) return + + allocate(rhs_glob(nrows), x_glob(ncols), stat=info) + if (info /= psb_success_) then + info = psb_err_alloc_dealloc_ + return + end if + rhs_glob = zone + x_glob = zzero + + call psb_scatter(rhs_glob,bv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + call psb_scatter(x_glob,xv,desc_a,info,root=psb_root_) + if (info /= psb_success_) return + + deallocate(rhs_glob, x_glob) + end subroutine load_external_matrix + +end module psb_zspmv_overlap_test + +program psb_z_spmv_kernel + use psb_zspmv_overlap_test + use psb_base_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif + implicit none + + type(psb_ctxt_type) :: ctxt + logical :: use_gpu + integer(psb_ipk_) :: my_rank, np, k + integer :: ios + character(len=256) :: arg + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + character(len=8) :: cpu_fmt + character(len=8) :: gpu_fmt + integer(psb_ipk_) :: idim_arg, times_arg + logical :: do_overlap + integer :: kmode + integer, parameter :: n_comm_modes = 5 + character(len=20), parameter :: comm_modes(n_comm_modes) = [character(len=20) :: & + & 'P2P', 'NEIGHBOR', 'PNEIGHBOR', 'MPI_GET', 'MPI_PUT'] + + idim_arg = -1 + times_arg = -1 + + matrix_file = '' + matrix_fmt = 'MM' + cpu_fmt = 'CSR' + gpu_fmt = 'HLG' + do_overlap = .true. + + call psb_init(ctxt) + call psb_info(ctxt, my_rank, np) + +#ifdef PSB_HAVE_CUDA + use_gpu = .true. +#else + use_gpu = .false. +#endif + + do k = 1, command_argument_count() + call get_command_argument(k, arg) + if (index(psb_toupper(trim(arg)), '--GPU=') == 1) then + select case (psb_toupper(adjustl(arg(7:len_trim(arg))))) + case ('TRUE','T','1','YES','Y','ON') + use_gpu = .true. + case ('FALSE','F','0','NO','N','OFF') + use_gpu = .false. + end select + else if (index(psb_toupper(trim(arg)), '--MATRIX=') == 1) then + matrix_file = adjustl(arg(10:len_trim(arg))) + else if (index(psb_toupper(trim(arg)), '--FMT=') == 1) then + arg = psb_toupper(adjustl(arg(7:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (index(psb_toupper(trim(arg)), '--MTX_FMT=') == 1) then + arg = psb_toupper(adjustl(arg(10:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (index(psb_toupper(trim(arg)), '--DIM=') == 1) then + read(arg(7:len_trim(arg)),*,iostat=ios) idim_arg + if ((ios /= 0) .or. (idim_arg < 2)) idim_arg = -1 + else if (index(psb_toupper(trim(arg)), '--TIMES=') == 1) then + read(arg(9:len_trim(arg)),*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + else if (index(psb_toupper(trim(arg)), '--ITERS=') == 1) then + read(arg(9:len_trim(arg)),*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + else if (index(psb_toupper(trim(arg)), '--CPU_FORMAT=') == 1) then + cpu_fmt = psb_toupper(adjustl(arg(14:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--CPU_FMT=') == 1) then + cpu_fmt = psb_toupper(adjustl(arg(11:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--GPU_FORMAT=') == 1) then + gpu_fmt = psb_toupper(adjustl(arg(14:len_trim(arg)))) + else if (index(psb_toupper(trim(arg)), '--GPU_FMT=') == 1) then + gpu_fmt = psb_toupper(adjustl(arg(11:len_trim(arg)))) + else if ((trim(psb_toupper(arg)) == '--NOOVERLAP') .or. (trim(psb_toupper(arg)) == '--NO_OVERLAP')) then + do_overlap = .false. + else if ((trim(psb_toupper(arg)) == '--OVERLAP') .or. (trim(psb_toupper(arg)) == '--SWAP')) then + do_overlap = .true. + else if (trim(psb_toupper(arg)) == '--MATRIX') then + if (k < command_argument_count()) call get_command_argument(k+1,matrix_file) + else if (trim(psb_toupper(arg)) == '--FMT') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + else if (trim(psb_toupper(arg)) == '--MTX_FMT') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + else if (trim(psb_toupper(arg)) == '--DIM') then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + read(arg,*,iostat=ios) idim_arg + if ((ios /= 0) .or. (idim_arg < 2)) idim_arg = -1 + end if + else if ((trim(psb_toupper(arg)) == '--TIMES') .or. (trim(psb_toupper(arg)) == '--ITERS')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + read(arg,*,iostat=ios) times_arg + if ((ios /= 0) .or. (times_arg < 1)) times_arg = -1 + end if + else if ((trim(psb_toupper(arg)) == '--CPU_FORMAT') .or. (trim(psb_toupper(arg)) == '--CPU_FMT')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + cpu_fmt = psb_toupper(trim(arg)) + end if + else if ((trim(psb_toupper(arg)) == '--GPU_FORMAT') .or. (trim(psb_toupper(arg)) == '--GPU_FMT')) then + if (k < command_argument_count()) then + call get_command_argument(k+1,arg) + gpu_fmt = psb_toupper(trim(arg)) + end if + end if + end do + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_init(ctxt) +#else + use_gpu = .false. +#endif + + if (my_rank == psb_root_) then + write(psb_out_unit,*) 'Welcome to PSBLAS version: ', psb_version_string_ + write(psb_out_unit,*) 'This is the psb_z_spmv_kernel sample program' + write(psb_out_unit,'("GPU enabled : ",l1)') use_gpu + write(psb_out_unit,'("Usage: ./psb_z_spmv_kernel [--gpu=TRUE|FALSE] [--dim=N] [--times=N] ",& + &"[--cpu_fmt=CSR|COO|CSC|ELL|HLL] [--gpu_fmt=HLL|ELL|CSR|HDIA] [--matrix=] [--fmt=MM|HB] ",& + &"[--overlap|--nooverlap] (runs all comm backends)")') + end if + + do kmode = 1, n_comm_modes + if (my_rank == psb_root_) then + write(psb_out_unit,'(/,"=== Backend sweep: ",a," ===")') trim(comm_modes(kmode)) + end if + call run_spmv_kernel(ctxt, use_gpu, matrix_file, matrix_fmt, cpu_fmt, gpu_fmt, & + & idim_arg, times_arg, do_overlap, comm_modes(kmode)) + end do + +#ifdef PSB_HAVE_CUDA + if (use_gpu) call psb_cuda_exit() +#endif + call psb_exit(ctxt) +end program psb_z_spmv_kernel diff --git a/test/comm/swapdata/Makefile b/test/comm/swapdata/Makefile new file mode 100644 index 000000000..988410d28 --- /dev/null +++ b/test/comm/swapdata/Makefile @@ -0,0 +1,33 @@ +INSTALLDIR=../../.. +INCDIR=$(INSTALLDIR)/include/ +MODDIR=$(INSTALLDIR)/modules/ +include $(INCDIR)/Make.inc.psblas +# +# Libraries used +# +LIBDIR=$(INSTALLDIR)/lib/ +PSBLAS_LIB= -L$(LIBDIR) -lpsb_util -lpsb_linsolve -lpsb_prec -lpsb_base +LDLIBS=$(PSBLDLIBS) + +FINCLUDES=$(FMFLAG)$(MODDIR) $(FMFLAG). + +TOBJS=psb_comm_test.o + +EXEDIR=./runs + +all: runsd psb_comm_test + +runsd: + (if test ! -d runs ; then mkdir runs; fi) + +psb_comm_test: $(TOBJS) + $(FLINK) $(LOPT) $(TOBJS) -o psb_comm_test $(PSBLAS_LIB) $(LDLIBS) + /bin/mv psb_comm_test $(EXEDIR) + +clean: + /bin/rm -f $(TOBJS) $(TOBJS_API) *$(.mod) $(EXEDIR)/psb_comm_test + +lib: + (cd ../../; make library) +verycleanlib: + (cd ../../; make veryclean) \ No newline at end of file diff --git a/test/comm/swapdata/README.md b/test/comm/swapdata/README.md new file mode 100644 index 000000000..a7811f624 --- /dev/null +++ b/test/comm/swapdata/README.md @@ -0,0 +1,29 @@ +swapdata communication test +============================ + +This test was added after introducing different communication schemes in PSBLAS. + +It focuses on direct halo exchange through the `swapdata` path: + +- index list type: halo (`psb_comm_halo_`) +- exchange API: `psi_swapdata` +- phases: `start`, `wait`, and `sync` (depending on test section) + +Communication patterns exercised: + +- baseline point-to-point (`isend/irecv`) +- neighbor collective (`ineighbor_alltoallv`) +- persistent neighbor collective (`persistent_ineighbor_alltoallv`) + +This test validates the low-level communication behavior in isolation, without +the full SpMV overlap pipeline. + +Run options +----------- + +- Synthetic 3D stencil descriptor (default): + - `./runs/psb_comm_test [--dim N] [--iters N] [--mode both|baseline|neighbor|persistent]` +- External matrix descriptor: + - `./runs/psb_comm_test [--iters N] [--mode both|baseline|neighbor|persistent] --matrix [--fmt MM|HB]` + +With `--matrix`, the descriptor is built from the distributed input matrix pattern. diff --git a/test/comm/swapdata/psb_c_comm_test.F90 b/test/comm/swapdata/psb_c_comm_test.F90 new file mode 100644 index 000000000..d5d2a2472 --- /dev/null +++ b/test/comm/swapdata/psb_c_comm_test.F90 @@ -0,0 +1,736 @@ +! +! Test program for c-type halo exchange: baseline vs neighbor topology. +! +! This test exercises the lower-level psi_swapdata interface directly +! to compare the two communication paths implemented in psi_dswapdata.F90: +! +! 1. Baseline (Isend/Irecv) : flag = IOR(psb_swap_send_, psb_swap_recv_) +! 2. Neighbor topology (Ineighbor_alltoallv) : flag = psb_swap_start_ then psb_swap_wait_ +! +! It builds a 3D block-partitioned descriptor with a 7-point stencil, +! fills owned entries with their global index, performs halo exchange +! via both paths, then checks: +! (a) The two paths produce identical results (cross-check) +! (b) Every halo entry equals the global index of its source (absolute check) +! +! Run with: mpirun -np

    ./psb_c_comm_test +! +program psb_c_comm_test + use psb_base_mod + use psb_util_mod + use psb_error_mod, only: psb_set_debug_level, psb_debug_ext_ + use psi_mod + use psb_comm_factory_mod, only: psb_comm_set, psb_comm_free + use psb_comm_schemes_mod, only: psb_comm_ineighbor_alltoallv_, psb_comm_persistent_ineighbor_alltoallv_, & + & psb_comm_isend_irecv_, psb_comm_rma_pull_, psb_comm_rma_push_ + use psb_comm_schemes_mod, only: psb_comm_status_start_, psb_comm_status_wait_, psb_comm_status_unknown_ + implicit none + + ! ---- parameters ---- + integer(psb_ipk_) :: idim + integer(psb_ipk_) :: argc + integer(psb_ipk_) :: iters + character(len=256) :: arg + character(len=16) :: mode + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + logical :: debug_swapdata + logical :: use_external_matrix + + ! ---- descriptor / context ---- + type(psb_ctxt_type) :: ctxt + type(psb_desc_type) :: desc_a + integer(psb_ipk_) :: my_rank, np, info, i, nr, number_of_local_rows + integer(psb_lpk_) :: m, nt + integer(psb_lpk_), allocatable :: myidx(:) + type(psb_cspmat_type) :: a_mat + type(psb_lcspmat_type) :: aux_a + + ! ---- vectors ---- + type(psb_c_vect_type) :: v_baseline, v_neighbor, v_neighbor_persistent, v_rma_get, v_rma_put + + ! ---- temporary / comparison arrays ---- + complex(psb_spk_), allocatable :: vals(:) + complex(psb_spk_), allocatable :: result_baseline(:), result_neighbor(:), result_persistent(:), & + & result_rma_get(:), result_rma_put(:) + complex(psb_spk_), allocatable :: expected(:) + + ! ---- halo index bookkeeping ---- + integer(psb_ipk_) :: nrow, ncol, num_neighbors, send_indexes, receive_indexes + class(psb_i_base_vect_type), pointer :: halo_indexes + + ! ---- error / reporting ---- + integer(psb_ipk_) :: n_pass, n_total, imode + logical :: run_baseline, run_neighbor, run_persistent, run_rma_get, run_rma_put + logical :: mat_allocated + logical :: comm_ok + real(psb_spk_) :: err, tol + real(psb_spk_) :: first_swap_baseline, first_swap_neighbor, first_swap_persistent, & + & first_swap_rma_get, first_swap_rma_put + real(psb_spk_) :: comm_setup_time_baseline, comm_setup_time_neighbor, comm_setup_time_persistent, & + & comm_setup_time_rma_get, comm_setup_time_rma_put + real(psb_spk_) :: t0, t1, dt, tsum_baseline, tsum_neighbor, tsum_neighbor_persistent, & + & tsum_rma_get, tsum_rma_put + integer(psb_lpk_), allocatable :: glob_col(:) + character(len=40) :: name + real(psb_spk_) :: huge_d + + name = 'psb_c_comm_test' + tol = 1.0e-12_psb_spk_ + huge_d = huge(sone) + n_pass = 0 + n_total = 0 + iters = 5 + mode = 'both' + debug_swapdata = .false. + matrix_file = '' + matrix_fmt = 'MM' + use_external_matrix = .false. + mat_allocated = .false. + + ! ---- parse command-line argument for idim ---- + idim = 10 + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i, arg) + if (trim(arg) == '--dim') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) idim + end if + else if (trim(arg) == '--iters') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) iters + end if + else if (index(psb_toupper(trim(arg)),'--MATRIX=') == 1) then + matrix_file = adjustl(arg(10:len_trim(arg))) + else if (trim(psb_toupper(arg)) == '--MATRIX') then + if (i < argc) then + call get_command_argument(i+1, matrix_file) + end if + else if (index(psb_toupper(trim(arg)),'--FMT=') == 1) then + arg = psb_toupper(adjustl(arg(7:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (trim(psb_toupper(arg)) == '--FMT') then + if (i < argc) then + call get_command_argument(i+1, arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + end if + end do + use_external_matrix = (len_trim(matrix_file) > 0) + + ! parse optional mode flag + do i = 1, argc + call get_command_argument(i, arg) + if (trim(arg) == '--mode') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) mode + end if + else if (trim(arg) == '--debug') then + debug_swapdata = .true. + end if + end do + + if (debug_swapdata) then + call psb_set_debug_level(psb_debug_ext_) + end if + + run_baseline = .false. + run_neighbor = .false. + run_persistent = .false. + run_rma_get = .false. + run_rma_put = .false. + + + select case (trim(adjustl(mode))) + case ('both','all') + run_baseline = .true. + run_neighbor = .true. + run_persistent = .true. + run_rma_get = .true. + run_rma_put = .true. + case ('baseline') + run_baseline = .true. + case ('neighbor') + run_neighbor = .true. + case ('persistent','persistent_neighbor','persistent-neighbor') + run_persistent = .true. + case ('rma_get') + run_rma_get = .true. + case ('rma_put') + run_rma_put = .true. + case default + run_baseline = .true. + run_neighbor = .true. + run_persistent = .true. + run_rma_get = .true. + run_rma_put = .true. + end select + + if ((.not.use_external_matrix) .and. (idim <= 0)) then + write(*,*) 'Invalid dimension specified. Usage: --dim ' + call psb_abort(ctxt) + end if + ! ================================================================== + ! 1. Initialise MPI / PSBLAS context + ! ================================================================== + call psb_init(ctxt) + call psb_info(ctxt, my_rank, np) + + if (my_rank == 0) then + write(psb_out_unit,'("================================================")') + write(psb_out_unit,'(" Test: c-type halo baseline vs neighbor topo")') + write(psb_out_unit,'(" Processes : ",i0)') np + if (use_external_matrix) then + write(psb_out_unit,'(" Matrix : ",a)') trim(matrix_file) + write(psb_out_unit,'(" Format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'(" Grid : ",i0," x ",i0," x ",i0)') idim,idim,idim + end if + write(psb_out_unit,'(" Usage : ./psb_c_comm_test [--dim N] [--iters N] [--mode ...] ",& + &"[--matrix ] [--fmt MM|HB]")') + write(psb_out_unit,'("================================================")') + end if + + ! ================================================================== + ! 2. Build descriptor with 7-point stencil connectivity + ! ================================================================== + if (use_external_matrix) then + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + end select + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'matrix read error:', info + call psb_abort(ctxt) + end if + if (aux_a%get_nrows() /= aux_a%get_ncols()) then + write(psb_err_unit,*) my_rank, 'matrix must be square for this test' + call psb_abort(ctxt) + end if + m = aux_a%get_nrows() + call psb_matdist(aux_a, a_mat, ctxt, desc_a, info, fmt='CSR', parts=part_block) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'matdist error:', info + call psb_abort(ctxt) + end if + mat_allocated = .true. + myidx = desc_a%get_global_indices() + number_of_local_rows = size(myidx) + else + m = (1_psb_lpk_ * idim) * idim * idim + nt = (m + np - 1) / np + nr = max(0, min(int(nt,psb_ipk_), int(m - (my_rank * nt),psb_ipk_))) + + call psb_cdall(ctxt, desc_a, info, nl=nr) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'cdall error:', info + call psb_abort(ctxt) + end if + + myidx = desc_a%get_global_indices() + number_of_local_rows = size(myidx) + + do i = 1, number_of_local_rows + call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)/), desc_a, info) + if (myidx(i) > 1) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)-1/), desc_a, info) + if (myidx(i) < m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)+1/), desc_a, info) + if (myidx(i) > idim) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)-idim/), desc_a, info) + if (myidx(i) + idim <= m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)+idim/), desc_a, info) + if (myidx(i) > int(idim,psb_lpk_)*idim) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), & + & (/myidx(i) - int(idim,psb_lpk_)*idim/), desc_a, info) + if (myidx(i) + int(idim,psb_lpk_)*idim <= m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), & + & (/myidx(i) + int(idim,psb_lpk_)*idim/), desc_a, info) + end do + + call psb_cdasb(desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'cdasb error:', info + call psb_abort(ctxt) + end if + end if + + nrow = desc_a%get_local_rows() ! owned + ncol = desc_a%get_local_cols() ! owned + halo + + ! ================================================================== + ! 3. Allocate two D vectors (scratch) and fill owned entries + ! ================================================================== + call psb_geall(v_baseline, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall baseline error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_neighbor, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_neighbor_persistent, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall persistent-neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_rma_get, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall rma-get error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_rma_put, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall rma-put error:', info + call psb_abort(ctxt) + end if + + + call psb_geasb(v_baseline, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb baseline error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_neighbor, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_neighbor_persistent, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb persistent-neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_rma_get, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb rma-get error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_rma_put, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb rma-put error:', info + call psb_abort(ctxt) + end if + + + + ! Fill owned entries with the global index value + allocate(vals(ncol)) + vals = czero + do i = 1, number_of_local_rows + vals(i) = real(myidx(i),psb_spk_) + end do + call v_baseline%set_vect(vals) + call v_neighbor%set_vect(vals) + call v_neighbor_persistent%set_vect(vals) + call v_rma_get%set_vect(vals) + call v_rma_put%set_vect(vals) + deallocate(vals) + + ! ================================================================== + ! 4. Build the expected result for halo positions + ! glob_col(j) = global index of local column j + ! After halo exchange every position j should hold glob_col(j). + ! ================================================================== + allocate(glob_col(ncol), expected(ncol)) + glob_col = desc_a%get_global_indices(owned=.false.) + do i = 1, ncol + expected(i) = real(glob_col(i),psb_spk_) + end do + allocate(result_baseline(ncol), result_neighbor(ncol), result_persistent(ncol), & + & result_rma_get(ncol), result_rma_put(ncol)) + result_baseline = huge_d + result_neighbor = huge_d + result_persistent = huge_d + result_rma_get = huge_d + result_rma_put = huge_d + + first_swap_baseline = szero + first_swap_neighbor = szero + first_swap_persistent = szero + first_swap_rma_get = szero + first_swap_rma_put = szero + + comm_setup_time_baseline = szero + comm_setup_time_neighbor = szero + comm_setup_time_persistent = szero + comm_setup_time_rma_get = szero + comm_setup_time_rma_put = szero + + ! ================================================================== + ! 6. Baseline halo exchange (Isend/Irecv in one call) + ! ================================================================== + if (run_baseline) then + comm_setup_time_baseline = psb_wtime() + call psb_comm_set(psb_comm_isend_irecv_, v_baseline%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set baseline error:', info + call psb_abort(ctxt) + end if + comm_setup_time_baseline = psb_wtime() - comm_setup_time_baseline + + first_swap_baseline = psb_wtime() + call psi_swapdata( & + swap_status=psb_comm_status_start_, & + beta=czero, & + y=v_baseline%v, & + desc_a=desc_a, & + info=info, & + data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'baseline swap error:', info + call psb_abort(ctxt) + end if + + call psi_swapdata( & + swap_status=psb_comm_status_wait_, & + beta=czero, & + y=v_baseline%v, & + desc_a=desc_a, & + info=info, & + data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'baseline swap error:', info + call psb_abort(ctxt) + end if + first_swap_baseline = psb_wtime() - first_swap_baseline + end if + + + ! ================================================================== + ! 7. Neighbor topology halo exchange (start + wait) + ! ================================================================== + if (run_neighbor) then + comm_setup_time_neighbor = psb_wtime() + call psb_comm_set(psb_comm_ineighbor_alltoallv_, v_neighbor%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set neighbor error:', info + call psb_abort(ctxt) + end if + comm_setup_time_neighbor = psb_wtime() - comm_setup_time_neighbor + + + first_swap_neighbor = psb_wtime() + call psi_swapdata(psb_comm_status_start_, czero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'neighbor start error:', info + call psb_abort(ctxt) + end if + + call psi_swapdata(psb_comm_status_wait_, czero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'neighbor wait error:', info + call psb_abort(ctxt) + end if + first_swap_neighbor = psb_wtime() - first_swap_neighbor + end if + + ! ================================================================== + ! 7b. Persistent-neighbor halo exchange (start + wait) + ! ================================================================== + if (run_persistent) then + comm_setup_time_persistent = psb_wtime() + call psb_comm_set(psb_comm_persistent_ineighbor_alltoallv_, v_neighbor_persistent%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set persistent-neighbor error:', info + call psb_abort(ctxt) + end if + comm_setup_time_persistent = psb_wtime() - comm_setup_time_persistent + + + first_swap_persistent = psb_wtime() + call psi_swapdata(psb_comm_status_start_, czero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'persistent-neighbor start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, czero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'persistent-neighbor wait error:', info + call psb_abort(ctxt) + end if + first_swap_persistent = psb_wtime() - first_swap_persistent + end if + + + + if(run_rma_get) then + comm_setup_time_rma_get = psb_wtime() + call psb_comm_set(psb_comm_rma_pull_, v_rma_get%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set RMA get error:', info + call psb_abort(ctxt) + end if + comm_setup_time_rma_get = psb_wtime() - comm_setup_time_rma_get + + first_swap_rma_get = psb_wtime() + call psi_swapdata(psb_comm_status_start_, czero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA get start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, czero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA get wait error:', info + call psb_abort(ctxt) + end if + first_swap_rma_get = psb_wtime() - first_swap_rma_get + end if + + + + + if(run_rma_put) then + comm_setup_time_rma_put = psb_wtime() + call psb_comm_set(psb_comm_rma_push_, v_rma_put%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set RMA put error:', info + call psb_abort(ctxt) + end if + comm_setup_time_rma_put = psb_wtime() - comm_setup_time_rma_put + + first_swap_rma_put = psb_wtime() + call psi_swapdata(psb_comm_status_start_, czero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA put start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, czero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA put wait error:', info + call psb_abort(ctxt) + end if + first_swap_rma_put = psb_wtime() - first_swap_rma_put + end if + + + + ! ================================================================== + ! 8. Performance: repeat exchanges and measure timings + ! ================================================================== + if (my_rank == 0) then + write(psb_out_unit,'("Timing: running ",i0," iterations for selected exchange mode(s)")') iters + end if + + tsum_baseline = szero + tsum_neighbor = szero + tsum_neighbor_persistent = szero + tsum_rma_get = szero + tsum_rma_put = szero + + do i = 1, iters + if (run_baseline) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, czero, v_baseline%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, czero, v_baseline%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_baseline = tsum_baseline + dt + end if + + if (run_neighbor) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, czero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, czero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_neighbor = tsum_neighbor + dt + end if + + if (run_persistent) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, czero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, czero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_neighbor_persistent = tsum_neighbor_persistent + dt + end if + + + if (run_rma_get) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, czero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, czero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_rma_get = tsum_rma_get + dt + end if + + + if (run_rma_put) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, czero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, czero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_rma_put = tsum_rma_put + dt + end if + + + end do + + + + call psb_amx(ctxt, tsum_baseline) + call psb_amx(ctxt, tsum_neighbor) + call psb_amx(ctxt, tsum_neighbor_persistent) + call psb_amx(ctxt, first_swap_baseline) + call psb_amx(ctxt, first_swap_neighbor) + call psb_amx(ctxt, first_swap_persistent) + call psb_amx(ctxt, comm_setup_time_baseline) + call psb_amx(ctxt, comm_setup_time_neighbor) + call psb_amx(ctxt, comm_setup_time_persistent) + call psb_amx(ctxt, comm_setup_time_rma_get) + call psb_amx(ctxt, comm_setup_time_rma_put) + + + + + if (my_rank == 0) then + if (run_baseline) then + write(psb_out_unit,'(" Avg baseline time : ",es12.5)') (tsum_baseline / real(iters,psb_spk_)) + write(psb_out_unit,'(" Tot baseline time : ",es12.5)') tsum_baseline + write(psb_out_unit,'(" First baseline time: ",es12.5)') first_swap_baseline + write(psb_out_unit,'(" Baseline comm setup: ",es12.5)') comm_setup_time_baseline + end if + if (run_neighbor) then + write(psb_out_unit,'(" Avg neighbor time : ",es12.5)') (tsum_neighbor / real(iters,psb_spk_)) + write(psb_out_unit,'(" Tot neighbor time : ",es12.5)') tsum_neighbor + write(psb_out_unit,'(" First neighbor time: ",es12.5)') first_swap_neighbor + write(psb_out_unit,'(" Neighbor comm setup: ",es12.5)') comm_setup_time_neighbor + end if + if (run_persistent) then + write(psb_out_unit,'(" Avg pers-neigh time: ",es12.5)') (tsum_neighbor_persistent / real(iters,psb_spk_)) + write(psb_out_unit,'(" Tot pers-neigh time: ",es12.5)') tsum_neighbor_persistent + write(psb_out_unit,'(" First pers-neigh time: ",es12.5)') first_swap_persistent + write(psb_out_unit,'(" Persistent comm setup: ",es12.5)') comm_setup_time_persistent + end if + if (run_rma_get) then + write(psb_out_unit,'(" Avg RMA get time : ",es12.5)') (tsum_rma_get / real(iters,psb_spk_)) + write(psb_out_unit,'(" Tot RMA get time : ",es12.5)') tsum_rma_get + write(psb_out_unit,'(" First RMA get time : ",es12.5)') first_swap_rma_get + write(psb_out_unit,'(" RMA get comm setup : ",es12.5)') comm_setup_time_rma_get + end if + if (run_rma_put) then + write(psb_out_unit,'(" Avg RMA put time : ",es12.5)') (tsum_rma_put / real(iters,psb_spk_)) + write(psb_out_unit,'(" Tot RMA put time : ",es12.5)') tsum_rma_put + write(psb_out_unit,'(" First RMA put time : ",es12.5)') first_swap_rma_put + write(psb_out_unit,'(" RMA put comm setup : ",es12.5)') comm_setup_time_rma_put + end if + end if + + ! ================================================================== + ! 8. Extract results and compare + ! ================================================================== + result_baseline = v_baseline%v%v + result_neighbor = v_neighbor%v%v + result_persistent = v_neighbor_persistent%v%v + result_rma_get = v_rma_get%v%v + result_rma_put = v_rma_put%v%v + + ! --- Cross Checks --- + if (run_baseline .and. run_neighbor) & + call check_result("cross-check baseline vs neighbor", result_baseline, result_neighbor, ncol, tol) + + if (run_baseline .and. run_persistent) & + call check_result("cross-check baseline vs pers-nei", result_baseline, result_persistent, ncol, tol) + + if (run_baseline .and. run_rma_get) & + call check_result("cross-check baseline vs rma-get", result_baseline, result_rma_get, ncol, tol) + + if (run_baseline .and. run_rma_put) & + call check_result("cross-check baseline vs rma-put", result_baseline, result_rma_put, ncol, tol) + + ! --- Absolute Correctness Checks against Expected --- + if (run_baseline) & + call check_result("baseline absolute correctness", result_baseline, expected, ncol, tol) + + if (run_neighbor) & + call check_result("neighbor absolute correctness", result_neighbor, expected, ncol, tol) + + if (run_persistent) & + call check_result("pers-neigh absolute correctness", result_persistent, expected, ncol, tol) + + if (run_rma_get) & + call check_result("rma_get absolute correctness", result_rma_get, expected, ncol, tol) + + if (run_rma_put) & + call check_result("rma_put absolute correctness", result_rma_put, expected, ncol, tol) + + ! ================================================================== + ! 9. Summary + ! ================================================================== + call psb_barrier(ctxt) + if (my_rank == 0) then + write(psb_out_unit,'("================================================")') + write(psb_out_unit,'(" Results: ",i0," / ",i0," tests passed")') n_pass, n_total + if (n_pass == n_total) then + write(psb_out_unit,'(" STATUS: ALL PASSED")') + else + write(psb_out_unit,'(" STATUS: SOME FAILURES")') + end if + write(psb_out_unit,'("================================================")') + end if + call psb_barrier(ctxt) + + ! ================================================================== + ! 10. Cleanup + ! ================================================================== + deallocate(result_baseline, result_neighbor, result_persistent, expected, glob_col) + +9999 call psb_gefree(v_baseline, desc_a, info) + call psb_gefree(v_neighbor, desc_a, info) + call psb_gefree(v_neighbor_persistent, desc_a, info) + if (mat_allocated) call psb_spfree(a_mat, desc_a, info) + call psb_cdfree(desc_a, info) + call psb_exit(ctxt) + + +contains + + ! Helper routine to compare two arrays, reduce the error across MPI ranks, and print the result + subroutine check_result(test_name, arr1, arr2, n, tolerance) + character(len=*), intent(in) :: test_name + complex(psb_spk_), intent(in) :: arr1(:), arr2(:) + integer(psb_ipk_), intent(in):: n + real(psb_spk_), intent(in) :: tolerance + real(psb_spk_) :: err_val + + n_total = n_total + 1 + + if (n > 0) then + err_val = maxval(abs(arr1(1:n) - arr2(1:n))) + else + err_val = szero + end if + + ! Get max error across all processes + call psb_amx(ctxt, err_val) + + if (my_rank == 0) then + if ((err_val >= szero) .and. (err_val < tolerance)) then + write(psb_out_unit,'(" [PASS] ", a, t45, ": err = ",es12.5)') test_name, err_val + n_pass = n_pass + 1 + else + write(psb_out_unit,'(" [FAIL] ", a, t45, ": err = ",es12.5)') test_name, err_val + end if + end if + end subroutine check_result + +end program psb_c_comm_test diff --git a/test/comm/swapdata/psb_comm_test.F90 b/test/comm/swapdata/psb_comm_test.F90 new file mode 100644 index 000000000..0de15b0d1 --- /dev/null +++ b/test/comm/swapdata/psb_comm_test.F90 @@ -0,0 +1,736 @@ +! +! Test program for D-type halo exchange: baseline vs neighbor topology. +! +! This test exercises the lower-level psi_swapdata interface directly +! to compare the two communication paths implemented in psi_dswapdata.F90: +! +! 1. Baseline (Isend/Irecv) : flag = IOR(psb_swap_send_, psb_swap_recv_) +! 2. Neighbor topology (Ineighbor_alltoallv) : flag = psb_swap_start_ then psb_swap_wait_ +! +! It builds a 3D block-partitioned descriptor with a 7-point stencil, +! fills owned entries with their global index, performs halo exchange +! via both paths, then checks: +! (a) The two paths produce identical results (cross-check) +! (b) Every halo entry equals the global index of its source (absolute check) +! +! Run with: mpirun -np

    ./test_halo_new +! +program psb_comm_test + use psb_base_mod + use psb_util_mod + use psb_error_mod, only: psb_set_debug_level, psb_debug_ext_ + use psi_mod + use psb_comm_factory_mod, only: psb_comm_set, psb_comm_free + use psb_comm_schemes_mod, only: psb_comm_ineighbor_alltoallv_, psb_comm_persistent_ineighbor_alltoallv_, & + & psb_comm_isend_irecv_, psb_comm_rma_pull_, psb_comm_rma_push_ + use psb_comm_schemes_mod, only: psb_comm_status_start_, psb_comm_status_wait_, psb_comm_status_unknown_ + implicit none + + ! ---- parameters ---- + integer(psb_ipk_) :: idim + integer(psb_ipk_) :: argc + integer(psb_ipk_) :: iters + character(len=256) :: arg + character(len=16) :: mode + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + logical :: debug_swapdata + logical :: use_external_matrix + + ! ---- descriptor / context ---- + type(psb_ctxt_type) :: ctxt + type(psb_desc_type) :: desc_a + integer(psb_ipk_) :: my_rank, np, info, i, nr, number_of_local_rows + integer(psb_lpk_) :: m, nt + integer(psb_lpk_), allocatable :: myidx(:) + type(psb_dspmat_type) :: a_mat + type(psb_ldspmat_type) :: aux_a + + ! ---- vectors ---- + type(psb_d_vect_type) :: v_baseline, v_neighbor, v_neighbor_persistent, v_rma_get, v_rma_put + + ! ---- temporary / comparison arrays ---- + real(psb_dpk_), allocatable :: vals(:) + real(psb_dpk_), allocatable :: result_baseline(:), result_neighbor(:), result_persistent(:), & + & result_rma_get(:), result_rma_put(:) + real(psb_dpk_), allocatable :: expected(:) + + ! ---- halo index bookkeeping ---- + integer(psb_ipk_) :: nrow, ncol, num_neighbors, send_indexes, receive_indexes + class(psb_i_base_vect_type), pointer :: halo_indexes + + ! ---- error / reporting ---- + integer(psb_ipk_) :: n_pass, n_total, imode + logical :: run_baseline, run_neighbor, run_persistent, run_rma_get, run_rma_put + logical :: mat_allocated + logical :: comm_ok + real(psb_dpk_) :: err, tol + real(psb_dpk_) :: first_swap_baseline, first_swap_neighbor, first_swap_persistent, & + & first_swap_rma_get, first_swap_rma_put + real(psb_dpk_) :: comm_setup_time_baseline, comm_setup_time_neighbor, comm_setup_time_persistent, & + & comm_setup_time_rma_get, comm_setup_time_rma_put + real(psb_dpk_) :: t0, t1, dt, tsum_baseline, tsum_neighbor, tsum_neighbor_persistent, & + & tsum_rma_get, tsum_rma_put + integer(psb_lpk_), allocatable :: glob_col(:) + character(len=40) :: name + real(psb_dpk_) :: huge_d + + name = 'test_halo_new' + tol = 1.0d-12 + huge_d = huge(1.0_psb_dpk_) + n_pass = 0 + n_total = 0 + iters = 5 + mode = 'both' + debug_swapdata = .false. + matrix_file = '' + matrix_fmt = 'MM' + use_external_matrix = .false. + mat_allocated = .false. + + ! ---- parse command-line argument for idim ---- + idim = 10 + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i, arg) + if (trim(arg) == '--dim') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) idim + end if + else if (trim(arg) == '--iters') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) iters + end if + else if (index(psb_toupper(trim(arg)),'--MATRIX=') == 1) then + matrix_file = adjustl(arg(10:len_trim(arg))) + else if (trim(psb_toupper(arg)) == '--MATRIX') then + if (i < argc) then + call get_command_argument(i+1, matrix_file) + end if + else if (index(psb_toupper(trim(arg)),'--FMT=') == 1) then + arg = psb_toupper(adjustl(arg(7:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (trim(psb_toupper(arg)) == '--FMT') then + if (i < argc) then + call get_command_argument(i+1, arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + end if + end do + use_external_matrix = (len_trim(matrix_file) > 0) + + ! parse optional mode flag + do i = 1, argc + call get_command_argument(i, arg) + if (trim(arg) == '--mode') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) mode + end if + else if (trim(arg) == '--debug') then + debug_swapdata = .true. + end if + end do + + if (debug_swapdata) then + call psb_set_debug_level(psb_debug_ext_) + end if + + run_baseline = .false. + run_neighbor = .false. + run_persistent = .false. + run_rma_get = .false. + run_rma_put = .false. + + + select case (trim(adjustl(mode))) + case ('both','all') + run_baseline = .true. + run_neighbor = .true. + run_persistent = .true. + run_rma_get = .true. + run_rma_put = .true. + case ('baseline') + run_baseline = .true. + case ('neighbor') + run_neighbor = .true. + case ('persistent','persistent_neighbor','persistent-neighbor') + run_persistent = .true. + case ('rma_get') + run_rma_get = .true. + case ('rma_put') + run_rma_put = .true. + case default + run_baseline = .true. + run_neighbor = .true. + run_persistent = .true. + run_rma_get = .true. + run_rma_put = .true. + end select + + if ((.not.use_external_matrix) .and. (idim <= 0)) then + write(*,*) 'Invalid dimension specified. Usage: --dim ' + call psb_abort(ctxt) + end if + ! ================================================================== + ! 1. Initialise MPI / PSBLAS context + ! ================================================================== + call psb_init(ctxt) + call psb_info(ctxt, my_rank, np) + + if (my_rank == 0) then + write(psb_out_unit,'("================================================")') + write(psb_out_unit,'(" Test: D-type halo baseline vs neighbor topo")') + write(psb_out_unit,'(" Processes : ",i0)') np + if (use_external_matrix) then + write(psb_out_unit,'(" Matrix : ",a)') trim(matrix_file) + write(psb_out_unit,'(" Format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'(" Grid : ",i0," x ",i0," x ",i0)') idim,idim,idim + end if + write(psb_out_unit,'(" Usage : ./psb_comm_test [--dim N] [--iters N] [--mode ...] ",& + &"[--matrix ] [--fmt MM|HB]")') + write(psb_out_unit,'("================================================")') + end if + + ! ================================================================== + ! 2. Build descriptor with 7-point stencil connectivity + ! ================================================================== + if (use_external_matrix) then + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + end select + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'matrix read error:', info + call psb_abort(ctxt) + end if + if (aux_a%get_nrows() /= aux_a%get_ncols()) then + write(psb_err_unit,*) my_rank, 'matrix must be square for this test' + call psb_abort(ctxt) + end if + m = aux_a%get_nrows() + call psb_matdist(aux_a, a_mat, ctxt, desc_a, info, fmt='CSR', parts=part_block) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'matdist error:', info + call psb_abort(ctxt) + end if + mat_allocated = .true. + myidx = desc_a%get_global_indices() + number_of_local_rows = size(myidx) + else + m = (1_psb_lpk_ * idim) * idim * idim + nt = (m + np - 1) / np + nr = max(0, min(int(nt,psb_ipk_), int(m - (my_rank * nt),psb_ipk_))) + + call psb_cdall(ctxt, desc_a, info, nl=nr) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'cdall error:', info + call psb_abort(ctxt) + end if + + myidx = desc_a%get_global_indices() + number_of_local_rows = size(myidx) + + do i = 1, number_of_local_rows + call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)/), desc_a, info) + if (myidx(i) > 1) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)-1/), desc_a, info) + if (myidx(i) < m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)+1/), desc_a, info) + if (myidx(i) > idim) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)-idim/), desc_a, info) + if (myidx(i) + idim <= m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)+idim/), desc_a, info) + if (myidx(i) > int(idim,psb_lpk_)*idim) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), & + & (/myidx(i) - int(idim,psb_lpk_)*idim/), desc_a, info) + if (myidx(i) + int(idim,psb_lpk_)*idim <= m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), & + & (/myidx(i) + int(idim,psb_lpk_)*idim/), desc_a, info) + end do + + call psb_cdasb(desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'cdasb error:', info + call psb_abort(ctxt) + end if + end if + + nrow = desc_a%get_local_rows() ! owned + ncol = desc_a%get_local_cols() ! owned + halo + + ! ================================================================== + ! 3. Allocate two D vectors (scratch) and fill owned entries + ! ================================================================== + call psb_geall(v_baseline, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall baseline error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_neighbor, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_neighbor_persistent, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall persistent-neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_rma_get, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall rma-get error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_rma_put, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall rma-put error:', info + call psb_abort(ctxt) + end if + + + call psb_geasb(v_baseline, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb baseline error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_neighbor, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_neighbor_persistent, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb persistent-neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_rma_get, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb rma-get error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_rma_put, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb rma-put error:', info + call psb_abort(ctxt) + end if + + + + ! Fill owned entries with the global index value + allocate(vals(ncol)) + vals = dzero + do i = 1, number_of_local_rows + vals(i) = real(myidx(i), psb_dpk_) + end do + call v_baseline%set_vect(vals) + call v_neighbor%set_vect(vals) + call v_neighbor_persistent%set_vect(vals) + call v_rma_get%set_vect(vals) + call v_rma_put%set_vect(vals) + deallocate(vals) + + ! ================================================================== + ! 4. Build the expected result for halo positions + ! glob_col(j) = global index of local column j + ! After halo exchange every position j should hold glob_col(j). + ! ================================================================== + allocate(glob_col(ncol), expected(ncol)) + glob_col = desc_a%get_global_indices(owned=.false.) + do i = 1, ncol + expected(i) = real(glob_col(i), psb_dpk_) + end do + allocate(result_baseline(ncol), result_neighbor(ncol), result_persistent(ncol), & + & result_rma_get(ncol), result_rma_put(ncol)) + result_baseline = huge_d + result_neighbor = huge_d + result_persistent = huge_d + result_rma_get = huge_d + result_rma_put = huge_d + + first_swap_baseline = 0.0_psb_dpk_ + first_swap_neighbor = 0.0_psb_dpk_ + first_swap_persistent = 0.0_psb_dpk_ + first_swap_rma_get = 0.0_psb_dpk_ + first_swap_rma_put = 0.0_psb_dpk_ + + comm_setup_time_baseline = 0.0_psb_dpk_ + comm_setup_time_neighbor = 0.0_psb_dpk_ + comm_setup_time_persistent = 0.0_psb_dpk_ + comm_setup_time_rma_get = 0.0_psb_dpk_ + comm_setup_time_rma_put = 0.0_psb_dpk_ + + ! ================================================================== + ! 6. Baseline halo exchange (Isend/Irecv in one call) + ! ================================================================== + if (run_baseline) then + comm_setup_time_baseline = psb_wtime() + call psb_comm_set(psb_comm_isend_irecv_, v_baseline%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set baseline error:', info + call psb_abort(ctxt) + end if + comm_setup_time_baseline = psb_wtime() - comm_setup_time_baseline + + first_swap_baseline = psb_wtime() + call psi_swapdata( & + swap_status=psb_comm_status_start_, & + beta=dzero, & + y=v_baseline%v, & + desc_a=desc_a, & + info=info, & + data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'baseline swap error:', info + call psb_abort(ctxt) + end if + + call psi_swapdata( & + swap_status=psb_comm_status_wait_, & + beta=dzero, & + y=v_baseline%v, & + desc_a=desc_a, & + info=info, & + data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'baseline swap error:', info + call psb_abort(ctxt) + end if + first_swap_baseline = psb_wtime() - first_swap_baseline + end if + + + ! ================================================================== + ! 7. Neighbor topology halo exchange (start + wait) + ! ================================================================== + if (run_neighbor) then + comm_setup_time_neighbor = psb_wtime() + call psb_comm_set(psb_comm_ineighbor_alltoallv_, v_neighbor%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set neighbor error:', info + call psb_abort(ctxt) + end if + comm_setup_time_neighbor = psb_wtime() - comm_setup_time_neighbor + + + first_swap_neighbor = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'neighbor start error:', info + call psb_abort(ctxt) + end if + + call psi_swapdata(psb_comm_status_wait_, dzero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'neighbor wait error:', info + call psb_abort(ctxt) + end if + first_swap_neighbor = psb_wtime() - first_swap_neighbor + end if + + ! ================================================================== + ! 7b. Persistent-neighbor halo exchange (start + wait) + ! ================================================================== + if (run_persistent) then + comm_setup_time_persistent = psb_wtime() + call psb_comm_set(psb_comm_persistent_ineighbor_alltoallv_, v_neighbor_persistent%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set persistent-neighbor error:', info + call psb_abort(ctxt) + end if + comm_setup_time_persistent = psb_wtime() - comm_setup_time_persistent + + + first_swap_persistent = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'persistent-neighbor start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, dzero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'persistent-neighbor wait error:', info + call psb_abort(ctxt) + end if + first_swap_persistent = psb_wtime() - first_swap_persistent + end if + + + + if(run_rma_get) then + comm_setup_time_rma_get = psb_wtime() + call psb_comm_set(psb_comm_rma_pull_, v_rma_get%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set RMA get error:', info + call psb_abort(ctxt) + end if + comm_setup_time_rma_get = psb_wtime() - comm_setup_time_rma_get + + first_swap_rma_get = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA get start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, dzero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA get wait error:', info + call psb_abort(ctxt) + end if + first_swap_rma_get = psb_wtime() - first_swap_rma_get + end if + + + + + if(run_rma_put) then + comm_setup_time_rma_put = psb_wtime() + call psb_comm_set(psb_comm_rma_push_, v_rma_put%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set RMA put error:', info + call psb_abort(ctxt) + end if + comm_setup_time_rma_put = psb_wtime() - comm_setup_time_rma_put + + first_swap_rma_put = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA put start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, dzero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA put wait error:', info + call psb_abort(ctxt) + end if + first_swap_rma_put = psb_wtime() - first_swap_rma_put + end if + + + + ! ================================================================== + ! 8. Performance: repeat exchanges and measure timings + ! ================================================================== + if (my_rank == 0) then + write(psb_out_unit,'("Timing: running ",i0," iterations for selected exchange mode(s)")') iters + end if + + tsum_baseline = 0.0_psb_dpk_ + tsum_neighbor = 0.0_psb_dpk_ + tsum_neighbor_persistent = 0.0_psb_dpk_ + tsum_rma_get = 0.0_psb_dpk_ + tsum_rma_put = 0.0_psb_dpk_ + + do i = 1, iters + if (run_baseline) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_baseline%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, dzero, v_baseline%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_baseline = tsum_baseline + dt + end if + + if (run_neighbor) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, dzero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_neighbor = tsum_neighbor + dt + end if + + if (run_persistent) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, dzero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_neighbor_persistent = tsum_neighbor_persistent + dt + end if + + + if (run_rma_get) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, dzero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_rma_get = tsum_rma_get + dt + end if + + + if (run_rma_put) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, dzero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_rma_put = tsum_rma_put + dt + end if + + + end do + + + + call psb_amx(ctxt, tsum_baseline) + call psb_amx(ctxt, tsum_neighbor) + call psb_amx(ctxt, tsum_neighbor_persistent) + call psb_amx(ctxt, first_swap_baseline) + call psb_amx(ctxt, first_swap_neighbor) + call psb_amx(ctxt, first_swap_persistent) + call psb_amx(ctxt, comm_setup_time_baseline) + call psb_amx(ctxt, comm_setup_time_neighbor) + call psb_amx(ctxt, comm_setup_time_persistent) + call psb_amx(ctxt, comm_setup_time_rma_get) + call psb_amx(ctxt, comm_setup_time_rma_put) + + + + + if (my_rank == 0) then + if (run_baseline) then + write(psb_out_unit,'(" Avg baseline time : ",es12.5)') (tsum_baseline / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot baseline time : ",es12.5)') tsum_baseline + write(psb_out_unit,'(" First baseline time: ",es12.5)') first_swap_baseline + write(psb_out_unit,'(" Baseline comm setup: ",es12.5)') comm_setup_time_baseline + end if + if (run_neighbor) then + write(psb_out_unit,'(" Avg neighbor time : ",es12.5)') (tsum_neighbor / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot neighbor time : ",es12.5)') tsum_neighbor + write(psb_out_unit,'(" First neighbor time: ",es12.5)') first_swap_neighbor + write(psb_out_unit,'(" Neighbor comm setup: ",es12.5)') comm_setup_time_neighbor + end if + if (run_persistent) then + write(psb_out_unit,'(" Avg pers-neigh time: ",es12.5)') (tsum_neighbor_persistent / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot pers-neigh time: ",es12.5)') tsum_neighbor_persistent + write(psb_out_unit,'(" First pers-neigh time: ",es12.5)') first_swap_persistent + write(psb_out_unit,'(" Persistent comm setup: ",es12.5)') comm_setup_time_persistent + end if + if (run_rma_get) then + write(psb_out_unit,'(" Avg RMA get time : ",es12.5)') (tsum_rma_get / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot RMA get time : ",es12.5)') tsum_rma_get + write(psb_out_unit,'(" First RMA get time : ",es12.5)') first_swap_rma_get + write(psb_out_unit,'(" RMA get comm setup : ",es12.5)') comm_setup_time_rma_get + end if + if (run_rma_put) then + write(psb_out_unit,'(" Avg RMA put time : ",es12.5)') (tsum_rma_put / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot RMA put time : ",es12.5)') tsum_rma_put + write(psb_out_unit,'(" First RMA put time : ",es12.5)') first_swap_rma_put + write(psb_out_unit,'(" RMA put comm setup : ",es12.5)') comm_setup_time_rma_put + end if + end if + + ! ================================================================== + ! 8. Extract results and compare + ! ================================================================== + result_baseline = v_baseline%v%v + result_neighbor = v_neighbor%v%v + result_persistent = v_neighbor_persistent%v%v + result_rma_get = v_rma_get%v%v + result_rma_put = v_rma_put%v%v + + ! --- Cross Checks --- + if (run_baseline .and. run_neighbor) & + call check_result("cross-check baseline vs neighbor", result_baseline, result_neighbor, ncol, tol) + + if (run_baseline .and. run_persistent) & + call check_result("cross-check baseline vs pers-nei", result_baseline, result_persistent, ncol, tol) + + if (run_baseline .and. run_rma_get) & + call check_result("cross-check baseline vs rma-get", result_baseline, result_rma_get, ncol, tol) + + if (run_baseline .and. run_rma_put) & + call check_result("cross-check baseline vs rma-put", result_baseline, result_rma_put, ncol, tol) + + ! --- Absolute Correctness Checks against Expected --- + if (run_baseline) & + call check_result("baseline absolute correctness", result_baseline, expected, ncol, tol) + + if (run_neighbor) & + call check_result("neighbor absolute correctness", result_neighbor, expected, ncol, tol) + + if (run_persistent) & + call check_result("pers-neigh absolute correctness", result_persistent, expected, ncol, tol) + + if (run_rma_get) & + call check_result("rma_get absolute correctness", result_rma_get, expected, ncol, tol) + + if (run_rma_put) & + call check_result("rma_put absolute correctness", result_rma_put, expected, ncol, tol) + + ! ================================================================== + ! 9. Summary + ! ================================================================== + call psb_barrier(ctxt) + if (my_rank == 0) then + write(psb_out_unit,'("================================================")') + write(psb_out_unit,'(" Results: ",i0," / ",i0," tests passed")') n_pass, n_total + if (n_pass == n_total) then + write(psb_out_unit,'(" STATUS: ALL PASSED")') + else + write(psb_out_unit,'(" STATUS: SOME FAILURES")') + end if + write(psb_out_unit,'("================================================")') + end if + call psb_barrier(ctxt) + + ! ================================================================== + ! 10. Cleanup + ! ================================================================== + deallocate(result_baseline, result_neighbor, result_persistent, expected, glob_col) + +9999 call psb_gefree(v_baseline, desc_a, info) + call psb_gefree(v_neighbor, desc_a, info) + call psb_gefree(v_neighbor_persistent, desc_a, info) + if (mat_allocated) call psb_spfree(a_mat, desc_a, info) + call psb_cdfree(desc_a, info) + call psb_exit(ctxt) + + +contains + + ! Helper routine to compare two arrays, reduce the error across MPI ranks, and print the result + subroutine check_result(test_name, arr1, arr2, n, tolerance) + character(len=*), intent(in) :: test_name + real(psb_dpk_), intent(in) :: arr1(:), arr2(:) + integer(psb_ipk_), intent(in):: n + real(psb_dpk_), intent(in) :: tolerance + real(psb_dpk_) :: err_val + + n_total = n_total + 1 + + if (n > 0) then + err_val = maxval(abs(arr1(1:n) - arr2(1:n))) + else + err_val = 0.0_psb_dpk_ + end if + + ! Get max error across all processes + call psb_amx(ctxt, err_val) + + if (my_rank == 0) then + if ((err_val >= 0.0_psb_dpk_) .and. (err_val < tolerance)) then + write(psb_out_unit,'(" [PASS] ", a, t45, ": err = ",es12.5)') test_name, err_val + n_pass = n_pass + 1 + else + write(psb_out_unit,'(" [FAIL] ", a, t45, ": err = ",es12.5)') test_name, err_val + end if + end if + end subroutine check_result + +end program psb_comm_test \ No newline at end of file diff --git a/test/comm/swapdata/psb_d_comm_test.F90 b/test/comm/swapdata/psb_d_comm_test.F90 new file mode 100644 index 000000000..8a0427d58 --- /dev/null +++ b/test/comm/swapdata/psb_d_comm_test.F90 @@ -0,0 +1,736 @@ +! +! Test program for d-type halo exchange: baseline vs neighbor topology. +! +! This test exercises the lower-level psi_swapdata interface directly +! to compare the two communication paths implemented in psi_dswapdata.F90: +! +! 1. Baseline (Isend/Irecv) : flag = IOR(psb_swap_send_, psb_swap_recv_) +! 2. Neighbor topology (Ineighbor_alltoallv) : flag = psb_swap_start_ then psb_swap_wait_ +! +! It builds a 3D block-partitioned descriptor with a 7-point stencil, +! fills owned entries with their global index, performs halo exchange +! via both paths, then checks: +! (a) The two paths produce identical results (cross-check) +! (b) Every halo entry equals the global index of its source (absolute check) +! +! Run with: mpirun -np

    ./psb_d_comm_test +! +program psb_d_comm_test + use psb_base_mod + use psb_util_mod + use psb_error_mod, only: psb_set_debug_level, psb_debug_ext_ + use psi_mod + use psb_comm_factory_mod, only: psb_comm_set, psb_comm_free + use psb_comm_schemes_mod, only: psb_comm_ineighbor_alltoallv_, psb_comm_persistent_ineighbor_alltoallv_, & + & psb_comm_isend_irecv_, psb_comm_rma_pull_, psb_comm_rma_push_ + use psb_comm_schemes_mod, only: psb_comm_status_start_, psb_comm_status_wait_, psb_comm_status_unknown_ + implicit none + + ! ---- parameters ---- + integer(psb_ipk_) :: idim + integer(psb_ipk_) :: argc + integer(psb_ipk_) :: iters + character(len=256) :: arg + character(len=16) :: mode + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + logical :: debug_swapdata + logical :: use_external_matrix + + ! ---- descriptor / context ---- + type(psb_ctxt_type) :: ctxt + type(psb_desc_type) :: desc_a + integer(psb_ipk_) :: my_rank, np, info, i, nr, number_of_local_rows + integer(psb_lpk_) :: m, nt + integer(psb_lpk_), allocatable :: myidx(:) + type(psb_dspmat_type) :: a_mat + type(psb_ldspmat_type) :: aux_a + + ! ---- vectors ---- + type(psb_d_vect_type) :: v_baseline, v_neighbor, v_neighbor_persistent, v_rma_get, v_rma_put + + ! ---- temporary / comparison arrays ---- + real(psb_dpk_), allocatable :: vals(:) + real(psb_dpk_), allocatable :: result_baseline(:), result_neighbor(:), result_persistent(:), & + & result_rma_get(:), result_rma_put(:) + real(psb_dpk_), allocatable :: expected(:) + + ! ---- halo index bookkeeping ---- + integer(psb_ipk_) :: nrow, ncol, num_neighbors, send_indexes, receive_indexes + class(psb_i_base_vect_type), pointer :: halo_indexes + + ! ---- error / reporting ---- + integer(psb_ipk_) :: n_pass, n_total, imode + logical :: run_baseline, run_neighbor, run_persistent, run_rma_get, run_rma_put + logical :: mat_allocated + logical :: comm_ok + real(psb_dpk_) :: err, tol + real(psb_dpk_) :: first_swap_baseline, first_swap_neighbor, first_swap_persistent, & + & first_swap_rma_get, first_swap_rma_put + real(psb_dpk_) :: comm_setup_time_baseline, comm_setup_time_neighbor, comm_setup_time_persistent, & + & comm_setup_time_rma_get, comm_setup_time_rma_put + real(psb_dpk_) :: t0, t1, dt, tsum_baseline, tsum_neighbor, tsum_neighbor_persistent, & + & tsum_rma_get, tsum_rma_put + integer(psb_lpk_), allocatable :: glob_col(:) + character(len=40) :: name + real(psb_dpk_) :: huge_d + + name = 'psb_d_comm_test' + tol = 1.0e-12_psb_dpk_ + huge_d = huge(done) + n_pass = 0 + n_total = 0 + iters = 5 + mode = 'both' + debug_swapdata = .false. + matrix_file = '' + matrix_fmt = 'MM' + use_external_matrix = .false. + mat_allocated = .false. + + ! ---- parse command-line argument for idim ---- + idim = 10 + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i, arg) + if (trim(arg) == '--dim') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) idim + end if + else if (trim(arg) == '--iters') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) iters + end if + else if (index(psb_toupper(trim(arg)),'--MATRIX=') == 1) then + matrix_file = adjustl(arg(10:len_trim(arg))) + else if (trim(psb_toupper(arg)) == '--MATRIX') then + if (i < argc) then + call get_command_argument(i+1, matrix_file) + end if + else if (index(psb_toupper(trim(arg)),'--FMT=') == 1) then + arg = psb_toupper(adjustl(arg(7:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (trim(psb_toupper(arg)) == '--FMT') then + if (i < argc) then + call get_command_argument(i+1, arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + end if + end do + use_external_matrix = (len_trim(matrix_file) > 0) + + ! parse optional mode flag + do i = 1, argc + call get_command_argument(i, arg) + if (trim(arg) == '--mode') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) mode + end if + else if (trim(arg) == '--debug') then + debug_swapdata = .true. + end if + end do + + if (debug_swapdata) then + call psb_set_debug_level(psb_debug_ext_) + end if + + run_baseline = .false. + run_neighbor = .false. + run_persistent = .false. + run_rma_get = .false. + run_rma_put = .false. + + + select case (trim(adjustl(mode))) + case ('both','all') + run_baseline = .true. + run_neighbor = .true. + run_persistent = .true. + run_rma_get = .true. + run_rma_put = .true. + case ('baseline') + run_baseline = .true. + case ('neighbor') + run_neighbor = .true. + case ('persistent','persistent_neighbor','persistent-neighbor') + run_persistent = .true. + case ('rma_get') + run_rma_get = .true. + case ('rma_put') + run_rma_put = .true. + case default + run_baseline = .true. + run_neighbor = .true. + run_persistent = .true. + run_rma_get = .true. + run_rma_put = .true. + end select + + if ((.not.use_external_matrix) .and. (idim <= 0)) then + write(*,*) 'Invalid dimension specified. Usage: --dim ' + call psb_abort(ctxt) + end if + ! ================================================================== + ! 1. Initialise MPI / PSBLAS context + ! ================================================================== + call psb_init(ctxt) + call psb_info(ctxt, my_rank, np) + + if (my_rank == 0) then + write(psb_out_unit,'("================================================")') + write(psb_out_unit,'(" Test: d-type halo baseline vs neighbor topo")') + write(psb_out_unit,'(" Processes : ",i0)') np + if (use_external_matrix) then + write(psb_out_unit,'(" Matrix : ",a)') trim(matrix_file) + write(psb_out_unit,'(" Format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'(" Grid : ",i0," x ",i0," x ",i0)') idim,idim,idim + end if + write(psb_out_unit,'(" Usage : ./psb_d_comm_test [--dim N] [--iters N] [--mode ...] ",& + &"[--matrix ] [--fmt MM|HB]")') + write(psb_out_unit,'("================================================")') + end if + + ! ================================================================== + ! 2. Build descriptor with 7-point stencil connectivity + ! ================================================================== + if (use_external_matrix) then + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + end select + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'matrix read error:', info + call psb_abort(ctxt) + end if + if (aux_a%get_nrows() /= aux_a%get_ncols()) then + write(psb_err_unit,*) my_rank, 'matrix must be square for this test' + call psb_abort(ctxt) + end if + m = aux_a%get_nrows() + call psb_matdist(aux_a, a_mat, ctxt, desc_a, info, fmt='CSR', parts=part_block) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'matdist error:', info + call psb_abort(ctxt) + end if + mat_allocated = .true. + myidx = desc_a%get_global_indices() + number_of_local_rows = size(myidx) + else + m = (1_psb_lpk_ * idim) * idim * idim + nt = (m + np - 1) / np + nr = max(0, min(int(nt,psb_ipk_), int(m - (my_rank * nt),psb_ipk_))) + + call psb_cdall(ctxt, desc_a, info, nl=nr) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'cdall error:', info + call psb_abort(ctxt) + end if + + myidx = desc_a%get_global_indices() + number_of_local_rows = size(myidx) + + do i = 1, number_of_local_rows + call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)/), desc_a, info) + if (myidx(i) > 1) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)-1/), desc_a, info) + if (myidx(i) < m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)+1/), desc_a, info) + if (myidx(i) > idim) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)-idim/), desc_a, info) + if (myidx(i) + idim <= m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)+idim/), desc_a, info) + if (myidx(i) > int(idim,psb_lpk_)*idim) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), & + & (/myidx(i) - int(idim,psb_lpk_)*idim/), desc_a, info) + if (myidx(i) + int(idim,psb_lpk_)*idim <= m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), & + & (/myidx(i) + int(idim,psb_lpk_)*idim/), desc_a, info) + end do + + call psb_cdasb(desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'cdasb error:', info + call psb_abort(ctxt) + end if + end if + + nrow = desc_a%get_local_rows() ! owned + ncol = desc_a%get_local_cols() ! owned + halo + + ! ================================================================== + ! 3. Allocate two D vectors (scratch) and fill owned entries + ! ================================================================== + call psb_geall(v_baseline, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall baseline error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_neighbor, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_neighbor_persistent, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall persistent-neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_rma_get, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall rma-get error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_rma_put, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall rma-put error:', info + call psb_abort(ctxt) + end if + + + call psb_geasb(v_baseline, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb baseline error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_neighbor, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_neighbor_persistent, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb persistent-neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_rma_get, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb rma-get error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_rma_put, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb rma-put error:', info + call psb_abort(ctxt) + end if + + + + ! Fill owned entries with the global index value + allocate(vals(ncol)) + vals = dzero + do i = 1, number_of_local_rows + vals(i) = real(myidx(i),psb_dpk_) + end do + call v_baseline%set_vect(vals) + call v_neighbor%set_vect(vals) + call v_neighbor_persistent%set_vect(vals) + call v_rma_get%set_vect(vals) + call v_rma_put%set_vect(vals) + deallocate(vals) + + ! ================================================================== + ! 4. Build the expected result for halo positions + ! glob_col(j) = global index of local column j + ! After halo exchange every position j should hold glob_col(j). + ! ================================================================== + allocate(glob_col(ncol), expected(ncol)) + glob_col = desc_a%get_global_indices(owned=.false.) + do i = 1, ncol + expected(i) = real(glob_col(i),psb_dpk_) + end do + allocate(result_baseline(ncol), result_neighbor(ncol), result_persistent(ncol), & + & result_rma_get(ncol), result_rma_put(ncol)) + result_baseline = huge_d + result_neighbor = huge_d + result_persistent = huge_d + result_rma_get = huge_d + result_rma_put = huge_d + + first_swap_baseline = dzero + first_swap_neighbor = dzero + first_swap_persistent = dzero + first_swap_rma_get = dzero + first_swap_rma_put = dzero + + comm_setup_time_baseline = dzero + comm_setup_time_neighbor = dzero + comm_setup_time_persistent = dzero + comm_setup_time_rma_get = dzero + comm_setup_time_rma_put = dzero + + ! ================================================================== + ! 6. Baseline halo exchange (Isend/Irecv in one call) + ! ================================================================== + if (run_baseline) then + comm_setup_time_baseline = psb_wtime() + call psb_comm_set(psb_comm_isend_irecv_, v_baseline%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set baseline error:', info + call psb_abort(ctxt) + end if + comm_setup_time_baseline = psb_wtime() - comm_setup_time_baseline + + first_swap_baseline = psb_wtime() + call psi_swapdata( & + swap_status=psb_comm_status_start_, & + beta=dzero, & + y=v_baseline%v, & + desc_a=desc_a, & + info=info, & + data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'baseline swap error:', info + call psb_abort(ctxt) + end if + + call psi_swapdata( & + swap_status=psb_comm_status_wait_, & + beta=dzero, & + y=v_baseline%v, & + desc_a=desc_a, & + info=info, & + data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'baseline swap error:', info + call psb_abort(ctxt) + end if + first_swap_baseline = psb_wtime() - first_swap_baseline + end if + + + ! ================================================================== + ! 7. Neighbor topology halo exchange (start + wait) + ! ================================================================== + if (run_neighbor) then + comm_setup_time_neighbor = psb_wtime() + call psb_comm_set(psb_comm_ineighbor_alltoallv_, v_neighbor%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set neighbor error:', info + call psb_abort(ctxt) + end if + comm_setup_time_neighbor = psb_wtime() - comm_setup_time_neighbor + + + first_swap_neighbor = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'neighbor start error:', info + call psb_abort(ctxt) + end if + + call psi_swapdata(psb_comm_status_wait_, dzero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'neighbor wait error:', info + call psb_abort(ctxt) + end if + first_swap_neighbor = psb_wtime() - first_swap_neighbor + end if + + ! ================================================================== + ! 7b. Persistent-neighbor halo exchange (start + wait) + ! ================================================================== + if (run_persistent) then + comm_setup_time_persistent = psb_wtime() + call psb_comm_set(psb_comm_persistent_ineighbor_alltoallv_, v_neighbor_persistent%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set persistent-neighbor error:', info + call psb_abort(ctxt) + end if + comm_setup_time_persistent = psb_wtime() - comm_setup_time_persistent + + + first_swap_persistent = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'persistent-neighbor start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, dzero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'persistent-neighbor wait error:', info + call psb_abort(ctxt) + end if + first_swap_persistent = psb_wtime() - first_swap_persistent + end if + + + + if(run_rma_get) then + comm_setup_time_rma_get = psb_wtime() + call psb_comm_set(psb_comm_rma_pull_, v_rma_get%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set RMA get error:', info + call psb_abort(ctxt) + end if + comm_setup_time_rma_get = psb_wtime() - comm_setup_time_rma_get + + first_swap_rma_get = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA get start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, dzero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA get wait error:', info + call psb_abort(ctxt) + end if + first_swap_rma_get = psb_wtime() - first_swap_rma_get + end if + + + + + if(run_rma_put) then + comm_setup_time_rma_put = psb_wtime() + call psb_comm_set(psb_comm_rma_push_, v_rma_put%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set RMA put error:', info + call psb_abort(ctxt) + end if + comm_setup_time_rma_put = psb_wtime() - comm_setup_time_rma_put + + first_swap_rma_put = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA put start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, dzero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA put wait error:', info + call psb_abort(ctxt) + end if + first_swap_rma_put = psb_wtime() - first_swap_rma_put + end if + + + + ! ================================================================== + ! 8. Performance: repeat exchanges and measure timings + ! ================================================================== + if (my_rank == 0) then + write(psb_out_unit,'("Timing: running ",i0," iterations for selected exchange mode(s)")') iters + end if + + tsum_baseline = dzero + tsum_neighbor = dzero + tsum_neighbor_persistent = dzero + tsum_rma_get = dzero + tsum_rma_put = dzero + + do i = 1, iters + if (run_baseline) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_baseline%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, dzero, v_baseline%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_baseline = tsum_baseline + dt + end if + + if (run_neighbor) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, dzero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_neighbor = tsum_neighbor + dt + end if + + if (run_persistent) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, dzero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_neighbor_persistent = tsum_neighbor_persistent + dt + end if + + + if (run_rma_get) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, dzero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_rma_get = tsum_rma_get + dt + end if + + + if (run_rma_put) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, dzero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, dzero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_rma_put = tsum_rma_put + dt + end if + + + end do + + + + call psb_amx(ctxt, tsum_baseline) + call psb_amx(ctxt, tsum_neighbor) + call psb_amx(ctxt, tsum_neighbor_persistent) + call psb_amx(ctxt, first_swap_baseline) + call psb_amx(ctxt, first_swap_neighbor) + call psb_amx(ctxt, first_swap_persistent) + call psb_amx(ctxt, comm_setup_time_baseline) + call psb_amx(ctxt, comm_setup_time_neighbor) + call psb_amx(ctxt, comm_setup_time_persistent) + call psb_amx(ctxt, comm_setup_time_rma_get) + call psb_amx(ctxt, comm_setup_time_rma_put) + + + + + if (my_rank == 0) then + if (run_baseline) then + write(psb_out_unit,'(" Avg baseline time : ",es12.5)') (tsum_baseline / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot baseline time : ",es12.5)') tsum_baseline + write(psb_out_unit,'(" First baseline time: ",es12.5)') first_swap_baseline + write(psb_out_unit,'(" Baseline comm setup: ",es12.5)') comm_setup_time_baseline + end if + if (run_neighbor) then + write(psb_out_unit,'(" Avg neighbor time : ",es12.5)') (tsum_neighbor / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot neighbor time : ",es12.5)') tsum_neighbor + write(psb_out_unit,'(" First neighbor time: ",es12.5)') first_swap_neighbor + write(psb_out_unit,'(" Neighbor comm setup: ",es12.5)') comm_setup_time_neighbor + end if + if (run_persistent) then + write(psb_out_unit,'(" Avg pers-neigh time: ",es12.5)') (tsum_neighbor_persistent / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot pers-neigh time: ",es12.5)') tsum_neighbor_persistent + write(psb_out_unit,'(" First pers-neigh time: ",es12.5)') first_swap_persistent + write(psb_out_unit,'(" Persistent comm setup: ",es12.5)') comm_setup_time_persistent + end if + if (run_rma_get) then + write(psb_out_unit,'(" Avg RMA get time : ",es12.5)') (tsum_rma_get / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot RMA get time : ",es12.5)') tsum_rma_get + write(psb_out_unit,'(" First RMA get time : ",es12.5)') first_swap_rma_get + write(psb_out_unit,'(" RMA get comm setup : ",es12.5)') comm_setup_time_rma_get + end if + if (run_rma_put) then + write(psb_out_unit,'(" Avg RMA put time : ",es12.5)') (tsum_rma_put / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot RMA put time : ",es12.5)') tsum_rma_put + write(psb_out_unit,'(" First RMA put time : ",es12.5)') first_swap_rma_put + write(psb_out_unit,'(" RMA put comm setup : ",es12.5)') comm_setup_time_rma_put + end if + end if + + ! ================================================================== + ! 8. Extract results and compare + ! ================================================================== + result_baseline = v_baseline%v%v + result_neighbor = v_neighbor%v%v + result_persistent = v_neighbor_persistent%v%v + result_rma_get = v_rma_get%v%v + result_rma_put = v_rma_put%v%v + + ! --- Cross Checks --- + if (run_baseline .and. run_neighbor) & + call check_result("cross-check baseline vs neighbor", result_baseline, result_neighbor, ncol, tol) + + if (run_baseline .and. run_persistent) & + call check_result("cross-check baseline vs pers-nei", result_baseline, result_persistent, ncol, tol) + + if (run_baseline .and. run_rma_get) & + call check_result("cross-check baseline vs rma-get", result_baseline, result_rma_get, ncol, tol) + + if (run_baseline .and. run_rma_put) & + call check_result("cross-check baseline vs rma-put", result_baseline, result_rma_put, ncol, tol) + + ! --- Absolute Correctness Checks against Expected --- + if (run_baseline) & + call check_result("baseline absolute correctness", result_baseline, expected, ncol, tol) + + if (run_neighbor) & + call check_result("neighbor absolute correctness", result_neighbor, expected, ncol, tol) + + if (run_persistent) & + call check_result("pers-neigh absolute correctness", result_persistent, expected, ncol, tol) + + if (run_rma_get) & + call check_result("rma_get absolute correctness", result_rma_get, expected, ncol, tol) + + if (run_rma_put) & + call check_result("rma_put absolute correctness", result_rma_put, expected, ncol, tol) + + ! ================================================================== + ! 9. Summary + ! ================================================================== + call psb_barrier(ctxt) + if (my_rank == 0) then + write(psb_out_unit,'("================================================")') + write(psb_out_unit,'(" Results: ",i0," / ",i0," tests passed")') n_pass, n_total + if (n_pass == n_total) then + write(psb_out_unit,'(" STATUS: ALL PASSED")') + else + write(psb_out_unit,'(" STATUS: SOME FAILURES")') + end if + write(psb_out_unit,'("================================================")') + end if + call psb_barrier(ctxt) + + ! ================================================================== + ! 10. Cleanup + ! ================================================================== + deallocate(result_baseline, result_neighbor, result_persistent, expected, glob_col) + +9999 call psb_gefree(v_baseline, desc_a, info) + call psb_gefree(v_neighbor, desc_a, info) + call psb_gefree(v_neighbor_persistent, desc_a, info) + if (mat_allocated) call psb_spfree(a_mat, desc_a, info) + call psb_cdfree(desc_a, info) + call psb_exit(ctxt) + + +contains + + ! Helper routine to compare two arrays, reduce the error across MPI ranks, and print the result + subroutine check_result(test_name, arr1, arr2, n, tolerance) + character(len=*), intent(in) :: test_name + real(psb_dpk_), intent(in) :: arr1(:), arr2(:) + integer(psb_ipk_), intent(in):: n + real(psb_dpk_), intent(in) :: tolerance + real(psb_dpk_) :: err_val + + n_total = n_total + 1 + + if (n > 0) then + err_val = maxval(abs(arr1(1:n) - arr2(1:n))) + else + err_val = dzero + end if + + ! Get max error across all processes + call psb_amx(ctxt, err_val) + + if (my_rank == 0) then + if ((err_val >= dzero) .and. (err_val < tolerance)) then + write(psb_out_unit,'(" [PASS] ", a, t45, ": err = ",es12.5)') test_name, err_val + n_pass = n_pass + 1 + else + write(psb_out_unit,'(" [FAIL] ", a, t45, ": err = ",es12.5)') test_name, err_val + end if + end if + end subroutine check_result + +end program psb_d_comm_test diff --git a/test/comm/swapdata/psb_s_comm_test.F90 b/test/comm/swapdata/psb_s_comm_test.F90 new file mode 100644 index 000000000..e46d2ae6b --- /dev/null +++ b/test/comm/swapdata/psb_s_comm_test.F90 @@ -0,0 +1,736 @@ +! +! Test program for s-type halo exchange: baseline vs neighbor topology. +! +! This test exercises the lower-level psi_swapdata interface directly +! to compare the two communication paths implemented in psi_dswapdata.F90: +! +! 1. Baseline (Isend/Irecv) : flag = IOR(psb_swap_send_, psb_swap_recv_) +! 2. Neighbor topology (Ineighbor_alltoallv) : flag = psb_swap_start_ then psb_swap_wait_ +! +! It builds a 3D block-partitioned descriptor with a 7-point stencil, +! fills owned entries with their global index, performs halo exchange +! via both paths, then checks: +! (a) The two paths produce identical results (cross-check) +! (b) Every halo entry equals the global index of its source (absolute check) +! +! Run with: mpirun -np

    ./psb_s_comm_test +! +program psb_s_comm_test + use psb_base_mod + use psb_util_mod + use psb_error_mod, only: psb_set_debug_level, psb_debug_ext_ + use psi_mod + use psb_comm_factory_mod, only: psb_comm_set, psb_comm_free + use psb_comm_schemes_mod, only: psb_comm_ineighbor_alltoallv_, psb_comm_persistent_ineighbor_alltoallv_, & + & psb_comm_isend_irecv_, psb_comm_rma_pull_, psb_comm_rma_push_ + use psb_comm_schemes_mod, only: psb_comm_status_start_, psb_comm_status_wait_, psb_comm_status_unknown_ + implicit none + + ! ---- parameters ---- + integer(psb_ipk_) :: idim + integer(psb_ipk_) :: argc + integer(psb_ipk_) :: iters + character(len=256) :: arg + character(len=16) :: mode + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + logical :: debug_swapdata + logical :: use_external_matrix + + ! ---- descriptor / context ---- + type(psb_ctxt_type) :: ctxt + type(psb_desc_type) :: desc_a + integer(psb_ipk_) :: my_rank, np, info, i, nr, number_of_local_rows + integer(psb_lpk_) :: m, nt + integer(psb_lpk_), allocatable :: myidx(:) + type(psb_sspmat_type) :: a_mat + type(psb_lsspmat_type) :: aux_a + + ! ---- vectors ---- + type(psb_s_vect_type) :: v_baseline, v_neighbor, v_neighbor_persistent, v_rma_get, v_rma_put + + ! ---- temporary / comparison arrays ---- + real(psb_spk_), allocatable :: vals(:) + real(psb_spk_), allocatable :: result_baseline(:), result_neighbor(:), result_persistent(:), & + & result_rma_get(:), result_rma_put(:) + real(psb_spk_), allocatable :: expected(:) + + ! ---- halo index bookkeeping ---- + integer(psb_ipk_) :: nrow, ncol, num_neighbors, send_indexes, receive_indexes + class(psb_i_base_vect_type), pointer :: halo_indexes + + ! ---- error / reporting ---- + integer(psb_ipk_) :: n_pass, n_total, imode + logical :: run_baseline, run_neighbor, run_persistent, run_rma_get, run_rma_put + logical :: mat_allocated + logical :: comm_ok + real(psb_spk_) :: err, tol + real(psb_spk_) :: first_swap_baseline, first_swap_neighbor, first_swap_persistent, & + & first_swap_rma_get, first_swap_rma_put + real(psb_spk_) :: comm_setup_time_baseline, comm_setup_time_neighbor, comm_setup_time_persistent, & + & comm_setup_time_rma_get, comm_setup_time_rma_put + real(psb_spk_) :: t0, t1, dt, tsum_baseline, tsum_neighbor, tsum_neighbor_persistent, & + & tsum_rma_get, tsum_rma_put + integer(psb_lpk_), allocatable :: glob_col(:) + character(len=40) :: name + real(psb_spk_) :: huge_d + + name = 'psb_s_comm_test' + tol = 1.0e-12_psb_spk_ + huge_d = huge(sone) + n_pass = 0 + n_total = 0 + iters = 5 + mode = 'both' + debug_swapdata = .false. + matrix_file = '' + matrix_fmt = 'MM' + use_external_matrix = .false. + mat_allocated = .false. + + ! ---- parse command-line argument for idim ---- + idim = 10 + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i, arg) + if (trim(arg) == '--dim') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) idim + end if + else if (trim(arg) == '--iters') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) iters + end if + else if (index(psb_toupper(trim(arg)),'--MATRIX=') == 1) then + matrix_file = adjustl(arg(10:len_trim(arg))) + else if (trim(psb_toupper(arg)) == '--MATRIX') then + if (i < argc) then + call get_command_argument(i+1, matrix_file) + end if + else if (index(psb_toupper(trim(arg)),'--FMT=') == 1) then + arg = psb_toupper(adjustl(arg(7:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (trim(psb_toupper(arg)) == '--FMT') then + if (i < argc) then + call get_command_argument(i+1, arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + end if + end do + use_external_matrix = (len_trim(matrix_file) > 0) + + ! parse optional mode flag + do i = 1, argc + call get_command_argument(i, arg) + if (trim(arg) == '--mode') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) mode + end if + else if (trim(arg) == '--debug') then + debug_swapdata = .true. + end if + end do + + if (debug_swapdata) then + call psb_set_debug_level(psb_debug_ext_) + end if + + run_baseline = .false. + run_neighbor = .false. + run_persistent = .false. + run_rma_get = .false. + run_rma_put = .false. + + + select case (trim(adjustl(mode))) + case ('both','all') + run_baseline = .true. + run_neighbor = .true. + run_persistent = .true. + run_rma_get = .true. + run_rma_put = .true. + case ('baseline') + run_baseline = .true. + case ('neighbor') + run_neighbor = .true. + case ('persistent','persistent_neighbor','persistent-neighbor') + run_persistent = .true. + case ('rma_get') + run_rma_get = .true. + case ('rma_put') + run_rma_put = .true. + case default + run_baseline = .true. + run_neighbor = .true. + run_persistent = .true. + run_rma_get = .true. + run_rma_put = .true. + end select + + if ((.not.use_external_matrix) .and. (idim <= 0)) then + write(*,*) 'Invalid dimension specified. Usage: --dim ' + call psb_abort(ctxt) + end if + ! ================================================================== + ! 1. Initialise MPI / PSBLAS context + ! ================================================================== + call psb_init(ctxt) + call psb_info(ctxt, my_rank, np) + + if (my_rank == 0) then + write(psb_out_unit,'("================================================")') + write(psb_out_unit,'(" Test: s-type halo baseline vs neighbor topo")') + write(psb_out_unit,'(" Processes : ",i0)') np + if (use_external_matrix) then + write(psb_out_unit,'(" Matrix : ",a)') trim(matrix_file) + write(psb_out_unit,'(" Format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'(" Grid : ",i0," x ",i0," x ",i0)') idim,idim,idim + end if + write(psb_out_unit,'(" Usage : ./psb_s_comm_test [--dim N] [--iters N] [--mode ...] ",& + &"[--matrix ] [--fmt MM|HB]")') + write(psb_out_unit,'("================================================")') + end if + + ! ================================================================== + ! 2. Build descriptor with 7-point stencil connectivity + ! ================================================================== + if (use_external_matrix) then + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + end select + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'matrix read error:', info + call psb_abort(ctxt) + end if + if (aux_a%get_nrows() /= aux_a%get_ncols()) then + write(psb_err_unit,*) my_rank, 'matrix must be square for this test' + call psb_abort(ctxt) + end if + m = aux_a%get_nrows() + call psb_matdist(aux_a, a_mat, ctxt, desc_a, info, fmt='CSR', parts=part_block) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'matdist error:', info + call psb_abort(ctxt) + end if + mat_allocated = .true. + myidx = desc_a%get_global_indices() + number_of_local_rows = size(myidx) + else + m = (1_psb_lpk_ * idim) * idim * idim + nt = (m + np - 1) / np + nr = max(0, min(int(nt,psb_ipk_), int(m - (my_rank * nt),psb_ipk_))) + + call psb_cdall(ctxt, desc_a, info, nl=nr) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'cdall error:', info + call psb_abort(ctxt) + end if + + myidx = desc_a%get_global_indices() + number_of_local_rows = size(myidx) + + do i = 1, number_of_local_rows + call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)/), desc_a, info) + if (myidx(i) > 1) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)-1/), desc_a, info) + if (myidx(i) < m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)+1/), desc_a, info) + if (myidx(i) > idim) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)-idim/), desc_a, info) + if (myidx(i) + idim <= m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)+idim/), desc_a, info) + if (myidx(i) > int(idim,psb_lpk_)*idim) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), & + & (/myidx(i) - int(idim,psb_lpk_)*idim/), desc_a, info) + if (myidx(i) + int(idim,psb_lpk_)*idim <= m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), & + & (/myidx(i) + int(idim,psb_lpk_)*idim/), desc_a, info) + end do + + call psb_cdasb(desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'cdasb error:', info + call psb_abort(ctxt) + end if + end if + + nrow = desc_a%get_local_rows() ! owned + ncol = desc_a%get_local_cols() ! owned + halo + + ! ================================================================== + ! 3. Allocate two D vectors (scratch) and fill owned entries + ! ================================================================== + call psb_geall(v_baseline, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall baseline error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_neighbor, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_neighbor_persistent, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall persistent-neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_rma_get, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall rma-get error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_rma_put, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall rma-put error:', info + call psb_abort(ctxt) + end if + + + call psb_geasb(v_baseline, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb baseline error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_neighbor, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_neighbor_persistent, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb persistent-neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_rma_get, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb rma-get error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_rma_put, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb rma-put error:', info + call psb_abort(ctxt) + end if + + + + ! Fill owned entries with the global index value + allocate(vals(ncol)) + vals = szero + do i = 1, number_of_local_rows + vals(i) = real(myidx(i),psb_spk_) + end do + call v_baseline%set_vect(vals) + call v_neighbor%set_vect(vals) + call v_neighbor_persistent%set_vect(vals) + call v_rma_get%set_vect(vals) + call v_rma_put%set_vect(vals) + deallocate(vals) + + ! ================================================================== + ! 4. Build the expected result for halo positions + ! glob_col(j) = global index of local column j + ! After halo exchange every position j should hold glob_col(j). + ! ================================================================== + allocate(glob_col(ncol), expected(ncol)) + glob_col = desc_a%get_global_indices(owned=.false.) + do i = 1, ncol + expected(i) = real(glob_col(i),psb_spk_) + end do + allocate(result_baseline(ncol), result_neighbor(ncol), result_persistent(ncol), & + & result_rma_get(ncol), result_rma_put(ncol)) + result_baseline = huge_d + result_neighbor = huge_d + result_persistent = huge_d + result_rma_get = huge_d + result_rma_put = huge_d + + first_swap_baseline = szero + first_swap_neighbor = szero + first_swap_persistent = szero + first_swap_rma_get = szero + first_swap_rma_put = szero + + comm_setup_time_baseline = szero + comm_setup_time_neighbor = szero + comm_setup_time_persistent = szero + comm_setup_time_rma_get = szero + comm_setup_time_rma_put = szero + + ! ================================================================== + ! 6. Baseline halo exchange (Isend/Irecv in one call) + ! ================================================================== + if (run_baseline) then + comm_setup_time_baseline = psb_wtime() + call psb_comm_set(psb_comm_isend_irecv_, v_baseline%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set baseline error:', info + call psb_abort(ctxt) + end if + comm_setup_time_baseline = psb_wtime() - comm_setup_time_baseline + + first_swap_baseline = psb_wtime() + call psi_swapdata( & + swap_status=psb_comm_status_start_, & + beta=szero, & + y=v_baseline%v, & + desc_a=desc_a, & + info=info, & + data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'baseline swap error:', info + call psb_abort(ctxt) + end if + + call psi_swapdata( & + swap_status=psb_comm_status_wait_, & + beta=szero, & + y=v_baseline%v, & + desc_a=desc_a, & + info=info, & + data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'baseline swap error:', info + call psb_abort(ctxt) + end if + first_swap_baseline = psb_wtime() - first_swap_baseline + end if + + + ! ================================================================== + ! 7. Neighbor topology halo exchange (start + wait) + ! ================================================================== + if (run_neighbor) then + comm_setup_time_neighbor = psb_wtime() + call psb_comm_set(psb_comm_ineighbor_alltoallv_, v_neighbor%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set neighbor error:', info + call psb_abort(ctxt) + end if + comm_setup_time_neighbor = psb_wtime() - comm_setup_time_neighbor + + + first_swap_neighbor = psb_wtime() + call psi_swapdata(psb_comm_status_start_, szero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'neighbor start error:', info + call psb_abort(ctxt) + end if + + call psi_swapdata(psb_comm_status_wait_, szero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'neighbor wait error:', info + call psb_abort(ctxt) + end if + first_swap_neighbor = psb_wtime() - first_swap_neighbor + end if + + ! ================================================================== + ! 7b. Persistent-neighbor halo exchange (start + wait) + ! ================================================================== + if (run_persistent) then + comm_setup_time_persistent = psb_wtime() + call psb_comm_set(psb_comm_persistent_ineighbor_alltoallv_, v_neighbor_persistent%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set persistent-neighbor error:', info + call psb_abort(ctxt) + end if + comm_setup_time_persistent = psb_wtime() - comm_setup_time_persistent + + + first_swap_persistent = psb_wtime() + call psi_swapdata(psb_comm_status_start_, szero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'persistent-neighbor start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, szero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'persistent-neighbor wait error:', info + call psb_abort(ctxt) + end if + first_swap_persistent = psb_wtime() - first_swap_persistent + end if + + + + if(run_rma_get) then + comm_setup_time_rma_get = psb_wtime() + call psb_comm_set(psb_comm_rma_pull_, v_rma_get%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set RMA get error:', info + call psb_abort(ctxt) + end if + comm_setup_time_rma_get = psb_wtime() - comm_setup_time_rma_get + + first_swap_rma_get = psb_wtime() + call psi_swapdata(psb_comm_status_start_, szero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA get start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, szero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA get wait error:', info + call psb_abort(ctxt) + end if + first_swap_rma_get = psb_wtime() - first_swap_rma_get + end if + + + + + if(run_rma_put) then + comm_setup_time_rma_put = psb_wtime() + call psb_comm_set(psb_comm_rma_push_, v_rma_put%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set RMA put error:', info + call psb_abort(ctxt) + end if + comm_setup_time_rma_put = psb_wtime() - comm_setup_time_rma_put + + first_swap_rma_put = psb_wtime() + call psi_swapdata(psb_comm_status_start_, szero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA put start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, szero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA put wait error:', info + call psb_abort(ctxt) + end if + first_swap_rma_put = psb_wtime() - first_swap_rma_put + end if + + + + ! ================================================================== + ! 8. Performance: repeat exchanges and measure timings + ! ================================================================== + if (my_rank == 0) then + write(psb_out_unit,'("Timing: running ",i0," iterations for selected exchange mode(s)")') iters + end if + + tsum_baseline = szero + tsum_neighbor = szero + tsum_neighbor_persistent = szero + tsum_rma_get = szero + tsum_rma_put = szero + + do i = 1, iters + if (run_baseline) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, szero, v_baseline%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, szero, v_baseline%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_baseline = tsum_baseline + dt + end if + + if (run_neighbor) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, szero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, szero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_neighbor = tsum_neighbor + dt + end if + + if (run_persistent) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, szero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, szero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_neighbor_persistent = tsum_neighbor_persistent + dt + end if + + + if (run_rma_get) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, szero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, szero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_rma_get = tsum_rma_get + dt + end if + + + if (run_rma_put) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, szero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, szero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_rma_put = tsum_rma_put + dt + end if + + + end do + + + + call psb_amx(ctxt, tsum_baseline) + call psb_amx(ctxt, tsum_neighbor) + call psb_amx(ctxt, tsum_neighbor_persistent) + call psb_amx(ctxt, first_swap_baseline) + call psb_amx(ctxt, first_swap_neighbor) + call psb_amx(ctxt, first_swap_persistent) + call psb_amx(ctxt, comm_setup_time_baseline) + call psb_amx(ctxt, comm_setup_time_neighbor) + call psb_amx(ctxt, comm_setup_time_persistent) + call psb_amx(ctxt, comm_setup_time_rma_get) + call psb_amx(ctxt, comm_setup_time_rma_put) + + + + + if (my_rank == 0) then + if (run_baseline) then + write(psb_out_unit,'(" Avg baseline time : ",es12.5)') (tsum_baseline / real(iters,psb_spk_)) + write(psb_out_unit,'(" Tot baseline time : ",es12.5)') tsum_baseline + write(psb_out_unit,'(" First baseline time: ",es12.5)') first_swap_baseline + write(psb_out_unit,'(" Baseline comm setup: ",es12.5)') comm_setup_time_baseline + end if + if (run_neighbor) then + write(psb_out_unit,'(" Avg neighbor time : ",es12.5)') (tsum_neighbor / real(iters,psb_spk_)) + write(psb_out_unit,'(" Tot neighbor time : ",es12.5)') tsum_neighbor + write(psb_out_unit,'(" First neighbor time: ",es12.5)') first_swap_neighbor + write(psb_out_unit,'(" Neighbor comm setup: ",es12.5)') comm_setup_time_neighbor + end if + if (run_persistent) then + write(psb_out_unit,'(" Avg pers-neigh time: ",es12.5)') (tsum_neighbor_persistent / real(iters,psb_spk_)) + write(psb_out_unit,'(" Tot pers-neigh time: ",es12.5)') tsum_neighbor_persistent + write(psb_out_unit,'(" First pers-neigh time: ",es12.5)') first_swap_persistent + write(psb_out_unit,'(" Persistent comm setup: ",es12.5)') comm_setup_time_persistent + end if + if (run_rma_get) then + write(psb_out_unit,'(" Avg RMA get time : ",es12.5)') (tsum_rma_get / real(iters,psb_spk_)) + write(psb_out_unit,'(" Tot RMA get time : ",es12.5)') tsum_rma_get + write(psb_out_unit,'(" First RMA get time : ",es12.5)') first_swap_rma_get + write(psb_out_unit,'(" RMA get comm setup : ",es12.5)') comm_setup_time_rma_get + end if + if (run_rma_put) then + write(psb_out_unit,'(" Avg RMA put time : ",es12.5)') (tsum_rma_put / real(iters,psb_spk_)) + write(psb_out_unit,'(" Tot RMA put time : ",es12.5)') tsum_rma_put + write(psb_out_unit,'(" First RMA put time : ",es12.5)') first_swap_rma_put + write(psb_out_unit,'(" RMA put comm setup : ",es12.5)') comm_setup_time_rma_put + end if + end if + + ! ================================================================== + ! 8. Extract results and compare + ! ================================================================== + result_baseline = v_baseline%v%v + result_neighbor = v_neighbor%v%v + result_persistent = v_neighbor_persistent%v%v + result_rma_get = v_rma_get%v%v + result_rma_put = v_rma_put%v%v + + ! --- Cross Checks --- + if (run_baseline .and. run_neighbor) & + call check_result("cross-check baseline vs neighbor", result_baseline, result_neighbor, ncol, tol) + + if (run_baseline .and. run_persistent) & + call check_result("cross-check baseline vs pers-nei", result_baseline, result_persistent, ncol, tol) + + if (run_baseline .and. run_rma_get) & + call check_result("cross-check baseline vs rma-get", result_baseline, result_rma_get, ncol, tol) + + if (run_baseline .and. run_rma_put) & + call check_result("cross-check baseline vs rma-put", result_baseline, result_rma_put, ncol, tol) + + ! --- Absolute Correctness Checks against Expected --- + if (run_baseline) & + call check_result("baseline absolute correctness", result_baseline, expected, ncol, tol) + + if (run_neighbor) & + call check_result("neighbor absolute correctness", result_neighbor, expected, ncol, tol) + + if (run_persistent) & + call check_result("pers-neigh absolute correctness", result_persistent, expected, ncol, tol) + + if (run_rma_get) & + call check_result("rma_get absolute correctness", result_rma_get, expected, ncol, tol) + + if (run_rma_put) & + call check_result("rma_put absolute correctness", result_rma_put, expected, ncol, tol) + + ! ================================================================== + ! 9. Summary + ! ================================================================== + call psb_barrier(ctxt) + if (my_rank == 0) then + write(psb_out_unit,'("================================================")') + write(psb_out_unit,'(" Results: ",i0," / ",i0," tests passed")') n_pass, n_total + if (n_pass == n_total) then + write(psb_out_unit,'(" STATUS: ALL PASSED")') + else + write(psb_out_unit,'(" STATUS: SOME FAILURES")') + end if + write(psb_out_unit,'("================================================")') + end if + call psb_barrier(ctxt) + + ! ================================================================== + ! 10. Cleanup + ! ================================================================== + deallocate(result_baseline, result_neighbor, result_persistent, expected, glob_col) + +9999 call psb_gefree(v_baseline, desc_a, info) + call psb_gefree(v_neighbor, desc_a, info) + call psb_gefree(v_neighbor_persistent, desc_a, info) + if (mat_allocated) call psb_spfree(a_mat, desc_a, info) + call psb_cdfree(desc_a, info) + call psb_exit(ctxt) + + +contains + + ! Helper routine to compare two arrays, reduce the error across MPI ranks, and print the result + subroutine check_result(test_name, arr1, arr2, n, tolerance) + character(len=*), intent(in) :: test_name + real(psb_spk_), intent(in) :: arr1(:), arr2(:) + integer(psb_ipk_), intent(in):: n + real(psb_spk_), intent(in) :: tolerance + real(psb_spk_) :: err_val + + n_total = n_total + 1 + + if (n > 0) then + err_val = maxval(abs(arr1(1:n) - arr2(1:n))) + else + err_val = szero + end if + + ! Get max error across all processes + call psb_amx(ctxt, err_val) + + if (my_rank == 0) then + if ((err_val >= szero) .and. (err_val < tolerance)) then + write(psb_out_unit,'(" [PASS] ", a, t45, ": err = ",es12.5)') test_name, err_val + n_pass = n_pass + 1 + else + write(psb_out_unit,'(" [FAIL] ", a, t45, ": err = ",es12.5)') test_name, err_val + end if + end if + end subroutine check_result + +end program psb_s_comm_test diff --git a/test/comm/swapdata/psb_z_comm_test.F90 b/test/comm/swapdata/psb_z_comm_test.F90 new file mode 100644 index 000000000..cb956f662 --- /dev/null +++ b/test/comm/swapdata/psb_z_comm_test.F90 @@ -0,0 +1,736 @@ +! +! Test program for z-type halo exchange: baseline vs neighbor topology. +! +! This test exercises the lower-level psi_swapdata interface directly +! to compare the two communication paths implemented in psi_dswapdata.F90: +! +! 1. Baseline (Isend/Irecv) : flag = IOR(psb_swap_send_, psb_swap_recv_) +! 2. Neighbor topology (Ineighbor_alltoallv) : flag = psb_swap_start_ then psb_swap_wait_ +! +! It builds a 3D block-partitioned descriptor with a 7-point stencil, +! fills owned entries with their global index, performs halo exchange +! via both paths, then checks: +! (a) The two paths produce identical results (cross-check) +! (b) Every halo entry equals the global index of its source (absolute check) +! +! Run with: mpirun -np

    ./psb_z_comm_test +! +program psb_z_comm_test + use psb_base_mod + use psb_util_mod + use psb_error_mod, only: psb_set_debug_level, psb_debug_ext_ + use psi_mod + use psb_comm_factory_mod, only: psb_comm_set, psb_comm_free + use psb_comm_schemes_mod, only: psb_comm_ineighbor_alltoallv_, psb_comm_persistent_ineighbor_alltoallv_, & + & psb_comm_isend_irecv_, psb_comm_rma_pull_, psb_comm_rma_push_ + use psb_comm_schemes_mod, only: psb_comm_status_start_, psb_comm_status_wait_, psb_comm_status_unknown_ + implicit none + + ! ---- parameters ---- + integer(psb_ipk_) :: idim + integer(psb_ipk_) :: argc + integer(psb_ipk_) :: iters + character(len=256) :: arg + character(len=16) :: mode + character(len=256) :: matrix_file + character(len=2) :: matrix_fmt + logical :: debug_swapdata + logical :: use_external_matrix + + ! ---- descriptor / context ---- + type(psb_ctxt_type) :: ctxt + type(psb_desc_type) :: desc_a + integer(psb_ipk_) :: my_rank, np, info, i, nr, number_of_local_rows + integer(psb_lpk_) :: m, nt + integer(psb_lpk_), allocatable :: myidx(:) + type(psb_zspmat_type) :: a_mat + type(psb_lzspmat_type) :: aux_a + + ! ---- vectors ---- + type(psb_z_vect_type) :: v_baseline, v_neighbor, v_neighbor_persistent, v_rma_get, v_rma_put + + ! ---- temporary / comparison arrays ---- + complex(psb_dpk_), allocatable :: vals(:) + complex(psb_dpk_), allocatable :: result_baseline(:), result_neighbor(:), result_persistent(:), & + & result_rma_get(:), result_rma_put(:) + complex(psb_dpk_), allocatable :: expected(:) + + ! ---- halo index bookkeeping ---- + integer(psb_ipk_) :: nrow, ncol, num_neighbors, send_indexes, receive_indexes + class(psb_i_base_vect_type), pointer :: halo_indexes + + ! ---- error / reporting ---- + integer(psb_ipk_) :: n_pass, n_total, imode + logical :: run_baseline, run_neighbor, run_persistent, run_rma_get, run_rma_put + logical :: mat_allocated + logical :: comm_ok + real(psb_dpk_) :: err, tol + real(psb_dpk_) :: first_swap_baseline, first_swap_neighbor, first_swap_persistent, & + & first_swap_rma_get, first_swap_rma_put + real(psb_dpk_) :: comm_setup_time_baseline, comm_setup_time_neighbor, comm_setup_time_persistent, & + & comm_setup_time_rma_get, comm_setup_time_rma_put + real(psb_dpk_) :: t0, t1, dt, tsum_baseline, tsum_neighbor, tsum_neighbor_persistent, & + & tsum_rma_get, tsum_rma_put + integer(psb_lpk_), allocatable :: glob_col(:) + character(len=40) :: name + real(psb_dpk_) :: huge_d + + name = 'psb_z_comm_test' + tol = 1.0e-12_psb_dpk_ + huge_d = huge(done) + n_pass = 0 + n_total = 0 + iters = 5 + mode = 'both' + debug_swapdata = .false. + matrix_file = '' + matrix_fmt = 'MM' + use_external_matrix = .false. + mat_allocated = .false. + + ! ---- parse command-line argument for idim ---- + idim = 10 + argc = command_argument_count() + do i = 1, argc + call get_command_argument(i, arg) + if (trim(arg) == '--dim') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) idim + end if + else if (trim(arg) == '--iters') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) iters + end if + else if (index(psb_toupper(trim(arg)),'--MATRIX=') == 1) then + matrix_file = adjustl(arg(10:len_trim(arg))) + else if (trim(psb_toupper(arg)) == '--MATRIX') then + if (i < argc) then + call get_command_argument(i+1, matrix_file) + end if + else if (index(psb_toupper(trim(arg)),'--FMT=') == 1) then + arg = psb_toupper(adjustl(arg(7:len_trim(arg)))) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + else if (trim(psb_toupper(arg)) == '--FMT') then + if (i < argc) then + call get_command_argument(i+1, arg) + arg = psb_toupper(trim(arg)) + if ((trim(arg) == 'MM') .or. (trim(arg) == 'HB')) matrix_fmt = trim(arg) + end if + end if + end do + use_external_matrix = (len_trim(matrix_file) > 0) + + ! parse optional mode flag + do i = 1, argc + call get_command_argument(i, arg) + if (trim(arg) == '--mode') then + if (i < argc) then + call get_command_argument(i+1, arg) + read(arg, *) mode + end if + else if (trim(arg) == '--debug') then + debug_swapdata = .true. + end if + end do + + if (debug_swapdata) then + call psb_set_debug_level(psb_debug_ext_) + end if + + run_baseline = .false. + run_neighbor = .false. + run_persistent = .false. + run_rma_get = .false. + run_rma_put = .false. + + + select case (trim(adjustl(mode))) + case ('both','all') + run_baseline = .true. + run_neighbor = .true. + run_persistent = .true. + run_rma_get = .true. + run_rma_put = .true. + case ('baseline') + run_baseline = .true. + case ('neighbor') + run_neighbor = .true. + case ('persistent','persistent_neighbor','persistent-neighbor') + run_persistent = .true. + case ('rma_get') + run_rma_get = .true. + case ('rma_put') + run_rma_put = .true. + case default + run_baseline = .true. + run_neighbor = .true. + run_persistent = .true. + run_rma_get = .true. + run_rma_put = .true. + end select + + if ((.not.use_external_matrix) .and. (idim <= 0)) then + write(*,*) 'Invalid dimension specified. Usage: --dim ' + call psb_abort(ctxt) + end if + ! ================================================================== + ! 1. Initialise MPI / PSBLAS context + ! ================================================================== + call psb_init(ctxt) + call psb_info(ctxt, my_rank, np) + + if (my_rank == 0) then + write(psb_out_unit,'("================================================")') + write(psb_out_unit,'(" Test: z-type halo baseline vs neighbor topo")') + write(psb_out_unit,'(" Processes : ",i0)') np + if (use_external_matrix) then + write(psb_out_unit,'(" Matrix : ",a)') trim(matrix_file) + write(psb_out_unit,'(" Format : ",a)') trim(matrix_fmt) + else + write(psb_out_unit,'(" Grid : ",i0," x ",i0," x ",i0)') idim,idim,idim + end if + write(psb_out_unit,'(" Usage : ./psb_z_comm_test [--dim N] [--iters N] [--mode ...] ",& + &"[--matrix ] [--fmt MM|HB]")') + write(psb_out_unit,'("================================================")') + end if + + ! ================================================================== + ! 2. Build descriptor with 7-point stencil connectivity + ! ================================================================== + if (use_external_matrix) then + select case(psb_toupper(trim(matrix_fmt))) + case('MM') + call mm_mat_read(aux_a,info,filename=trim(matrix_file)) + case('HB') + call hb_read(aux_a,info,filename=trim(matrix_file)) + case default + info = psb_err_internal_error_ + end select + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'matrix read error:', info + call psb_abort(ctxt) + end if + if (aux_a%get_nrows() /= aux_a%get_ncols()) then + write(psb_err_unit,*) my_rank, 'matrix must be square for this test' + call psb_abort(ctxt) + end if + m = aux_a%get_nrows() + call psb_matdist(aux_a, a_mat, ctxt, desc_a, info, fmt='CSR', parts=part_block) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'matdist error:', info + call psb_abort(ctxt) + end if + mat_allocated = .true. + myidx = desc_a%get_global_indices() + number_of_local_rows = size(myidx) + else + m = (1_psb_lpk_ * idim) * idim * idim + nt = (m + np - 1) / np + nr = max(0, min(int(nt,psb_ipk_), int(m - (my_rank * nt),psb_ipk_))) + + call psb_cdall(ctxt, desc_a, info, nl=nr) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'cdall error:', info + call psb_abort(ctxt) + end if + + myidx = desc_a%get_global_indices() + number_of_local_rows = size(myidx) + + do i = 1, number_of_local_rows + call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)/), desc_a, info) + if (myidx(i) > 1) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)-1/), desc_a, info) + if (myidx(i) < m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)+1/), desc_a, info) + if (myidx(i) > idim) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)-idim/), desc_a, info) + if (myidx(i) + idim <= m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), (/myidx(i)+idim/), desc_a, info) + if (myidx(i) > int(idim,psb_lpk_)*idim) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), & + & (/myidx(i) - int(idim,psb_lpk_)*idim/), desc_a, info) + if (myidx(i) + int(idim,psb_lpk_)*idim <= m) & + & call psb_cdins(1_psb_ipk_, (/myidx(i)/), & + & (/myidx(i) + int(idim,psb_lpk_)*idim/), desc_a, info) + end do + + call psb_cdasb(desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'cdasb error:', info + call psb_abort(ctxt) + end if + end if + + nrow = desc_a%get_local_rows() ! owned + ncol = desc_a%get_local_cols() ! owned + halo + + ! ================================================================== + ! 3. Allocate two D vectors (scratch) and fill owned entries + ! ================================================================== + call psb_geall(v_baseline, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall baseline error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_neighbor, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_neighbor_persistent, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall persistent-neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_rma_get, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall rma-get error:', info + call psb_abort(ctxt) + end if + call psb_geall(v_rma_put, desc_a, info) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geall rma-put error:', info + call psb_abort(ctxt) + end if + + + call psb_geasb(v_baseline, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb baseline error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_neighbor, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_neighbor_persistent, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb persistent-neighbor error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_rma_get, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb rma-get error:', info + call psb_abort(ctxt) + end if + call psb_geasb(v_rma_put, desc_a, info, scratch=.true.) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'geasb rma-put error:', info + call psb_abort(ctxt) + end if + + + + ! Fill owned entries with the global index value + allocate(vals(ncol)) + vals = zzero + do i = 1, number_of_local_rows + vals(i) = real(myidx(i),psb_dpk_) + end do + call v_baseline%set_vect(vals) + call v_neighbor%set_vect(vals) + call v_neighbor_persistent%set_vect(vals) + call v_rma_get%set_vect(vals) + call v_rma_put%set_vect(vals) + deallocate(vals) + + ! ================================================================== + ! 4. Build the expected result for halo positions + ! glob_col(j) = global index of local column j + ! After halo exchange every position j should hold glob_col(j). + ! ================================================================== + allocate(glob_col(ncol), expected(ncol)) + glob_col = desc_a%get_global_indices(owned=.false.) + do i = 1, ncol + expected(i) = real(glob_col(i),psb_dpk_) + end do + allocate(result_baseline(ncol), result_neighbor(ncol), result_persistent(ncol), & + & result_rma_get(ncol), result_rma_put(ncol)) + result_baseline = huge_d + result_neighbor = huge_d + result_persistent = huge_d + result_rma_get = huge_d + result_rma_put = huge_d + + first_swap_baseline = dzero + first_swap_neighbor = dzero + first_swap_persistent = dzero + first_swap_rma_get = dzero + first_swap_rma_put = dzero + + comm_setup_time_baseline = dzero + comm_setup_time_neighbor = dzero + comm_setup_time_persistent = dzero + comm_setup_time_rma_get = dzero + comm_setup_time_rma_put = dzero + + ! ================================================================== + ! 6. Baseline halo exchange (Isend/Irecv in one call) + ! ================================================================== + if (run_baseline) then + comm_setup_time_baseline = psb_wtime() + call psb_comm_set(psb_comm_isend_irecv_, v_baseline%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set baseline error:', info + call psb_abort(ctxt) + end if + comm_setup_time_baseline = psb_wtime() - comm_setup_time_baseline + + first_swap_baseline = psb_wtime() + call psi_swapdata( & + swap_status=psb_comm_status_start_, & + beta=zzero, & + y=v_baseline%v, & + desc_a=desc_a, & + info=info, & + data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'baseline swap error:', info + call psb_abort(ctxt) + end if + + call psi_swapdata( & + swap_status=psb_comm_status_wait_, & + beta=zzero, & + y=v_baseline%v, & + desc_a=desc_a, & + info=info, & + data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'baseline swap error:', info + call psb_abort(ctxt) + end if + first_swap_baseline = psb_wtime() - first_swap_baseline + end if + + + ! ================================================================== + ! 7. Neighbor topology halo exchange (start + wait) + ! ================================================================== + if (run_neighbor) then + comm_setup_time_neighbor = psb_wtime() + call psb_comm_set(psb_comm_ineighbor_alltoallv_, v_neighbor%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set neighbor error:', info + call psb_abort(ctxt) + end if + comm_setup_time_neighbor = psb_wtime() - comm_setup_time_neighbor + + + first_swap_neighbor = psb_wtime() + call psi_swapdata(psb_comm_status_start_, zzero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'neighbor start error:', info + call psb_abort(ctxt) + end if + + call psi_swapdata(psb_comm_status_wait_, zzero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'neighbor wait error:', info + call psb_abort(ctxt) + end if + first_swap_neighbor = psb_wtime() - first_swap_neighbor + end if + + ! ================================================================== + ! 7b. Persistent-neighbor halo exchange (start + wait) + ! ================================================================== + if (run_persistent) then + comm_setup_time_persistent = psb_wtime() + call psb_comm_set(psb_comm_persistent_ineighbor_alltoallv_, v_neighbor_persistent%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set persistent-neighbor error:', info + call psb_abort(ctxt) + end if + comm_setup_time_persistent = psb_wtime() - comm_setup_time_persistent + + + first_swap_persistent = psb_wtime() + call psi_swapdata(psb_comm_status_start_, zzero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'persistent-neighbor start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, zzero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'persistent-neighbor wait error:', info + call psb_abort(ctxt) + end if + first_swap_persistent = psb_wtime() - first_swap_persistent + end if + + + + if(run_rma_get) then + comm_setup_time_rma_get = psb_wtime() + call psb_comm_set(psb_comm_rma_pull_, v_rma_get%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set RMA get error:', info + call psb_abort(ctxt) + end if + comm_setup_time_rma_get = psb_wtime() - comm_setup_time_rma_get + + first_swap_rma_get = psb_wtime() + call psi_swapdata(psb_comm_status_start_, zzero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA get start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, zzero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA get wait error:', info + call psb_abort(ctxt) + end if + first_swap_rma_get = psb_wtime() - first_swap_rma_get + end if + + + + + if(run_rma_put) then + comm_setup_time_rma_put = psb_wtime() + call psb_comm_set(psb_comm_rma_push_, v_rma_put%v%comm_handle, info) + if (info /= 0) then + write(psb_err_unit,*) my_rank, 'psb_comm_set RMA put error:', info + call psb_abort(ctxt) + end if + comm_setup_time_rma_put = psb_wtime() - comm_setup_time_rma_put + + first_swap_rma_put = psb_wtime() + call psi_swapdata(psb_comm_status_start_, zzero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA put start error:', info + call psb_abort(ctxt) + end if + call psi_swapdata(psb_comm_status_wait_, zzero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + if (info /= psb_success_) then + write(psb_err_unit,*) my_rank, 'RMA put wait error:', info + call psb_abort(ctxt) + end if + first_swap_rma_put = psb_wtime() - first_swap_rma_put + end if + + + + ! ================================================================== + ! 8. Performance: repeat exchanges and measure timings + ! ================================================================== + if (my_rank == 0) then + write(psb_out_unit,'("Timing: running ",i0," iterations for selected exchange mode(s)")') iters + end if + + tsum_baseline = dzero + tsum_neighbor = dzero + tsum_neighbor_persistent = dzero + tsum_rma_get = dzero + tsum_rma_put = dzero + + do i = 1, iters + if (run_baseline) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, zzero, v_baseline%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, zzero, v_baseline%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_baseline = tsum_baseline + dt + end if + + if (run_neighbor) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, zzero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, zzero, v_neighbor%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_neighbor = tsum_neighbor + dt + end if + + if (run_persistent) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, zzero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, zzero, v_neighbor_persistent%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_neighbor_persistent = tsum_neighbor_persistent + dt + end if + + + if (run_rma_get) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, zzero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, zzero, v_rma_get%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_rma_get = tsum_rma_get + dt + end if + + + if (run_rma_put) then + t0 = psb_wtime() + call psi_swapdata(psb_comm_status_start_, zzero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + call psi_swapdata(psb_comm_status_wait_, zzero, v_rma_put%v, desc_a, info, data=psb_comm_halo_) + t1 = psb_wtime() + dt = t1 - t0 + call psb_amx(ctxt, dt) + tsum_rma_put = tsum_rma_put + dt + end if + + + end do + + + + call psb_amx(ctxt, tsum_baseline) + call psb_amx(ctxt, tsum_neighbor) + call psb_amx(ctxt, tsum_neighbor_persistent) + call psb_amx(ctxt, first_swap_baseline) + call psb_amx(ctxt, first_swap_neighbor) + call psb_amx(ctxt, first_swap_persistent) + call psb_amx(ctxt, comm_setup_time_baseline) + call psb_amx(ctxt, comm_setup_time_neighbor) + call psb_amx(ctxt, comm_setup_time_persistent) + call psb_amx(ctxt, comm_setup_time_rma_get) + call psb_amx(ctxt, comm_setup_time_rma_put) + + + + + if (my_rank == 0) then + if (run_baseline) then + write(psb_out_unit,'(" Avg baseline time : ",es12.5)') (tsum_baseline / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot baseline time : ",es12.5)') tsum_baseline + write(psb_out_unit,'(" First baseline time: ",es12.5)') first_swap_baseline + write(psb_out_unit,'(" Baseline comm setup: ",es12.5)') comm_setup_time_baseline + end if + if (run_neighbor) then + write(psb_out_unit,'(" Avg neighbor time : ",es12.5)') (tsum_neighbor / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot neighbor time : ",es12.5)') tsum_neighbor + write(psb_out_unit,'(" First neighbor time: ",es12.5)') first_swap_neighbor + write(psb_out_unit,'(" Neighbor comm setup: ",es12.5)') comm_setup_time_neighbor + end if + if (run_persistent) then + write(psb_out_unit,'(" Avg pers-neigh time: ",es12.5)') (tsum_neighbor_persistent / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot pers-neigh time: ",es12.5)') tsum_neighbor_persistent + write(psb_out_unit,'(" First pers-neigh time: ",es12.5)') first_swap_persistent + write(psb_out_unit,'(" Persistent comm setup: ",es12.5)') comm_setup_time_persistent + end if + if (run_rma_get) then + write(psb_out_unit,'(" Avg RMA get time : ",es12.5)') (tsum_rma_get / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot RMA get time : ",es12.5)') tsum_rma_get + write(psb_out_unit,'(" First RMA get time : ",es12.5)') first_swap_rma_get + write(psb_out_unit,'(" RMA get comm setup : ",es12.5)') comm_setup_time_rma_get + end if + if (run_rma_put) then + write(psb_out_unit,'(" Avg RMA put time : ",es12.5)') (tsum_rma_put / real(iters,psb_dpk_)) + write(psb_out_unit,'(" Tot RMA put time : ",es12.5)') tsum_rma_put + write(psb_out_unit,'(" First RMA put time : ",es12.5)') first_swap_rma_put + write(psb_out_unit,'(" RMA put comm setup : ",es12.5)') comm_setup_time_rma_put + end if + end if + + ! ================================================================== + ! 8. Extract results and compare + ! ================================================================== + result_baseline = v_baseline%v%v + result_neighbor = v_neighbor%v%v + result_persistent = v_neighbor_persistent%v%v + result_rma_get = v_rma_get%v%v + result_rma_put = v_rma_put%v%v + + ! --- Cross Checks --- + if (run_baseline .and. run_neighbor) & + call check_result("cross-check baseline vs neighbor", result_baseline, result_neighbor, ncol, tol) + + if (run_baseline .and. run_persistent) & + call check_result("cross-check baseline vs pers-nei", result_baseline, result_persistent, ncol, tol) + + if (run_baseline .and. run_rma_get) & + call check_result("cross-check baseline vs rma-get", result_baseline, result_rma_get, ncol, tol) + + if (run_baseline .and. run_rma_put) & + call check_result("cross-check baseline vs rma-put", result_baseline, result_rma_put, ncol, tol) + + ! --- Absolute Correctness Checks against Expected --- + if (run_baseline) & + call check_result("baseline absolute correctness", result_baseline, expected, ncol, tol) + + if (run_neighbor) & + call check_result("neighbor absolute correctness", result_neighbor, expected, ncol, tol) + + if (run_persistent) & + call check_result("pers-neigh absolute correctness", result_persistent, expected, ncol, tol) + + if (run_rma_get) & + call check_result("rma_get absolute correctness", result_rma_get, expected, ncol, tol) + + if (run_rma_put) & + call check_result("rma_put absolute correctness", result_rma_put, expected, ncol, tol) + + ! ================================================================== + ! 9. Summary + ! ================================================================== + call psb_barrier(ctxt) + if (my_rank == 0) then + write(psb_out_unit,'("================================================")') + write(psb_out_unit,'(" Results: ",i0," / ",i0," tests passed")') n_pass, n_total + if (n_pass == n_total) then + write(psb_out_unit,'(" STATUS: ALL PASSED")') + else + write(psb_out_unit,'(" STATUS: SOME FAILURES")') + end if + write(psb_out_unit,'("================================================")') + end if + call psb_barrier(ctxt) + + ! ================================================================== + ! 10. Cleanup + ! ================================================================== + deallocate(result_baseline, result_neighbor, result_persistent, expected, glob_col) + +9999 call psb_gefree(v_baseline, desc_a, info) + call psb_gefree(v_neighbor, desc_a, info) + call psb_gefree(v_neighbor_persistent, desc_a, info) + if (mat_allocated) call psb_spfree(a_mat, desc_a, info) + call psb_cdfree(desc_a, info) + call psb_exit(ctxt) + + +contains + + ! Helper routine to compare two arrays, reduce the error across MPI ranks, and print the result + subroutine check_result(test_name, arr1, arr2, n, tolerance) + character(len=*), intent(in) :: test_name + complex(psb_dpk_), intent(in) :: arr1(:), arr2(:) + integer(psb_ipk_), intent(in):: n + real(psb_dpk_), intent(in) :: tolerance + real(psb_dpk_) :: err_val + + n_total = n_total + 1 + + if (n > 0) then + err_val = maxval(abs(arr1(1:n) - arr2(1:n))) + else + err_val = dzero + end if + + ! Get max error across all processes + call psb_amx(ctxt, err_val) + + if (my_rank == 0) then + if ((err_val >= dzero) .and. (err_val < tolerance)) then + write(psb_out_unit,'(" [PASS] ", a, t45, ": err = ",es12.5)') test_name, err_val + n_pass = n_pass + 1 + else + write(psb_out_unit,'(" [FAIL] ", a, t45, ": err = ",es12.5)') test_name, err_val + end if + end if + end subroutine check_result + +end program psb_z_comm_test diff --git a/test/computational_routines/CMakeLists.txt b/test/computational_routines/CMakeLists.txt index d49cc825a..89f5ed9f3 100644 --- a/test/computational_routines/CMakeLists.txt +++ b/test/computational_routines/CMakeLists.txt @@ -28,22 +28,22 @@ file(MAKE_DIRECTORY ${EXEDIR}) set(PSBLAS_LIBS psblas::util psblas::prec psblas::base) -include(${CMAKE_CURRENT_LIST_DIR}/utils/CMakeLists.txt) - include(${CMAKE_CURRENT_LIST_DIR}/geaxpby/CMakeLists.txt) include(${CMAKE_CURRENT_LIST_DIR}/gedot/CMakeLists.txt) include(${CMAKE_CURRENT_LIST_DIR}/spmm/CMakeLists.txt) + # Create executables -add_executable(psb_geaxpby_test ${geaxpby_source_files} ${utils_source_files}) -add_executable(psb_gedot_test ${gedot_source_files} ${utils_source_files}) -add_executable(psb_spmm_test ${spmm_source_files} ${utils_source_files}) +add_executable(psb_geaxpby_test ${geaxpby_source_files}) +add_executable(psb_gedot_test ${gedot_source_files}) +add_executable(psb_spmm_test ${spmm_source_files}) # Link the necessary libraries target_link_libraries(psb_geaxpby_test ${PSBLAS_LIBS}) target_link_libraries(psb_gedot_test ${PSBLAS_LIBS}) target_link_libraries(psb_spmm_test ${PSBLAS_LIBS}) + # Set output directory set_target_properties(psb_geaxpby_test PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${EXEDIR} diff --git a/test/computational_routines/Makefile b/test/computational_routines/Makefile new file mode 100644 index 000000000..ce5dc3297 --- /dev/null +++ b/test/computational_routines/Makefile @@ -0,0 +1,13 @@ +SUBDIRS := geaxpby gedot spmm + +.PHONY: all $(SUBDIRS) clean + +all: $(SUBDIRS) + +$(SUBDIRS): + $(MAKE) -C $@ + +clean: + @for d in $(SUBDIRS); do \ + $(MAKE) -C $$d clean; \ + done diff --git a/test/computational_routines/README.md b/test/computational_routines/README.md index 1947d8950..5bc710444 100644 --- a/test/computational_routines/README.md +++ b/test/computational_routines/README.md @@ -13,42 +13,70 @@ The necessary dependnces are: - CUDA 12.5 ## Test Approach -In order to check wheter each kernel computation is correct or not, it was taken into account a simple approach resported in [[1]](#testing): the kernels are excecuted both in single $y_{s}$ and double precision $y_{d}$. The difference between the two results $\Delta y$ should not exceed the machine epsilon of the single precision floating point representation. This quantity is identified as the unit roundoff $u$. In this the IEEE floating point representation we have $u = 2^-24 \approx 5.96 \cdot 10^{-8}$ and therefore $\Delta y = y_d - y_s \leq u$ as stated in Highman in his book [[2]](#accuracy). It is also important to note that $\Delta y$ is a double precision floating point number, since it should be able to detect an higher precision with respect to a single precision representation. +In order to check wheter each kernel computation is correct or not, it was taken into account a simple approach resported in [[1]](#testing): the kernels are excecuted both in single $y_{s}$ and double precision $y_{d}$. The difference between the two results $\Delta y$ should not exceed the machine epsilon of the single precision floating point representation. This quantity is identified as the unit roundoff $u$. In this the IEEE floating point representation we have $$u = 2^-24 \approx 5.96 \cdot 10^{-8}$$ and therefore $$\Delta y = y_d - y_s \leq u$$ as stated in Highman in his book [[2]](#accuracy). It is also important to note that $\Delta y$ is a double precision floating point number, since it should be able to detect an higher precision with respect to a single precision representation. The innovative approach introduced in this test suite is to have a theoretical results showing us the correctness of the double precision implementation. In fact, the double precision computation is used as validation result for the single precision one, but no assumption of correctness were done before. In this work, double precision computations are validated using a heuristic approach based on the number $p$ of significand digits that can be estimated using the $\gamma_n = \frac{nu}{1-nu}$ worst case constant known from Higman [[2]](#accuracy) in order to have an upper bound to the number of significand digits. Since this approach is kernel specific, see each test directory to see how this idea is applied to each routine. ## Directory description -Each directory has the name of the computational kernel routines described in the documentation of the version 3.9 of the PSBLAS library. In each directory there are different files: +Each directory has the name of the computational kernel routines described in the documentation of the version 3.9 of the PSBLAS library. In each directory there are different files and directories: -- ```autotest.sh```, it's the bash script excecuting and also possibily compiling kernel specific tests. -- ```Makefile```, contains all the rules to compile the subdir including PSBLAS modules and files, also according to the PSBLAS testing environment utilities. -- ```psb__test.f90```, a single file implementing a main program that initializes the testing environment and start test routine parametrizing over the test input space. In this file it also contained a subroutine containing the call to the actual kernel using the parameters passed from the main program. -- ```README.md``, a file explaining the input space and all the choices used to validete and explain the tests implemented. +- parallel/ +- serial/ +- vectors/ +- runs/ +- logs/ +- autotest.sh +- Makefile +- <routine_name>.f90 +- psb_<routine_name>_test.f90 +- README.md +## Standard test runner and log schema + +All `autotest.sh` scripts use a shared helper in `test/computational_routines/common/testlib.sh` to standardize execution and logging. Each test writes logs in `logs/` with the format: + +- `[RUN] ` and `[DATE] ` header +- `[DIFF] vs : differences` for each comparison + +The main driver [test/computational_routines/test.sh](test/computational_routines/test.sh) aggregates logs from each `logs/` directory. + +Process count for multi-process runs is capped to 4 by default. Override with: + +- `PSBLAS_TEST_NP=` to set a specific process count +- `PSBLAS_TEST_MAX_NP=` to change the default cap ## Routines + In this test suite were considered only computational routines implemented by PSBLAS, according to the version 3.9 of the documentation. In the following table are reported all the kernels, their implementation and wheter or not they were tested yet. -|**Kernel**| **PSBLAS Subroutine**|**Description**|**Single Process Test**|**Multi-Process Test**|**Complex Test**|**GPU Test**| -| ------------------------------- | :--------------------------: | ---------------------------------------------------------------------- | :---------------: |:---------------: |:---------------: |:---------------: | -|**General Dense Matrix Sum**| `psb_geaxpby`| This subroutine is an interface to the computational kernel for dense matrix sum: $Y \leftarrow \alpha X + \beta Y$ |Yes ✅|Yes ✅|No ❌|No ❌| -| **Dot product**|`psb_gedot`|This function computes dot product between two vectors x and y. $dot \leftarrow x^T y$ If x and y are real vectors it computes dot-product as: $dot \leftarrow x^H y$ |Yes ✅|Yes ✅|No ❌|No ❌| -| **Generalized Dot Product** |`psb_gedots`|This subroutine computes a series of dot products among the columns of two dense matrices x and y:$res(i) \leftarrow x(:,i)^T y(:,i)$ If the matrices are complex, then the usual convention applies, i.e. the conjugate transpose of x is used. If x and y are of rank one, then res is a scalar, else it is a rank one array.|Yes ✅|Yes ✅|No ❌|No ❌| -|**Infinity-Norm of Vector**|`psb_normi`/`psb_geamax`|This function computes the infinity-norm of a vector x. If x is a real vector it computes infinity norm as:$amax \leftarrow max \mid x_i \mid$else if x is a complex vector then it computes the infinity-norm as: $amax \leftarrow max(\mid re(x_i) \mid + \mid im(x_i) \mid)$ |No ❌|No ❌|No ❌|No ❌| -|**Generalized Infinity Norm**|`psb_geamaxs`|This subroutine computes a series of infinity norms on the columns of a dense matrix x: $res(i) \leftarrow max_k \mid x(k,i) \mid$ |No ❌|No ❌|No ❌|No ❌| -| **1-Norm of Vector**| `psb_norm1` / `psb_geasums`|This function computes the 1-norm of a vector x. If x is a real vector it computes 1-norm as: $asum \leftarrow \mid \mid x_i \mid \mid$ else if x is a complex vector then it computes 1-norm as: $asum \leftarrow \mid \mid re(x) \mid \mid_1 + \mid \mid im(x) \mid \mid_1$ |No ❌|No ❌|No ❌|No ❌| -|**Generalized 1-Norm of Vector**|`psb_geasums`|This subroutine computes a series of 1-norms on the columns of a dense matrix x: $res(i) \leftarrow max_k \mid x(k,i) \mid$ This function computes the 1-norm of a vector x. If x is a real vector it computes 1-norm as: $res(i) \leftarrow \mid \mid x_i \mid \mid$else if x is a complex vector then it computes 1-norm as:$res(i) \leftarrow \mid \mid re(x) \mid \mid_\ + \mid \mid im(x) \mid \mid_1$ |No ❌|No ❌|No ❌|No ❌| -| **2-Norm of Vector**|`psb_norm2` / `psb_genrm2`| This function computes the 2-norm of a vector x. If x is a real vector it computes 2-norm as: $nrm2 \leftarrow \sqrt{x^T x}$ else if x is a complex vector then it computes 2-norm as: $nrm2 \leftarrow \sqrt{x^H x}$ |No ❌|No ❌|No ❌|No ❌| -|**Generalized 2-Norm of Vector**|`psb_genrm2s` / `psb_spnrm1` |This subroutine computes a series of 2-norms on the columns of a dense matrix x: $res(i) \leftarrow \mid \mid x(:,i) \mid \mid_2$ |No ❌|No ❌|No ❌|No ❌| -|**1-Norm of Sparse Matrix**|`psb_norm1`|This function computes the 1-norm of a matrix A: $nrm1 \leftarrow \mid \mid A \mid \mid_1$ where A represents the global matrix A|No ❌|No ❌|No ❌|No ❌| -|**Infinity Norm of Sparse Matrix**|`psb_normi` / `psb_spnrmi`|This function computes the infinity-norm of a matrix A: $nrmi \leftarrow \mid \mid A \mid \mid_{\infty}$ where: $A$ represents the global matrix|No ❌|No ❌|No ❌|No ❌| -|**Sparse Matrix by Dense Matrix Product**| `psb_spmm`|This subroutine computes the Sparse Matrix by Dense Matrix Product: $y \leftarrow \alpha A x + \beta y$ $y \leftarrow \alpha A^T x + \beta y$ $y \leftarrow \alpha A^H x + \beta y$ where:
    $x$ is the global dense matrix $x_{:,:}$
    y is the global dense matrix $y_{:,:}$
    $A$ is the global sparse matrix |Work in progress :hammer_and_wrench:|No ❌|No ❌|No ❌| -|**Triangular System Solve**|`psb_spsm`|This subroutine computes the Triangular System Solve: $y \leftarrow \alpha T^{-1} x + \beta y$ $y \leftarrow \alpha D^{-1} x + \beta y$ $y \leftarrow \alpha T^{-1} D x + \beta y$ $y \leftarrow \alpha T^{-T} x + \beta y$ $y \leftarrow \alpha D T^{-T} x + \beta y$ $y \leftarrow \alpha T^{-T} D x + \beta y$ $y \leftarrow \alpha T^{-H} x + \beta y$ $y \leftarrow \alpha D T^{-H} x + \beta y$ $y \leftarrow \alpha T^{-H} D x + \beta y$ where:
    $x$ is the global dense matrix $x_{:,:}$
    $y$ is the global dense matrix $y_{:,:}$
    $T$ is the global sparse block triangular submatrix
    D is the scaling diagonal matrix|No ❌|No ❌|No ❌|No ❌| -|**Entrywise Product**|`psb_gemlt`|This function computes the entrywise product between two vectors $x$ and $y$ $dot \leftarrow x(i)y(i)$ |No ❌|No ❌|No ❌|No ❌| -|**Entrywise Division**|`psb_gediv`|This function computes the entrywise division between two vectors $x$ and $y$ $div \leftarrow \frac{x(i)}{y(i)}$ |No ❌|No ❌|No ❌|No ❌| -|**Entrywise Inversion**|`psb_geinv`|This function computes the entrywise inverse of a vector x and puts it into $y$ $inv \leftarrow \frac{1}{x(i)}$ |No ❌|No ❌|No ❌|No ❌| - -## Developer Notes -In order to keep compliant the excecution of the bash script used to automate the teest excecution, remember to create a new directory to put new tests and to use the name convention of psb_test_ signature for utilities functions and psb_kernel_test for tests used for new routines. + +|**Kernel**| **PSBLAS Subroutine**|**Description**|**Test**| +| ------------------------------- | :--------------------------: | ---------------------------------------------------------------------- | :---------------: | +|**General Dense Matrix Sum**| `psb_geaxpby`| This subroutine is an interface to the computational kernel for dense matrix sum:$$Y \leftarrow \alpha X + \beta Y$$|Yes ✅| +| **Dot product**|`psb_gedot`|This function computes dot product between two vectors x and y.$$dot \leftarrow x^T y$$If x and y are real vectors it computes dot-product as:$$dot \leftarrow x^H y$$|Work in progress :hammer_and_wrench:| +| **Generalized Dot Product** |`psb_gedots`|This subroutine computes a series of dot products among the columns of two dense matrices x and y:$$res(i) \leftarrow x(:,i)^T y(:,i)$$If the matrices are complex, then the usual convention applies, i.e. the conjugate transpose of x is used. If x and y are of rank one, then res is a scalar, else it is a rank one array.|No ❌| +|**Infinity-Norm of Vector**|`psb_normi`/`psb_geamax`|This function computes the infinity-norm of a vector x. If x is a real vector it computes infinity norm as:$$amax \leftarrow max \mid x_i \mid$$else if x is a complex vector then it computes the infinity-norm as:$$amax \leftarrow max(\mid re(x_i) \mid + \mid im(x_i) \mid)$$|No ❌| +|**Generalized Infinity Norm**|`psb_geamaxs`|This subroutine computes a series of infinity norms on the columns of a dense matrix x:$$res(i) \leftarrow max_k \mid x(k,i) \mid$$| No ❌ | +| **1-Norm of Vector**| `psb_norm1` / `psb_geasums`|This function computes the 1-norm of a vector x. If x is a real vector it computes 1-norm as:$$asum \leftarrow \mid \mid x_i \mid \mid$$else if x is a complex vector then it computes 1-norm as:$$asum \leftarrow \mid \mid re(x) \mid \mid_1 + \mid \mid im(x) \mid \mid_1$$|No ❌| +|**Generalized 1-Norm of Vector**|`psb_geasums`|This subroutine computes a series of 1-norms on the columns of a dense matrix x:$$res(i) \leftarrow max_k \mid x(k,i) \mid$$This function computes the 1-norm of a vector x. If x is a real vector it computes 1-norm as:$$res(i) \leftarrow \mid \mid x_i \mid \mid$$else if x is a complex vector then it computes 1-norm as:$$res(i) \leftarrow \mid \mid re(x) \mid \mid_\ + \mid \mid im(x) \mid \mid_1$$|No ❌| +| **2-Norm of Vector**|`psb_norm2` / `psb_genrm2`| This function computes the 2-norm of a vector x. If x is a real vector it computes 2-norm as:$$nrm2 \leftarrow \sqrt{x^T x}$$else if x is a complex vector then it computes 2-norm as:$$nrm2 \leftarrow \sqrt{x^H x}$$|No ❌| +|**Generalized 2-Norm of Vector**|`psb_genrm2s` / `psb_spnrm1` |This subroutine computes a series of 2-norms on the columns of a dense matrix x:$$res(i) \leftarrow \mid \mid x(:,i) \mid \mid_2$$|No ❌| +|**1-Norm of Sparse Matrix**|`psb_norm1`|This function computes the 1-norm of a matrix A:$$nrm1 \leftarrow \mid \mid A \mid \mid_1$$where A represents the global matrix A|No ❌| +|**Infinity Norm of Sparse Matrix**|`psb_normi` / `psb_spnrmi`|This function computes the infinity-norm of a matrix A:$$nrmi \leftarrow \mid \mid A \mid \mid_{\infty}$$where: A represents the global matrix A|No ❌| +|**Sparse Matrix by Dense Matrix Product**| `psb_spmm`|This subroutine computes the Sparse Matrix by Dense Matrix Product:$$y \leftarrow \alpha A x + \beta y$$$$y \leftarrow \alpha A^T x + \beta y$$$$y \leftarrow \alpha A^H x + \beta y$$where:
    x is the global dense matrix x_{:,:}
    y is the global dense matrix y_{:,:}
    A is the global sparse matrix A|Work in progress :hammer_and_wrench:| +|**Triangular System Solve**|`psb_spsm`|This subroutine computes the Triangular System Solve:$$y \leftarrow \alpha T^{-1} x + \beta y$$$$y \leftarrow \alpha D^{-1} x + \beta y$$$$y \leftarrow \alpha T^{-1} D x + \beta y$$$$y \leftarrow \alpha T^{-T} x + \beta y$$$$y \leftarrow \alpha D T^{-T} x + \beta y$$$$y \leftarrow \alpha T^{-T} D x + \beta y$$$$y \leftarrow \alpha T^{-H} x + \beta y$$$$y \leftarrow \alpha D T^{-H} x + \beta y$$$$y \leftarrow \alpha T^{-H} D x + \beta y$$where:
    x is the global dense matrix x_{:,:}
    y is the global dense matrix y_{:,:}
    T is the global sparse block triangular submatrix T
    D is the scaling diagonal matrix|No ❌| +|**Entrywise Product**|`psb_gemlt`|This function computes the entrywise product between two vectors x and y$$dot \leftarrow x(i)y(i)$$|No ❌| +|**Entrywise Division**|`psb_gediv`|This function computes the entrywise division between two vectors x and y$$div \leftarrow \frac{x(i)}{y(i)}$$|No ❌| +|**Entrywise Inversion**|`psb_geinv`|This function computes the entrywise inverse of a vector x and puts it into y$$inv \leftarrow \frac{1}{x(i)}$$|No ❌| + +## TODO +- Merge all the output logs +- Finish the directories description +- Check memory occupancy of parallel/ serial/ and vectors/ directories (Maybe not the best way for lots of rputines?) + +## Questions +- Is it correct to use psb_gather even for a single process running? +- Is it correct to shift in 0,xxxx type of notation to compare with the correct number of significand digits? + ## References [1]. Higham, Nicholas J. Testing linear algebra software. Springer US, 1997 diff --git a/test/computational_routines/backlog.txt b/test/computational_routines/backlog.txt deleted file mode 100644 index 6ae68b7e5..000000000 --- a/test/computational_routines/backlog.txt +++ /dev/null @@ -1,13 +0,0 @@ -COMPLETED: -- Try to use Julienne https://github.com/berkeleylab/julienne in order to avoid different do nested loops [OK] -(Possible solutions are to use Fortuno and FPunit, in order to implement parametrized tests) -- Remove file generation in order to save up memory [OK] -- Clean main log at each run [OK] (Log aggregation was deleted) -- Fix log aggregation in main directory, see number of total tests [OK] (Log aggregation was deleted) -- Fix parallel and serial, using a fortran routine instead of the diff between files [OK] - - - -TODO: -- Force recompilation in main script (A flag should be added) -- Generate input vectors only if vectors/ directory doesn't exist to save up time (It is really dependant on the kernel analyzed, it is not always possible) diff --git a/test/computational_routines/common/testlib.sh b/test/computational_routines/common/testlib.sh new file mode 100644 index 000000000..fa21ef611 --- /dev/null +++ b/test/computational_routines/common/testlib.sh @@ -0,0 +1,172 @@ +#!/bin/bash + +# Common helpers for computational_routines autotest.sh scripts. + +# Color codes +GREEN="\033[0;32m" +RED="\033[0;31m" +BLUE="\033[0;34m" +YELLOW="\033[33m" +RESET="\033[0m" + +info() { + echo -e "${BLUE}[INFO]\t $*${RESET}" +} + +warn() { + echo -e "${YELLOW}[WARNING] $*${RESET}" +} + +err() { + echo -e "${RED}[ERROR]\t$*${RESET}" +} + +ensure_dirs() { + for d in "$@"; do + mkdir -p "$d" + done +} + +log_header() { + local logfile="$1" + local title="$2" + { + echo "[RUN] ${title}" + echo "[DATE] $(date +"%Y-%m-%d %H:%M:%S")" + } >> "$logfile" +} + +run_mpi() { + local np="$1" + local exe="$2" + local label="$3" + info "Starting ${label}" + mpirun -np "$np" "$exe" +} + +compare_dirs() { + local dir1="$1" + local dir2="$2" + local logfile="$3" + 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} + + 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 + warn "Missing directories for comparison (${dir1}, ${dir2})." + return 0 + fi + + for file1 in "$dir1"/*; do + if [[ ! -f "$file1" ]]; then + continue + fi + total_files=$((total_files + 1)) + local filename + filename=$(basename "$file1") + local file2="$dir2/$filename" + if [[ -f "$file2" ]]; then + local diff_count + if [[ "${filename}" == *.mtx ]]; then + diff_count=$(awk -v f1="$file1" -v f2="$file2" -v eps="$eps" -v mode="$cmp_mode" ' + function readvals(fname, vals, line, n, header_seen) { + n = 0 + while ((getline line < fname) > 0) { + if (line ~ /^%/) continue + if (line ~ /^[[:space:]]*$/) continue + if (!header_seen) { header_seen = 1; continue } + n++; vals[n] = line + 0 + } + close(fname) + return n + } + BEGIN { + n1 = readvals(f1, a) + n2 = readvals(f2, b) + n = (n1 < n2 ? n1 : n2) + diff = 0 + for (i = 1; i <= n; i++) { + d = a[i] - b[i] + if (d < 0) d = -d + 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) + print diff + }') + else + diff_count=$(diff -U 0 "$file1" "$file2" | grep -E '^[+-]' | grep -v '^[+-]{3}' | wc -l) + fi + 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 + err "File ${filename} does not exist in ${dir2}" + total_fail=$((total_fail + 1)) + fi + 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() { + local detected + local max + detected=${PSBLAS_TEST_NP:-$(nproc)} + max=${PSBLAS_TEST_MAX_NP:-4} + + if [[ "$detected" -gt "$max" ]]; then + detected="$max" + fi + + echo "$detected" +} diff --git a/test/computational_routines/geaxpby/CMakeLists.txt b/test/computational_routines/geaxpby/CMakeLists.txt index 2b7371ba1..e55c31238 100644 --- a/test/computational_routines/geaxpby/CMakeLists.txt +++ b/test/computational_routines/geaxpby/CMakeLists.txt @@ -1,6 +1,6 @@ set(PSB_geaxpby_source_files psb_geaxpby_test.f90 - #geaxpby.f90 + geaxpby.f90 ) foreach(file IN LISTS PSB_geaxpby_source_files) list(APPEND geaxpby_source_files ${CMAKE_CURRENT_LIST_DIR}/${file}) diff --git a/test/computational_routines/geaxpby/Makefile b/test/computational_routines/geaxpby/Makefile index 1307040bd..b4ebb57b7 100644 --- a/test/computational_routines/geaxpby/Makefile +++ b/test/computational_routines/geaxpby/Makefile @@ -8,10 +8,12 @@ include $(INCDIR)/Make.inc.psblas LIBDIR = $(INSTALLDIR)/lib/ PSBLAS_LIB = -L$(LIBDIR) -lpsb_util -lpsb_base LDLIBS = $(PSBLDLIBS) -EXEDIR = ./runs FINCLUDES=$(FMFLAG)$(MODDIR) $(FMFLAG). +EXEDIR=./runs + + GREEN=\033[0;32m RED=\033[0;31m BLUE=\033[0;34m @@ -23,12 +25,15 @@ all: runsd psb_geaxpby_test @printf "$(GREEN)[INFO]\t Compilation success!$(END_COLOUR)\n" runsd: - @(if test ! -d $(EXEDIR) ; then mkdir $(EXEDIR); fi) + @(if test ! -d runs ; then mkdir runs; fi) @printf "$(BLUE)[INFO]\t Build directory $(EXEDIR) correctly initialized$(END_COLOUR)\n" + psb_geaxpby_test: - @$(FLINK) $(LOPT) psb_geaxpby_test.f90 ../utils/psb_test_utils.o -o $(EXEDIR)/psb_geaxpby_test -I../utils/ -I$(MODDIR) -I. $(PSBLAS_LIB) $(LDLIBS) - @printf "$(BLUE)[INFO]\t Testing files for psb_geaxpby linked and compiled correctly$(END_COLOUR)\n" + @$(FLINK) $(LOPT) psb_geaxpby_test.f90 geaxpby.f90 -o psb_geaxpby_test -I$(MODDIR) -I. $(PSBLAS_LIB) $(LDLIBS) + @mv psb_geaxpby_test $(EXEDIR) + @printf "$(BLUE)[INFO]\t Testing files generated correctly$(END_COLOUR)\n" + clean: @rm -f $(OBJS)\ diff --git a/test/computational_routines/geaxpby/README.md b/test/computational_routines/geaxpby/README.md index ee7b9e631..57e17a619 100644 --- a/test/computational_routines/geaxpby/README.md +++ b/test/computational_routines/geaxpby/README.md @@ -6,7 +6,7 @@ This is a directory developed by Luca Pepè Sciarria and Simone Staccone froma T Steps to reproduce the tests: - Compile the code using ``` make ``` (Optional) - Launch the script ./autotest.sh or with source ./autotest.sh if you want to add modules to the .bashrc file permenently. -- Check the output log file psb_geaxpby_test.log to collect results +- Check the output log file logs/psblas_geaxpby_test.log to collect results NOTE: If the code is changed and a new compilation is needed to show the changes, the autotest.sh script isn't aware of this scenario, therefore it is necessary to manually recompile the code. @@ -18,8 +18,6 @@ The ```psb_geaxpby```. The signature of the function is: call psb_geaxpby(alpha, x, beta, y, desc_a, info) ``` -The strategy to validate the correctness of the computation is to compare single precision result and double precision result in the test cases in which the test should not give an error. In this way it is possible to have a correctness check of the computation comparing the two results considering a number of significant digits which is tuned on the single precision computation. - ### Parameters Values **x** vectors are located in the vectors/ directory. They are generated randomly using the same seed and then saved on different files based on their characteristics. The size of the vector is choosen accordingly to the size of the matrix column space considered for the single test instance. |Vector|File Name|Coefficients|Coefficients Description| @@ -37,22 +35,28 @@ The strategy to validate the correctness of the computation is to compare single |$y_3$|y3.txt|$y_i \ne 0, \forall i$|Random coefficients |$y_4$|y4.txt|$y_i = 0, \forall i$|Null coefficients -**$\alpha$** real coefficient multiplied by vector $x$ +**$\alpha$** |$\alpha$|Value|Coefficients Description| |:-:|:-:|:-:| |$\alpha_1$|1.0|Positive value| |$\alpha_2$|-1.0|Negative value| |$\alpha_3$|0.0|Null value| -**$\beta$** real coefficient multiplied by vector $y$ +**$\beta$** |$\alpha$|Value|Coefficients Description| |:-:|:-:|:-:| |$\beta_1$|1.0|Positive value| |$\beta_2$|-1.0|Negative value| |$\beta_3$|0.0|Null value| +## Output +The ouput files generated by the test are automatically compared by the autotest.sh script, but if it is needed to manually run the test here it is the naming convenction used. + +The results of the computation will be saved on different files based on the instance of the test considered. In particular the naming conventiona format the output file as sol_x#_y#_a#_b#.mtx, where each # is a number choosen w.r.t. the test instance. (Ex. sol_x1_y1_a1_b1.mtx is the solution computed using the first x vector file , the first y vector file, alpha = 1.0 and beta = 1.0). Moreover, the files will be saved in the serial/ directory if the program is launched using 1 process or in parrallel/ directory if the program is launched with more than one process. + + ## TODO - Add computation with broken descriptor and catch the errore result - Test using complex data - Try multiple distributions -- Try using a matrix instead of a vector +- Try using a matrix instead of a vector \ No newline at end of file diff --git a/test/computational_routines/geaxpby/autotest.sh b/test/computational_routines/geaxpby/autotest.sh old mode 100755 new mode 100644 index 562c189cf..dc6552f67 --- a/test/computational_routines/geaxpby/autotest.sh +++ b/test/computational_routines/geaxpby/autotest.sh @@ -1,42 +1,39 @@ #!/bin/bash -# Variables definition -num_procs=$(nproc) +script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +source "${script_dir}/../common/testlib.sh" +# Variables definition +dir1="serial" +dir2="parallel" +num_procs=$(get_num_procs) +log_dir="logs" +log_file_name="${log_dir}/psblas_geaxpby_test.log" -# Define color codes -GREEN="\033[0;32m" -RED="\033[0;31m" -BLUE="\033[0;34m" -YELLOW="\033[33m" -RESET="\033[0m" +ensure_dirs runs serial parallel vectors "${log_dir}" +log_header "${log_file_name}" "psb_geaxpby" # Check if the executable ELF file exists if [ ! -f "./runs/psb_geaxpby_test" ]; then - echo -e "${YELLOW}[WARNING] Executable not found. Running make...${RESET}" + warn "Executable not found. Running make..." make if [ ! -f "./runs/psb_geaxpby_test" ]; then - echo -e "${RED}[ERROR] Failed to create executable. Check make command.${RESET}" + err "Failed to create executable. Check make command." fi else - echo -e "${BLUE}[INFO]\t The executable already exists. Skipping the make process.${RESET}" + info "The executable already exists. Skipping the make process." fi # Excecute tests and save results -echo -e "${BLUE}[INFO]\t Running the PSBLAS psb_geaxpby test...${RESET}" -echo "" -echo -e "${BLUE}[INFO]\t Starting single process computation${RESET}" -mpirun -np 1 ./runs/psb_geaxpby_test -echo -e "${BLUE}[INFO]\t Single process computation terminated correctly${RESET}" -echo "" -echo -e "${BLUE}[INFO]\t Starting $num_procs processes computation${RESET}" -mpirun -np $num_procs ./runs/psb_geaxpby_test -echo -e "${BLUE}[INFO]\t Multiple processes computation terminated correctly${RESET}" - -rm -f results/* -rm -f -r results/ - -echo -e "${BLUE}[INFO]\t PSBLAS psb_geaxpby test succesfully completed.${RESET}" +info "Running the PSBLAS psb_geaxpby test..." +echo "" >> "${log_file_name}" +run_mpi 1 ./runs/psb_geaxpby_test "single process computation" +run_mpi "$num_procs" ./runs/psb_geaxpby_test "${num_procs} processes computation" + +# Iterate through files in the first directory +compare_dirs "$dir1" "$dir2" "${log_file_name}" + +info "PSBLAS psb_geaxpby test successfully completed." diff --git a/test/computational_routines/geaxpby/geaxpby.f90 b/test/computational_routines/geaxpby/geaxpby.f90 new file mode 100644 index 000000000..e809417b2 --- /dev/null +++ b/test/computational_routines/geaxpby/geaxpby.f90 @@ -0,0 +1,250 @@ +program main + use psb_geaxpby_test + use psb_base_mod + + implicit none + + ! MPI variables + integer(psb_ipk_) :: my_rank, np + + ! Communicator variable + type(psb_ctxt_type) :: ctxt + + ! parameters array + character(len=64) :: x(4),y(4) + real(psb_dpk_) :: alpha(3), beta(3) + integer(psb_ipk_) :: arr_size + integer(psb_ipk_) :: tests_number, count + + ! cycle indexes variables + integer(psb_ipk_) :: i,j,k,h + integer(psb_ipk_) :: info, ret, unit + + ! time stats variables + character(len=8) :: date ! YYYYMMDD + character(len=10) :: time ! HHMMSS.sss + character(len=5) :: zones ! Time zone + integer :: values(8) + + ! others + character(len=:), allocatable :: output_file_name + integer(psb_ipk_) :: last_percent_sp, last_percent_dp + + ! Initialize parameters + x(1) = "vectors/x1.mtx" + x(2) = "vectors/x2.mtx" + x(3) = "vectors/x3.mtx" + x(4) = "vectors/x4.mtx" + + y(1) = "vectors/y1.mtx" + y(2) = "vectors/y2.mtx" + y(3) = "vectors/y3.mtx" + y(4) = "vectors/y4.mtx" + + alpha(1) = done + alpha(2) = -done + alpha(3) = dzero + + beta(1) = done + beta(2) = -done + beta(3) = dzero + + arr_size = 10000 + tests_number = size(x) * size(y) * size(alpha) * size(beta) + count = 0 + last_percent_sp = -1 + last_percent_dp = -1 + + call psb_init(ctxt) + call psb_info(ctxt,my_rank,np) + + if(my_rank == psb_root_) then + ! Setup logger output + if(np == 1) then + open(newunit=unit, file='psblas_geaxpby_test.log', status='replace', action='write', iostat=info) + else + open(newunit=unit, file='psblas_geaxpby_test.log', status='old', action='write', position='append', iostat=info) + end if + if (info /= 0) then + print *, 'Error opening output file.' + print *, "I/O Status Code:", info + stop + end if + + psb_out_unit = unit + + write(psb_out_unit,'(A,A)') 'Welcome to PSBLAS version: ',psb_version_string_ + write(psb_out_unit,'(A)') 'This is the psb_geaxpby_test sample program' + write(psb_out_unit,'(A,I0)') 'Number of processes used in this computation: ', np + write(psb_out_unit,'(A)') '' + + call generate_vectors(arr_size) + end if + + call psb_bcast(ctxt,psb_out_unit) + call psb_barrier(ctxt) + + + if(my_rank == psb_root_) write(*,'(A)') "[INFO] Starting single precision computation..." + + do i=1,size(x) + do j=1,size(y) + do k=1,size(alpha) + do h=1,size(beta) + + call psb_geaxpby_kernel(x_file=x(i), y_file=y(j), alpha = real(alpha(k),psb_spk_),& + & beta = real(beta(h),psb_spk_), arr_size = arr_size, ctxt = ctxt, ret = ret, & + & output_file_name = output_file_name) + + if(my_rank == psb_root_) then + count = count + 1 + call print_progress(count, tests_number, last_percent_sp, "single precision") + call date_and_time(date, time, zones, values) + + if(ret /= -1) then + ! Success formatted output + write(psb_out_unit,'("[", I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2,"] ",& + & A,A,A,I0,A,I0,T110,A)') & + & values(1), values(2), values(3), values(5), values(6), values(7), & + & "Generation geaxpby single precision result file ", & + & output_file_name , ' ', count , "/", tests_number, "[OK]" + else + ! Fail formatted output + write(psb_out_unit,'("[", I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2,"] ",& + & A,A,A,I0,A,I0,T110,A)') & + & values(1), values(2), values(3), values(5), values(6), values(7), & + & "Generation geaxpby single precision result file ", & + & output_file_name , ' ', count , "/", tests_number, "[FAIL]" + goto 9998 + end if + end if + call psb_barrier(ctxt) + end do + end do + end do + end do + + if(my_rank == psb_root_) write(*,'(A)') "[INFO] Single precision computation completed succesfully!" + + + if(my_rank == psb_root_) then + write(psb_out_unit, *) '' + count = 0 + end if + + + if(my_rank == psb_root_) write(*,'(A)') "[INFO] Starting double precision check..." + + + + call psb_barrier(ctxt) + + ! Here double precision comparison should be done + do i=1,size(x) + do j=1,size(y) + do k=1,size(alpha) + do h=1,size(beta) + call psb_geaxpby_check(x_file=x(i), y_file=y(j), alpha = alpha(k), beta = beta(h), & + & arr_size = arr_size, ctxt = ctxt, ret = ret, output_file_name = output_file_name) + + if(my_rank == psb_root_) then + count = count + 1 + call print_progress(count, tests_number, last_percent_dp, "double precision") + call date_and_time(date, time, zones, values) + + if(ret == 0) then + ! Success formatted output + write(psb_out_unit,'("[", I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2,"] ",& + & A,A,A,I0,A,I0,T110,A)') & + & values(1), values(2), values(3), values(5), values(6), values(7), & + & "Double precision check on file ", & + & output_file_name , ' ', count , "/", tests_number, "[OK]" + else + ! Fail formatted output + write(psb_out_unit,'("[", I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2,"] ",& + & A,A,A,I0,A,I0,T110,A)') & + & values(1), values(2), values(3), values(5), values(6), values(7), & + & "Double precision check on file ", & + & output_file_name , ' ', count , "/", tests_number, "[FAIL]" + write(psb_out_unit,'(A,I0)') "[ERROR] Error at element ", abs(ret) + write(psb_out_unit,'(A,F10.8)') "Alpha:", alpha(k) + write(psb_out_unit,'(A,F15.8)') "Beta: ", beta(h) + + goto 9999 + end if + end if + call psb_barrier(ctxt) + end do + end do + end do + end do + + if(my_rank == psb_root_) then + write(*,'(A)') "[INFO] Duble precision check completed succesfully!" + close(unit) + end if + + call psb_exit(ctxt) + return + + 9998 continue + if(my_rank == psb_root_) then + close(unit) + write(*,'(A,I0,A,I0,A)') "[ERROR] Error in geaxpby single precision computation ", & + & count, "/", tests_number, " see log file for details" + end if + + 9999 continue + if(my_rank == psb_root_) then + close(unit) + write(*,'(A,I0,A,I0,A)') "[ERROR] Error in geaxpby double precision check ", & + & count, "/", tests_number, " see log file for details" + end if + + call psb_exit(ctxt) + return +contains + + subroutine print_progress(current, total, last_percent, label) + use iso_fortran_env, only: error_unit + implicit none + integer(psb_ipk_), intent(in) :: current, total + integer(psb_ipk_), intent(inout) :: last_percent + character(len=*), intent(in) :: label + integer(psb_ipk_) :: percent, filled, width, i + character(len=160) :: line + + if (total <= 0) return + percent = int(real(current) / real(total) * 100.0) + if (percent == last_percent) return + last_percent = percent + + width = 30 + filled = int(real(percent) / 100.0 * width) + + line = "[INFO] Progress " // trim(label) // ": [" + do i = 1, filled + line = trim(line) // "#" + end do + do i = filled + 1, width + line = trim(line) // "-" + end do + 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 + + 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 \ No newline at end of file diff --git a/test/computational_routines/geaxpby/logs/psblas_geaxpby_test.log b/test/computational_routines/geaxpby/logs/psblas_geaxpby_test.log new file mode 100644 index 000000000..8c1d31b59 --- /dev/null +++ b/test/computational_routines/geaxpby/logs/psblas_geaxpby_test.log @@ -0,0 +1,3158 @@ +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:13:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 11:54:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:13:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:16:23 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:22:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 14:22:24 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:21:50 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:29:28 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:54:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:57:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 16:10:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 10:36:10 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 10:45:09 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 20:59:49 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 21:19:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences diff --git a/test/computational_routines/geaxpby/psb_geaxpby_test.f90 b/test/computational_routines/geaxpby/psb_geaxpby_test.f90 index 28382655e..11e590544 100644 --- a/test/computational_routines/geaxpby/psb_geaxpby_test.f90 +++ b/test/computational_routines/geaxpby/psb_geaxpby_test.f90 @@ -71,149 +71,41 @@ !! Intent: out. !! Specified as: An integer value; 0 means no error has been detected. !! -program main - use psb_base_mod - use psb_util_mod - use psb_test_utils +module psb_geaxpby_test - implicit none + contains - ! MPI variables - integer(psb_ipk_) :: my_rank, np - - ! Communicator variable - type(psb_ctxt_type) :: ctxt - - ! parameters array - character(len=64) :: x(4),y(4) - real(psb_dpk_) :: alpha(3), beta(3) - integer(psb_ipk_) :: arr_size - integer(psb_ipk_) :: tests_number, count - - ! cycle indexes variables - integer(psb_ipk_) :: i,j,k,h,l - integer(psb_ipk_) :: info, ret, unit - - ! others - character(len=:), allocatable :: output_file_name - type(psb_test_info) :: test_info - - ! result vectors - real(psb_spk_), allocatable :: y_single(:) - real(psb_dpk_), allocatable :: y_double(:) - - - ! Initialize parameters - x(1) = "vectors/x1.mtx" - x(2) = "vectors/x2.mtx" - x(3) = "vectors/x3.mtx" - x(4) = "vectors/x4.mtx" - - y(1) = "vectors/y1.mtx" - y(2) = "vectors/y2.mtx" - y(3) = "vectors/y3.mtx" - y(4) = "vectors/y4.mtx" - - alpha(1) = done - alpha(2) = -done - alpha(3) = dzero - - beta(1) = done - beta(2) = -done - beta(3) = dzero - - arr_size = 10000 - - !! Initialize test metadata - test_info%total_tests = size(x) * size(y) * size(alpha) * size(beta) - test_info%threshold_type = VALUE - test_info%threshold = 1.0D-06 - test_info%kernel_name = "psb_geaxpby" - - call psb_test_init(test_info) - - if(test_info%my_rank == psb_root_) then - psb_out_unit = test_info%output_unit - call psb_test_generate_input_vectors(arr_size) - allocate(y_single(arr_size)) - allocate(y_double(arr_size)) - end if - - call psb_bcast(test_info%ctxt,test_info%output_unit) - call psb_barrier(test_info%ctxt) - - if(test_info%my_rank == psb_root_) write(*,'(A)') "[INFO] Starting test excecution ..." - - do i=1,size(x) - do j=1,size(y) - do k=1,size(alpha) - do h=1,size(beta) - - call psb_geaxpby_real_kernel(x(i), y(j), alpha(k),beta(h), arr_size, test_info%ctxt, y_single, y_double) - - if(test_info%my_rank == psb_root_) then - if(test_info%np > 1) then - ! If the program is being run on multiple processes, we need to - ! check the result on the root process with the one computed only using - ! a single process - call psb_test_process_vector_check(y_single, test_info) - else - call psb_test_single_double_vector_check(y_single,y_double,test_info, arr_size) - - ! If the program is being run on a single process, we can save the result directly - call psb_test_save_vector_result(y_single, test_info) - end if - - test_info%current_test = test_info%current_test + 1 - end if - call psb_barrier(test_info%ctxt) - end do - end do - end do - end do - - call psb_test_exit(test_info) - -contains - - !> @brief This subroutine implements the psb_geaxpby kernel for real vectors - !! performing the operation y = alpha * x + beta * y. It reads input from files, - !! performs the operation, and outputs the result. - !! - !! @param x_file: file name of the input vector x - !! @param y_file: file name of the input vector y - !! @param alpha: scalar alpha - !! @param beta: scalar beta - !! @param arr_size: size of the vectors - !! @param ctxt: communication context - !! @param y_single_global: single precision output vector - !! @param y_double_global: double precision output vector + !> @brief Function to excecute psb_geaxpby in single precision and + !! save the results on file !! - subroutine psb_geaxpby_real_kernel(x_file, y_file, alpha, beta, arr_size, ctxt, y_single_global, y_double_global) - ! implicit none + subroutine psb_geaxpby_kernel(x_file, y_file, alpha, beta, arr_size, ctxt, ret, output_file_name) + use psb_base_mod + use psb_util_mod + + implicit none ! input parameters character(len = *), intent(in) :: x_file, y_file - real(psb_dpk_), intent(in) :: alpha, beta + real(psb_spk_), intent(in) :: alpha, beta integer(psb_ipk_), intent(in) :: arr_size type(psb_ctxt_type), intent(in) :: ctxt + ! output parameters + integer(psb_ipk_), intent(out) :: ret + character(len=:), allocatable, intent(out) :: output_file_name + ! vectors - type(psb_s_vect_type) :: x_single, y_single - type(psb_d_vect_type) :: x_double, y_double + type(psb_s_vect_type) :: x, y ! matrix descriptor data structure - type(psb_desc_type) :: desc_a + type(psb_desc_type) :: desc_a ! communication context - integer(psb_ipk_) :: my_rank, np, info, err_act + integer(psb_ipk_) :: my_rank, np, info, err_act ! variables outside PSLBALS data structures - real(psb_spk_), allocatable :: x_single_global(:) - real(psb_spk_), allocatable, intent(inout) :: y_single_global(:) - real(psb_dpk_), allocatable :: x_double_global(:) - real(psb_dpk_), allocatable, intent(inout) :: y_double_global(:) - integer(psb_ipk_) :: i, nl + real(psb_spk_), allocatable :: x_global(:), y_global(:) + integer(psb_ipk_) :: i ! others logical :: exists @@ -231,23 +123,14 @@ contains ! Generate random array for b using always the same seed if(my_rank == psb_root_) then - allocate(x_single_global(arr_size)) - allocate(x_double_global(arr_size)) - - call mm_array_read(x_single_global,info,filename=x_file) - call mm_array_read(y_single_global,info,filename=y_file) - call mm_array_read(x_double_global,info,filename=x_file) - call mm_array_read(y_double_global,info,filename=y_file) + allocate(x_global(arr_size)) + allocate(y_global(arr_size)) + call mm_array_read(x_global,info,filename=x_file) + call mm_array_read(y_global,info,filename=y_file) end if ! Allocate descriptor as if it was a block rows distribution - nl = (arr_size)/np + mod(arr_size,np) - - call psb_bcast(test_info%ctxt,test_info%output_unit) - call psb_barrier(test_info%ctxt) - - - call psb_cdall(ctxt, desc_a, info,nl=nl) + call psb_cdall(ctxt, desc_a, info,nl=arr_size/np) if(info /= psb_success_) then write(psb_out_unit,'(A)') "Error allocating desc_a data structure" goto 9999 @@ -260,122 +143,425 @@ contains end if - call psb_geall(x_single,desc_a,info) + call psb_geall(x,desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating single precision x data structure" + write(psb_out_unit,'(A)') "Error allocating x data structure" goto 9999 end if - call psb_geall(x_double,desc_a,info) + + ! Populate x class using data from x_global vector + call psb_scatter(x_global,x,desc_a,info,root=psb_root_) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating double precision x data structure" + write(psb_out_unit,'(A)') "Error in psb_scatter to populate x data structure" goto 9999 end if - ! Populate x class using data from x_global vector - call psb_scatter(x_single_global,x_single,desc_a,info,root=psb_root_) + + call psb_geall(y,desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_scatter to populate single precision x data structure" - return + write(psb_out_unit,'(A)') "Error allocating y data structure" + goto 9999 end if - call psb_scatter(x_double_global,x_double,desc_a,info,root=psb_root_) + ! Populate y class using data from y_global vector + call psb_scatter(y_global,y,desc_a,info,root=psb_root_) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_scatter to populate double precision x data structure" - return + write(psb_out_unit,'(A)') "Error in psb_scatter to populate y data structure" + goto 9999 end if - call psb_geall(y_single,desc_a,info) + + ! y = alpha * x + beta * y + call psb_geaxpby(alpha,x,beta,y,desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating single precision y data structure" + write(psb_out_unit,'(A)') "Error in psb_geaxpby routine" goto 9999 end if - call psb_geall(y_double,desc_a,info) + ! Make the root process be the one that saves everything on file + if(np == 1) then + ! Check if output directory exists + inquire(file='serial/', exist=exists) + if (.not.exists) then + call system('mkdir serial/') + end if + output_file_name = "serial/" + else + ! Check if output directory exists + inquire(file='parallel/', exist=exists) + if (.not.exists) then + call system('mkdir parallel/') + end if + output_file_name = "parallel/" + end if + + output_file_name = output_file_name // "sol_" // x_file(9:10) // "_" // y_file(9:10) + + if(alpha == sone) then + output_file_name = output_file_name // "_a1" + else if(alpha == -sone) then + output_file_name = output_file_name // "_a2" + else if(alpha == szero) then + output_file_name = output_file_name // "_a3" + end if + + if(beta == sone) then + output_file_name = output_file_name // "_b1.mtx" + else if(beta == -sone) then + output_file_name = output_file_name // "_b2.mtx" + else if(beta == szero) then + output_file_name = output_file_name // "_b3.mtx" + end if + + ! gather the result combining all the partial ones + call psb_gather(y_global, y, desc_a, info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating double precision y data structure" + write(psb_out_unit,'(A)') "Error gathering global vector x to write on file" goto 9999 end if - ! Populate y class using data from y_global vector - call psb_scatter(y_single_global,y_single,desc_a,info,root=psb_root_) + ! Save result to output file + if(my_rank == psb_root_) then + call mm_array_write(y_global,"Result vector",info,filename=output_file_name) + end if + + ! Deallocate + call psb_gefree(x, desc_a,info) + if(info /= psb_success_) then + write(psb_out_unit,'(A)') "Error in vector x free routine" + goto 9999 + end if + + call psb_gefree(y, desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_scatter to populate single precision y data structure" + write(psb_out_unit,'(A)') "Error in vector y free routine" goto 9999 end if - call psb_scatter(y_double_global,y_double,desc_a,info,root=psb_root_) + call psb_cdfree(desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_scatter to populate double precision y data structure" + write(psb_out_unit,'(A)') "Error in matrix descriptor free routine" goto 9999 end if + if(my_rank == 0) then + deallocate(x_global) + deallocate(y_global) + end if - ! y = alpha * x + beta * y - call psb_geaxpby(real(alpha,psb_spk_),x_single,real(beta,psb_spk_),y_single,desc_a,info) + return + + + ! Error handling + 9999 ret = -1 + stop + + end subroutine + + + + !> @brief Function to excecute psb_geaxpby in double precision and + !! compare the results with the ones on file + !! + subroutine psb_geaxpby_check(x_file, y_file, alpha, beta, arr_size, ctxt, ret, output_file_name) + use psb_base_mod + use psb_util_mod + + implicit none + + ! input parameters + character(len = *), intent(in) :: x_file, y_file + real(psb_dpk_), intent(in) :: alpha, beta + integer(psb_ipk_), intent(in) :: arr_size + type(psb_ctxt_type), intent(in) :: ctxt + + ! output parameters + integer(psb_ipk_), intent(out) :: ret + character(len=:), allocatable, intent(out) :: output_file_name + ! vectors + type(psb_d_vect_type) :: x, y + type(psb_s_vect_type) :: y_check + + ! matrix descriptor data structure + type(psb_desc_type) :: desc_a + + ! communication context + integer(psb_ipk_) :: my_rank, np, info, err_act + + ! variables outside PSLBALS data structures + real(psb_dpk_), allocatable :: x_global(:), y_global(:) + integer(psb_ipk_) :: i + + ! others + logical :: exists + + + + + info = psb_success_ + + call psb_info(ctxt,my_rank,np) + + if (my_rank < 0) then + ! This should not happen, but just in case + call psb_error(ctxt) + endif + + ! Generate random array for b using always the same seed + if(my_rank == psb_root_) then + allocate(x_global(arr_size)) + allocate(y_global(arr_size)) + call mm_array_read(x_global,info,filename=x_file) + call mm_array_read(y_global,info,filename=y_file) + end if + + ! Allocate descriptor as if it was a block rows distribution + call psb_cdall(ctxt, desc_a, info,nl=10000/np) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_geaxpby routine" + write(psb_out_unit,'(A)') "Error allocating desc_a data structure" goto 9999 end if - ! y = alpha * x + beta * y - call psb_geaxpby(alpha,x_double,beta,y_double,desc_a,info) + call psb_cdasb(desc_a, info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_geaxpby routine" + write(psb_out_unit,'(A)') "Error assembling desc_a data structure" goto 9999 end if - ! Gather final result - call psb_gather(y_single_global, y_single, desc_a, info, psb_root_) + + call psb_geall(x,desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_gather routine" + write(psb_out_unit,'(A)') "Error allocating x data structure" goto 9999 end if - - call psb_gather(y_double_global, y_double, desc_a, info, psb_root_) + + + ! Populate x class using data from x_global vector + call psb_scatter(x_global,x,desc_a,info,root=psb_root_) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_gather routine" + write(psb_out_unit,'(A)') "Error in psb_scatter to populate x data structure" goto 9999 end if - ! Deallocate - 9999 call psb_gefree(x_single, desc_a,info) + call psb_geall(y,desc_a,info) + if(info /= psb_success_) then + write(psb_out_unit,'(A)') "Error allocating y data structure" + goto 9999 + end if + + ! Populate y class using data from y_global vector + call psb_scatter(y_global,y,desc_a,info,root=psb_root_) + if(info /= psb_success_) then + write(psb_out_unit,'(A)') "Error in psb_scatter to populate y data structure" + goto 9999 + end if + + + call psb_geall(y_check,desc_a,info) + if(info /= psb_success_) then + write(psb_out_unit,'(A)') "Error allocating y_check data structure" + goto 9999 + end if + + + ! y = alpha * x + beta * y + call psb_geaxpby(alpha,x,beta,y,desc_a,info) + if(info /= psb_success_) then + write(psb_out_unit,'(A)') "Error in psb_geaxpby routine" + goto 9999 + end if + + + ! gather the result combining all the partial ones + call psb_gather(y_global, y, desc_a, info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in single precision vector x free routine" + write(psb_out_unit,'(A)') "Error gathering global vector y used for comparison" + goto 9999 end if - call psb_gefree(y_single, desc_a,info) + if(my_rank == psb_root_) then + ! Make the root process be the one that saves everything on file + if(np == 1) then + ! Check if output directory exists + inquire(file='serial/', exist=exists) + if(.not.exists) then + write(psb_out_unit,'(A)') "Error in psb_geaxpby_check routine, no single precision result is saved on file" + goto 9999 + end if + output_file_name = "serial/" + else + ! Check if output directory exists + inquire(file='parallel/', exist=exists) + if(.not.exists) then + write(psb_out_unit,'(A)') "Error in psb_geaxpby_check routine, no single precision result is saved on file" + goto 9999 + end if + output_file_name = "parallel/" + end if + + output_file_name = output_file_name // "sol_" // x_file(9:10) // "_" // y_file(9:10) + + if(alpha == done) then + output_file_name = output_file_name // "_a1" + else if(alpha == -done) then + output_file_name = output_file_name // "_a2" + else if(alpha == dzero) then + output_file_name = output_file_name // "_a3" + end if + + if(beta == done) then + output_file_name = output_file_name // "_b1.mtx" + else if(beta == -done) then + output_file_name = output_file_name // "_b2.mtx" + else if(beta == dzero) then + output_file_name = output_file_name // "_b3.mtx" + end if + + + ! Read single precision result from file + call mm_array_read(y_check,info,filename=output_file_name) + if(info /= psb_success_) then + write(psb_out_unit,'(A)') "Error in mm_array_read for y_check data structure" + goto 9999 + end if + + ! 5.96e-08 is 2^-24 (Single precision unit roundoff) + ! 1.19e-07 is 2^-23 (Single precision unit interval) + do i=1, arr_size + !! write(*, *) abs(y_global(i) - y_check%v%v(i)) > 5.96D-08, & + !! & y_global(i), y_check%v%v(i), output_file_name + if(abs(y_global(i) - y_check%v%v(i)) > 1.19e-07) then + ret = -i + write(psb_out_unit, '(A,F10.8)') "Y computed in double precision: ", y_global(i) + write(psb_out_unit, '(A,F10.8)') "Y read from single precision file: ", y_check%v%v(i) + write(psb_out_unit, '(A,F10.8)') "Diff: ", abs(y_global(i) - y_check%v%v(i)) + exit + end if + end do + end if + + ! Deallocate + call psb_gefree(x, desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in single precision vector y free routine" + write(psb_out_unit,'(A)') "Error in vector x free routine" + goto 9999 end if - call psb_gefree(x_double, desc_a,info) + call psb_gefree(y, desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in double precision vector x free routine" + write(psb_out_unit,'(A)') "Error in vector y free routine" + goto 9999 end if - call psb_gefree(y_double, desc_a,info) + call psb_gefree(y_check, desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in double precision vector y free routine" + write(psb_out_unit,'(A)') "Error in vector y_check free routine" + goto 9999 end if call psb_cdfree(desc_a,info) if(info /= psb_success_) then write(psb_out_unit,'(A)') "Error in matrix descriptor free routine" + goto 9999 end if if(my_rank == 0) then - deallocate(x_single_global) - deallocate(x_double_global) + deallocate(x_global) + deallocate(y_global) end if + ret = 0 + return + ! Error handling + 9999 ret = -1 + stop + end subroutine -end program main + !> @brief Function to randomly generate x and y vectors + !! and save them on multiple files based on their + !! coefficients values. + !! + subroutine generate_vectors(arr_size) + use psb_base_mod + use psb_util_mod + + implicit none + + integer(psb_ipk_), intent(in) :: arr_size + real(psb_dpk_), allocatable :: x(:), y(:) + integer(psb_ipk_) :: i, info + logical :: exists + + + ! Check if output directory exists + inquire(file='vectors/', exist=exists) + if (.not.exists) then + call system('mkdir vectors/') + end if + + allocate(x(arr_size)) + allocate(y(arr_size)) + + call random_init(repeatable=.true.,image_distinct=.true.) + call random_number(x) + call random_number(y) + + ! Write only positive in x_1 + call mm_array_write(x,"Positive vector",info,filename="vectors/x1.mtx") + call mm_array_write(y,"Positive vector",info,filename="vectors/y1.mtx") + + ! Write only negative in x_2 + do i=1,arr_size + x(i) = -x(i) + end do + + do i=1,arr_size + y(i) = -y(i) + end do + + call mm_array_write(x,"Negative vector",info,filename="vectors/x2.mtx") + call mm_array_write(y,"Negative vector",info,filename="vectors/y2.mtx") + + + ! Since numbers are less than one and always positive, we have to generate negative ones subtractiong 50 + do i=1,arr_size + x(i) = -x(i) ! Make the values positive again + x(i) = x(i) - 0.5 + end do + + do i=1,arr_size + y(i) = -y(i) ! Make the values positive again + y(i) = y(i) - 0.5 + end do + + ! Write random in x_3 + call mm_array_write(x,"Random vector",info,filename="vectors/x3.mtx") + call mm_array_write(y,"Random vector",info,filename="vectors/y3.mtx") + + ! Write zero in x_4 + do i=1,arr_size + x(i) = 0 + end do + + do i=1,arr_size + y(i) = 0 + end do + + call mm_array_write(x,"Null vector",info,filename="vectors/x4.mtx") + call mm_array_write(y,"Null vector",info,filename="vectors/y4.mtx") + + deallocate(x) + deallocate(y) + + end subroutine + +end module psb_geaxpby_test \ No newline at end of file diff --git a/test/computational_routines/geaxpby/psblas_geaxpby_test.log b/test/computational_routines/geaxpby/psblas_geaxpby_test.log new file mode 100644 index 000000000..3bb70e7fa --- /dev/null +++ b/test/computational_routines/geaxpby/psblas_geaxpby_test.log @@ -0,0 +1,586 @@ +Welcome to PSBLAS version: 3.9.1 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 1 + +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2026-06-04 21:19:20] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2026-06-04 21:19:21] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2026-06-04 21:19:22] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2026-06-04 21:19:23] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2026-06-04 21:19:23] Double precision check on file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2026-06-04 21:19:24] Double precision check on file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2026-06-04 21:19:25] Double precision check on file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2026-06-04 21:19:26] Double precision check on file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] +Welcome to PSBLAS version: 3.9.1 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 4 + +[2026-06-04 21:19:26] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2026-06-04 21:19:26] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2026-06-04 21:19:26] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2026-06-04 21:19:26] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2026-06-04 21:19:26] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2026-06-04 21:19:26] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2026-06-04 21:19:26] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2026-06-04 21:19:26] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2026-06-04 21:19:26] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2026-06-04 21:19:26] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2026-06-04 21:19:26] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2026-06-04 21:19:27] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2026-06-04 21:19:28] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2026-06-04 21:19:29] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2026-06-04 21:19:30] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2026-06-04 21:19:30] Double precision check on file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2026-06-04 21:19:31] Double precision check on file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2026-06-04 21:19:32] Double precision check on file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2026-06-04 21:19:33] Double precision check on file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] diff --git a/test/computational_routines/gedot/CMakeLists.txt b/test/computational_routines/gedot/CMakeLists.txt index 2b5ec6844..ac704392f 100644 --- a/test/computational_routines/gedot/CMakeLists.txt +++ b/test/computational_routines/gedot/CMakeLists.txt @@ -1,5 +1,6 @@ set(PSB_gedot_source_files psb_gedot_test.f90 + gedot.f90 ) foreach(file IN LISTS PSB_gedot_source_files) list(APPEND gedot_source_files ${CMAKE_CURRENT_LIST_DIR}/${file}) diff --git a/test/computational_routines/gedot/Makefile b/test/computational_routines/gedot/Makefile deleted file mode 100644 index 0fbeed0ca..000000000 --- a/test/computational_routines/gedot/Makefile +++ /dev/null @@ -1,37 +0,0 @@ -INSTALLDIR=../../.. -INCDIR=$(INSTALLDIR)/include/ -MODDIR=$(INSTALLDIR)/modules/ -include $(INCDIR)/Make.inc.psblas -# -# Libraries used -# -LIBDIR = $(INSTALLDIR)/lib/ -PSBLAS_LIB = -L$(LIBDIR) -lpsb_util -lpsb_base -LDLIBS = $(PSBLDLIBS) -EXEDIR = ./runs - -FINCLUDES=$(FMFLAG)$(MODDIR) $(FMFLAG). - -GREEN=\033[0;32m -RED=\033[0;31m -BLUE=\033[0;34m -YELLOW=\033[33m -END_COLOUR=\033[0m - - -all: runsd psb_gedot_test - @printf "$(GREEN)[INFO]\t Compilation success!$(END_COLOUR)\n" - -runsd: - @(if test ! -d $(EXEDIR) ; then mkdir $(EXEDIR); fi) - @printf "$(BLUE)[INFO]\t Build directory $(EXEDIR)/ correctly initialized$(END_COLOUR)\n" - -psb_gedot_test: - @$(FLINK) $(LOPT) psb_gedot_test.f90 ../utils/psb_test_utils.o -o $(EXEDIR)/psb_gedot_test -I../utils/ -I$(MODDIR) -I. $(PSBLAS_LIB) $(LDLIBS) - @printf "$(BLUE)[INFO]\t Testing files for psb_gedot linked and compiled correctly$(END_COLOUR)\n" - -clean: - @rm -f $(OBJS)\ - *$(.mod) $(EXEDIR)/psb_gedot_test - -.PHONY: all psb_gedot_test clean diff --git a/test/computational_routines/gedot/README.md b/test/computational_routines/gedot/README.md index 7bdbb0eb4..b2787b400 100644 --- a/test/computational_routines/gedot/README.md +++ b/test/computational_routines/gedot/README.md @@ -1,28 +1,28 @@ # Introduction -This is a directory developed by Luca Pepè Sciarria and Simone Staccone from Tor Vergata University to start to create some unit tests for PSBLAS 3.9, in particular for ```psb_gedot``` routine. +This is a directory developed by Luca Pepè Sciarria and Simone Staccone froma Tor Vergata University to start to create some unit tests for PSBLAS 3.9, in particular for ```psb_gedot``` routine. ## Getting started Steps to reproduce the tests: - - Compile the code using ``` make ``` (Optional) -- Launch the script ```./autotest.sh``` or with ```source ./autotest.sh``` if you want to add modules to the .bashrc file permanently. -- Check the output log file ```psb_gedot_test.log``` to collect results and check for errors. In any case a summarization of tests passed should be shown in stdout. +- Launch the script ./autotest.sh or with source ./autotest.sh if you want to add modules to the .bashrc file permenently. +- Check the output log file logs/psblas_gedot_test.log to collect results -NOTE: If the code is changed and a new compilation is needed to show the changes, the ```autotest.sh``` script isn't aware of this scenario, therefore it is necessary to manually recompile the code. Moreover, if you are running manually the script and not launching the main ```test.sh``` script, be careful to use the last compiled version of the utils. +NOTE: If the code is changed and a new compilation is needed to show the changes, the autotest.sh script isn't aware of this scenario, therefore it is necessary to manually recompile the code. ## Test Suite -The ```psb_gedot``` is a function that performs the scalar product between two vectors giving a value as result. The signature of the function is: +### Overall Analysys +The ```psb_gedot```. The signature of the function is: ```fortran psb_gedot(x, y, desc_a, info [,global]) ``` -The strategy to validate the correctness of the computation is to compare single precision result and double precision result in the test cases in which the test should not give an error. In this way it is possible to have a correctness check of the computation comparing the two results considering a number of significant digits which is tuned on the single precision computation. +In the comparison 7 significand digits means having a notation like 0,$d_1 d_2 d_3 ... d_7$*10^7 also. ### Parameters Values **x** vectors are located in the vectors/ directory. They are generated randomly using the same seed and then saved on different files based on their characteristics. The size of the vector is choosen accordingly to the size of the matrix column space considered for the single test instance. -|Variable|File Name|Coefficients|Coefficients Description| +|Vector|File Name|Coefficients|Coefficients Description| |:-:|:-:|:-:|:-:| |$x_1$|x1.txt|$x_i> 0, \forall i$|Positive coefficients| |$x_2$|x2.txt|$x_i < 0, \forall i$|Negative coefficients @@ -30,23 +30,36 @@ The strategy to validate the correctness of the computation is to compare single |$x_4$|x4.txt|$x_i = 0, \forall i$|Null coefficients **y** vectors are located in the vectors/ directory. They are generated randomly using the same seed and then saved on different files based on their characteristics. The size of the vector is choosen accordingly to the size of the matrix rows space considered for the single test instance. -|Variable|File Name|Coefficients|Coefficients Description| +|Vector|File Name|Coefficients|Coefficients Description| |:-:|:-:|:-:|:-:| |$y_1$|y1.txt|$y_i> 0, \forall i$|Positive coefficients| |$y_2$|y2.txt|$y_i < 0, \forall i$|Negative coefficients |$y_3$|y3.txt|$y_i \ne 0, \forall i$|Random coefficients |$y_4$|y4.txt|$y_i = 0, \forall i$|Null coefficients -**global** logical value indicating if the computation is global among all processes or it is only local, so that a global reduction is needed afterwards. -|Variable|Value|Value Description| +**$\alpha$** +|$\alpha$|Value|Coefficients Description| +|:-:|:-:|:-:| +|$\alpha_1$|1.0|Positive value| +|$\alpha_2$|-1.0|Negative value| +|$\alpha_3$|0.0|Null value| + +**$\beta$** +|$\alpha$|Value|Coefficients Description| |:-:|:-:|:-:| -|$global_1$|True|Global computation is required implicitly| -|$global_2$|False|Global computation is required explicitly, so only a local computation is done| +|$\beta_1$|1.0|Positive value| +|$\beta_2$|-1.0|Negative value| +|$\beta_3$|0.0|Null value| + +## Output +The ouput files generated by the test are automatically compared by the autotest.sh script, but if it is needed to manually run the test here it is the naming convenction used. + +The results of the computation will be saved on different files based on the instance of the test considered. In particular the naming conventiona format the output file as sol_x#_y#_a#_b#.mtx, where each # is a number choosen w.r.t. the test instance. (Ex. sol_x1_y1_a1_b1.mtx is the solution computed using the first x vector file , the first y vector file, alpha = 1.0 and beta = 1.0). Moreover, the files will be saved in the serial/ directory if the program is launched using 1 process or in parrallel/ directory if the program is launched with more than one process. ## TODO -List of things still to add in the test: -- Add computation with broken descriptor and catch the errore result (Use EXCECUTE_COMMAND_LINE from a fortran program and check the exit codes) +- Use also global in different ways +- Add computation with broken descriptor and catch the errore result - Test using complex data ($dot \leftarrow x^H \cdot y$) -- Test also GPU excecution -- Try multiple distributions \ No newline at end of file +- Try multiple distributions +- Fix result_check handling, it should not be an entire vector \ No newline at end of file diff --git a/test/computational_routines/gedot/autotest.sh b/test/computational_routines/gedot/autotest.sh old mode 100755 new mode 100644 index 57c734e57..49c43bb7e --- a/test/computational_routines/gedot/autotest.sh +++ b/test/computational_routines/gedot/autotest.sh @@ -1,40 +1,40 @@ #!/bin/bash +script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +source "${script_dir}/../common/testlib.sh" + # Variables definition -num_procs=$(nproc) +dir1="serial" +dir2="parallel" +num_procs=$(get_num_procs) +log_dir="logs" +log_file_name="${log_dir}/psblas_gedot_test.log" -# Define color codes -GREEN="\033[0;32m" -RED="\033[0;31m" -BLUE="\033[0;34m" -YELLOW="\033[33m" -RESET="\033[0m" +ensure_dirs runs serial parallel vectors "${log_dir}" +log_header "${log_file_name}" "psb_gedot" # Check if the executable ELF file exists if [ ! -f "./runs/psb_gedot_test" ]; then - echo -e "${YELLOW}[WARNING] Executable not found. Running make...${RESET}" + warn "Executable not found. Running make..." make - if [ ! -f "./runs/psb_geaxpby_test" ]; then - echo -e "${RED}[ERROR] Failed to create executable. Check make command.${RESET}" + if [ ! -f "./runs/psb_gedot_test" ]; then + err "Failed to create executable. Check make command." fi else - echo -e "${BLUE}[INFO]\t The executable already exists. Skipping the make process.${RESET}" + info "The executable already exists. Skipping the make process." fi # Excecute tests and save results -echo -e "${BLUE}[INFO]\t Running the PSBLAS psb_gedot test...${RESET}" -echo "" -echo -e "${BLUE}[INFO]\t Starting single process computation${RESET}" -mpirun -np 1 ./runs/psb_gedot_test -echo -e "${BLUE}[INFO]\t Single process computation terminated correctly${RESET}" -echo "" -echo -e "${BLUE}[INFO]\t Starting $num_procs processes computation${RESET}" -mpirun -np $num_procs ./runs/psb_gedot_test -echo -e "${BLUE}[INFO]\t Multiple processes computation terminated correctly${RESET}" - -rm -f results/* -rm -f -r results/ - -echo -e "${GREEN}[INFO]\t PSBLAS psb_gedot test succesfully completed.${RESET}" \ No newline at end of file +info "Running the PSBLAS psb_gedot test..." +echo "" >> "${log_file_name}" +run_mpi 1 ./runs/psb_gedot_test "single process computation" +run_mpi "$num_procs" ./runs/psb_gedot_test "${num_procs} processes computation" + + +# Iterate through files in the first directory +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." \ No newline at end of file diff --git a/test/computational_routines/gedot/gedot.f90 b/test/computational_routines/gedot/gedot.f90 new file mode 100644 index 000000000..64fb1dbb6 --- /dev/null +++ b/test/computational_routines/gedot/gedot.f90 @@ -0,0 +1,227 @@ +program main + use psb_gedot_test + use psb_base_mod + + implicit none + + ! MPI variables + integer(psb_ipk_) :: my_rank, np + + ! Communicator variable + type(psb_ctxt_type) :: ctxt + + ! parameters array + character(len=64) :: x(4),y(4) + real(psb_dpk_) :: alpha(3), beta(3) + integer(psb_ipk_) :: arr_size + integer(psb_ipk_) :: tests_number, count + + ! cycle indexes variables + integer(psb_ipk_) :: i,j,k,h + integer(psb_ipk_) :: info, ret, unit + + ! time stats variables + character(len=8) :: date ! YYYYMMDD + character(len=10) :: time ! HHMMSS.sss + character(len=5) :: zones ! Time zone + integer :: values(8) + + ! others + character(len=:), allocatable :: output_file_name + integer(psb_ipk_) :: last_percent_sp, last_percent_dp + + ! Initialize parameters + x(1) = "vectors/x1.mtx" + x(2) = "vectors/x2.mtx" + x(3) = "vectors/x3.mtx" + x(4) = "vectors/x4.mtx" + + y(1) = "vectors/y1.mtx" + y(2) = "vectors/y2.mtx" + y(3) = "vectors/y3.mtx" + y(4) = "vectors/y4.mtx" + + arr_size = 10000 + tests_number = size(x) * size(y) + count = 0 + last_percent_sp = -1 + last_percent_dp = -1 + + call psb_init(ctxt) + call psb_info(ctxt,my_rank,np) + + if(my_rank == psb_root_) then + ! Setup logger output + if(np == 1) then + open(newunit=unit, file='psblas_gedot_test.log', status='replace', action='write', iostat=info) + else + open(newunit=unit, file='psblas_gedot_test.log', status='old', action='write', position='append', iostat=info) + end if + if (info /= 0) then + print *, 'Error opening output file.' + print *, "I/O Status Code:", info + stop + end if + + psb_out_unit = unit + + write(psb_out_unit,'(A,A)') 'Welcome to PSBLAS version: ',psb_version_string_ + write(psb_out_unit,'(A)') 'This is the psb_gedot_test sample program' + write(psb_out_unit,'(A,I0)') 'Number of processes used in this computation: ', np + write(psb_out_unit,'(A)') '' + + call generate_vectors(arr_size) + end if + + call psb_bcast(ctxt,psb_out_unit) + call psb_barrier(ctxt) + + + if(my_rank == psb_root_) write(*,'(A)') "[INFO] Starting single precision computation..." + + do i=1,size(x) + do j=1,size(y) + call psb_gedot_kernel(x_file=x(i), y_file=y(j), arr_size = arr_size, ctxt = ctxt, & + & ret = ret, output_file_name = output_file_name) + + if(my_rank == psb_root_) then + count = count + 1 + call print_progress(count, tests_number, last_percent_sp, "single precision") + call date_and_time(date, time, zones, values) + if(ret /= -1) then + ! Success formatted output + write(psb_out_unit,'("[", I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2,"] ",& + & A,A,A,I0,A,I0,T110,A)') & + & values(1), values(2), values(3), values(5), values(6), values(7), & + & "Generation gedot single precision result file ", & + & output_file_name , ' ', count , "/", tests_number, "[OK]" + else + ! Fail formatted output + write(psb_out_unit,'("[", I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2,"] ",& + & A,A,A,I0,A,I0,T110,A)') & + & values(1), values(2), values(3), values(5), values(6), values(7), & + & "Generation gedot single precision result file ", & + & output_file_name , ' ', count , "/", tests_number, "[FAIL]" + goto 9998 + end if + end if + call psb_barrier(ctxt) + end do + end do + + if(my_rank == psb_root_) write(*,'(A)') "[INFO] Single precision computation completed succesfully!" + + + if(my_rank == psb_root_) then + write(psb_out_unit, *) '' + count = 0 + end if + + + if(my_rank == psb_root_) write(*,'(A)') "[INFO] Starting double precision check..." + + + + call psb_barrier(ctxt) + + ! Here double precision comparison should be done + do i=1,size(x) + do j=1,size(y) + call psb_gedot_check(x_file=x(i), y_file=y(j), & + & arr_size = arr_size, ctxt = ctxt, ret = ret, output_file_name = output_file_name) + + if(my_rank == psb_root_) then + count = count + 1 + call print_progress(count, tests_number, last_percent_dp, "double precision") + call date_and_time(date, time, zones, values) + if(ret == 0) then + ! Success formatted output + write(psb_out_unit,'("[", I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2,"] ",& + & A,A,A,I0,A,I0,T110,A)') & + & values(1), values(2), values(3), values(5), values(6), values(7), & + & "Double precision check on file ", & + & output_file_name , ' ', count , "/", tests_number, "[OK]" + else + ! Fail formatted output + write(psb_out_unit,'("[", I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2,"] ",& + & A,A,A,I0,A,I0,T110,A)') & + & values(1), values(2), values(3), values(5), values(6), values(7), & + & "Double precision check on file ", & + & output_file_name , ' ', count , "/", tests_number, "[FAIL]" + write(psb_out_unit,'(A,I0)') "[ERROR] Error at element ", abs(ret) + goto 9999 + end if + end if + call psb_barrier(ctxt) + end do + end do + + if(my_rank == psb_root_) then + write(*,'(A)') "[INFO] Duble precision check completed succesfully!" + close(unit) + end if + + call psb_exit(ctxt) + return + + 9998 continue + if(my_rank == psb_root_) then + close(unit) + write(*,'(A,I0,A,I0,A)') "[ERROR] Error in gedot single precision computation ", & + & count, "/", tests_number, " see log file for details" + end if + + 9999 continue + if(my_rank == psb_root_) then + close(unit) + write(*,'(A,I0,A,I0,A)') "[ERROR] Error in gedot double precision check ", & + & count, "/", tests_number, " see log file for details" + end if + + call psb_exit(ctxt) + return +contains + + subroutine print_progress(current, total, last_percent, label) + use iso_fortran_env, only: error_unit + implicit none + integer(psb_ipk_), intent(in) :: current, total + integer(psb_ipk_), intent(inout) :: last_percent + character(len=*), intent(in) :: label + integer(psb_ipk_) :: percent, filled, width, i + character(len=160) :: line + + if (total <= 0) return + percent = int(real(current) / real(total) * 100.0) + if (percent == last_percent) return + last_percent = percent + + width = 30 + filled = int(real(percent) / 100.0 * width) + + line = "[INFO] Progress " // trim(label) // ": [" + do i = 1, filled + line = trim(line) // "#" + end do + do i = filled + 1, width + line = trim(line) // "-" + end do + 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 + + 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 \ No newline at end of file diff --git a/test/computational_routines/gedot/logs/psblas_gedot_test.log b/test/computational_routines/gedot/logs/psblas_gedot_test.log new file mode 100644 index 000000000..35cab17a8 --- /dev/null +++ b/test/computational_routines/gedot/logs/psblas_gedot_test.log @@ -0,0 +1,402 @@ +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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: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 diff --git a/test/computational_routines/gedots/Makefile b/test/computational_routines/gedot/makefile similarity index 54% rename from test/computational_routines/gedots/Makefile rename to test/computational_routines/gedot/makefile index 400cb4156..c9f2a5884 100644 --- a/test/computational_routines/gedots/Makefile +++ b/test/computational_routines/gedot/makefile @@ -8,10 +8,12 @@ include $(INCDIR)/Make.inc.psblas LIBDIR = $(INSTALLDIR)/lib/ PSBLAS_LIB = -L$(LIBDIR) -lpsb_util -lpsb_base LDLIBS = $(PSBLDLIBS) -EXEDIR = ./runs FINCLUDES=$(FMFLAG)$(MODDIR) $(FMFLAG). +EXEDIR=./runs + + GREEN=\033[0;32m RED=\033[0;31m BLUE=\033[0;34m @@ -19,19 +21,22 @@ YELLOW=\033[33m END_COLOUR=\033[0m -all: runsd psb_gedots_test +all: runsd psb_gedot_test @printf "$(GREEN)[INFO]\t Compilation success!$(END_COLOUR)\n" -runsd: - @(if test ! -d $(EXEDIR) ; then mkdir $(EXEDIR); fi) +runsd: + @(if test ! -d runs ; then mkdir runs; fi) @printf "$(BLUE)[INFO]\t Build directory $(EXEDIR) correctly initialized$(END_COLOUR)\n" -psb_gedots_test: - @$(FLINK) $(LOPT) psb_gedots_test.f90 ../utils/psb_test_utils.o -o $(EXEDIR)/psb_gedots_test -I../utils/ -I$(MODDIR) -I. $(PSBLAS_LIB) $(LDLIBS) - @printf "$(BLUE)[INFO]\t Testing files for psb_gedot linked and compiled correctly$(END_COLOUR)\n" + +psb_gedot_test: + @$(FLINK) $(LOPT) psb_gedot_test.f90 gedot.f90 -o psb_gedot_test -I$(MODDIR) -I. $(PSBLAS_LIB) $(LDLIBS) + @mv psb_gedot_test $(EXEDIR) + @printf "$(BLUE)[INFO]\t Testing files generated correctly$(END_COLOUR)\n" + clean: @rm -f $(OBJS)\ - *$(.mod) $(EXEDIR)/psb_gedots_test + *$(.mod) $(EXEDIR)/psb_gedot_test -.PHONY: all psb_gedots_test clean +.PHONY: all runsd clean diff --git a/test/computational_routines/gedot/psb_gedot_test.f90 b/test/computational_routines/gedot/psb_gedot_test.f90 index 652a50328..5cb34cea7 100644 --- a/test/computational_routines/gedot/psb_gedot_test.f90 +++ b/test/computational_routines/gedot/psb_gedot_test.f90 @@ -41,7 +41,7 @@ !! Scope: local !! Type: required !! Intent: in -!! Specified as: an object of type psb_desc_type. +!! Specified as: an object of type psb desc type. !! !! global Descritption: Specifies whether the computation should include the global !! reduction across all processes. @@ -80,140 +80,45 @@ !! In this way the global communication, which for small sizes is a latency- !! bound operation, is invoked only once. !! -program main +module psb_gedot_test use psb_base_mod use psb_util_mod - use psb_test_utils - - implicit none - - ! Communicator variable - type(psb_ctxt_type) :: ctxt - - ! parameters array - character(len=64) :: x(4),y(4) - integer(psb_ipk_) :: arr_size - integer(psb_ipk_) :: tests_number, count - logical :: global(2) = [.true., .false.] - - ! cycle indexes variables - integer(psb_ipk_) :: i,j,k,h,l - integer(psb_ipk_) :: info, unit - - ! results - real(psb_spk_) :: result_single, global_result_single - real(psb_dpk_) :: result_double - type(psb_test_info) :: test_info - - - - ! Initialize parameters - x(1) = "vectors/x1.mtx" - x(2) = "vectors/x2.mtx" - x(3) = "vectors/x3.mtx" - x(4) = "vectors/x4.mtx" - - y(1) = "vectors/y1.mtx" - y(2) = "vectors/y2.mtx" - y(3) = "vectors/y3.mtx" - y(4) = "vectors/y4.mtx" - - arr_size = 100000 - - !! Initialize test metadata - test_info%total_tests = size(x) * size(y) * size(global) - test_info%threshold_type = GAMMA - test_info%threshold = 1.0D-06 - test_info%kernel_name = "psb_gedot" - - call psb_test_init(test_info) - - if(test_info%my_rank == psb_root_) then - psb_out_unit = test_info%output_unit - call psb_test_generate_input_vectors(arr_size) - end if - - call psb_bcast(test_info%ctxt,test_info%output_unit) - call psb_barrier(test_info%ctxt) - - - if(test_info%my_rank == psb_root_) write(*,'(A)') "[INFO] Starting test excecution ..." - - ! Iterate over test parameters - do i=1,size(x) - do j=1,size(y) - do h=1,size(global) - call psb_gedot_real_kernel(x(i), y(j), arr_size, test_info%ctxt,global(h), result_single, result_double) - - if(test_info%my_rank == psb_root_) then - if(global(h) .eqv. .true.) then - global_result_single = result_single - - if(test_info%np > 1) then - ! If the program is being run on multiple processes, we need to - ! check the result on the root process with the one computed only using - ! a single process - call psb_test_process_check(result_single, test_info) - else - call psb_test_single_double_scalar_check(result_single,result_double,test_info, arr_size) - - ! If the program is being run on a single process, we can save the result directly - call psb_test_save_result(result_single, test_info) - end if - - else - call psb_test_check_global_local(global_result_single, result_single, test_info) - end if - - test_info%current_test = test_info%current_test + 1 - - end if - call psb_barrier(test_info%ctxt) - end do - end do - end do - - call psb_test_exit(test_info) -contains + contains - !> @brief Function to excecute psb_gedot in single precision real - !! vector and compare with the same computation in double - !! precision + !> @brief Function to excecute psb_geaxpby in single precision and + !! save the results on file !! - !! @param x_file file name of the first vector - !! @param y_file file name of the second vector - !! @param arr_size size of the vectors - !! @param ctxt communication context - !! @param result_single result of the single precision computation - !! @param result_double result of the double precision computation - !! @param global if .true. the result is a global reduction, otherwise it is local - !! - subroutine psb_gedot_real_kernel(x_file, y_file, arr_size, ctxt, global, result_single, result_double) + subroutine psb_gedot_kernel(x_file, y_file, arr_size, ctxt, ret, output_file_name) + + implicit none + ! input parameters - character(len = *), intent(in) :: x_file, y_file - integer(psb_ipk_), intent(in) :: arr_size - type(psb_ctxt_type), intent(in) :: ctxt - logical, intent(in) :: global + character(len = *), intent(in) :: x_file, y_file + integer(psb_ipk_), intent(in) :: arr_size + type(psb_ctxt_type), intent(in) :: ctxt ! output parameters - real(psb_spk_), intent(out) :: result_single - real(psb_dpk_), intent(out) :: result_double + integer(psb_ipk_), intent(out) :: ret + character(len=:), allocatable, intent(out) :: output_file_name ! vectors - type(psb_s_vect_type) :: x_single, y_single - type(psb_d_vect_type) :: x_double, y_double + type(psb_s_vect_type) :: x, y ! matrix descriptor data structure - type(psb_desc_type) :: desc_a + type(psb_desc_type) :: desc_a ! communication context - integer(psb_ipk_) :: my_rank, np, info + integer(psb_ipk_) :: my_rank, np, info, err_act ! variables outside PSLBALS data structures - real(psb_spk_), allocatable :: x_single_global(:), y_single_global(:) - real(psb_dpk_), allocatable :: x_double_global(:), y_double_global(:) - integer(psb_ipk_) :: i, nl + real(psb_spk_), allocatable :: x_global(:), y_global(:) + integer(psb_ipk_) :: i + + ! others + logical :: exists + real(psb_spk_) :: result(1) + info = psb_success_ @@ -226,21 +131,14 @@ contains ! Generate random array for b using always the same seed if(my_rank == psb_root_) then - allocate(x_single_global(arr_size)) - allocate(y_single_global(arr_size)) - allocate(x_double_global(arr_size)) - allocate(y_double_global(arr_size)) - - call mm_array_read(x_single_global,info,filename=x_file) - call mm_array_read(y_single_global,info,filename=y_file) - call mm_array_read(x_double_global,info,filename=x_file) - call mm_array_read(y_double_global,info,filename=y_file) + allocate(x_global(arr_size)) + allocate(y_global(arr_size)) + call mm_array_read(x_global,info,filename=x_file) + call mm_array_read(y_global,info,filename=y_file) end if ! Allocate descriptor as if it was a block rows distribution - nl = (arr_size)/np + mod(arr_size,np) - - call psb_cdall(ctxt, desc_a, info,nl=nl) + call psb_cdall(ctxt, desc_a, info,nl=arr_size/np) if(info /= psb_success_) then write(psb_out_unit,'(A)') "Error allocating desc_a data structure" goto 9999 @@ -253,111 +151,413 @@ contains end if - call psb_geall(x_single,desc_a,info) + call psb_geall(x,desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating single precision x data structure" + write(psb_out_unit,'(A)') "Error allocating x data structure" goto 9999 end if - call psb_geall(x_double,desc_a,info) + + ! Populate x class using data from x_global vector + call psb_scatter(x_global,x,desc_a,info,root=psb_root_) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating double precision x data structure" + write(psb_out_unit,'(A)') "Error in psb_scatter to populate x data structure" goto 9999 end if - ! Populate x class using data from x_global vector - call psb_scatter(x_single_global,x_single,desc_a,info,root=psb_root_) + + call psb_geall(y,desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_scatter to populate single precision x data structure" + write(psb_out_unit,'(A)') "Error allocating y data structure" goto 9999 end if - call psb_scatter(x_double_global,x_double,desc_a,info,root=psb_root_) + ! Populate y class using data from y_global vector + call psb_scatter(y_global,y,desc_a,info,root=psb_root_) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_scatter to populate double precision x data structure" + write(psb_out_unit,'(A)') "Error in psb_scatter to populate y data structure" goto 9999 end if - call psb_geall(y_single,desc_a,info) + + ! y = x^T * y + result(1) = psb_gedot(x,y,desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating single precision y data structure" + write(psb_out_unit,'(A)') "Error in psb_gedot routine" goto 9999 end if - call psb_geall(y_double,desc_a,info) + ! Make the root process be the one that saves everything on file + if(np == 1) then + ! Check if output directory exists + inquire(file='serial/', exist=exists) + if (.not.exists) then + call system('mkdir serial/') + end if + output_file_name = "serial/" + else + ! Check if output directory exists + inquire(file='parallel/', exist=exists) + if (.not.exists) then + call system('mkdir parallel/') + end if + output_file_name = "parallel/" + end if + + output_file_name = output_file_name // "sol_" // x_file(9:10) // "_" // y_file(9:10) // ".mtx" + + ! Save result to output file + if(my_rank == psb_root_) then + call mm_array_write(result,"Result of the scalar product computation",info,filename=output_file_name) + end if + + ! Deallocate + call psb_gefree(x, desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating double precision y data structure" + write(psb_out_unit,'(A)') "Error in vector x free routine" goto 9999 end if - ! Populate y class using data from y_global vector - call psb_scatter(y_single_global,y_single,desc_a,info,root=psb_root_) + call psb_gefree(y, desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_scatter to populate single precision y data structure" + write(psb_out_unit,'(A)') "Error in vector y free routine" goto 9999 end if - call psb_scatter(y_double_global,y_double,desc_a,info,root=psb_root_) + call psb_cdfree(desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_scatter to populate double precision y data structure" + write(psb_out_unit,'(A)') "Error in matrix descriptor free routine" goto 9999 end if - ! y = x^T * y - result_single = psb_gedot(x_single,y_single,desc_a,info,global) + if(my_rank == 0) then + deallocate(x_global) + deallocate(y_global) + end if + + ret = 0 + return + + + ! Error handling + 9999 ret = -1 + stop + + end subroutine + + + + !> @brief Function to excecute psb_geaxpby in double precision and + !! compare the results with the ones on file + !! + subroutine psb_gedot_check(x_file, y_file, arr_size, ctxt, ret, output_file_name) + + implicit none + + ! input parameters + character(len = *), intent(in) :: x_file, y_file + integer(psb_ipk_), intent(in) :: arr_size + type(psb_ctxt_type), intent(in) :: ctxt + + ! output parameters + integer(psb_ipk_), intent(out) :: ret + character(len=:), allocatable, intent(out) :: output_file_name + ! vectors + type(psb_d_vect_type) :: x, y + type(psb_s_vect_type) :: result_check + + ! matrix descriptor data structure + type(psb_desc_type) :: desc_a + + ! communication context + integer(psb_ipk_) :: my_rank, np, info, err_act + + ! variables outside PSLBALS data structures + real(psb_dpk_), allocatable :: x_global(:), y_global(:) + integer(psb_ipk_) :: i + + ! others + logical :: exists + real(psb_dpk_) :: result(1) + + + info = psb_success_ + + call psb_info(ctxt,my_rank,np) + + if (my_rank < 0) then + ! This should not happen, but just in case + call psb_error(ctxt) + endif + + ! Generate random array for b using always the same seed + if(my_rank == psb_root_) then + allocate(x_global(arr_size)) + allocate(y_global(arr_size)) + call mm_array_read(x_global,info,filename=x_file) + call mm_array_read(y_global,info,filename=y_file) + end if + + ! Allocate descriptor as if it was a block rows distribution + call psb_cdall(ctxt, desc_a, info,nl=arr_size/np) + if(info /= psb_success_) then + write(psb_out_unit,'(A)') "Error allocating desc_a data structure" + goto 9999 + end if + + call psb_cdasb(desc_a, info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_gedot routine in single precision" + write(psb_out_unit,'(A)') "Error assembling desc_a data structure" goto 9999 end if - result_double = psb_gedot(x_double,y_double,desc_a,info,global) + call psb_geall(x,desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_gedot routine in double precision" + write(psb_out_unit,'(A)') "Error allocating x data structure" goto 9999 end if - if(global .eqv. .false.) then - ! If the result is local, we need to sum the local results - ! to get the final result - call psb_sum(ctxt, result_single) - call psb_sum(ctxt, result_double) + + ! Populate x class using data from x_global vector + call psb_scatter(x_global,x,desc_a,info,root=psb_root_) + if(info /= psb_success_) then + write(psb_out_unit,'(A)') "Error in psb_scatter to populate x data structure" + goto 9999 end if - ! Deallocate - 9999 call psb_gefree(x_single, desc_a,info) + + call psb_geall(y,desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in single precision vector x free routine" + write(psb_out_unit,'(A)') "Error allocating y data structure" + goto 9999 end if - call psb_gefree(y_single, desc_a,info) + ! Populate y class using data from y_global vector + call psb_scatter(y_global,y,desc_a,info,root=psb_root_) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in single precision vector y free routine" + write(psb_out_unit,'(A)') "Error in psb_scatter to populate y data structure" + goto 9999 end if - call psb_gefree(x_double, desc_a,info) + + call psb_geall(result_check,desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in double precision vector x free routine" + write(psb_out_unit,'(A)') "Error allocating y_check data structure" + goto 9999 end if - call psb_gefree(y_double, desc_a,info) + + ! y = x^T * y + result(1) = psb_gedot(x,y,desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in double precision vector y free routine" + write(psb_out_unit,'(A)') "Error in psb_gedot routine" + goto 9999 + end if + + if(my_rank == psb_root_) then + ! Make the root process be the one that saves everything on file + if(np == 1) then + ! Check if output directory exists + inquire(file='serial/', exist=exists) + if(.not.exists) then + write(psb_out_unit,'(A)') "Error in psb_gedot_check routine, no single precision result is saved on file" + goto 9999 + end if + output_file_name = "serial/" + else + ! Check if output directory exists + inquire(file='parallel/', exist=exists) + if(.not.exists) then + write(psb_out_unit,'(A)') "Error in psb_gedot_check routine, no single precision result is saved on file" + goto 9999 + end if + output_file_name = "parallel/" + end if + + output_file_name = output_file_name // "sol_" // x_file(9:10) // "_" // y_file(9:10) // ".mtx" + + ! Read single precision result from file + call mm_array_read(result_check,info,filename=output_file_name) + if(info /= psb_success_) then + write(psb_out_unit,'(A)') "Error in mm_array_read for y_check data structure" + goto 9999 + end if + + ! 5.96e-08 is 2^-24 (Single precision unit roundoff) + ! 1.19e-07 is 2^-23 (Single precision unit interval) + !! call shift_decimal_double(result(1)) + !! call shift_decimal_single(result_check%v%v(1)) + + ! write(*,*) result(1),result_check%v%v(1), (arr_size * 1.19D-07) / (done-arr_size * 1.19D-07) + if(abs(result(1) - result_check%v%v(1)) > (arr_size * 1.19D-07) / (done-arr_size * 1.19D-07)) then + ret = -1 + return + end if + end if + + call psb_barrier(ctxt) + + ! Deallocate + call psb_gefree(x, desc_a,info) + if(info /= psb_success_) then + write(psb_out_unit,'(A)') "Error in vector x free routine" + goto 9999 + end if + + call psb_gefree(y, desc_a,info) + if(info /= psb_success_) then + write(psb_out_unit,'(A)') "Error in vector y free routine" + goto 9999 + end if + + call psb_gefree(result_check, desc_a,info) + if(info /= psb_success_) then + write(psb_out_unit,'(A)') "Error in vector y_check free routine" + goto 9999 end if call psb_cdfree(desc_a,info) if(info /= psb_success_) then write(psb_out_unit,'(A)') "Error in matrix descriptor free routine" + goto 9999 end if if(my_rank == 0) then - deallocate(x_single_global) - deallocate(y_single_global) - deallocate(x_double_global) - deallocate(y_double_global) + deallocate(x_global) + deallocate(y_global) end if + ret = 0 + + ret = 0 + return + + + ! Error handling + 9999 ret = -1 + stop + + end subroutine + + subroutine shift_decimal_double(n) + + implicit none + + real(psb_dpk_),intent(inout) :: n + integer :: n_digits + character(len=20) :: int_str + + + ! Convert the absolute value of the integer part to string + write(int_str, '(I0)') int(abs(n)) + + ! Count number of digits + n_digits = len_trim(adjustl(int_str)) + + ! Shift the decimal point + n = abs(n) / 10.0**n_digits + + end subroutine + + + subroutine shift_decimal_single(n) + + implicit none + + real(psb_spk_),intent(inout) :: n + integer :: n_digits + character(len=20) :: int_str + + + ! Convert the absolute value of the integer part to string + write(int_str, '(I0)') int(abs(n)) + + ! Count number of digits + n_digits = len_trim(adjustl(int_str)) + + ! Shift the decimal point + n = abs(n) / 10.0**n_digits + + end subroutine + + + !> @brief Function to randomly generate x and y vectors + !! and save them on multiple files based on their + !! coefficients values. + !! + subroutine generate_vectors(arr_size) + + + implicit none + + integer(psb_ipk_), intent(in) :: arr_size + real(psb_dpk_), allocatable :: x(:), y(:) + integer(psb_ipk_) :: i, info + logical :: exists + + + ! Check if output directory exists + inquire(file='vectors/', exist=exists) + if (.not.exists) then + call system('mkdir vectors/') + end if + + allocate(x(arr_size)) + allocate(y(arr_size)) + + call random_init(repeatable=.true.,image_distinct=.true.) + call random_number(x) + call random_number(y) + + ! Write only positive in x_1 + call mm_array_write(x,"Positive vector",info,filename="vectors/x1.mtx") + call mm_array_write(y,"Positive vector",info,filename="vectors/y1.mtx") + + ! Write only negative in x_2 + do i=1,arr_size + x(i) = -x(i) + end do + + do i=1,arr_size + y(i) = -y(i) + end do + + call mm_array_write(x,"Negative vector",info,filename="vectors/x2.mtx") + call mm_array_write(y,"Negative vector",info,filename="vectors/y2.mtx") + + + ! Since numbers are less than one and always positive, we have to generate negative ones subtractiong 50 + do i=1,arr_size + x(i) = -x(i) ! Make the values positive again + x(i) = x(i) - 0.5 + end do + + do i=1,arr_size + y(i) = -y(i) ! Make the values positive again + y(i) = y(i) - 0.5 + end do + + ! Write random in x_3 + call mm_array_write(x,"Random vector",info,filename="vectors/x3.mtx") + call mm_array_write(y,"Random vector",info,filename="vectors/y3.mtx") + + ! Write zero in x_4 + do i=1,arr_size + x(i) = 0 + end do + + do i=1,arr_size + y(i) = 0 + end do + + call mm_array_write(x,"Null vector",info,filename="vectors/x4.mtx") + call mm_array_write(y,"Null vector",info,filename="vectors/y4.mtx") + + deallocate(x) + deallocate(y) + end subroutine -end program main \ No newline at end of file +end module psb_gedot_test \ No newline at end of file diff --git a/test/computational_routines/gedot/psblas_gedot_test.log b/test/computational_routines/gedot/psblas_gedot_test.log new file mode 100644 index 000000000..7be0c3f0c --- /dev/null +++ b/test/computational_routines/gedot/psblas_gedot_test.log @@ -0,0 +1,74 @@ +Welcome to PSBLAS version: 3.9.1 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2026-06-04 21:19:38] 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_y2.mtx 2/16 [OK] +[2026-06-04 21:19:38] 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_y4.mtx 4/16 [OK] +[2026-06-04 21:19:38] 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_y2.mtx 6/16 [OK] +[2026-06-04 21:19:38] 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_y4.mtx 8/16 [OK] +[2026-06-04 21:19:38] 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_y2.mtx 10/16 [OK] +[2026-06-04 21:19:38] 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_y4.mtx 12/16 [OK] +[2026-06-04 21:19:38] 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_y2.mtx 14/16 [OK] +[2026-06-04 21:19:38] 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_y4.mtx 16/16 [OK] + +[2026-06-04 21:19:38] 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_y2.mtx 2/16 [OK] +[2026-06-04 21:19:38] 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_y4.mtx 4/16 [OK] +[2026-06-04 21:19:38] 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_y2.mtx 6/16 [OK] +[2026-06-04 21:19:39] 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_y4.mtx 8/16 [OK] +[2026-06-04 21:19:39] 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_y2.mtx 10/16 [OK] +[2026-06-04 21:19:39] 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_y4.mtx 12/16 [OK] +[2026-06-04 21:19:39] 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_y2.mtx 14/16 [OK] +[2026-06-04 21:19:39] 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_y4.mtx 16/16 [OK] +Welcome to PSBLAS version: 3.9.1 +This is the psb_gedot_test sample program +Number of processes used in this computation: 4 + +[2026-06-04 21:19:39] 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_y2.mtx 2/16 [OK] +[2026-06-04 21:19:39] 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_y4.mtx 4/16 [OK] +[2026-06-04 21:19:39] 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_y2.mtx 6/16 [OK] +[2026-06-04 21:19:39] 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_y4.mtx 8/16 [OK] +[2026-06-04 21:19:39] 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_y2.mtx 10/16 [OK] +[2026-06-04 21:19:39] 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_y4.mtx 12/16 [OK] +[2026-06-04 21:19:39] 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_y2.mtx 14/16 [OK] +[2026-06-04 21:19:39] 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_y4.mtx 16/16 [OK] + +[2026-06-04 21:19:39] 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_y2.mtx 2/16 [OK] +[2026-06-04 21:19:39] 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_y4.mtx 4/16 [OK] +[2026-06-04 21:19:39] 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_y2.mtx 6/16 [OK] +[2026-06-04 21:19:39] 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_y4.mtx 8/16 [OK] +[2026-06-04 21:19:39] 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_y2.mtx 10/16 [OK] +[2026-06-04 21:19:39] 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_y4.mtx 12/16 [OK] +[2026-06-04 21:19:39] 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_y2.mtx 14/16 [OK] +[2026-06-04 21:19:39] 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_y4.mtx 16/16 [OK] diff --git a/test/computational_routines/gedots/README.md b/test/computational_routines/gedots/README.md deleted file mode 100644 index 26445719c..000000000 --- a/test/computational_routines/gedots/README.md +++ /dev/null @@ -1,49 +0,0 @@ -# Introduction -This is a directory developed by Luca Pepè Sciarria and Simone Staccone from Tor Vergata University to start to create some unit tests for PSBLAS 3.9, in particular for ```psb_gedot``` routine. - - -## Getting started -Steps to reproduce the tests: - -- Compile the code using ``` make ``` (Optional) -- Launch the script ```./autotest.sh``` or with ```source ./autotest.sh``` if you want to add modules to the .bashrc file permanently. -- Check the output log file ```psb_gedot_test.log``` to collect results and check for errors. In any case a summarization of tests passed should be shown in stdout. - -NOTE: If the code is changed and a new compilation is needed to show the changes, the ```autotest.sh``` script isn't aware of this scenario, therefore it is necessary to manually recompile the code. Moreover, if you are running manually the script and not launching the main ```test.sh``` script, be careful to use the last compiled version of the utils. - -## Test Suite -The ```psb_gedot``` is a function that performs the scalar product between two vectors giving a value as result. The signature of the function is: - -```fortran -psb_gedot(x, y, desc_a, info [,global]) -``` - -The strategy to validate the correctness of the computation is to compare single precision result and double precision result in the test cases in which the test should not give an error. In this way it is possible to have a correctness check of the computation comparing the two results considering a number of significant digits which is tuned on the single precision computation. - -### Parameters Values -We considered high condition number as 10^6, so we will consider only matrices having a lower estimated condition number, in particular the technique used to estimate it is the SVD (Singular Value Decomposition) considering the highest and lowest value on the diagonal (?). -**x** vectors are located in the vectors/ directory. They are generated randomly using the same seed and then saved on different files based on their characteristics. The size of the vector is choosen accordingly to the size of the matrix column space considered for the single test instance. -|Variable|File Name|Coefficients|Coefficients Description| -|:-:|:-:|:-:|:-:| -|$x_1$|x1.txt|$x_i> 0, \forall i$|Positive coefficients| -|$x_2$|x2.txt|$x_i < 0, \forall i$|Negative coefficients -|$x_3$|x3.txt|$x_i \ne 0, \forall i$|Random coefficients -|$x_4$|x4.txt|$x_i = 0, \forall i$|Null coefficients - -**y** vectors are located in the vectors/ directory. They are generated randomly using the same seed and then saved on different files based on their characteristics. The size of the vector is choosen accordingly to the size of the matrix rows space considered for the single test instance. -|Variable|File Name|Coefficients|Coefficients Description| -|:-:|:-:|:-:|:-:| -|$y_1$|y1.txt|$y_i> 0, \forall i$|Positive coefficients| -|$y_2$|y2.txt|$y_i < 0, \forall i$|Negative coefficients -|$y_3$|y3.txt|$y_i \ne 0, \forall i$|Random coefficients -|$y_4$|y4.txt|$y_i = 0, \forall i$|Null coefficients - - - -## TODO -List of things still to add in the test: -- Add computation with broken descriptor and catch the errore result (Use EXCECUTE_COMMAND_LINE from a fortran program and check the exit codes) -- Test using complex data ($dot \leftarrow x^H \cdot y$) -- Test also GPU excecution -- Try multiple distributions -- Add test using matrix (the first attempt was unsuccessful) \ No newline at end of file diff --git a/test/computational_routines/gedots/autotest.sh b/test/computational_routines/gedots/autotest.sh deleted file mode 100755 index 6e9dd9e70..000000000 --- a/test/computational_routines/gedots/autotest.sh +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Variables definition -num_procs=$(nproc) - -# Define color codes -GREEN="\033[0;32m" -RED="\033[0;31m" -BLUE="\033[0;34m" -YELLOW="\033[33m" -RESET="\033[0m" - - -# Check if the executable ELF file exists -if [ ! -f "./runs/psb_gedots_test" ]; then - echo -e "${YELLOW}[WARNING] Executable not found. Running make...${RESET}" - make - if [ ! -f "./runs/psb_geaxpbys_test" ]; then - echo -e "${RED}[ERROR] Failed to create executable. Check make command.${RESET}" - fi -else - echo -e "${BLUE}[INFO]\t The executable already exists. Skipping the make process.${RESET}" -fi - - -# Excecute tests and save results -echo -e "${BLUE}[INFO]\t Running the PSBLAS psb_gedots test...${RESET}" -echo "" -echo -e "${BLUE}[INFO]\t Starting single process computation${RESET}" -mpirun -np 1 ./runs/psb_gedots_test -echo -e "${BLUE}[INFO]\t Single process computation terminated correctly${RESET}" -echo "" -echo -e "${BLUE}[INFO]\t Starting $num_procs processes computation${RESET}" -mpirun -np $num_procs ./runs/psb_gedots_test -echo -e "${BLUE}[INFO]\t Multiple processes computation terminated correctly${RESET}" - -rm -f results/* -rm -f -r results/ - -echo -e "${GREEN}[INFO]\t PSBLAS psb_gedots test succesfully completed.${RESET}" \ No newline at end of file diff --git a/test/computational_routines/gedots/psb_gedots_test.f90 b/test/computational_routines/gedots/psb_gedots_test.f90 deleted file mode 100644 index 3d67d6a28..000000000 --- a/test/computational_routines/gedots/psb_gedots_test.f90 +++ /dev/null @@ -1,677 +0,0 @@ -!> Test program for y = x^T * y or y = x^H * y psb_gedot routine -!! Check the README.md to see all details about the tests. -!! -!! Authors: Luca Pepé Sciarria, Staccone Simone (Tor Vergata University) -!! -!! psb_gedot(x, y, desc_a, info [,global]) -!! -!! Type: Synchronous. -!! -!! ====================================== -!! | Data type | Precision | -!! ====================================== -!! | psb_spk_ | Short Precision Real | -!! | psb_dpk_ | Long Precision Real | -!! | psb_cpk_ | Short Precision Complex| -!! | psb_zpk_ | Long Precision Complex | -!! ====================================== -!! Table 1: Data types -!! -!! ROUTINE PARAMETERS -!! -!! Input: -!! -!! x Description: the local portion of global dense matrix x. -!! Scope: local -!! Type: required -!! Intent: in -!! Specified as: a rank one or two array or an object of type psb_T_vect_type -!! containing numbers of type specified in Table 1. The rank of x must be -!! the same of y. -!! -!! y Description: the local portion of the global dense matrix y. -!! Scope: local -!! Type: required -!! Intent: inout -!! Specified as: a rank one or two array or an object of type psb_T_vect_type -!! containing numbers of the type indicated in Table 1. The rank of y must -!! be the same of x. -!! -!! desc_a Description: contains data structures for communications. -!! Scope: local -!! Type: required -!! Intent: in -!! Specified as: an object of type psb_desc_type. -!! -!! Output: -!! -!! res Description: is the dot product of vectors x and y -!! Scope: global -!! Intent: out -!! Specified as: a number or a rank-one array of the data type indicated in Table 1 -!! -!! info Description: Error code. -!! Scope: local -!! Type: required -!! Intent: out -!! Specified as: An integer value; 0 means no error has been detected. -!! -program main - use psb_base_mod - use psb_util_mod - use psb_test_utils - - implicit none - - ! Communicator variable - type(psb_ctxt_type) :: ctxt - - ! parameters array - character(len=64) :: x(4),y(4) - integer(psb_ipk_) :: arr_size - integer(psb_ipk_) :: tests_number, count - - ! cycle indexes variables - integer(psb_ipk_) :: i,j,k,h,l - integer(psb_ipk_) :: info, unit - - ! results - real(psb_spk_) :: result_single - real(psb_dpk_) :: result_double - real(psb_spk_), allocatable :: result_single_vector(:) - real(psb_dpk_), allocatable :: result_double_vector(:) - type(psb_test_info) :: test_info - - - - ! Initialize parameters - x(1) = "vectors/x1.mtx" - x(2) = "vectors/x2.mtx" - x(3) = "vectors/x3.mtx" - x(4) = "vectors/x4.mtx" - - y(1) = "vectors/y1.mtx" - y(2) = "vectors/y2.mtx" - y(3) = "vectors/y3.mtx" - y(4) = "vectors/y4.mtx" - - arr_size = 100000 - - !! Initialize test metadata - test_info%total_tests = size(x) * size(y) - test_info%threshold_type = GAMMA - test_info%threshold = 1.0D-06 - test_info%kernel_name = "psb_gedots" - - call psb_test_init(test_info) - - if(test_info%my_rank == psb_root_) then - psb_out_unit = test_info%output_unit - call psb_test_generate_input_vectors(arr_size) - end if - - call psb_bcast(test_info%ctxt,test_info%output_unit) - call psb_barrier(test_info%ctxt) - - - if(test_info%my_rank == psb_root_) write(*,'(A)') "[INFO] Starting test excecution ..." - - ! Iterate over test parameters - do i=1,size(x) - do j=1,size(y) - call psb_gedots_real_kernel(x(i), y(j), arr_size, test_info%ctxt,result_single, result_double) - - if(test_info%my_rank == psb_root_) then - if(test_info%np > 1) then - ! If the program is being run on multiple processes, we need to - ! check the result on the root process with the one computed only using - ! a single process - call psb_test_process_check(result_single, test_info) - else - call psb_test_single_double_scalar_check(result_single,result_double,test_info, arr_size) - - ! If the program is being run on a single process, we can save the result directly - call psb_test_save_result(result_single, test_info) - end if - test_info%current_test = test_info%current_test + 1 - end if - - call psb_barrier(test_info%ctxt) - end do - end do - - - ! Test using matrices - x(1) = "../matrix/1138_bus.mtx" - x(2) = "../matrix/crystm03.mtx" - x(3) = "../matrix/qc2534.mtx" - x(4) = "../matrix/rdb5000.mtx" - - y(1) = "../matrix/1138_bus.mtx" - y(2) = "../matrix/crystm03.mtx" - y(3) = "../matrix/qc2534.mtx" - y(4) = "../matrix/rdb5000.mtx" - - - - if(test_info%my_rank == psb_root_) then - allocate(result_single_vector(arr_size)) - allocate(result_double_vector(arr_size)) - end if - - ! Iterate over test parameters - !! do i=1,size(x) - !! do j=1,size(y) - !! call psb_gedots_real_matrix_kernel(x(i), y(j), arr_size, test_info%ctxt,result_single_vector, result_double_vector) -!! - !! if(test_info%my_rank == psb_root_) then - !! if(test_info%np > 1) then - !! ! If the program is being run on multiple processes, we need to - !! ! check the result on the root process with the one computed only using - !! ! a single process - !! call psb_test_process_vector_check(result_single_vector, test_info) - !! else - !! call psb_test_single_double_vector_check(result_single_vector,result_double_vector,test_info, arr_size) - !! - !! ! If the program is being run on a single process, we can save the result directly - !! call psb_test_save_vector_result(result_single_vector, test_info) - !! end if - !! test_info%current_test = test_info%current_test + 1 - !! end if -!! - !! call psb_barrier(test_info%ctxt) - !! end do - !! end do - - if(test_info%my_rank == psb_root_) then - deallocate(result_single_vector) - deallocate(result_double_vector) - end if - - call psb_test_exit(test_info) - -contains - - - subroutine psb_gedots_real_matrix_kernel(x_file, y_file, arr_size, ctxt, result_single, result_double) - ! input parameters - character(len = *), intent(in) :: x_file, y_file - integer(psb_ipk_), intent(in) :: arr_size - type(psb_ctxt_type), intent(in) :: ctxt - - ! output parameters - real(psb_spk_), allocatable, intent(inout) :: result_single(:) - real(psb_dpk_), allocatable, intent(inout) :: result_double(:) - - ! matrices - type(psb_lsspmat_type) :: x_single_aux, y_single_aux - type(psb_ldspmat_type) :: x_double_aux, y_double_aux - - ! sparse matrices - type(psb_sspmat_type) :: x_single, y_single - type(psb_dspmat_type) :: x_double, y_double - - ! matrix parameters - integer(psb_ipk_) :: x_rows, x_cols, x_nnz - integer(psb_ipk_) :: y_rows, y_cols, y_nnz - integer(psb_ipk_) :: nl - - ! matrix descriptor data structure - type(psb_desc_type) :: desc_a - - ! communication context - integer(psb_ipk_) :: my_rank, np, info - - - - - ! Allocate dense arrays for the local part only - integer(psb_ipk_) :: num_local_rows_x, num_local_cols_x, num_local_rows_y, num_local_cols_y - real(psb_spk_), allocatable :: x_dense_single(:,:), y_dense_single(:,:) - real(psb_dpk_), allocatable :: x_dense_double(:,:), y_dense_double(:,:) - ! For single precision x - integer(psb_ipk_), allocatable :: row_x(:), col_x(:) - real(psb_spk_), allocatable :: val_x(:) - integer(psb_ipk_) :: nnz_x, idx - type(psb_s_coo_sparse_mat) :: x_coo_single - ! For single precision y - integer(psb_ipk_), allocatable :: row_y(:), col_y(:) - real(psb_spk_), allocatable :: val_y(:) - integer(psb_ipk_) :: nnz_y - type(psb_s_coo_sparse_mat) :: y_coo_single - - ! For double precision x - integer(psb_ipk_), allocatable :: row_xd(:), col_xd(:) - real(psb_dpk_), allocatable :: val_xd(:) - integer(psb_ipk_) :: nnz_xd - type(psb_d_coo_sparse_mat) :: x_coo_d - ! For double precision y - integer(psb_ipk_), allocatable :: row_yd(:), col_yd(:) - real(psb_dpk_), allocatable :: val_yd(:) - integer(psb_ipk_) :: nnz_yd - type(psb_d_coo_sparse_mat) :: y_coo_d - - - - class(psb_s_coo_sparse_mat), pointer :: a_ptr_s - class(psb_d_coo_sparse_mat), pointer :: a_ptr_d - - - - - - - call psb_info(ctxt,my_rank,np) - - if (my_rank < 0) then - ! This should not happen, but just in case - call psb_error(ctxt) - endif - - call mm_mat_read(a=x_single_aux,info=info, iunit=17, filename=x_file) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error reading single precision matrix x" - return - end if - - call mm_mat_read(a=x_double_aux,info=info, iunit=17, filename=x_file) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error reading double precision matrix x" - return - end if - - call mm_mat_read(a=y_single_aux,info=info, iunit=17, filename=y_file) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error reading single precision matrix y" - return - end if - - call mm_mat_read(a=y_double_aux,info=info, iunit=17, filename=y_file) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error reading double precision matrix y" - return - end if - - - x_rows = x_single_aux%get_nrows() - x_cols = x_single_aux%get_ncols() - x_nnz = x_single_aux%get_nzeros() - - y_rows = y_single_aux%get_nrows() - y_cols = y_single_aux%get_ncols() - y_nnz = y_single_aux%get_nzeros() - - - ! Allocate descriptor as if it was a block rows distribution - nl = (arr_size)/np + mod(arr_size,np) - - - ! part_block it's a macro defined in psb_blockpart_mod to identify BLOCK ROWS distribution - call psb_matdist(x_single_aux, x_single, ctxt,desc_a,info,fmt="COO",parts=part_block) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_matdist for single precision matrix x" - goto 9999 - end if - - call psb_matdist(x_double_aux, x_double, ctxt,desc_a,info,fmt="COO",parts=part_block) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_matdist for double precision matrix x" - goto 9999 - end if - - call psb_matdist(y_single_aux, y_single, ctxt,desc_a,info,fmt="COO",parts=part_block) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_matdist for single precision matrix y" - goto 9999 - end if - - call psb_matdist(y_double_aux, y_double, ctxt,desc_a,info,fmt="COO",parts=part_block) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_matdist for double precision matrix y" - goto 9999 - end if - - - - - - ! --------------------------------------------------------------------- ! - - - - ! Get local dimensions from the descriptor - num_local_rows_x = x_single%get_nrows() - num_local_cols_x = x_single%get_ncols() - num_local_rows_y = y_single%get_nrows() - num_local_cols_y = y_single%get_ncols() - - allocate(x_dense_single(num_local_rows_x, num_local_cols_x)) - allocate(y_dense_single(num_local_rows_y, num_local_cols_y)) - allocate(x_dense_double(num_local_rows_x, num_local_cols_x)) - allocate(y_dense_double(num_local_rows_y, num_local_cols_y)) - - ! Initialize to zero - x_dense_single = 0.0_psb_spk_ - y_dense_single = 0.0_psb_spk_ - x_dense_double = 0.0_psb_dpk_ - y_dense_double = 0.0_psb_dpk_ - - ! Explicitly extract COO values and insert them in the dense arrays - - - - - select type(a_ptr_s => x_single%a) - type is (psb_s_coo_sparse_mat) - x_coo_single = a_ptr_s - class default - write(psb_out_unit,'(A)') "Error: x_single%a is not of type psb_s_coo_sparse_mat" - return - end select - - nnz_x = x_coo_single%get_nzeros() - allocate(row_x(nnz_x), col_x(nnz_x), val_x(nnz_x)) - row_x = x_coo_single%ia - col_x = x_coo_single%ja - val_x = x_coo_single%val - - do idx = 1, nnz_x - x_dense_single(row_x(idx), col_x(idx)) = val_x(idx) - end do - - - - select type(a_ptr_s => y_single%a) - type is (psb_s_coo_sparse_mat) - y_coo_single = a_ptr_s - class default - write(psb_out_unit,'(A)') "Error: x_single%a is not of type psb_s_coo_sparse_mat" - return - end select - - nnz_y = y_coo_single%get_nzeros() - allocate(row_y(nnz_y), col_y(nnz_y), val_y(nnz_y)) - row_y = y_coo_single%ia - col_y = y_coo_single%ja - val_y = y_coo_single%val - do idx = 1, nnz_y - y_dense_single(row_y(idx), col_y(idx)) = val_y(idx) - end do - - - - select type(a_ptr_d => x_double%a) - type is (psb_d_coo_sparse_mat) - x_coo_d = a_ptr_d - class default - write(psb_out_unit,'(A)') "Error: x_single%a is not of type psb_s_coo_sparse_mat" - return - end select - - - nnz_xd = x_coo_d%get_nzeros() - allocate(row_xd(nnz_xd), col_xd(nnz_xd), val_xd(nnz_xd)) - row_xd = x_coo_d%ia - col_xd = x_coo_d%ja - val_xd = x_coo_d%val - - do idx = 1, nnz_xd - x_dense_double(row_xd(idx), col_xd(idx)) = val_xd(idx) - end do - - - - - - select type(a_ptr_d => y_double%a) - type is (psb_d_coo_sparse_mat) - y_coo_d = a_ptr_d - class default - write(psb_out_unit,'(A)') "Error: x_single%a is not of type psb_s_coo_sparse_mat" - return - end select - - - nnz_yd = y_coo_d%get_nzeros() - allocate(row_yd(nnz_yd), col_yd(nnz_yd), val_yd(nnz_yd)) - row_yd = y_coo_d%ia - col_yd = y_coo_d%ja - val_yd = y_coo_d%val - do idx = 1, nnz_yd - y_dense_double(row_yd(idx), col_yd(idx)) = val_yd(idx) - end do - - - - - ! --------------------------------------------------------------------- ! - - ! y = x^T * y - call psb_gedots(result_single,x_dense_single,y_dense_single,desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_gedots routine in single precision" - goto 9999 - end if -!! - !! ! y = x^T * y - call psb_gedots(result_double,x_dense_double,y_dense_double,desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_gedots routine in double precision" - goto 9999 - end if - - - - - - - - - 9999 call psb_spfree(x_single, desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in single precision vector x free routine" - end if - - call psb_spfree(y_single, desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in single precision vector y free routine" - end if - - call psb_spfree(x_double, desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in double precision vector x free routine" - end if - - call psb_spfree(y_double, desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in double precision vector y free routine" - end if - - call psb_cdfree(desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in matrix descriptor free routine" - end if - - - end subroutine - - - !> @brief Function to excecute psb_gedots in single precision real - !! vector and compare with the same computation in double - !! precision - !! - !! @param x_file file name of the first vector - !! @param y_file file name of the second vector - !! @param arr_size size of the vectors - !! @param ctxt communication context - !! @param result_single result of the single precision computation - !! @param result_double result of the double precision computation - !! - subroutine psb_gedots_real_kernel(x_file, y_file, arr_size, ctxt, result_single, result_double) - ! input parameters - character(len = *), intent(in) :: x_file, y_file - integer(psb_ipk_), intent(in) :: arr_size - type(psb_ctxt_type), intent(in) :: ctxt - - ! output parameters - real(psb_spk_), intent(out) :: result_single - real(psb_dpk_), intent(out) :: result_double - - ! vectors - type(psb_s_vect_type) :: x_single, y_single - type(psb_d_vect_type) :: x_double, y_double - - ! matrix descriptor data structure - type(psb_desc_type) :: desc_a - - ! communication context - integer(psb_ipk_) :: my_rank, np, info, err_act - - ! variables outside PSLBALS data structures - real(psb_spk_), allocatable :: x_single_global(:), y_single_global(:) - real(psb_dpk_), allocatable :: x_double_global(:), y_double_global(:) - integer(psb_ipk_) :: i, nl - - ! others - logical :: exists - - info = psb_success_ - - call psb_info(ctxt,my_rank,np) - - if (my_rank < 0) then - ! This should not happen, but just in case - call psb_error(ctxt) - endif - - ! Generate random array for b using always the same seed - if(my_rank == psb_root_) then - allocate(x_single_global(arr_size)) - allocate(y_single_global(arr_size)) - allocate(x_double_global(arr_size)) - allocate(y_double_global(arr_size)) - - call mm_array_read(x_single_global,info,filename=x_file) - call mm_array_read(y_single_global,info,filename=y_file) - call mm_array_read(x_double_global,info,filename=x_file) - call mm_array_read(y_double_global,info,filename=y_file) - end if - - ! Allocate descriptor as if it was a block rows distribution - nl = (arr_size)/np + mod(arr_size,np) - - call psb_cdall(ctxt, desc_a, info,nl=nl) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating desc_a data structure" - goto 9999 - end if - - call psb_cdasb(desc_a, info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error assembling desc_a data structure" - goto 9999 - end if - - - call psb_geall(x_single,desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating single precision x data structure" - goto 9999 - end if - - call psb_geall(x_double,desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating double precision x data structure" - goto 9999 - end if - - ! Populate x class using data from x_global vector - call psb_scatter(x_single_global,x_single,desc_a,info,root=psb_root_) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_scatter to populate single precision x data structure" - goto 9999 - end if - - call psb_scatter(x_double_global,x_double,desc_a,info,root=psb_root_) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_scatter to populate double precision x data structure" - goto 9999 - end if - - call psb_geall(y_single,desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating single precision y data structure" - goto 9999 - end if - - call psb_geall(y_double,desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error allocating double precision y data structure" - goto 9999 - end if - - ! Populate y class using data from y_global vector - call psb_scatter(y_single_global,y_single,desc_a,info,root=psb_root_) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_scatter to populate single precision y data structure" - goto 9999 - end if - - call psb_scatter(y_double_global,y_double,desc_a,info,root=psb_root_) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_scatter to populate double precision y data structure" - goto 9999 - end if - - ! y = x^T * y - call psb_gedots(result_single,x_single%v%v,y_single%v%v,desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_gedots routine in single precision" - goto 9999 - end if - - - call psb_gedots(result_double,x_double%v%v,y_double%v%v,desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in psb_gedots routine in double precision" - goto 9999 - end if - - - ! Deallocate - 9999 call psb_gefree(x_single, desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in single precision vector x free routine" - end if - - call psb_gefree(y_single, desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in single precision vector y free routine" - end if - - call psb_gefree(x_double, desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in double precision vector x free routine" - end if - - call psb_gefree(y_double, desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in double precision vector y free routine" - end if - - - call psb_cdfree(desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,'(A)') "Error in matrix descriptor free routine" - end if - - if(my_rank == 0) then - deallocate(x_single_global) - deallocate(y_single_global) - deallocate(x_double_global) - deallocate(y_double_global) - end if - - end subroutine - -end program main \ No newline at end of file diff --git a/test/computational_routines/psblas_test_results.log b/test/computational_routines/psblas_test_results.log new file mode 100644 index 000000000..644b6ca39 --- /dev/null +++ b/test/computational_routines/psblas_test_results.log @@ -0,0 +1,54866 @@ +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:05:39] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:05:39] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:05:39] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:05:39] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:05:40] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:05:40] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:05:40] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:05:40] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:05:41] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:05:41] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:05:41] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:05:41] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:05:41] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:05:41] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:05:41] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:05:41] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:05:41] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:06:28] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:06:28] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:06:28] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:06:29] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:06:29] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:06:29] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:06:29] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:06:29] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:06:29] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:06:29] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:06:29] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:06:29] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:06:29] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:06:30] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:06:30] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:06:30] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:06:30] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:06:30] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:06:30] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:06:30] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:09:08] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:09:08] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:09:08] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:09:09] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:09:09] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:09:09] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:09:09] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:09:09] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:09:09] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:09:09] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:09:09] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:09:09] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:09:09] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:09:10] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:09:10] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:09:10] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:09:10] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:09:10] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:09:10] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:09:10] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:09:41] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:09:41] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:09:41] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:09:42] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:09:42] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:09:42] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:09:42] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:09:42] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:09:42] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:09:42] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:09:42] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:09:43] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:09:43] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:09:43] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:09:43] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:09:43] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:09:43] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:09:43] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:09:43] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:09:43] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:12:41] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:12:41] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:12:41] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:12:41] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:12:41] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:12:41] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:12:41] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:12:42] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:12:42] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:12:42] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:12:42] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:12:42] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:12:42] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:12:42] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:12:42] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:12:42] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:12:42] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:12:42] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:12:43] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:12:43] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:12:43] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:12:43] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:12:59] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:12:59] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:12:59] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +Comparison between serial/sol_x1_y1_a1_b1.mtx and parallel/sol_x1_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b2.mtx and parallel/sol_x1_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b3.mtx and parallel/sol_x1_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b1.mtx and parallel/sol_x1_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b2.mtx and parallel/sol_x1_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b3.mtx and parallel/sol_x1_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b1.mtx and parallel/sol_x1_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b2.mtx and parallel/sol_x1_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b3.mtx and parallel/sol_x1_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b1.mtx and parallel/sol_x1_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b2.mtx and parallel/sol_x1_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b3.mtx and parallel/sol_x1_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b1.mtx and parallel/sol_x1_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b2.mtx and parallel/sol_x1_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b3.mtx and parallel/sol_x1_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b1.mtx and parallel/sol_x1_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b2.mtx and parallel/sol_x1_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b3.mtx and parallel/sol_x1_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b1.mtx and parallel/sol_x1_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b2.mtx and parallel/sol_x1_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b3.mtx and parallel/sol_x1_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b1.mtx and parallel/sol_x1_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b2.mtx and parallel/sol_x1_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b3.mtx and parallel/sol_x1_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b1.mtx and parallel/sol_x1_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b2.mtx and parallel/sol_x1_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b3.mtx and parallel/sol_x1_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b1.mtx and parallel/sol_x1_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b2.mtx and parallel/sol_x1_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b3.mtx and parallel/sol_x1_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b1.mtx and parallel/sol_x1_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b2.mtx and parallel/sol_x1_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b3.mtx and parallel/sol_x1_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b1.mtx and parallel/sol_x1_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b2.mtx and parallel/sol_x1_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b3.mtx and parallel/sol_x1_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b1.mtx and parallel/sol_x2_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b2.mtx and parallel/sol_x2_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b3.mtx and parallel/sol_x2_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b1.mtx and parallel/sol_x2_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b2.mtx and parallel/sol_x2_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b3.mtx and parallel/sol_x2_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b1.mtx and parallel/sol_x2_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b2.mtx and parallel/sol_x2_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b3.mtx and parallel/sol_x2_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b1.mtx and parallel/sol_x2_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b2.mtx and parallel/sol_x2_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b3.mtx and parallel/sol_x2_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b1.mtx and parallel/sol_x2_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b2.mtx and parallel/sol_x2_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b3.mtx and parallel/sol_x2_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b1.mtx and parallel/sol_x2_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b2.mtx and parallel/sol_x2_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b3.mtx and parallel/sol_x2_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b1.mtx and parallel/sol_x2_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b2.mtx and parallel/sol_x2_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b3.mtx and parallel/sol_x2_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b1.mtx and parallel/sol_x2_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b2.mtx and parallel/sol_x2_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b3.mtx and parallel/sol_x2_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b1.mtx and parallel/sol_x2_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b2.mtx and parallel/sol_x2_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b3.mtx and parallel/sol_x2_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b1.mtx and parallel/sol_x2_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b2.mtx and parallel/sol_x2_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b3.mtx and parallel/sol_x2_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b1.mtx and parallel/sol_x2_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b2.mtx and parallel/sol_x2_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b3.mtx and parallel/sol_x2_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b1.mtx and parallel/sol_x2_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b2.mtx and parallel/sol_x2_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b3.mtx and parallel/sol_x2_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b1.mtx and parallel/sol_x3_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b2.mtx and parallel/sol_x3_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b3.mtx and parallel/sol_x3_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b1.mtx and parallel/sol_x3_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b2.mtx and parallel/sol_x3_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b3.mtx and parallel/sol_x3_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b1.mtx and parallel/sol_x3_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b2.mtx and parallel/sol_x3_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b3.mtx and parallel/sol_x3_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b1.mtx and parallel/sol_x3_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b2.mtx and parallel/sol_x3_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b3.mtx and parallel/sol_x3_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b1.mtx and parallel/sol_x3_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b2.mtx and parallel/sol_x3_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b3.mtx and parallel/sol_x3_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b1.mtx and parallel/sol_x3_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b2.mtx and parallel/sol_x3_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b3.mtx and parallel/sol_x3_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b1.mtx and parallel/sol_x3_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b2.mtx and parallel/sol_x3_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b3.mtx and parallel/sol_x3_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b1.mtx and parallel/sol_x3_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b2.mtx and parallel/sol_x3_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b3.mtx and parallel/sol_x3_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b1.mtx and parallel/sol_x3_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b2.mtx and parallel/sol_x3_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b3.mtx and parallel/sol_x3_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b1.mtx and parallel/sol_x3_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b2.mtx and parallel/sol_x3_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b3.mtx and parallel/sol_x3_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b1.mtx and parallel/sol_x3_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b2.mtx and parallel/sol_x3_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b3.mtx and parallel/sol_x3_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b1.mtx and parallel/sol_x3_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b2.mtx and parallel/sol_x3_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b3.mtx and parallel/sol_x3_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b1.mtx and parallel/sol_x4_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b2.mtx and parallel/sol_x4_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b3.mtx and parallel/sol_x4_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b1.mtx and parallel/sol_x4_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b2.mtx and parallel/sol_x4_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b3.mtx and parallel/sol_x4_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b1.mtx and parallel/sol_x4_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b2.mtx and parallel/sol_x4_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b3.mtx and parallel/sol_x4_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b1.mtx and parallel/sol_x4_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b2.mtx and parallel/sol_x4_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b3.mtx and parallel/sol_x4_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b1.mtx and parallel/sol_x4_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b2.mtx and parallel/sol_x4_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b3.mtx and parallel/sol_x4_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b1.mtx and parallel/sol_x4_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b2.mtx and parallel/sol_x4_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b3.mtx and parallel/sol_x4_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b1.mtx and parallel/sol_x4_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b2.mtx and parallel/sol_x4_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b3.mtx and parallel/sol_x4_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b1.mtx and parallel/sol_x4_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b2.mtx and parallel/sol_x4_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b3.mtx and parallel/sol_x4_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b1.mtx and parallel/sol_x4_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b2.mtx and parallel/sol_x4_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b3.mtx and parallel/sol_x4_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b1.mtx and parallel/sol_x4_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b2.mtx and parallel/sol_x4_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b3.mtx and parallel/sol_x4_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b1.mtx and parallel/sol_x4_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b2.mtx and parallel/sol_x4_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b3.mtx and parallel/sol_x4_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b1.mtx and parallel/sol_x4_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b2.mtx and parallel/sol_x4_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b3.mtx and parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:14:31] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:14:31] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:14:31] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:14:31] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:14:32] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:14:32] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:15:25] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:15:25] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:15:25] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:15:26] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:15:26] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:15:26] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:15:26] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:15:26] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:15:26] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:15:26] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:15:26] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:15:26] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:15:27] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:15:27] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:15:27] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:15:27] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:15:27] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:15:27] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:15:27] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:15:27] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:18:05] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:18:05] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:18:05] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:18:06] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:18:06] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:18:06] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:18:06] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:18:06] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:18:06] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:18:06] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:18:06] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:18:06] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:18:07] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:18:07] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:18:07] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:18:07] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:18:07] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:18:07] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:18:07] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:18:07] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:18:39] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:18:39] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:18:39] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:18:40] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:18:40] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:18:40] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:18:40] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:18:40] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:18:40] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:18:40] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:18:40] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:18:40] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:18:40] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:18:41] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:18:41] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:18:41] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:18:41] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:18:41] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:18:41] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:18:41] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:21:21] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:21:21] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:21:21] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:21:21] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:21:21] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:21:21] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:21:21] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:21:21] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:21:21] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:21:21] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:21:21] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:21:22] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:21:22] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:21:22] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:21:22] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:21:22] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:21:22] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:21:22] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:21:22] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:21:22] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:21:22] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:21:23] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:23:57] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:57] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:23:57] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:57] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:12:59] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:12:59] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:12:59] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:13:00] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:13:01] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:13:02] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:13:03] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:13:03] Double precision check on file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:13:04] Double precision check on file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:13:05] Double precision check on file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:13:06] Double precision check on file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:13:07] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:13:08] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:13:09] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:13:10] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:13:11] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:13:12] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:13:13] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:13:14] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:13:15] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:13:16] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:13:16] Double precision check on file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:13:17] Double precision check on file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:13:18] Double precision check on file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:13:19] Double precision check on file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:13:20] Double precision check on file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:13:21] Double precision check on file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:13:22] Double precision check on file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +Comparison between serial/sol_x1_y1_a1_b1.mtx and parallel/sol_x1_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b2.mtx and parallel/sol_x1_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b3.mtx and parallel/sol_x1_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b1.mtx and parallel/sol_x1_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b2.mtx and parallel/sol_x1_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b3.mtx and parallel/sol_x1_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b1.mtx and parallel/sol_x1_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b2.mtx and parallel/sol_x1_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b3.mtx and parallel/sol_x1_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b1.mtx and parallel/sol_x1_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b2.mtx and parallel/sol_x1_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b3.mtx and parallel/sol_x1_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b1.mtx and parallel/sol_x1_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b2.mtx and parallel/sol_x1_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b3.mtx and parallel/sol_x1_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b1.mtx and parallel/sol_x1_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b2.mtx and parallel/sol_x1_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b3.mtx and parallel/sol_x1_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b1.mtx and parallel/sol_x1_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b2.mtx and parallel/sol_x1_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b3.mtx and parallel/sol_x1_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b1.mtx and parallel/sol_x1_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b2.mtx and parallel/sol_x1_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b3.mtx and parallel/sol_x1_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b1.mtx and parallel/sol_x1_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b2.mtx and parallel/sol_x1_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b3.mtx and parallel/sol_x1_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b1.mtx and parallel/sol_x1_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b2.mtx and parallel/sol_x1_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b3.mtx and parallel/sol_x1_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b1.mtx and parallel/sol_x1_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b2.mtx and parallel/sol_x1_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b3.mtx and parallel/sol_x1_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b1.mtx and parallel/sol_x1_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b2.mtx and parallel/sol_x1_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b3.mtx and parallel/sol_x1_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b1.mtx and parallel/sol_x2_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b2.mtx and parallel/sol_x2_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b3.mtx and parallel/sol_x2_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b1.mtx and parallel/sol_x2_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b2.mtx and parallel/sol_x2_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b3.mtx and parallel/sol_x2_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b1.mtx and parallel/sol_x2_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b2.mtx and parallel/sol_x2_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b3.mtx and parallel/sol_x2_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b1.mtx and parallel/sol_x2_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b2.mtx and parallel/sol_x2_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b3.mtx and parallel/sol_x2_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b1.mtx and parallel/sol_x2_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b2.mtx and parallel/sol_x2_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b3.mtx and parallel/sol_x2_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b1.mtx and parallel/sol_x2_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b2.mtx and parallel/sol_x2_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b3.mtx and parallel/sol_x2_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b1.mtx and parallel/sol_x2_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b2.mtx and parallel/sol_x2_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b3.mtx and parallel/sol_x2_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b1.mtx and parallel/sol_x2_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b2.mtx and parallel/sol_x2_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b3.mtx and parallel/sol_x2_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b1.mtx and parallel/sol_x2_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b2.mtx and parallel/sol_x2_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b3.mtx and parallel/sol_x2_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b1.mtx and parallel/sol_x2_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b2.mtx and parallel/sol_x2_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b3.mtx and parallel/sol_x2_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b1.mtx and parallel/sol_x2_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b2.mtx and parallel/sol_x2_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b3.mtx and parallel/sol_x2_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b1.mtx and parallel/sol_x2_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b2.mtx and parallel/sol_x2_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b3.mtx and parallel/sol_x2_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b1.mtx and parallel/sol_x3_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b2.mtx and parallel/sol_x3_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b3.mtx and parallel/sol_x3_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b1.mtx and parallel/sol_x3_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b2.mtx and parallel/sol_x3_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b3.mtx and parallel/sol_x3_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b1.mtx and parallel/sol_x3_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b2.mtx and parallel/sol_x3_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b3.mtx and parallel/sol_x3_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b1.mtx and parallel/sol_x3_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b2.mtx and parallel/sol_x3_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b3.mtx and parallel/sol_x3_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b1.mtx and parallel/sol_x3_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b2.mtx and parallel/sol_x3_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b3.mtx and parallel/sol_x3_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b1.mtx and parallel/sol_x3_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b2.mtx and parallel/sol_x3_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b3.mtx and parallel/sol_x3_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b1.mtx and parallel/sol_x3_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b2.mtx and parallel/sol_x3_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b3.mtx and parallel/sol_x3_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b1.mtx and parallel/sol_x3_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b2.mtx and parallel/sol_x3_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b3.mtx and parallel/sol_x3_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b1.mtx and parallel/sol_x3_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b2.mtx and parallel/sol_x3_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b3.mtx and parallel/sol_x3_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b1.mtx and parallel/sol_x3_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b2.mtx and parallel/sol_x3_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b3.mtx and parallel/sol_x3_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b1.mtx and parallel/sol_x3_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b2.mtx and parallel/sol_x3_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b3.mtx and parallel/sol_x3_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b1.mtx and parallel/sol_x3_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b2.mtx and parallel/sol_x3_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b3.mtx and parallel/sol_x3_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b1.mtx and parallel/sol_x4_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b2.mtx and parallel/sol_x4_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b3.mtx and parallel/sol_x4_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b1.mtx and parallel/sol_x4_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b2.mtx and parallel/sol_x4_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b3.mtx and parallel/sol_x4_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b1.mtx and parallel/sol_x4_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b2.mtx and parallel/sol_x4_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b3.mtx and parallel/sol_x4_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b1.mtx and parallel/sol_x4_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b2.mtx and parallel/sol_x4_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b3.mtx and parallel/sol_x4_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b1.mtx and parallel/sol_x4_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b2.mtx and parallel/sol_x4_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b3.mtx and parallel/sol_x4_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b1.mtx and parallel/sol_x4_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b2.mtx and parallel/sol_x4_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b3.mtx and parallel/sol_x4_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b1.mtx and parallel/sol_x4_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b2.mtx and parallel/sol_x4_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b3.mtx and parallel/sol_x4_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b1.mtx and parallel/sol_x4_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b2.mtx and parallel/sol_x4_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b3.mtx and parallel/sol_x4_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b1.mtx and parallel/sol_x4_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b2.mtx and parallel/sol_x4_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b3.mtx and parallel/sol_x4_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b1.mtx and parallel/sol_x4_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b2.mtx and parallel/sol_x4_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b3.mtx and parallel/sol_x4_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b1.mtx and parallel/sol_x4_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b2.mtx and parallel/sol_x4_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b3.mtx and parallel/sol_x4_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b1.mtx and parallel/sol_x4_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b2.mtx and parallel/sol_x4_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b3.mtx and parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:23:57] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:57] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:24:56] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:24:56] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:24:56] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:23:57] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:57] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:58] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:58] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:59] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:23:59] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:24:56] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:24:56] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:24:56] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:24:56] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:24:57] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:25:07] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:25:07] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:25:07] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:25:07] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:25:07] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:25:07] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:25:07] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:25:07] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:25:08] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:25:09] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:25:10] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:25:11] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:25:11] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:25:11] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:25:11] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:25:11] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:25:11] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:25:11] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:25:11] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:25:11] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:25:11] Double precision check on file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:25:12] Double precision check on file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:25:13] Double precision check on file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:25:14] Double precision check on file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:25:14] Double precision check on file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:25:14] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:25:14] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:25:14] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:25:14] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:25:14] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:25:14] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:25:14] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:25:14] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:25:14] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:25:15] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:25:16] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:25:17] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:25:18] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:25:18] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:25:18] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:25:18] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:25:18] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:25:18] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:25:18] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] + +Comparison between serial/sol_x1_y1_a1_b1.mtx and parallel/sol_x1_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b2.mtx and parallel/sol_x1_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b3.mtx and parallel/sol_x1_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b1.mtx and parallel/sol_x1_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b2.mtx and parallel/sol_x1_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b3.mtx and parallel/sol_x1_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b1.mtx and parallel/sol_x1_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b2.mtx and parallel/sol_x1_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b3.mtx and parallel/sol_x1_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b1.mtx and parallel/sol_x1_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b2.mtx and parallel/sol_x1_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b3.mtx and parallel/sol_x1_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b1.mtx and parallel/sol_x1_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b2.mtx and parallel/sol_x1_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b3.mtx and parallel/sol_x1_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b1.mtx and parallel/sol_x1_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b2.mtx and parallel/sol_x1_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b3.mtx and parallel/sol_x1_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b1.mtx and parallel/sol_x1_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b2.mtx and parallel/sol_x1_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b3.mtx and parallel/sol_x1_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b1.mtx and parallel/sol_x1_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b2.mtx and parallel/sol_x1_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b3.mtx and parallel/sol_x1_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b1.mtx and parallel/sol_x1_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b2.mtx and parallel/sol_x1_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b3.mtx and parallel/sol_x1_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b1.mtx and parallel/sol_x1_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b2.mtx and parallel/sol_x1_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b3.mtx and parallel/sol_x1_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b1.mtx and parallel/sol_x1_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b2.mtx and parallel/sol_x1_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b3.mtx and parallel/sol_x1_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b1.mtx and parallel/sol_x1_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b2.mtx and parallel/sol_x1_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b3.mtx and parallel/sol_x1_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b1.mtx and parallel/sol_x2_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b2.mtx and parallel/sol_x2_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b3.mtx and parallel/sol_x2_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b1.mtx and parallel/sol_x2_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b2.mtx and parallel/sol_x2_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b3.mtx and parallel/sol_x2_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b1.mtx and parallel/sol_x2_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b2.mtx and parallel/sol_x2_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b3.mtx and parallel/sol_x2_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b1.mtx and parallel/sol_x2_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b2.mtx and parallel/sol_x2_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b3.mtx and parallel/sol_x2_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b1.mtx and parallel/sol_x2_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b2.mtx and parallel/sol_x2_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b3.mtx and parallel/sol_x2_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b1.mtx and parallel/sol_x2_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b2.mtx and parallel/sol_x2_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b3.mtx and parallel/sol_x2_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b1.mtx and parallel/sol_x2_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b2.mtx and parallel/sol_x2_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b3.mtx and parallel/sol_x2_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b1.mtx and parallel/sol_x2_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b2.mtx and parallel/sol_x2_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b3.mtx and parallel/sol_x2_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b1.mtx and parallel/sol_x2_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b2.mtx and parallel/sol_x2_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b3.mtx and parallel/sol_x2_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b1.mtx and parallel/sol_x2_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b2.mtx and parallel/sol_x2_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b3.mtx and parallel/sol_x2_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b1.mtx and parallel/sol_x2_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b2.mtx and parallel/sol_x2_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b3.mtx and parallel/sol_x2_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b1.mtx and parallel/sol_x2_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b2.mtx and parallel/sol_x2_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b3.mtx and parallel/sol_x2_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b1.mtx and parallel/sol_x3_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b2.mtx and parallel/sol_x3_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b3.mtx and parallel/sol_x3_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b1.mtx and parallel/sol_x3_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b2.mtx and parallel/sol_x3_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b3.mtx and parallel/sol_x3_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b1.mtx and parallel/sol_x3_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b2.mtx and parallel/sol_x3_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b3.mtx and parallel/sol_x3_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b1.mtx and parallel/sol_x3_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b2.mtx and parallel/sol_x3_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b3.mtx and parallel/sol_x3_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b1.mtx and parallel/sol_x3_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b2.mtx and parallel/sol_x3_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b3.mtx and parallel/sol_x3_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b1.mtx and parallel/sol_x3_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b2.mtx and parallel/sol_x3_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b3.mtx and parallel/sol_x3_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b1.mtx and parallel/sol_x3_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b2.mtx and parallel/sol_x3_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b3.mtx and parallel/sol_x3_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b1.mtx and parallel/sol_x3_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b2.mtx and parallel/sol_x3_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b3.mtx and parallel/sol_x3_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b1.mtx and parallel/sol_x3_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b2.mtx and parallel/sol_x3_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b3.mtx and parallel/sol_x3_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b1.mtx and parallel/sol_x3_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b2.mtx and parallel/sol_x3_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b3.mtx and parallel/sol_x3_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b1.mtx and parallel/sol_x3_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b2.mtx and parallel/sol_x3_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b3.mtx and parallel/sol_x3_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b1.mtx and parallel/sol_x3_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b2.mtx and parallel/sol_x3_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b3.mtx and parallel/sol_x3_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b1.mtx and parallel/sol_x4_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b2.mtx and parallel/sol_x4_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b3.mtx and parallel/sol_x4_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b1.mtx and parallel/sol_x4_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b2.mtx and parallel/sol_x4_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b3.mtx and parallel/sol_x4_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b1.mtx and parallel/sol_x4_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b2.mtx and parallel/sol_x4_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b3.mtx and parallel/sol_x4_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b1.mtx and parallel/sol_x4_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b2.mtx and parallel/sol_x4_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b3.mtx and parallel/sol_x4_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b1.mtx and parallel/sol_x4_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b2.mtx and parallel/sol_x4_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b3.mtx and parallel/sol_x4_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b1.mtx and parallel/sol_x4_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b2.mtx and parallel/sol_x4_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b3.mtx and parallel/sol_x4_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b1.mtx and parallel/sol_x4_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b2.mtx and parallel/sol_x4_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b3.mtx and parallel/sol_x4_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b1.mtx and parallel/sol_x4_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b2.mtx and parallel/sol_x4_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b3.mtx and parallel/sol_x4_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b1.mtx and parallel/sol_x4_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b2.mtx and parallel/sol_x4_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b3.mtx and parallel/sol_x4_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b1.mtx and parallel/sol_x4_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b2.mtx and parallel/sol_x4_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b3.mtx and parallel/sol_x4_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b1.mtx and parallel/sol_x4_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b2.mtx and parallel/sol_x4_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b3.mtx and parallel/sol_x4_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b1.mtx and parallel/sol_x4_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b2.mtx and parallel/sol_x4_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b3.mtx and parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:25:20] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:22] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:22] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:22] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:22] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:22] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:22] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:20] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:25:20] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:20] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:21] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:21] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:22] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:22] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:22] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:22] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:22] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:22] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:25:33] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:25:34] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:25:35] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:25:36] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:25:36] Double precision check on file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:25:36] Double precision check on file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:25:36] Double precision check on file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:25:36] Double precision check on file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:25:36] Double precision check on file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:25:36] Double precision check on file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:25:37] Double precision check on file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:25:38] Double precision check on file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:25:39] Double precision check on file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:25:40] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:25:40] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:25:40] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:25:40] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:25:40] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:25:40] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:25:40] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:25:40] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:25:40] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:25:40] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:25:41] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:25:42] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:25:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:25:44] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:25:44] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:25:44] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:25:44] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:25:44] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:25:44] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:25:44] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:25:44] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:25:44] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:25:44] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:25:44] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] + +Comparison between serial/sol_x1_y1_a1_b1.mtx and parallel/sol_x1_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b2.mtx and parallel/sol_x1_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b3.mtx and parallel/sol_x1_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b1.mtx and parallel/sol_x1_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b2.mtx and parallel/sol_x1_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b3.mtx and parallel/sol_x1_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b1.mtx and parallel/sol_x1_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b2.mtx and parallel/sol_x1_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b3.mtx and parallel/sol_x1_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b1.mtx and parallel/sol_x1_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b2.mtx and parallel/sol_x1_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b3.mtx and parallel/sol_x1_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b1.mtx and parallel/sol_x1_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b2.mtx and parallel/sol_x1_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b3.mtx and parallel/sol_x1_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b1.mtx and parallel/sol_x1_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b2.mtx and parallel/sol_x1_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b3.mtx and parallel/sol_x1_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b1.mtx and parallel/sol_x1_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b2.mtx and parallel/sol_x1_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b3.mtx and parallel/sol_x1_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b1.mtx and parallel/sol_x1_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b2.mtx and parallel/sol_x1_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b3.mtx and parallel/sol_x1_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b1.mtx and parallel/sol_x1_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b2.mtx and parallel/sol_x1_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b3.mtx and parallel/sol_x1_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b1.mtx and parallel/sol_x1_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b2.mtx and parallel/sol_x1_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b3.mtx and parallel/sol_x1_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b1.mtx and parallel/sol_x1_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b2.mtx and parallel/sol_x1_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b3.mtx and parallel/sol_x1_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b1.mtx and parallel/sol_x1_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b2.mtx and parallel/sol_x1_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b3.mtx and parallel/sol_x1_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b1.mtx and parallel/sol_x2_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b2.mtx and parallel/sol_x2_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b3.mtx and parallel/sol_x2_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b1.mtx and parallel/sol_x2_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b2.mtx and parallel/sol_x2_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b3.mtx and parallel/sol_x2_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b1.mtx and parallel/sol_x2_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b2.mtx and parallel/sol_x2_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b3.mtx and parallel/sol_x2_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b1.mtx and parallel/sol_x2_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b2.mtx and parallel/sol_x2_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b3.mtx and parallel/sol_x2_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b1.mtx and parallel/sol_x2_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b2.mtx and parallel/sol_x2_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b3.mtx and parallel/sol_x2_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b1.mtx and parallel/sol_x2_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b2.mtx and parallel/sol_x2_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b3.mtx and parallel/sol_x2_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b1.mtx and parallel/sol_x2_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b2.mtx and parallel/sol_x2_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b3.mtx and parallel/sol_x2_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b1.mtx and parallel/sol_x2_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b2.mtx and parallel/sol_x2_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b3.mtx and parallel/sol_x2_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b1.mtx and parallel/sol_x2_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b2.mtx and parallel/sol_x2_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b3.mtx and parallel/sol_x2_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b1.mtx and parallel/sol_x2_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b2.mtx and parallel/sol_x2_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b3.mtx and parallel/sol_x2_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b1.mtx and parallel/sol_x2_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b2.mtx and parallel/sol_x2_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b3.mtx and parallel/sol_x2_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b1.mtx and parallel/sol_x2_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b2.mtx and parallel/sol_x2_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b3.mtx and parallel/sol_x2_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b1.mtx and parallel/sol_x3_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b2.mtx and parallel/sol_x3_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b3.mtx and parallel/sol_x3_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b1.mtx and parallel/sol_x3_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b2.mtx and parallel/sol_x3_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b3.mtx and parallel/sol_x3_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b1.mtx and parallel/sol_x3_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b2.mtx and parallel/sol_x3_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b3.mtx and parallel/sol_x3_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b1.mtx and parallel/sol_x3_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b2.mtx and parallel/sol_x3_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b3.mtx and parallel/sol_x3_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b1.mtx and parallel/sol_x3_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b2.mtx and parallel/sol_x3_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b3.mtx and parallel/sol_x3_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b1.mtx and parallel/sol_x3_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b2.mtx and parallel/sol_x3_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b3.mtx and parallel/sol_x3_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b1.mtx and parallel/sol_x3_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b2.mtx and parallel/sol_x3_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b3.mtx and parallel/sol_x3_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b1.mtx and parallel/sol_x3_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b2.mtx and parallel/sol_x3_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b3.mtx and parallel/sol_x3_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b1.mtx and parallel/sol_x3_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b2.mtx and parallel/sol_x3_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b3.mtx and parallel/sol_x3_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b1.mtx and parallel/sol_x3_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b2.mtx and parallel/sol_x3_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b3.mtx and parallel/sol_x3_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b1.mtx and parallel/sol_x3_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b2.mtx and parallel/sol_x3_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b3.mtx and parallel/sol_x3_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b1.mtx and parallel/sol_x3_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b2.mtx and parallel/sol_x3_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b3.mtx and parallel/sol_x3_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b1.mtx and parallel/sol_x4_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b2.mtx and parallel/sol_x4_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b3.mtx and parallel/sol_x4_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b1.mtx and parallel/sol_x4_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b2.mtx and parallel/sol_x4_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b3.mtx and parallel/sol_x4_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b1.mtx and parallel/sol_x4_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b2.mtx and parallel/sol_x4_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b3.mtx and parallel/sol_x4_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b1.mtx and parallel/sol_x4_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b2.mtx and parallel/sol_x4_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b3.mtx and parallel/sol_x4_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b1.mtx and parallel/sol_x4_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b2.mtx and parallel/sol_x4_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b3.mtx and parallel/sol_x4_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b1.mtx and parallel/sol_x4_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b2.mtx and parallel/sol_x4_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b3.mtx and parallel/sol_x4_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b1.mtx and parallel/sol_x4_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b2.mtx and parallel/sol_x4_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b3.mtx and parallel/sol_x4_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b1.mtx and parallel/sol_x4_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b2.mtx and parallel/sol_x4_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b3.mtx and parallel/sol_x4_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b1.mtx and parallel/sol_x4_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b2.mtx and parallel/sol_x4_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b3.mtx and parallel/sol_x4_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b1.mtx and parallel/sol_x4_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b2.mtx and parallel/sol_x4_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b3.mtx and parallel/sol_x4_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b1.mtx and parallel/sol_x4_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b2.mtx and parallel/sol_x4_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b3.mtx and parallel/sol_x4_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b1.mtx and parallel/sol_x4_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b2.mtx and parallel/sol_x4_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b3.mtx and parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:25:48] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:25:48] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:26:02] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:26:03] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:26:04] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:26:05] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:26:05] Double precision check on file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:26:05] Double precision check on file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:26:05] Double precision check on file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:26:06] Double precision check on file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] + +Comparison between serial/sol_x1_y1_a1_b1.mtx and parallel/sol_x1_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b2.mtx and parallel/sol_x1_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b3.mtx and parallel/sol_x1_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b1.mtx and parallel/sol_x1_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b2.mtx and parallel/sol_x1_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b3.mtx and parallel/sol_x1_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b1.mtx and parallel/sol_x1_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b2.mtx and parallel/sol_x1_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b3.mtx and parallel/sol_x1_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b1.mtx and parallel/sol_x1_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b2.mtx and parallel/sol_x1_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b3.mtx and parallel/sol_x1_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b1.mtx and parallel/sol_x1_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b2.mtx and parallel/sol_x1_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b3.mtx and parallel/sol_x1_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b1.mtx and parallel/sol_x1_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b2.mtx and parallel/sol_x1_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b3.mtx and parallel/sol_x1_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b1.mtx and parallel/sol_x1_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b2.mtx and parallel/sol_x1_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b3.mtx and parallel/sol_x1_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b1.mtx and parallel/sol_x1_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b2.mtx and parallel/sol_x1_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b3.mtx and parallel/sol_x1_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b1.mtx and parallel/sol_x1_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b2.mtx and parallel/sol_x1_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b3.mtx and parallel/sol_x1_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b1.mtx and parallel/sol_x1_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b2.mtx and parallel/sol_x1_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b3.mtx and parallel/sol_x1_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b1.mtx and parallel/sol_x1_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b2.mtx and parallel/sol_x1_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b3.mtx and parallel/sol_x1_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b1.mtx and parallel/sol_x1_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b2.mtx and parallel/sol_x1_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b3.mtx and parallel/sol_x1_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b1.mtx and parallel/sol_x2_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b2.mtx and parallel/sol_x2_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b3.mtx and parallel/sol_x2_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b1.mtx and parallel/sol_x2_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b2.mtx and parallel/sol_x2_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b3.mtx and parallel/sol_x2_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b1.mtx and parallel/sol_x2_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b2.mtx and parallel/sol_x2_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b3.mtx and parallel/sol_x2_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b1.mtx and parallel/sol_x2_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b2.mtx and parallel/sol_x2_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b3.mtx and parallel/sol_x2_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b1.mtx and parallel/sol_x2_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b2.mtx and parallel/sol_x2_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b3.mtx and parallel/sol_x2_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b1.mtx and parallel/sol_x2_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b2.mtx and parallel/sol_x2_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b3.mtx and parallel/sol_x2_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b1.mtx and parallel/sol_x2_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b2.mtx and parallel/sol_x2_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b3.mtx and parallel/sol_x2_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b1.mtx and parallel/sol_x2_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b2.mtx and parallel/sol_x2_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b3.mtx and parallel/sol_x2_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b1.mtx and parallel/sol_x2_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b2.mtx and parallel/sol_x2_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b3.mtx and parallel/sol_x2_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b1.mtx and parallel/sol_x2_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b2.mtx and parallel/sol_x2_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b3.mtx and parallel/sol_x2_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b1.mtx and parallel/sol_x2_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b2.mtx and parallel/sol_x2_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b3.mtx and parallel/sol_x2_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b1.mtx and parallel/sol_x2_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b2.mtx and parallel/sol_x2_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b3.mtx and parallel/sol_x2_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b1.mtx and parallel/sol_x3_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b2.mtx and parallel/sol_x3_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b3.mtx and parallel/sol_x3_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b1.mtx and parallel/sol_x3_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b2.mtx and parallel/sol_x3_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b3.mtx and parallel/sol_x3_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b1.mtx and parallel/sol_x3_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b2.mtx and parallel/sol_x3_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b3.mtx and parallel/sol_x3_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b1.mtx and parallel/sol_x3_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b2.mtx and parallel/sol_x3_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b3.mtx and parallel/sol_x3_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b1.mtx and parallel/sol_x3_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b2.mtx and parallel/sol_x3_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b3.mtx and parallel/sol_x3_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b1.mtx and parallel/sol_x3_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b2.mtx and parallel/sol_x3_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b3.mtx and parallel/sol_x3_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b1.mtx and parallel/sol_x3_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b2.mtx and parallel/sol_x3_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b3.mtx and parallel/sol_x3_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b1.mtx and parallel/sol_x3_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b2.mtx and parallel/sol_x3_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b3.mtx and parallel/sol_x3_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b1.mtx and parallel/sol_x3_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b2.mtx and parallel/sol_x3_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b3.mtx and parallel/sol_x3_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b1.mtx and parallel/sol_x3_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b2.mtx and parallel/sol_x3_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b3.mtx and parallel/sol_x3_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b1.mtx and parallel/sol_x3_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b2.mtx and parallel/sol_x3_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b3.mtx and parallel/sol_x3_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b1.mtx and parallel/sol_x3_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b2.mtx and parallel/sol_x3_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b3.mtx and parallel/sol_x3_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b1.mtx and parallel/sol_x4_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b2.mtx and parallel/sol_x4_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b3.mtx and parallel/sol_x4_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b1.mtx and parallel/sol_x4_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b2.mtx and parallel/sol_x4_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b3.mtx and parallel/sol_x4_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b1.mtx and parallel/sol_x4_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b2.mtx and parallel/sol_x4_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b3.mtx and parallel/sol_x4_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b1.mtx and parallel/sol_x4_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b2.mtx and parallel/sol_x4_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b3.mtx and parallel/sol_x4_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b1.mtx and parallel/sol_x4_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b2.mtx and parallel/sol_x4_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b3.mtx and parallel/sol_x4_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b1.mtx and parallel/sol_x4_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b2.mtx and parallel/sol_x4_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b3.mtx and parallel/sol_x4_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b1.mtx and parallel/sol_x4_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b2.mtx and parallel/sol_x4_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b3.mtx and parallel/sol_x4_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b1.mtx and parallel/sol_x4_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b2.mtx and parallel/sol_x4_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b3.mtx and parallel/sol_x4_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b1.mtx and parallel/sol_x4_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b2.mtx and parallel/sol_x4_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b3.mtx and parallel/sol_x4_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b1.mtx and parallel/sol_x4_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b2.mtx and parallel/sol_x4_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b3.mtx and parallel/sol_x4_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b1.mtx and parallel/sol_x4_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b2.mtx and parallel/sol_x4_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b3.mtx and parallel/sol_x4_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b1.mtx and parallel/sol_x4_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b2.mtx and parallel/sol_x4_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b3.mtx and parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:47] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:25:48] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:48] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:48] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:49] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:25:49] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +Comparison between serial/sol_x1_y1_a1_b1.mtx and parallel/sol_x1_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b2.mtx and parallel/sol_x1_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b3.mtx and parallel/sol_x1_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b1.mtx and parallel/sol_x1_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b2.mtx and parallel/sol_x1_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b3.mtx and parallel/sol_x1_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b1.mtx and parallel/sol_x1_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b2.mtx and parallel/sol_x1_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b3.mtx and parallel/sol_x1_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b1.mtx and parallel/sol_x1_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b2.mtx and parallel/sol_x1_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b3.mtx and parallel/sol_x1_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b1.mtx and parallel/sol_x1_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b2.mtx and parallel/sol_x1_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b3.mtx and parallel/sol_x1_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b1.mtx and parallel/sol_x1_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b2.mtx and parallel/sol_x1_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b3.mtx and parallel/sol_x1_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b1.mtx and parallel/sol_x1_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b2.mtx and parallel/sol_x1_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b3.mtx and parallel/sol_x1_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b1.mtx and parallel/sol_x1_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b2.mtx and parallel/sol_x1_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b3.mtx and parallel/sol_x1_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b1.mtx and parallel/sol_x1_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b2.mtx and parallel/sol_x1_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b3.mtx and parallel/sol_x1_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b1.mtx and parallel/sol_x1_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b2.mtx and parallel/sol_x1_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b3.mtx and parallel/sol_x1_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b1.mtx and parallel/sol_x1_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b2.mtx and parallel/sol_x1_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b3.mtx and parallel/sol_x1_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b1.mtx and parallel/sol_x1_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b2.mtx and parallel/sol_x1_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b3.mtx and parallel/sol_x1_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b1.mtx and parallel/sol_x2_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b2.mtx and parallel/sol_x2_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b3.mtx and parallel/sol_x2_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b1.mtx and parallel/sol_x2_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b2.mtx and parallel/sol_x2_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b3.mtx and parallel/sol_x2_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b1.mtx and parallel/sol_x2_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b2.mtx and parallel/sol_x2_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b3.mtx and parallel/sol_x2_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b1.mtx and parallel/sol_x2_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b2.mtx and parallel/sol_x2_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b3.mtx and parallel/sol_x2_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b1.mtx and parallel/sol_x2_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b2.mtx and parallel/sol_x2_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b3.mtx and parallel/sol_x2_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b1.mtx and parallel/sol_x2_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b2.mtx and parallel/sol_x2_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b3.mtx and parallel/sol_x2_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b1.mtx and parallel/sol_x2_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b2.mtx and parallel/sol_x2_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b3.mtx and parallel/sol_x2_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b1.mtx and parallel/sol_x2_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b2.mtx and parallel/sol_x2_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b3.mtx and parallel/sol_x2_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b1.mtx and parallel/sol_x2_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b2.mtx and parallel/sol_x2_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b3.mtx and parallel/sol_x2_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b1.mtx and parallel/sol_x2_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b2.mtx and parallel/sol_x2_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b3.mtx and parallel/sol_x2_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b1.mtx and parallel/sol_x2_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b2.mtx and parallel/sol_x2_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b3.mtx and parallel/sol_x2_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b1.mtx and parallel/sol_x2_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b2.mtx and parallel/sol_x2_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b3.mtx and parallel/sol_x2_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b1.mtx and parallel/sol_x3_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b2.mtx and parallel/sol_x3_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b3.mtx and parallel/sol_x3_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b1.mtx and parallel/sol_x3_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b2.mtx and parallel/sol_x3_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b3.mtx and parallel/sol_x3_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b1.mtx and parallel/sol_x3_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b2.mtx and parallel/sol_x3_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b3.mtx and parallel/sol_x3_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b1.mtx and parallel/sol_x3_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b2.mtx and parallel/sol_x3_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b3.mtx and parallel/sol_x3_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b1.mtx and parallel/sol_x3_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b2.mtx and parallel/sol_x3_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b3.mtx and parallel/sol_x3_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b1.mtx and parallel/sol_x3_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b2.mtx and parallel/sol_x3_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b3.mtx and parallel/sol_x3_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b1.mtx and parallel/sol_x3_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b2.mtx and parallel/sol_x3_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b3.mtx and parallel/sol_x3_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b1.mtx and parallel/sol_x3_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b2.mtx and parallel/sol_x3_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b3.mtx and parallel/sol_x3_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b1.mtx and parallel/sol_x3_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b2.mtx and parallel/sol_x3_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b3.mtx and parallel/sol_x3_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b1.mtx and parallel/sol_x3_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b2.mtx and parallel/sol_x3_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b3.mtx and parallel/sol_x3_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b1.mtx and parallel/sol_x3_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b2.mtx and parallel/sol_x3_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b3.mtx and parallel/sol_x3_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b1.mtx and parallel/sol_x3_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b2.mtx and parallel/sol_x3_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b3.mtx and parallel/sol_x3_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b1.mtx and parallel/sol_x4_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b2.mtx and parallel/sol_x4_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b3.mtx and parallel/sol_x4_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b1.mtx and parallel/sol_x4_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b2.mtx and parallel/sol_x4_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b3.mtx and parallel/sol_x4_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b1.mtx and parallel/sol_x4_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b2.mtx and parallel/sol_x4_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b3.mtx and parallel/sol_x4_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b1.mtx and parallel/sol_x4_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b2.mtx and parallel/sol_x4_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b3.mtx and parallel/sol_x4_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b1.mtx and parallel/sol_x4_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b2.mtx and parallel/sol_x4_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b3.mtx and parallel/sol_x4_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b1.mtx and parallel/sol_x4_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b2.mtx and parallel/sol_x4_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b3.mtx and parallel/sol_x4_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b1.mtx and parallel/sol_x4_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b2.mtx and parallel/sol_x4_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b3.mtx and parallel/sol_x4_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b1.mtx and parallel/sol_x4_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b2.mtx and parallel/sol_x4_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b3.mtx and parallel/sol_x4_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b1.mtx and parallel/sol_x4_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b2.mtx and parallel/sol_x4_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b3.mtx and parallel/sol_x4_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b1.mtx and parallel/sol_x4_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b2.mtx and parallel/sol_x4_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b3.mtx and parallel/sol_x4_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b1.mtx and parallel/sol_x4_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b2.mtx and parallel/sol_x4_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b3.mtx and parallel/sol_x4_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b1.mtx and parallel/sol_x4_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b2.mtx and parallel/sol_x4_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b3.mtx and parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:26:23] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:26:24] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:26:25] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:26:26] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:26:26] Double precision check on file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:26:27] Double precision check on file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:26:28] Double precision check on file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:26:29] Double precision check on file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:26:30] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:26:31] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:26:32] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:26:33] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:26:34] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:26:35] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:26:36] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:26:37] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:26:38] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:26:39] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:26:39] Double precision check on file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:26:40] Double precision check on file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:26:41] Double precision check on file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:26:42] Double precision check on file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:26:43] Double precision check on file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:26:44] Double precision check on file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:26:45] Double precision check on file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:26:46] Double precision check on file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +Comparison between serial/sol_x1_y1_a1_b1.mtx and parallel/sol_x1_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b2.mtx and parallel/sol_x1_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b3.mtx and parallel/sol_x1_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b1.mtx and parallel/sol_x1_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b2.mtx and parallel/sol_x1_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b3.mtx and parallel/sol_x1_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b1.mtx and parallel/sol_x1_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b2.mtx and parallel/sol_x1_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b3.mtx and parallel/sol_x1_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b1.mtx and parallel/sol_x1_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b2.mtx and parallel/sol_x1_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b3.mtx and parallel/sol_x1_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b1.mtx and parallel/sol_x1_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b2.mtx and parallel/sol_x1_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b3.mtx and parallel/sol_x1_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b1.mtx and parallel/sol_x1_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b2.mtx and parallel/sol_x1_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b3.mtx and parallel/sol_x1_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b1.mtx and parallel/sol_x1_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b2.mtx and parallel/sol_x1_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b3.mtx and parallel/sol_x1_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b1.mtx and parallel/sol_x1_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b2.mtx and parallel/sol_x1_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b3.mtx and parallel/sol_x1_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b1.mtx and parallel/sol_x1_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b2.mtx and parallel/sol_x1_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b3.mtx and parallel/sol_x1_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b1.mtx and parallel/sol_x1_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b2.mtx and parallel/sol_x1_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b3.mtx and parallel/sol_x1_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b1.mtx and parallel/sol_x1_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b2.mtx and parallel/sol_x1_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b3.mtx and parallel/sol_x1_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b1.mtx and parallel/sol_x1_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b2.mtx and parallel/sol_x1_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b3.mtx and parallel/sol_x1_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b1.mtx and parallel/sol_x2_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b2.mtx and parallel/sol_x2_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b3.mtx and parallel/sol_x2_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b1.mtx and parallel/sol_x2_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b2.mtx and parallel/sol_x2_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b3.mtx and parallel/sol_x2_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b1.mtx and parallel/sol_x2_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b2.mtx and parallel/sol_x2_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b3.mtx and parallel/sol_x2_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b1.mtx and parallel/sol_x2_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b2.mtx and parallel/sol_x2_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b3.mtx and parallel/sol_x2_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b1.mtx and parallel/sol_x2_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b2.mtx and parallel/sol_x2_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b3.mtx and parallel/sol_x2_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b1.mtx and parallel/sol_x2_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b2.mtx and parallel/sol_x2_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b3.mtx and parallel/sol_x2_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b1.mtx and parallel/sol_x2_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b2.mtx and parallel/sol_x2_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b3.mtx and parallel/sol_x2_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b1.mtx and parallel/sol_x2_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b2.mtx and parallel/sol_x2_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b3.mtx and parallel/sol_x2_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b1.mtx and parallel/sol_x2_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b2.mtx and parallel/sol_x2_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b3.mtx and parallel/sol_x2_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b1.mtx and parallel/sol_x2_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b2.mtx and parallel/sol_x2_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b3.mtx and parallel/sol_x2_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b1.mtx and parallel/sol_x2_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b2.mtx and parallel/sol_x2_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b3.mtx and parallel/sol_x2_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b1.mtx and parallel/sol_x2_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b2.mtx and parallel/sol_x2_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b3.mtx and parallel/sol_x2_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b1.mtx and parallel/sol_x3_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b2.mtx and parallel/sol_x3_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b3.mtx and parallel/sol_x3_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b1.mtx and parallel/sol_x3_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b2.mtx and parallel/sol_x3_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b3.mtx and parallel/sol_x3_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b1.mtx and parallel/sol_x3_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b2.mtx and parallel/sol_x3_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b3.mtx and parallel/sol_x3_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b1.mtx and parallel/sol_x3_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b2.mtx and parallel/sol_x3_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b3.mtx and parallel/sol_x3_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b1.mtx and parallel/sol_x3_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b2.mtx and parallel/sol_x3_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b3.mtx and parallel/sol_x3_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b1.mtx and parallel/sol_x3_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b2.mtx and parallel/sol_x3_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b3.mtx and parallel/sol_x3_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b1.mtx and parallel/sol_x3_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b2.mtx and parallel/sol_x3_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b3.mtx and parallel/sol_x3_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b1.mtx and parallel/sol_x3_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b2.mtx and parallel/sol_x3_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b3.mtx and parallel/sol_x3_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b1.mtx and parallel/sol_x3_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b2.mtx and parallel/sol_x3_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b3.mtx and parallel/sol_x3_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b1.mtx and parallel/sol_x3_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b2.mtx and parallel/sol_x3_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b3.mtx and parallel/sol_x3_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b1.mtx and parallel/sol_x3_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b2.mtx and parallel/sol_x3_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b3.mtx and parallel/sol_x3_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b1.mtx and parallel/sol_x3_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b2.mtx and parallel/sol_x3_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b3.mtx and parallel/sol_x3_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b1.mtx and parallel/sol_x4_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b2.mtx and parallel/sol_x4_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b3.mtx and parallel/sol_x4_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b1.mtx and parallel/sol_x4_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b2.mtx and parallel/sol_x4_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b3.mtx and parallel/sol_x4_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b1.mtx and parallel/sol_x4_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b2.mtx and parallel/sol_x4_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b3.mtx and parallel/sol_x4_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b1.mtx and parallel/sol_x4_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b2.mtx and parallel/sol_x4_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b3.mtx and parallel/sol_x4_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b1.mtx and parallel/sol_x4_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b2.mtx and parallel/sol_x4_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b3.mtx and parallel/sol_x4_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b1.mtx and parallel/sol_x4_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b2.mtx and parallel/sol_x4_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b3.mtx and parallel/sol_x4_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b1.mtx and parallel/sol_x4_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b2.mtx and parallel/sol_x4_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b3.mtx and parallel/sol_x4_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b1.mtx and parallel/sol_x4_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b2.mtx and parallel/sol_x4_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b3.mtx and parallel/sol_x4_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b1.mtx and parallel/sol_x4_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b2.mtx and parallel/sol_x4_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b3.mtx and parallel/sol_x4_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b1.mtx and parallel/sol_x4_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b2.mtx and parallel/sol_x4_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b3.mtx and parallel/sol_x4_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b1.mtx and parallel/sol_x4_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b2.mtx and parallel/sol_x4_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b3.mtx and parallel/sol_x4_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b1.mtx and parallel/sol_x4_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b2.mtx and parallel/sol_x4_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b3.mtx and parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:35:32] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:35:32] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:36:52] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:36:52] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:36:52] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:36:52] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:36:52] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:36:53] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:36:54] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:36:55] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:36:56] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:36:56] Double precision check on file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:36:57] Double precision check on file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:36:58] Double precision check on file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:36:59] Double precision check on file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:36:59] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:36:59] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:36:59] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:36:59] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:36:59] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:37:00] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:37:01] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:37:02] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:37:03] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:37:03] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:37:03] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:37:03] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:37:03] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:37:03] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:37:03] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:37:03] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:37:03] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:37:03] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:37:04] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:37:05] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:37:06] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:37:07] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:37:08] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:37:09] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:37:09] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:37:09] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:37:09] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:37:09] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:37:09] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:37:09] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:37:09] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:37:09] Double precision check on file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:37:09] Double precision check on file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:37:09] Double precision check on file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:37:09] Double precision check on file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:37:09] Double precision check on file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:37:09] Double precision check on file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:37:09] Double precision check on file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:37:09] Double precision check on file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:37:09] Double precision check on file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:37:09] Double precision check on file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:37:09] Double precision check on file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:37:10] Double precision check on file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:37:11] Double precision check on file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:37:12] Double precision check on file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:37:13] Double precision check on file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:37:14] Double precision check on file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:37:15] Double precision check on file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +Comparison between serial/sol_x1_y1_a1_b1.mtx and parallel/sol_x1_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b2.mtx and parallel/sol_x1_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b3.mtx and parallel/sol_x1_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b1.mtx and parallel/sol_x1_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b2.mtx and parallel/sol_x1_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b3.mtx and parallel/sol_x1_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b1.mtx and parallel/sol_x1_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b2.mtx and parallel/sol_x1_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b3.mtx and parallel/sol_x1_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b1.mtx and parallel/sol_x1_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b2.mtx and parallel/sol_x1_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b3.mtx and parallel/sol_x1_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b1.mtx and parallel/sol_x1_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b2.mtx and parallel/sol_x1_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b3.mtx and parallel/sol_x1_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b1.mtx and parallel/sol_x1_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b2.mtx and parallel/sol_x1_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b3.mtx and parallel/sol_x1_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b1.mtx and parallel/sol_x1_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b2.mtx and parallel/sol_x1_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b3.mtx and parallel/sol_x1_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b1.mtx and parallel/sol_x1_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b2.mtx and parallel/sol_x1_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b3.mtx and parallel/sol_x1_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b1.mtx and parallel/sol_x1_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b2.mtx and parallel/sol_x1_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b3.mtx and parallel/sol_x1_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b1.mtx and parallel/sol_x1_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b2.mtx and parallel/sol_x1_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b3.mtx and parallel/sol_x1_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b1.mtx and parallel/sol_x1_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b2.mtx and parallel/sol_x1_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b3.mtx and parallel/sol_x1_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b1.mtx and parallel/sol_x1_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b2.mtx and parallel/sol_x1_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b3.mtx and parallel/sol_x1_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b1.mtx and parallel/sol_x2_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b2.mtx and parallel/sol_x2_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b3.mtx and parallel/sol_x2_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b1.mtx and parallel/sol_x2_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b2.mtx and parallel/sol_x2_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b3.mtx and parallel/sol_x2_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b1.mtx and parallel/sol_x2_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b2.mtx and parallel/sol_x2_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b3.mtx and parallel/sol_x2_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b1.mtx and parallel/sol_x2_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b2.mtx and parallel/sol_x2_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b3.mtx and parallel/sol_x2_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b1.mtx and parallel/sol_x2_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b2.mtx and parallel/sol_x2_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b3.mtx and parallel/sol_x2_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b1.mtx and parallel/sol_x2_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b2.mtx and parallel/sol_x2_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b3.mtx and parallel/sol_x2_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b1.mtx and parallel/sol_x2_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b2.mtx and parallel/sol_x2_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b3.mtx and parallel/sol_x2_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b1.mtx and parallel/sol_x2_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b2.mtx and parallel/sol_x2_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b3.mtx and parallel/sol_x2_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b1.mtx and parallel/sol_x2_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b2.mtx and parallel/sol_x2_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b3.mtx and parallel/sol_x2_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b1.mtx and parallel/sol_x2_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b2.mtx and parallel/sol_x2_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b3.mtx and parallel/sol_x2_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b1.mtx and parallel/sol_x2_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b2.mtx and parallel/sol_x2_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b3.mtx and parallel/sol_x2_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b1.mtx and parallel/sol_x2_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b2.mtx and parallel/sol_x2_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b3.mtx and parallel/sol_x2_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b1.mtx and parallel/sol_x3_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b2.mtx and parallel/sol_x3_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b3.mtx and parallel/sol_x3_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b1.mtx and parallel/sol_x3_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b2.mtx and parallel/sol_x3_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b3.mtx and parallel/sol_x3_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b1.mtx and parallel/sol_x3_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b2.mtx and parallel/sol_x3_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b3.mtx and parallel/sol_x3_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b1.mtx and parallel/sol_x3_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b2.mtx and parallel/sol_x3_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b3.mtx and parallel/sol_x3_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b1.mtx and parallel/sol_x3_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b2.mtx and parallel/sol_x3_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b3.mtx and parallel/sol_x3_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b1.mtx and parallel/sol_x3_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b2.mtx and parallel/sol_x3_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b3.mtx and parallel/sol_x3_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b1.mtx and parallel/sol_x3_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b2.mtx and parallel/sol_x3_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b3.mtx and parallel/sol_x3_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b1.mtx and parallel/sol_x3_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b2.mtx and parallel/sol_x3_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b3.mtx and parallel/sol_x3_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b1.mtx and parallel/sol_x3_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b2.mtx and parallel/sol_x3_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b3.mtx and parallel/sol_x3_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b1.mtx and parallel/sol_x3_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b2.mtx and parallel/sol_x3_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b3.mtx and parallel/sol_x3_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b1.mtx and parallel/sol_x3_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b2.mtx and parallel/sol_x3_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b3.mtx and parallel/sol_x3_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b1.mtx and parallel/sol_x3_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b2.mtx and parallel/sol_x3_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b3.mtx and parallel/sol_x3_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b1.mtx and parallel/sol_x4_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b2.mtx and parallel/sol_x4_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b3.mtx and parallel/sol_x4_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b1.mtx and parallel/sol_x4_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b2.mtx and parallel/sol_x4_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b3.mtx and parallel/sol_x4_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b1.mtx and parallel/sol_x4_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b2.mtx and parallel/sol_x4_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b3.mtx and parallel/sol_x4_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b1.mtx and parallel/sol_x4_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b2.mtx and parallel/sol_x4_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b3.mtx and parallel/sol_x4_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b1.mtx and parallel/sol_x4_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b2.mtx and parallel/sol_x4_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b3.mtx and parallel/sol_x4_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b1.mtx and parallel/sol_x4_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b2.mtx and parallel/sol_x4_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b3.mtx and parallel/sol_x4_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b1.mtx and parallel/sol_x4_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b2.mtx and parallel/sol_x4_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b3.mtx and parallel/sol_x4_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b1.mtx and parallel/sol_x4_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b2.mtx and parallel/sol_x4_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b3.mtx and parallel/sol_x4_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b1.mtx and parallel/sol_x4_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b2.mtx and parallel/sol_x4_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b3.mtx and parallel/sol_x4_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b1.mtx and parallel/sol_x4_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b2.mtx and parallel/sol_x4_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b3.mtx and parallel/sol_x4_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b1.mtx and parallel/sol_x4_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b2.mtx and parallel/sol_x4_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b3.mtx and parallel/sol_x4_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b1.mtx and parallel/sol_x4_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b2.mtx and parallel/sol_x4_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b3.mtx and parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:35:32] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:35:32] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:37:18] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:37:32] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:37:33] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:37:34] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:37:35] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:37:36] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:37:36] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:37:36] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:37:36] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:37:36] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:37:36] Double precision check on file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:37:37] Double precision check on file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:37:38] Double precision check on file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:37:39] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:37:39] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:37:39] Generation geaxpby single precision result file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:37:39] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:37:39] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:37:39] Generation geaxpby single precision result file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:37:39] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:37:39] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:37:40] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:37:41] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:37:42] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:37:43] Generation geaxpby single precision result file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:37:44] Generation geaxpby single precision result file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:37:45] Generation geaxpby single precision result file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:37:46] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:37:47] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:37:48] Generation geaxpby single precision result file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2025-06-12 13:37:48] Double precision check on file parallel/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2025-06-12 13:37:48] Double precision check on file parallel/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2025-06-12 13:37:48] Double precision check on file parallel/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2025-06-12 13:37:49] Double precision check on file parallel/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2025-06-12 13:37:50] Double precision check on file parallel/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2025-06-12 13:37:51] Double precision check on file parallel/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2025-06-12 13:37:52] Double precision check on file parallel/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2025-06-12 13:37:53] Double precision check on file parallel/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2025-06-12 13:37:54] Double precision check on file parallel/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2025-06-12 13:37:55] Double precision check on file parallel/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2025-06-12 13:37:55] Double precision check on file parallel/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2025-06-12 13:37:55] Double precision check on file parallel/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2025-06-12 13:37:55] Double precision check on file parallel/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2025-06-12 13:37:55] Double precision check on file parallel/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2025-06-12 13:37:55] Double precision check on file parallel/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2025-06-12 13:37:55] Double precision check on file parallel/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2025-06-12 13:37:55] Double precision check on file parallel/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2025-06-12 13:37:55] Double precision check on file parallel/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2025-06-12 13:37:55] Double precision check on file parallel/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +Comparison between serial/sol_x1_y1_a1_b1.mtx and parallel/sol_x1_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b2.mtx and parallel/sol_x1_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a1_b3.mtx and parallel/sol_x1_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b1.mtx and parallel/sol_x1_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b2.mtx and parallel/sol_x1_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a2_b3.mtx and parallel/sol_x1_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b1.mtx and parallel/sol_x1_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b2.mtx and parallel/sol_x1_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y1_a3_b3.mtx and parallel/sol_x1_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b1.mtx and parallel/sol_x1_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b2.mtx and parallel/sol_x1_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a1_b3.mtx and parallel/sol_x1_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b1.mtx and parallel/sol_x1_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b2.mtx and parallel/sol_x1_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a2_b3.mtx and parallel/sol_x1_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b1.mtx and parallel/sol_x1_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b2.mtx and parallel/sol_x1_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y2_a3_b3.mtx and parallel/sol_x1_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b1.mtx and parallel/sol_x1_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b2.mtx and parallel/sol_x1_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a1_b3.mtx and parallel/sol_x1_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b1.mtx and parallel/sol_x1_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b2.mtx and parallel/sol_x1_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a2_b3.mtx and parallel/sol_x1_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b1.mtx and parallel/sol_x1_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b2.mtx and parallel/sol_x1_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y3_a3_b3.mtx and parallel/sol_x1_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b1.mtx and parallel/sol_x1_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b2.mtx and parallel/sol_x1_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a1_b3.mtx and parallel/sol_x1_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b1.mtx and parallel/sol_x1_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b2.mtx and parallel/sol_x1_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a2_b3.mtx and parallel/sol_x1_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b1.mtx and parallel/sol_x1_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b2.mtx and parallel/sol_x1_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x1_y4_a3_b3.mtx and parallel/sol_x1_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b1.mtx and parallel/sol_x2_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b2.mtx and parallel/sol_x2_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a1_b3.mtx and parallel/sol_x2_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b1.mtx and parallel/sol_x2_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b2.mtx and parallel/sol_x2_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a2_b3.mtx and parallel/sol_x2_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b1.mtx and parallel/sol_x2_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b2.mtx and parallel/sol_x2_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y1_a3_b3.mtx and parallel/sol_x2_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b1.mtx and parallel/sol_x2_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b2.mtx and parallel/sol_x2_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a1_b3.mtx and parallel/sol_x2_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b1.mtx and parallel/sol_x2_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b2.mtx and parallel/sol_x2_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a2_b3.mtx and parallel/sol_x2_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b1.mtx and parallel/sol_x2_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b2.mtx and parallel/sol_x2_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y2_a3_b3.mtx and parallel/sol_x2_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b1.mtx and parallel/sol_x2_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b2.mtx and parallel/sol_x2_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a1_b3.mtx and parallel/sol_x2_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b1.mtx and parallel/sol_x2_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b2.mtx and parallel/sol_x2_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a2_b3.mtx and parallel/sol_x2_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b1.mtx and parallel/sol_x2_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b2.mtx and parallel/sol_x2_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y3_a3_b3.mtx and parallel/sol_x2_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b1.mtx and parallel/sol_x2_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b2.mtx and parallel/sol_x2_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a1_b3.mtx and parallel/sol_x2_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b1.mtx and parallel/sol_x2_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b2.mtx and parallel/sol_x2_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a2_b3.mtx and parallel/sol_x2_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b1.mtx and parallel/sol_x2_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b2.mtx and parallel/sol_x2_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x2_y4_a3_b3.mtx and parallel/sol_x2_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b1.mtx and parallel/sol_x3_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b2.mtx and parallel/sol_x3_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a1_b3.mtx and parallel/sol_x3_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b1.mtx and parallel/sol_x3_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b2.mtx and parallel/sol_x3_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a2_b3.mtx and parallel/sol_x3_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b1.mtx and parallel/sol_x3_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b2.mtx and parallel/sol_x3_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y1_a3_b3.mtx and parallel/sol_x3_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b1.mtx and parallel/sol_x3_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b2.mtx and parallel/sol_x3_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a1_b3.mtx and parallel/sol_x3_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b1.mtx and parallel/sol_x3_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b2.mtx and parallel/sol_x3_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a2_b3.mtx and parallel/sol_x3_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b1.mtx and parallel/sol_x3_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b2.mtx and parallel/sol_x3_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y2_a3_b3.mtx and parallel/sol_x3_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b1.mtx and parallel/sol_x3_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b2.mtx and parallel/sol_x3_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a1_b3.mtx and parallel/sol_x3_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b1.mtx and parallel/sol_x3_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b2.mtx and parallel/sol_x3_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a2_b3.mtx and parallel/sol_x3_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b1.mtx and parallel/sol_x3_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b2.mtx and parallel/sol_x3_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y3_a3_b3.mtx and parallel/sol_x3_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b1.mtx and parallel/sol_x3_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b2.mtx and parallel/sol_x3_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a1_b3.mtx and parallel/sol_x3_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b1.mtx and parallel/sol_x3_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b2.mtx and parallel/sol_x3_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a2_b3.mtx and parallel/sol_x3_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b1.mtx and parallel/sol_x3_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b2.mtx and parallel/sol_x3_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x3_y4_a3_b3.mtx and parallel/sol_x3_y4_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b1.mtx and parallel/sol_x4_y1_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b2.mtx and parallel/sol_x4_y1_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a1_b3.mtx and parallel/sol_x4_y1_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b1.mtx and parallel/sol_x4_y1_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b2.mtx and parallel/sol_x4_y1_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a2_b3.mtx and parallel/sol_x4_y1_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b1.mtx and parallel/sol_x4_y1_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b2.mtx and parallel/sol_x4_y1_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y1_a3_b3.mtx and parallel/sol_x4_y1_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b1.mtx and parallel/sol_x4_y2_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b2.mtx and parallel/sol_x4_y2_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a1_b3.mtx and parallel/sol_x4_y2_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b1.mtx and parallel/sol_x4_y2_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b2.mtx and parallel/sol_x4_y2_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a2_b3.mtx and parallel/sol_x4_y2_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b1.mtx and parallel/sol_x4_y2_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b2.mtx and parallel/sol_x4_y2_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y2_a3_b3.mtx and parallel/sol_x4_y2_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b1.mtx and parallel/sol_x4_y3_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b2.mtx and parallel/sol_x4_y3_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a1_b3.mtx and parallel/sol_x4_y3_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b1.mtx and parallel/sol_x4_y3_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b2.mtx and parallel/sol_x4_y3_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a2_b3.mtx and parallel/sol_x4_y3_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b1.mtx and parallel/sol_x4_y3_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b2.mtx and parallel/sol_x4_y3_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y3_a3_b3.mtx and parallel/sol_x4_y3_a3_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b1.mtx and parallel/sol_x4_y4_a1_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b2.mtx and parallel/sol_x4_y4_a1_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a1_b3.mtx and parallel/sol_x4_y4_a1_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b1.mtx and parallel/sol_x4_y4_a2_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b2.mtx and parallel/sol_x4_y4_a2_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a2_b3.mtx and parallel/sol_x4_y4_a2_b3.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b1.mtx and parallel/sol_x4_y4_a3_b1.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b2.mtx and parallel/sol_x4_y4_a3_b2.mtx: 0 differences +Comparison between serial/sol_x4_y4_a3_b3.mtx and parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:35:32] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:35:32] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:37:18] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:37:56] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:37:56] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:37:56] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + +Welcome to PSBLAS version: 3.9.1 +This is the psb_geaxpby_test sample program +Number of processes used in this computation: 1 + +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2026-03-23 10:37:01] Generation geaxpby single precision result file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2026-03-23 10:37:02] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2026-03-23 10:37:03] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2026-03-23 10:37:04] Generation geaxpby single precision result file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] + +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y1_a1_b1.mtx 1/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y1_a1_b2.mtx 2/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y1_a1_b3.mtx 3/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y1_a2_b1.mtx 4/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y1_a2_b2.mtx 5/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y1_a2_b3.mtx 6/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y1_a3_b1.mtx 7/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y1_a3_b2.mtx 8/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y1_a3_b3.mtx 9/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y2_a1_b1.mtx 10/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y2_a1_b2.mtx 11/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y2_a1_b3.mtx 12/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y2_a2_b1.mtx 13/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y2_a2_b2.mtx 14/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y2_a2_b3.mtx 15/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y2_a3_b1.mtx 16/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y2_a3_b2.mtx 17/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y2_a3_b3.mtx 18/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y3_a1_b1.mtx 19/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y3_a1_b2.mtx 20/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y3_a1_b3.mtx 21/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y3_a2_b1.mtx 22/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y3_a2_b2.mtx 23/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y3_a2_b3.mtx 24/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y3_a3_b1.mtx 25/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y3_a3_b2.mtx 26/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y3_a3_b3.mtx 27/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y4_a1_b1.mtx 28/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y4_a1_b2.mtx 29/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y4_a1_b3.mtx 30/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y4_a2_b1.mtx 31/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y4_a2_b2.mtx 32/144 [OK] +[2026-03-23 10:37:04] Double precision check on file serial/sol_x1_y4_a2_b3.mtx 33/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x1_y4_a3_b1.mtx 34/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x1_y4_a3_b2.mtx 35/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x1_y4_a3_b3.mtx 36/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y1_a1_b1.mtx 37/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y1_a1_b2.mtx 38/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y1_a1_b3.mtx 39/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y1_a2_b1.mtx 40/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y1_a2_b2.mtx 41/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y1_a2_b3.mtx 42/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y1_a3_b1.mtx 43/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y1_a3_b2.mtx 44/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y1_a3_b3.mtx 45/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y2_a1_b1.mtx 46/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y2_a1_b2.mtx 47/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y2_a1_b3.mtx 48/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y2_a2_b1.mtx 49/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y2_a2_b2.mtx 50/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y2_a2_b3.mtx 51/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y2_a3_b1.mtx 52/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y2_a3_b2.mtx 53/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y2_a3_b3.mtx 54/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y3_a1_b1.mtx 55/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y3_a1_b2.mtx 56/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y3_a1_b3.mtx 57/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y3_a2_b1.mtx 58/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y3_a2_b2.mtx 59/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y3_a2_b3.mtx 60/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y3_a3_b1.mtx 61/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y3_a3_b2.mtx 62/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y3_a3_b3.mtx 63/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y4_a1_b1.mtx 64/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y4_a1_b2.mtx 65/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y4_a1_b3.mtx 66/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y4_a2_b1.mtx 67/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y4_a2_b2.mtx 68/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y4_a2_b3.mtx 69/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y4_a3_b1.mtx 70/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y4_a3_b2.mtx 71/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x2_y4_a3_b3.mtx 72/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x3_y1_a1_b1.mtx 73/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x3_y1_a1_b2.mtx 74/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x3_y1_a1_b3.mtx 75/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x3_y1_a2_b1.mtx 76/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x3_y1_a2_b2.mtx 77/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x3_y1_a2_b3.mtx 78/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x3_y1_a3_b1.mtx 79/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x3_y1_a3_b2.mtx 80/144 [OK] +[2026-03-23 10:37:05] Double precision check on file serial/sol_x3_y1_a3_b3.mtx 81/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y2_a1_b1.mtx 82/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y2_a1_b2.mtx 83/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y2_a1_b3.mtx 84/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y2_a2_b1.mtx 85/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y2_a2_b2.mtx 86/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y2_a2_b3.mtx 87/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y2_a3_b1.mtx 88/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y2_a3_b2.mtx 89/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y2_a3_b3.mtx 90/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y3_a1_b1.mtx 91/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y3_a1_b2.mtx 92/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y3_a1_b3.mtx 93/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y3_a2_b1.mtx 94/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y3_a2_b2.mtx 95/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y3_a2_b3.mtx 96/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y3_a3_b1.mtx 97/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y3_a3_b2.mtx 98/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y3_a3_b3.mtx 99/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y4_a1_b1.mtx 100/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y4_a1_b2.mtx 101/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y4_a1_b3.mtx 102/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y4_a2_b1.mtx 103/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y4_a2_b2.mtx 104/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y4_a2_b3.mtx 105/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y4_a3_b1.mtx 106/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y4_a3_b2.mtx 107/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x3_y4_a3_b3.mtx 108/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y1_a1_b1.mtx 109/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y1_a1_b2.mtx 110/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y1_a1_b3.mtx 111/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y1_a2_b1.mtx 112/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y1_a2_b2.mtx 113/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y1_a2_b3.mtx 114/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y1_a3_b1.mtx 115/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y1_a3_b2.mtx 116/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y1_a3_b3.mtx 117/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y2_a1_b1.mtx 118/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y2_a1_b2.mtx 119/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y2_a1_b3.mtx 120/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y2_a2_b1.mtx 121/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y2_a2_b2.mtx 122/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y2_a2_b3.mtx 123/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y2_a3_b1.mtx 124/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y2_a3_b2.mtx 125/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y2_a3_b3.mtx 126/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y3_a1_b1.mtx 127/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y3_a1_b2.mtx 128/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y3_a1_b3.mtx 129/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y3_a2_b1.mtx 130/144 [OK] +[2026-03-23 10:37:06] Double precision check on file serial/sol_x4_y3_a2_b2.mtx 131/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y3_a2_b3.mtx 132/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y3_a3_b1.mtx 133/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y3_a3_b2.mtx 134/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y3_a3_b3.mtx 135/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y4_a1_b1.mtx 136/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y4_a1_b2.mtx 137/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y4_a1_b3.mtx 138/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y4_a2_b1.mtx 139/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y4_a2_b2.mtx 140/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y4_a2_b3.mtx 141/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y4_a3_b1.mtx 142/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y4_a3_b2.mtx 143/144 [OK] +[2026-03-23 10:37:07] Double precision check on file serial/sol_x4_y4_a3_b3.mtx 144/144 [OK] + + +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 1 + +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Generation gedot single precision result file serial/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:27:44] Double precision check on file serial/sol_x4_y4.mtx 16/144 [OK] +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:19] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:28:20] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:44] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:32:45] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:33:40] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:33:41] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:34:42] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:34:42] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:34:43] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:35:32] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:35:32] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:35:32] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:35:33] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:37:17] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:37:17] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:37:18] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences +Welcome to PSBLAS version: 3.9.0 +This is the psb_gedot_test sample program +Number of processes used in this computation: 40 + +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:37:56] Generation gedot single precision result file parallel/sol_x4_y4.mtx 16/144 [OK] + +[2025-06-12 13:37:56] Double precision check on file parallel/sol_x1_y1.mtx 1/144 [OK] +[2025-06-12 13:37:56] Double precision check on file parallel/sol_x1_y2.mtx 2/144 [OK] +[2025-06-12 13:37:56] Double precision check on file parallel/sol_x1_y3.mtx 3/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x1_y4.mtx 4/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x2_y1.mtx 5/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x2_y2.mtx 6/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x2_y3.mtx 7/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x2_y4.mtx 8/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x3_y1.mtx 9/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x3_y2.mtx 10/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x3_y3.mtx 11/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x3_y4.mtx 12/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x4_y1.mtx 13/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x4_y2.mtx 14/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x4_y3.mtx 15/144 [OK] +[2025-06-12 13:37:57] Double precision check on file parallel/sol_x4_y4.mtx 16/144 [OK] + +Comparison between serial/sol_x1_y1.mtx and parallel/sol_x1_y1.mtx: 4 differences +Comparison between serial/sol_x1_y2.mtx and parallel/sol_x1_y2.mtx: 4 differences +Comparison between serial/sol_x1_y3.mtx and parallel/sol_x1_y3.mtx: 4 differences +Comparison between serial/sol_x1_y4.mtx and parallel/sol_x1_y4.mtx: 0 differences +Comparison between serial/sol_x2_y1.mtx and parallel/sol_x2_y1.mtx: 4 differences +Comparison between serial/sol_x2_y2.mtx and parallel/sol_x2_y2.mtx: 4 differences +Comparison between serial/sol_x2_y3.mtx and parallel/sol_x2_y3.mtx: 4 differences +Comparison between serial/sol_x2_y4.mtx and parallel/sol_x2_y4.mtx: 0 differences +Comparison between serial/sol_x3_y1.mtx and parallel/sol_x3_y1.mtx: 4 differences +Comparison between serial/sol_x3_y2.mtx and parallel/sol_x3_y2.mtx: 4 differences +Comparison between serial/sol_x3_y3.mtx and parallel/sol_x3_y3.mtx: 4 differences +Comparison between serial/sol_x3_y4.mtx and parallel/sol_x3_y4.mtx: 0 differences +Comparison between serial/sol_x4_y1.mtx and parallel/sol_x4_y1.mtx: 0 differences +Comparison between serial/sol_x4_y2.mtx and parallel/sol_x4_y2.mtx: 0 differences +Comparison between serial/sol_x4_y3.mtx and parallel/sol_x4_y3.mtx: 0 differences +Comparison between serial/sol_x4_y4.mtx and parallel/sol_x4_y4.mtx: 0 differences + + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + + +[RUN] psb_spmm +[DATE] 2026-05-28 10:23:38 + + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + +[RUN] psb_spmm +[DATE] 2026-05-28 16:06:35 + + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences + +[RUN] psb_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + +[RUN] psb_spmm +[DATE] 2026-05-28 16:06:35 + +[RUN] psb_spmm +[DATE] 2026-05-28 17:38:01 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + +[RUN] psb_spmm +[DATE] 2026-05-28 16:06:35 + +[RUN] psb_spmm +[DATE] 2026-05-28 17:38:01 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[RUN] psb_spmm +[DATE] 2026-05-28 17:41:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + +[RUN] psb_spmm +[DATE] 2026-05-28 16:06:35 + +[RUN] psb_spmm +[DATE] 2026-05-28 17:38:01 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[RUN] psb_spmm +[DATE] 2026-05-28 17:41:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:15:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + +[RUN] psb_spmm +[DATE] 2026-05-28 16:06:35 + +[RUN] psb_spmm +[DATE] 2026-05-28 17:38:01 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[RUN] psb_spmm +[DATE] 2026-05-28 17:41:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:15:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:29:09 + +[RUN] psb_spmm +[DATE] 2026-05-29 08:33:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 12:18:37 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 14:53:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 15:07:42 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-30 12:38:05 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:13:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 11:54:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:13:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:16:23 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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: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_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:13:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 11:54:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:13:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:16:23 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:22:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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: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_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + +[RUN] psb_spmm +[DATE] 2026-05-28 16:06:35 + +[RUN] psb_spmm +[DATE] 2026-05-28 17:38:01 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[RUN] psb_spmm +[DATE] 2026-05-28 17:41:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:15:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:29:09 + +[RUN] psb_spmm +[DATE] 2026-05-29 08:33:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 12:18:37 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 14:53:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 15:07:42 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-30 12:38:05 +[RUN] psb_spmm +[DATE] 2026-05-30 12:40:05 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1117229 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1341885 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1411816 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1422000 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1171656 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1101118 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437048 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1424281 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1411968 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1411359 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1368648 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1085005 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1102485 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1105069 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1424117 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1105829 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1355728 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1110541 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1108413 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1103853 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1254648 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1211936 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1249328 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1337032 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1419415 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420479 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1326392 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1321984 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1198712 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1183208 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1347064 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1436287 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1427623 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1169376 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1085917 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1362264 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1118597 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1112517 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1082573 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1100965 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1099901 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1435072 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1429144 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1387952 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1098229 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1423063 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1342503 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1331712 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1085613 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1207984 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1083485 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437048 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1079077 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1412575 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1080445 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1412423 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437656 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1408928 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1080749 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437048 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1114949 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1418199 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1345239 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[RUN] psb_spmm +[DATE] 2026-05-30 13:02:08 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:16:44 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:22:26 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1272269 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1128477 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1318944 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1155990 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1143525 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1245376 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1186389 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1421240 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1437352 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1427775 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1282909 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1219221 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1130465 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1227125 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1376997 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1144133 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1406332 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1203869 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1199613 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1413792 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1363480 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1231837 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1139877 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1381264 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1364088 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1178181 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1205693 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1382923 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1343720 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1382176 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1078470 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150669 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1220296 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1375781 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1411664 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1200525 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1238981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1191557 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1200069 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1422000 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1107805 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1430208 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1202805 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1380656 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1125741 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1265744 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1246277 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1129997 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1172557 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1406647 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1122245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1084549 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1347216 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1432640 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1339768 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1131669 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437808 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1113429 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1364240 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1176053 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1359832 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1325632 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1378832 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1147944 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1352676 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1354360 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1164349 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1286720 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1079229 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1407407 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1416224 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1419719 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1417288 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1168300 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1409221 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1425344 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1091237 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1175293 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1151287 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1409839 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:13:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 11:54:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:13:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:16:23 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:22:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 14:22:24 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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: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_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + +[RUN] psb_spmm +[DATE] 2026-05-28 16:06:35 + +[RUN] psb_spmm +[DATE] 2026-05-28 17:38:01 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[RUN] psb_spmm +[DATE] 2026-05-28 17:41:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:15:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:29:09 + +[RUN] psb_spmm +[DATE] 2026-05-29 08:33:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 12:18:37 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 14:53:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 15:07:42 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-30 12:38:05 +[RUN] psb_spmm +[DATE] 2026-05-30 12:40:05 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1117229 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1341885 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1411816 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1422000 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1171656 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1101118 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437048 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1424281 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1411968 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1411359 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1368648 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1085005 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1102485 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1105069 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1424117 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1105829 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1355728 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1110541 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1108413 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1103853 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1254648 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1211936 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1249328 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1337032 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1419415 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420479 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1326392 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1321984 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1198712 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1183208 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1347064 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1436287 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1427623 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1169376 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1085917 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1362264 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1118597 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1112517 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1082573 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1100965 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1099901 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1435072 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1429144 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1387952 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1098229 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1423063 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1342503 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1331712 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1085613 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1207984 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1083485 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437048 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1079077 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1412575 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1080445 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1412423 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437656 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1408928 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1080749 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437048 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1114949 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1418199 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1345239 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[RUN] psb_spmm +[DATE] 2026-05-30 13:02:08 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:16:44 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:22:26 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1272269 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1128477 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1318944 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1155990 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1143525 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1245376 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1186389 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1421240 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1437352 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1427775 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1282909 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1219221 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1130465 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1227125 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1376997 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1144133 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1406332 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1203869 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1199613 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1413792 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1363480 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1231837 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1139877 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1381264 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1364088 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1178181 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1205693 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1382923 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1343720 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1382176 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1078470 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150669 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1220296 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1375781 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1411664 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1200525 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1238981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1191557 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1200069 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1422000 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1107805 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1430208 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1202805 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1380656 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1125741 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1265744 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1246277 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1129997 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1172557 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1406647 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1122245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1084549 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1347216 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1432640 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1339768 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1131669 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437808 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1113429 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1364240 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1176053 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1359832 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1325632 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1378832 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1147944 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1352676 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1354360 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1164349 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1286720 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1079229 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1407407 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1416224 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1419719 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1417288 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1168300 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1409221 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1425344 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1091237 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1175293 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1151287 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1409839 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 14:22:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1376704 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1115264 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1087893 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1149616 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1127412 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1091541 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1263909 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1431728 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1079229 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1166325 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1368941 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1435528 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1414247 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1131669 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1347509 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1119509 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1114797 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1166021 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1155533 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1176357 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1163437 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1414855 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420327 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1381709 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1408622 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1402239 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1311952 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1144285 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1436744 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1202056 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1365606 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1437199 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1136381 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1129237 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1135469 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1078470 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1431728 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1411360 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1169517 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1364999 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1282909 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1138661 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1084245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1093517 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1350549 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1429448 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1381404 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1331397 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1364544 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1329128 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1422608 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1114341 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1405127 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1133189 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1365760 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1339920 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1333992 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1350104 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1191557 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1360743 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1385672 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1393575 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1136533 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1373208 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1323807 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1186085 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1330040 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1174380 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1243845 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1432639 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1232760 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1429903 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1416527 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1408928 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1410143 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:13:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 11:54:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:13:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:16:23 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:22:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 14:22:24 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:21:50 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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: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_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:13:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 11:54:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:13:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:16:23 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:22:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 14:22:24 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:21:50 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:29:28 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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: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_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + +[RUN] psb_spmm +[DATE] 2026-05-28 16:06:35 + +[RUN] psb_spmm +[DATE] 2026-05-28 17:38:01 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[RUN] psb_spmm +[DATE] 2026-05-28 17:41:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:15:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:29:09 + +[RUN] psb_spmm +[DATE] 2026-05-29 08:33:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 12:18:37 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 14:53:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 15:07:42 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-30 12:38:05 +[RUN] psb_spmm +[DATE] 2026-05-30 12:40:05 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1117229 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1341885 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1411816 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1422000 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1171656 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1101118 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437048 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1424281 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1411968 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1411359 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1368648 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1085005 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1102485 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1105069 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1424117 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1105829 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1355728 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1110541 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1108413 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1103853 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1254648 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1211936 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1249328 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1337032 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1419415 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420479 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1326392 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1321984 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1198712 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1183208 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1347064 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1436287 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1427623 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1169376 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1085917 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1362264 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1118597 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1112517 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1082573 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1100965 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1099901 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1435072 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1429144 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1387952 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1098229 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1423063 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1342503 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1331712 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1085613 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1207984 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1083485 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437048 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1079077 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1412575 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1080445 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1412423 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437656 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1408928 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1080749 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437048 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1114949 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1418199 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1345239 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[RUN] psb_spmm +[DATE] 2026-05-30 13:02:08 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:16:44 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:22:26 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1272269 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1128477 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1318944 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1155990 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1143525 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1245376 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1186389 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1421240 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1437352 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1427775 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1282909 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1219221 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1130465 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1227125 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1376997 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1144133 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1406332 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1203869 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1199613 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1413792 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1363480 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1231837 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1139877 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1381264 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1364088 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1178181 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1205693 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1382923 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1343720 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1382176 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1078470 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150669 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1220296 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1375781 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1411664 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1200525 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1238981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1191557 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1200069 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1422000 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1107805 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1430208 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1202805 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1380656 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1125741 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1265744 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1246277 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1129997 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1172557 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1406647 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1122245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1084549 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1347216 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1432640 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1339768 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1131669 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437808 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1113429 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1364240 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1176053 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1359832 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1325632 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1378832 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1147944 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1352676 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1354360 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1164349 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1286720 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1079229 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1407407 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1416224 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1419719 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1417288 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1168300 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1409221 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1425344 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1091237 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1175293 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1151287 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1409839 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 14:22:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1376704 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1115264 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1087893 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1149616 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1127412 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1091541 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1263909 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1431728 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1079229 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1166325 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1368941 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1435528 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1414247 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1131669 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1347509 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1119509 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1114797 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1166021 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1155533 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1176357 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1163437 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1414855 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420327 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1381709 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1408622 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1402239 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1311952 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1144285 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1436744 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1202056 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1365606 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1437199 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1136381 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1129237 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1135469 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1078470 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1431728 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1411360 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1169517 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1364999 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1282909 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1138661 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1084245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1093517 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1350549 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1429448 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1381404 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1331397 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1364544 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1329128 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1422608 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1114341 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1405127 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1133189 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1365760 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1339920 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1333992 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1350104 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1191557 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1360743 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1385672 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1393575 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1136533 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1373208 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1323807 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1186085 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1330040 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1174380 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1243845 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1432639 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1232760 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1429903 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1416527 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1408928 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1410143 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 15:22:11 + +[RUN] psb_spmm +[DATE] 2026-06-03 15:29:49 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1264517 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1427168 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1169224 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1172264 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1175901 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1301007 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1255245 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1161928 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1087437 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1309509 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1298107 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1232304 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1148552 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1136533 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1162840 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1158432 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1336880 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1098989 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1350712 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1151288 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1148096 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1099141 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1241728 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1289760 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1149768 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1079685 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1260576 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1423824 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150528 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1234584 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1289000 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1139573 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1096558 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1205096 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1088957 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1097469 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1193240 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1231229 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1129845 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1111910 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1245984 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1150365 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1138205 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1197192 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1130301 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1314688 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1353600 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1181840 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1143536 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1312700 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437958 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1235040 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1181536 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1156304 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1172112 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1141256 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1234279 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1320149 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1194456 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1136685 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1427624 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1258751 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1079989 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1079837 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1131516 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1393879 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1089413 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1318792 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1300400 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1385064 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1436744 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1336119 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1298119 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1313168 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1273647 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:13:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 11:54:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:13:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:16:23 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:22:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 14:22:24 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:21:50 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:29:28 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:54:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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: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_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:13:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 11:54:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:13:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:16:23 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:22:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 14:22:24 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:21:50 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:29:28 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:54:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:57:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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: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_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:13:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 11:54:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:13:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:16:23 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:22:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 14:22:24 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:21:50 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:29:28 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:54:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:57:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 16:10:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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: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_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:13:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 11:54:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:13:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:16:23 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:22:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 14:22:24 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:21:50 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:29:28 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:54:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:57:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 16:10:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 10:36:10 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 10:45:09 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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: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_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + +[RUN] psb_spmm +[DATE] 2026-05-28 16:06:35 + +[RUN] psb_spmm +[DATE] 2026-05-28 17:38:01 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[RUN] psb_spmm +[DATE] 2026-05-28 17:41:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:15:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:29:09 + +[RUN] psb_spmm +[DATE] 2026-05-29 08:33:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 12:18:37 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 14:53:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 15:07:42 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-30 12:38:05 +[RUN] psb_spmm +[DATE] 2026-05-30 12:40:05 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1117229 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1341885 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1411816 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1422000 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1171656 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1101118 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437048 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1424281 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1411968 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1411359 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1368648 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1085005 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1102485 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1105069 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1424117 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1105829 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1355728 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1110541 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1108413 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1103853 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1254648 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1211936 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1249328 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1337032 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1419415 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420479 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1326392 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1321984 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1198712 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1183208 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1347064 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1436287 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1427623 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1169376 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1085917 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1362264 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1118597 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1112517 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1082573 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1100965 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1099901 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1435072 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1429144 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1387952 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1098229 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1423063 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1342503 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1331712 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1085613 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1207984 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1083485 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437048 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1079077 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1412575 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1080445 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1412423 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437656 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1408928 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1080749 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437048 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1114949 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1418199 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1345239 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[RUN] psb_spmm +[DATE] 2026-05-30 13:02:08 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:16:44 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:22:26 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1272269 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1128477 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1318944 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1155990 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1143525 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1245376 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1186389 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1421240 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1437352 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1427775 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1282909 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1219221 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1130465 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1227125 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1376997 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1144133 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1406332 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1203869 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1199613 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1413792 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1363480 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1231837 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1139877 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1381264 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1364088 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1178181 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1205693 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1382923 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1343720 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1382176 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1078470 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150669 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1220296 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1375781 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1411664 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1200525 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1238981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1191557 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1200069 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1422000 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1107805 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1430208 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1202805 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1380656 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1125741 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1265744 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1246277 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1129997 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1172557 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1406647 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1122245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1084549 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1347216 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1432640 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1339768 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1131669 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437808 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1113429 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1364240 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1176053 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1359832 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1325632 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1378832 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1147944 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1352676 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1354360 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1164349 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1286720 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1079229 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1407407 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1416224 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1419719 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1417288 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1168300 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1409221 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1425344 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1091237 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1175293 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1151287 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1409839 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 14:22:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1376704 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1115264 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1087893 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1149616 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1127412 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1091541 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1263909 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1431728 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1079229 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1166325 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1368941 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1435528 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1414247 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1131669 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1347509 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1119509 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1114797 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1166021 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1155533 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1176357 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1163437 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1414855 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420327 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1381709 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1408622 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1402239 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1311952 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1144285 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1436744 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1202056 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1365606 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1437199 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1136381 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1129237 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1135469 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1078470 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1431728 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1411360 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1169517 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1364999 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1282909 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1138661 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1084245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1093517 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1350549 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1429448 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1381404 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1331397 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1364544 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1329128 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1422608 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1114341 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1405127 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1133189 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1365760 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1339920 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1333992 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1350104 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1191557 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1360743 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1385672 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1393575 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1136533 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1373208 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1323807 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1186085 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1330040 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1174380 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1243845 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1432639 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1232760 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1429903 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1416527 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1408928 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1410143 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 15:22:11 + +[RUN] psb_spmm +[DATE] 2026-06-03 15:29:49 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1264517 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1427168 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1169224 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1172264 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1175901 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1301007 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1255245 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1161928 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1087437 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1309509 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1298107 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1232304 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1148552 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1136533 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1162840 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1158432 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1336880 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1098989 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1350712 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1151288 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1148096 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1099141 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1241728 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1289760 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1149768 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1079685 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1260576 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1423824 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150528 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1234584 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1289000 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1139573 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1096558 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1205096 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1088957 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1097469 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1193240 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1231229 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1129845 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1111910 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1245984 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1150365 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1138205 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1197192 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1130301 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1314688 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1353600 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1181840 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1143536 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1312700 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437958 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1235040 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1181536 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1156304 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1172112 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1141256 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1234279 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1320149 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1194456 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1136685 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1427624 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1258751 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1079989 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1079837 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1131516 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1393879 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1089413 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1318792 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1300400 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1385064 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1436744 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1336119 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1298119 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1313168 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1273647 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 15:55:11 + +[RUN] psb_spmm +[DATE] 2026-06-03 15:57:39 + +[RUN] psb_spmm +[DATE] 2026-06-03 16:10:37 + +[RUN] psb_spmm +[DATE] 2026-06-04 10:45:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1368345 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1427168 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1169224 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1172264 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1175901 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1301007 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1255245 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1161928 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1087437 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1309509 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1298107 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1232304 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1148552 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1136533 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1162840 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1158432 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1336880 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1098989 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1350712 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1151288 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1148096 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1099141 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1241728 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1289760 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1149768 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1079685 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1260576 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1423824 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150528 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1234584 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1289000 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1139573 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1096558 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1205096 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1088957 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1097469 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1193240 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1231229 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1129845 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1111910 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1245984 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1150365 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1138205 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1197192 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1130301 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1314688 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1353600 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1181840 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1143536 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1312700 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437958 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1235040 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1181536 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1156304 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1172112 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1141256 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1234279 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1320149 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1194456 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1136685 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1427624 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1258751 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1079989 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1079837 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1131516 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1393879 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1089413 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1318792 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1300400 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1385064 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1436744 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1336119 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1298119 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1313168 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1273647 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:13:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 11:54:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:13:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:16:23 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:22:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 14:22:24 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:21:50 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:29:28 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:54:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:57:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 16:10:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 10:36:10 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 10:45:09 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 20:59:49 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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: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_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + +[RUN] psb_spmm +[DATE] 2026-05-28 16:06:35 + +[RUN] psb_spmm +[DATE] 2026-05-28 17:38:01 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[RUN] psb_spmm +[DATE] 2026-05-28 17:41:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:15:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:29:09 + +[RUN] psb_spmm +[DATE] 2026-05-29 08:33:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 12:18:37 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 14:53:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 15:07:42 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-30 12:38:05 +[RUN] psb_spmm +[DATE] 2026-05-30 12:40:05 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1117229 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1341885 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1411816 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1422000 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1171656 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1101118 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437048 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1424281 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1411968 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1411359 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1368648 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1085005 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1102485 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1105069 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1424117 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1105829 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1355728 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1110541 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1108413 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1103853 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1254648 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1211936 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1249328 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1337032 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1419415 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420479 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1326392 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1321984 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1198712 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1183208 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1347064 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1436287 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1427623 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1169376 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1085917 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1362264 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1118597 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1112517 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1082573 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1100965 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1099901 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1435072 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1429144 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1387952 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1098229 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1423063 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1342503 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1331712 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1085613 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1207984 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1083485 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437048 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1079077 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1412575 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1080445 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1412423 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437656 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1408928 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1080749 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437048 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1114949 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1418199 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1345239 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[RUN] psb_spmm +[DATE] 2026-05-30 13:02:08 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:16:44 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:22:26 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1272269 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1128477 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1318944 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1155990 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1143525 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1245376 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1186389 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1421240 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1437352 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1427775 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1282909 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1219221 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1130465 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1227125 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1376997 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1144133 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1406332 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1203869 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1199613 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1413792 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1363480 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1231837 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1139877 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1381264 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1364088 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1178181 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1205693 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1382923 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1343720 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1382176 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1078470 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150669 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1220296 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1375781 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1411664 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1200525 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1238981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1191557 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1200069 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1422000 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1107805 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1430208 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1202805 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1380656 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1125741 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1265744 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1246277 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1129997 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1172557 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1406647 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1122245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1084549 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1347216 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1432640 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1339768 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1131669 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437808 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1113429 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1364240 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1176053 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1359832 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1325632 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1378832 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1147944 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1352676 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1354360 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1164349 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1286720 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1079229 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1407407 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1416224 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1419719 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1417288 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1168300 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1409221 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1425344 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1091237 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1175293 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1151287 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1409839 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 14:22:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1376704 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1115264 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1087893 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1149616 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1127412 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1091541 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1263909 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1431728 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1079229 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1166325 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1368941 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1435528 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1414247 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1131669 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1347509 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1119509 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1114797 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1166021 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1155533 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1176357 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1163437 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1414855 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420327 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1381709 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1408622 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1402239 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1311952 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1144285 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1436744 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1202056 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1365606 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1437199 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1136381 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1129237 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1135469 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1078470 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1431728 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1411360 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1169517 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1364999 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1282909 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1138661 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1084245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1093517 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1350549 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1429448 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1381404 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1331397 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1364544 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1329128 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1422608 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1114341 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1405127 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1133189 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1365760 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1339920 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1333992 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1350104 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1191557 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1360743 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1385672 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1393575 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1136533 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1373208 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1323807 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1186085 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1330040 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1174380 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1243845 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1432639 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1232760 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1429903 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1416527 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1408928 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1410143 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 15:22:11 + +[RUN] psb_spmm +[DATE] 2026-06-03 15:29:49 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1264517 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1427168 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1169224 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1172264 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1175901 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1301007 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1255245 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1161928 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1087437 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1309509 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1298107 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1232304 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1148552 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1136533 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1162840 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1158432 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1336880 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1098989 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1350712 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1151288 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1148096 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1099141 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1241728 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1289760 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1149768 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1079685 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1260576 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1423824 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150528 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1234584 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1289000 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1139573 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1096558 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1205096 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1088957 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1097469 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1193240 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1231229 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1129845 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1111910 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1245984 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1150365 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1138205 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1197192 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1130301 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1314688 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1353600 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1181840 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1143536 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1312700 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437958 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1235040 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1181536 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1156304 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1172112 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1141256 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1234279 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1320149 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1194456 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1136685 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1427624 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1258751 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1079989 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1079837 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1131516 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1393879 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1089413 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1318792 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1300400 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1385064 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1436744 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1336119 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1298119 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1313168 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1273647 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 15:55:11 + +[RUN] psb_spmm +[DATE] 2026-06-03 15:57:39 + +[RUN] psb_spmm +[DATE] 2026-06-03 16:10:37 + +[RUN] psb_spmm +[DATE] 2026-06-04 10:45:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1368345 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1427168 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1169224 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1172264 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1175901 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1301007 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1255245 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1161928 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1087437 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1309509 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1298107 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1232304 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1148552 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1136533 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1162840 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1158432 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1336880 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1098989 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1350712 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1151288 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1148096 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1099141 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1241728 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1289760 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1149768 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1079685 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1260576 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1423824 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150528 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1234584 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1289000 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1139573 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1096558 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1205096 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1088957 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1097469 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1193240 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1231229 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1129845 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1111910 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1245984 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1150365 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1138205 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1197192 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1130301 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1314688 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1353600 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1181840 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1143536 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1312700 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437958 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1235040 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1181536 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1156304 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1172112 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1141256 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1234279 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1320149 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1194456 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1136685 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1427624 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1258751 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1079989 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1079837 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1131516 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1393879 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1089413 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1318792 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1300400 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1385064 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1436744 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1336119 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1298119 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1313168 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1273647 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-04 14:56:51 + +[RUN] psb_spmm +[DATE] 2026-06-04 15:15:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 52758 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 52758 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 52758 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 52758 differences +[RUN] psb_spmm +[DATE] 2026-06-04 15:16:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 15:54:33 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 69 differences +[RUN] psb_spmm +[DATE] 2026-06-04 15:59:37 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[RUN] psb_spmm +[DATE] 2026-06-04 16:06:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 16:10:07 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 16:10:33 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 73 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 73 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 73 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 73 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 73 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 73 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 73 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 73 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 21:00:09 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 73 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 73 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 73 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 73 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 73 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 73 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 73 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 73 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:23:30 + +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:26:43 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 10:50:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 15:13:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 16:06:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: differences +[RUN] psb_geaxpby +[DATE] 2026-05-28 17:41:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-29 08:14:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:37:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 12:39:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:01:48 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-05-30 13:13:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 11:54:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:13:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:16:23 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 13:22:06 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 14:22:24 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:21:50 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:29:28 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:54:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 15:57:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-03 16:10:17 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 10:36:10 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 10:45:09 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 20:59:49 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_geaxpby +[DATE] 2026-06-04 21:19:19 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + +[RUN] psb_gedot +[DATE] 2026-05-28 10:23:37 + +[RUN] psb_gedot +[DATE] 2026-05-28 10:26:58 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 10:50:32 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 15:14:11 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 16:06:34 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: 4 differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: 4 differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: 4 differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: 4 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: 4 differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: 4 differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: 4 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-05-28 17:38:00 + +[DIFF] serial/sol_x1_y1.mtx vs parallel/sol_x1_y1.mtx: differences +[DIFF] serial/sol_x1_y2.mtx vs parallel/sol_x1_y2.mtx: differences +[DIFF] serial/sol_x1_y3.mtx vs parallel/sol_x1_y3.mtx: differences +[DIFF] serial/sol_x1_y4.mtx vs parallel/sol_x1_y4.mtx: differences +[DIFF] serial/sol_x2_y1.mtx vs parallel/sol_x2_y1.mtx: differences +[DIFF] serial/sol_x2_y2.mtx vs parallel/sol_x2_y2.mtx: differences +[DIFF] serial/sol_x2_y3.mtx vs parallel/sol_x2_y3.mtx: differences +[DIFF] serial/sol_x2_y4.mtx vs parallel/sol_x2_y4.mtx: differences +[DIFF] serial/sol_x3_y1.mtx vs parallel/sol_x3_y1.mtx: differences +[DIFF] serial/sol_x3_y2.mtx vs parallel/sol_x3_y2.mtx: differences +[DIFF] serial/sol_x3_y3.mtx vs parallel/sol_x3_y3.mtx: differences +[DIFF] serial/sol_x3_y4.mtx vs parallel/sol_x3_y4.mtx: differences +[DIFF] serial/sol_x4_y1.mtx vs parallel/sol_x4_y1.mtx: differences +[DIFF] serial/sol_x4_y2.mtx vs parallel/sol_x4_y2.mtx: differences +[DIFF] serial/sol_x4_y3.mtx vs parallel/sol_x4_y3.mtx: differences +[DIFF] serial/sol_x4_y4.mtx vs parallel/sol_x4_y4.mtx: differences +[RUN] psb_gedot +[DATE] 2026-05-28 17:41:50 + +[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-05-29 08:14:58 + +[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-05-30 12:38:04 + +[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-05-30 12:40:04 + +[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-05-30 13:02:07 + +[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: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 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + +[RUN] psb_spmm +[DATE] 2026-05-28 16:06:35 + +[RUN] psb_spmm +[DATE] 2026-05-28 17:38:01 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[RUN] psb_spmm +[DATE] 2026-05-28 17:41:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:15:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:29:09 + +[RUN] psb_spmm +[DATE] 2026-05-29 08:33:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 12:18:37 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 14:53:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 15:07:42 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-30 12:38:05 +[RUN] psb_spmm +[DATE] 2026-05-30 12:40:05 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1117229 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1341885 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1411816 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1422000 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1171656 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1101118 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437048 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1424281 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1411968 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1411359 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1368648 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1085005 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1102485 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1105069 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1424117 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1105829 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1355728 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1110541 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1108413 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1103853 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1254648 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1211936 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1249328 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1337032 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1419415 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420479 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1326392 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1321984 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1198712 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1183208 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1347064 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1436287 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1427623 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1169376 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1085917 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1362264 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1118597 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1112517 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1082573 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1100965 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1099901 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1435072 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1429144 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1387952 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1098229 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1423063 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1342503 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1331712 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1085613 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1207984 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1083485 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437048 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1079077 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1412575 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1080445 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1412423 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437656 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1408928 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1080749 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437048 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1114949 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1418199 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1345239 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[RUN] psb_spmm +[DATE] 2026-05-30 13:02:08 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:16:44 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:22:26 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1272269 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1128477 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1318944 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1155990 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1143525 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1245376 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1186389 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1421240 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1437352 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1427775 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1282909 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1219221 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1130465 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1227125 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1376997 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1144133 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1406332 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1203869 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1199613 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1413792 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1363480 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1231837 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1139877 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1381264 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1364088 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1178181 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1205693 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1382923 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1343720 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1382176 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1078470 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150669 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1220296 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1375781 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1411664 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1200525 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1238981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1191557 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1200069 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1422000 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1107805 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1430208 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1202805 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1380656 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1125741 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1265744 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1246277 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1129997 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1172557 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1406647 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1122245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1084549 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1347216 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1432640 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1339768 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1131669 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437808 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1113429 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1364240 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1176053 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1359832 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1325632 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1378832 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1147944 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1352676 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1354360 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1164349 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1286720 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1079229 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1407407 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1416224 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1419719 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1417288 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1168300 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1409221 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1425344 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1091237 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1175293 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1151287 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1409839 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 14:22:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1376704 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1115264 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1087893 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1149616 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1127412 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1091541 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1263909 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1431728 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1079229 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1166325 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1368941 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1435528 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1414247 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1131669 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1347509 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1119509 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1114797 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1166021 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1155533 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1176357 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1163437 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1414855 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420327 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1381709 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1408622 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1402239 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1311952 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1144285 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1436744 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1202056 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1365606 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1437199 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1136381 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1129237 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1135469 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1078470 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1431728 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1411360 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1169517 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1364999 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1282909 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1138661 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1084245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1093517 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1350549 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1429448 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1381404 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1331397 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1364544 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1329128 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1422608 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1114341 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1405127 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1133189 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1365760 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1339920 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1333992 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1350104 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1191557 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1360743 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1385672 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1393575 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1136533 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1373208 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1323807 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1186085 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1330040 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1174380 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1243845 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1432639 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1232760 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1429903 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1416527 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1408928 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1410143 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 15:22:11 + +[RUN] psb_spmm +[DATE] 2026-06-03 15:29:49 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1264517 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1427168 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1169224 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1172264 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1175901 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1301007 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1255245 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1161928 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1087437 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1309509 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1298107 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1232304 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1148552 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1136533 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1162840 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1158432 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1336880 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1098989 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1350712 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1151288 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1148096 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1099141 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1241728 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1289760 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1149768 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1079685 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1260576 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1423824 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150528 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1234584 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1289000 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1139573 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1096558 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1205096 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1088957 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1097469 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1193240 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1231229 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1129845 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1111910 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1245984 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1150365 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1138205 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1197192 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1130301 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1314688 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1353600 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1181840 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1143536 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1312700 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437958 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1235040 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1181536 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1156304 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1172112 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1141256 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1234279 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1320149 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1194456 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1136685 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1427624 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1258751 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1079989 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1079837 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1131516 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1393879 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1089413 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1318792 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1300400 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1385064 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1436744 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1336119 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1298119 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1313168 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1273647 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 15:55:11 + +[RUN] psb_spmm +[DATE] 2026-06-03 15:57:39 + +[RUN] psb_spmm +[DATE] 2026-06-03 16:10:37 + +[RUN] psb_spmm +[DATE] 2026-06-04 10:45:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1368345 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1427168 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1169224 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1172264 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1175901 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1301007 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1255245 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1161928 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1087437 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1309509 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1298107 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1232304 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1148552 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1136533 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1162840 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1158432 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1336880 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1098989 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1350712 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1151288 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1148096 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1099141 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1241728 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1289760 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1149768 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1079685 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1260576 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1423824 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150528 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1234584 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1289000 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1139573 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1096558 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1205096 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1088957 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1097469 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1193240 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1231229 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1129845 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1111910 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1245984 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1150365 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1138205 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1197192 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1130301 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1314688 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1353600 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1181840 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1143536 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1312700 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437958 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1235040 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1181536 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1156304 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1172112 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1141256 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1234279 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1320149 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1194456 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1136685 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1427624 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1258751 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1079989 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1079837 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1131516 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1393879 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1089413 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1318792 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1300400 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1385064 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1436744 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1336119 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1298119 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1313168 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1273647 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-04 14:56:51 + +[RUN] psb_spmm +[DATE] 2026-06-04 15:15:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 52758 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 52758 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 52758 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 52758 differences +[RUN] psb_spmm +[DATE] 2026-06-04 15:16:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 15:54:33 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 69 differences +[RUN] psb_spmm +[DATE] 2026-06-04 15:59:37 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[RUN] psb_spmm +[DATE] 2026-06-04 16:06:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 16:10:07 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 16:10:33 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 73 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 73 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 73 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 73 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 73 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 73 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 73 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 73 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 21:00:09 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 73 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 73 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 73 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 73 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 73 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 73 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 73 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 73 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 21:19:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences + diff --git a/test/computational_routines/spmm/CMakeLists.txt b/test/computational_routines/spmm/CMakeLists.txt index 0147bc767..9d22913d8 100644 --- a/test/computational_routines/spmm/CMakeLists.txt +++ b/test/computational_routines/spmm/CMakeLists.txt @@ -6,3 +6,11 @@ foreach(file IN LISTS PSB_spmm_source_files) list(APPEND spmm_source_files ${CMAKE_CURRENT_LIST_DIR}/${file}) endforeach() +set(PSB_spmm_overlap_source_files + psb_spmm_overlap_test.f90 + spmm_overlap.f90 +) +foreach(file IN LISTS PSB_spmm_overlap_source_files) + list(APPEND spmm_overlap_source_files ${CMAKE_CURRENT_LIST_DIR}/${file}) +endforeach() + diff --git a/test/computational_routines/spmm/Makefile b/test/computational_routines/spmm/Makefile index 5f6ef2a0d..a2e368bc2 100644 --- a/test/computational_routines/spmm/Makefile +++ b/test/computational_routines/spmm/Makefile @@ -21,7 +21,7 @@ YELLOW=\033[33m END_COLOUR=\033[0m -all: runsd psb_spmm_test +all: runsd psb_spmm_test @printf "$(GREEN)[INFO]\tCompilation success!$(END_COLOUR)\n" runsd: diff --git a/test/computational_routines/spmm/README.md b/test/computational_routines/spmm/README.md index 34f0ab0b2..a64a8ad24 100644 --- a/test/computational_routines/spmm/README.md +++ b/test/computational_routines/spmm/README.md @@ -18,8 +18,8 @@ In order to have the exact same environment used for testing compile PSBALS libr Steps to reproduce the tests: - Compile the code using ``` make ``` - Insert the matrix files inside the matrix/ directory (or create one if it doesn't exists; psblas3/test/spmm/matrix/) -- Launch the script autotest.sh (Still not implemented) -- Check the output log file test_log.txt to collect results +- Launch the script autotest.sh +- Check the output log file logs/psblas_spmm_test.log to collect results ## Test goal Check the correctness of the matrix-vector multiplication $y = Ax$ using the **psb_spmm** routine, checking for all the test suite cases. diff --git a/test/computational_routines/spmm/autotest.sh b/test/computational_routines/spmm/autotest.sh new file mode 100755 index 000000000..15b219482 --- /dev/null +++ b/test/computational_routines/spmm/autotest.sh @@ -0,0 +1,54 @@ +#!/bin/bash + +script_dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) +source "${script_dir}/../common/testlib.sh" + +# Variables definition +num_procs=$(get_num_procs) +log_dir="logs" +log_file_name="${log_dir}/psblas_spmm_test.log" + +ensure_dirs runs serial parallel vectors matrix "${log_dir}" +log_header "${log_file_name}" "psb_spmm" + +# Ensure required directories exist +# Ensure a default matrix is available +if [ ! -f "matrix/1138_bus.mtx" ]; then + warn "No default matrix found. Place a MatrixMarket file at matrix/1138_bus.mtx" +fi + +# Check if the executable ELF file exists +if [ ! -f "./runs/psb_spmm_test" ]; then + warn "Executable not found. Running make..." + make + if [ ! -f "./runs/psb_spmm_test" ]; then + err "Failed to create executable. Check make command." + exit 1 + fi +else + info "The executable already exists. Skipping the make process." +fi + +# Execute tests and save results +info "Running the PSBLAS psb_spmm test..." +echo "" >> "${log_file_name}" +run_mpi 1 ./runs/psb_spmm_test "single process computation" +run_mpi "$num_procs" ./runs/psb_spmm_test "${num_procs} processes computation" + +# Compare serial and parallel outputs if present. +# 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." +exit $compare_status diff --git a/test/computational_routines/spmm/logs/psblas_spmm_test.log b/test/computational_routines/spmm/logs/psblas_spmm_test.log new file mode 100644 index 000000000..af82d3b09 --- /dev/null +++ b/test/computational_routines/spmm/logs/psblas_spmm_test.log @@ -0,0 +1,1673 @@ +[RUN] psb_spmm +[DATE] 2026-05-28 10:23:38 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:27:00 + +[RUN] psb_spmm +[DATE] 2026-05-28 10:50:33 + +[RUN] psb_spmm +[DATE] 2026-05-28 15:14:13 + +[RUN] psb_spmm +[DATE] 2026-05-28 16:06:35 + +[RUN] psb_spmm +[DATE] 2026-05-28 17:38:01 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: differences +[RUN] psb_spmm +[DATE] 2026-05-28 17:41:51 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:15:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 08:29:09 + +[RUN] psb_spmm +[DATE] 2026-05-29 08:33:00 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 12:18:37 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 14:53:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-29 15:07:42 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[RUN] psb_spmm +[DATE] 2026-05-30 12:38:05 +[RUN] psb_spmm +[DATE] 2026-05-30 12:40:05 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1117229 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1341885 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1411816 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1422000 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1171656 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1101118 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437048 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1424281 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1411968 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1411359 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1368648 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1085005 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1102485 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1105069 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1424117 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1105829 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1355728 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1110541 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1108413 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1103853 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1254648 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1211936 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1249328 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1337032 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1419415 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420479 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1326392 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1321984 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1198712 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1183208 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1347064 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1436287 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1427623 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1169376 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1085917 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1362264 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1118597 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1112517 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1082573 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1100965 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1099901 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1435072 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1429144 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1387952 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1098229 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1423063 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1342503 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1331712 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1085613 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1207984 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1083485 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437048 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1079077 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1412575 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1080445 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1412423 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437656 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1408928 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1080749 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437048 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1114949 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1418199 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1345239 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[RUN] psb_spmm +[DATE] 2026-05-30 13:02:08 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:16:44 + +[RUN] psb_spmm +[DATE] 2026-06-03 13:22:26 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1272269 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1128477 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1318944 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1155990 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1143525 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1245376 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1186389 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1421240 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1437352 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1427775 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1282909 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1219221 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1130465 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1227125 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1376997 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1144133 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1406332 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1203869 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1199613 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1413792 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1363480 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1231837 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1139877 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1381264 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1364088 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1178181 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1205693 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1382923 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1343720 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1382176 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1078470 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150669 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1220296 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1375781 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1411664 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1200525 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1238981 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1191557 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1200069 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1422000 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1107805 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1430208 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1202805 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1380656 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1125741 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1265744 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1246277 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1129997 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1172557 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1406647 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1122245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1084549 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1347216 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1432640 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1339768 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1131669 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1437808 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1113429 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1364240 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1176053 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1359832 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1325632 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1378832 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1147944 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1352676 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1354360 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1164349 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1286720 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1079229 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1407407 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1416224 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1419719 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1417288 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1168300 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1409221 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1425344 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1091237 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1175293 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1151287 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1409839 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 14:22:45 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1376704 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1115264 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1087893 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1149616 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1127412 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1091541 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1263909 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1431728 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1079229 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1166325 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1368941 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1435528 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1414247 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1131669 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1347509 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1119509 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1114797 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1166021 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1155533 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1176357 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1163437 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1414855 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1420327 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1381709 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1408622 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1402239 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1311952 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1144285 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1436744 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1202056 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1365606 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1437199 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1136381 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1129237 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1135469 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1078470 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1431728 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1411360 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1169517 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1364999 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1282909 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1138661 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1084245 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1093517 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1350549 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1429448 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1381404 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1331397 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1364544 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1329128 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1422608 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1114341 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1405127 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1133189 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1365760 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1339920 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1333992 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1350104 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1191557 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1360743 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1385672 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1393575 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1136533 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1373208 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1323807 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1186085 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1330040 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1174380 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1243845 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1432639 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1232760 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1429903 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1416527 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1408928 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1410143 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 15:22:11 + +[RUN] psb_spmm +[DATE] 2026-06-03 15:29:49 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1264517 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1427168 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1169224 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1172264 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1175901 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1301007 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1255245 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1161928 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1087437 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1309509 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1298107 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1232304 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1148552 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1136533 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1162840 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1158432 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1336880 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1098989 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1350712 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1151288 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1148096 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1099141 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1241728 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1289760 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1149768 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1079685 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1260576 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1423824 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150528 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1234584 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1289000 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1139573 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1096558 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1205096 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1088957 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1097469 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1193240 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1231229 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1129845 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1111910 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1245984 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1150365 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1138205 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1197192 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1130301 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1314688 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1353600 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1181840 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1143536 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1312700 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437958 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1235040 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1181536 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1156304 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1172112 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1141256 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1234279 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1320149 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1194456 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1136685 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1427624 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1258751 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1079989 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1079837 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1131516 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1393879 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1089413 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1318792 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1300400 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1385064 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1436744 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1336119 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1298119 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1313168 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1273647 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-03 15:55:11 + +[RUN] psb_spmm +[DATE] 2026-06-03 15:57:39 + +[RUN] psb_spmm +[DATE] 2026-06-03 16:10:37 + +[RUN] psb_spmm +[DATE] 2026-06-04 10:45:29 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 1368345 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 1427168 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 1169224 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 1172264 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 1175901 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 1301007 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 1255245 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 1161928 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 1087437 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 1309509 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 1298107 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 1232304 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 1148552 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 1136533 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 1162840 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 1158432 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 1336880 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 1098989 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 1350712 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 1151288 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 1078470 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 1148096 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 1099141 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 1241728 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 1289760 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 1149768 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 1079685 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 1260576 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 1423824 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 1150528 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 1234584 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 1289000 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 1139573 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 1096558 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 1205096 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 1088957 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 1097469 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 1193240 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 1231229 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 1129845 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 1111910 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 1245984 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 1089413 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 1089565 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 1150365 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 1138205 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 1197192 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 1130301 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 1314688 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 1353600 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 1437959 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 1181840 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 1143536 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 1312700 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 1437958 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 1235040 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 1181536 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 1088349 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 1156304 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 1172112 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 1141256 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 1234279 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 1320149 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 1194456 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 1105981 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 1136685 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 1437960 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 1427624 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 1258751 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 1079989 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 1079837 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 1131516 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 1393879 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 1437959 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 1089413 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 1318792 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 1300400 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 1385064 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 1436744 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 1336119 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 1298119 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 1313168 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 1273647 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 1031715 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 1031715 differences +[RUN] psb_spmm +[DATE] 2026-06-04 14:56:51 + +[RUN] psb_spmm +[DATE] 2026-06-04 15:15:57 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 52758 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 52758 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 52758 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 52758 differences +[RUN] psb_spmm +[DATE] 2026-06-04 15:16:31 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 15:54:33 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 69 differences +[RUN] psb_spmm +[DATE] 2026-06-04 15:59:37 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[RUN] psb_spmm +[DATE] 2026-06-04 16:06:14 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 67 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 49 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 49 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 50 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 16:10:07 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 67 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 68 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 69 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 16:10:33 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 73 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 73 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 73 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 73 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 73 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 73 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 73 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 73 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 21:00:09 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 73 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 73 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 73 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 73 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 73 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 73 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 73 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 73 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 75 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 75 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 74 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 37 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences +[RUN] psb_spmm +[DATE] 2026-06-04 21:19:39 + +[DIFF] serial/sol_x1_y1_a1_b1.mtx vs parallel/sol_x1_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b2.mtx vs parallel/sol_x1_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a1_b3.mtx vs parallel/sol_x1_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b1.mtx vs parallel/sol_x1_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b2.mtx vs parallel/sol_x1_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a2_b3.mtx vs parallel/sol_x1_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b1.mtx vs parallel/sol_x1_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b2.mtx vs parallel/sol_x1_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y1_a3_b3.mtx vs parallel/sol_x1_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b1.mtx vs parallel/sol_x1_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b2.mtx vs parallel/sol_x1_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a1_b3.mtx vs parallel/sol_x1_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b1.mtx vs parallel/sol_x1_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b2.mtx vs parallel/sol_x1_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a2_b3.mtx vs parallel/sol_x1_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b1.mtx vs parallel/sol_x1_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b2.mtx vs parallel/sol_x1_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y2_a3_b3.mtx vs parallel/sol_x1_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b1.mtx vs parallel/sol_x1_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b2.mtx vs parallel/sol_x1_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a1_b3.mtx vs parallel/sol_x1_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b1.mtx vs parallel/sol_x1_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b2.mtx vs parallel/sol_x1_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a2_b3.mtx vs parallel/sol_x1_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b1.mtx vs parallel/sol_x1_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b2.mtx vs parallel/sol_x1_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y3_a3_b3.mtx vs parallel/sol_x1_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b1.mtx vs parallel/sol_x1_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b2.mtx vs parallel/sol_x1_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a1_b3.mtx vs parallel/sol_x1_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b1.mtx vs parallel/sol_x1_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b2.mtx vs parallel/sol_x1_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a2_b3.mtx vs parallel/sol_x1_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b1.mtx vs parallel/sol_x1_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b2.mtx vs parallel/sol_x1_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x1_y4_a3_b3.mtx vs parallel/sol_x1_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b1.mtx vs parallel/sol_x2_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b2.mtx vs parallel/sol_x2_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a1_b3.mtx vs parallel/sol_x2_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b1.mtx vs parallel/sol_x2_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b2.mtx vs parallel/sol_x2_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a2_b3.mtx vs parallel/sol_x2_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b1.mtx vs parallel/sol_x2_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b2.mtx vs parallel/sol_x2_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y1_a3_b3.mtx vs parallel/sol_x2_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b1.mtx vs parallel/sol_x2_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b2.mtx vs parallel/sol_x2_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a1_b3.mtx vs parallel/sol_x2_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b1.mtx vs parallel/sol_x2_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b2.mtx vs parallel/sol_x2_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a2_b3.mtx vs parallel/sol_x2_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b1.mtx vs parallel/sol_x2_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b2.mtx vs parallel/sol_x2_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y2_a3_b3.mtx vs parallel/sol_x2_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b1.mtx vs parallel/sol_x2_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b2.mtx vs parallel/sol_x2_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a1_b3.mtx vs parallel/sol_x2_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b1.mtx vs parallel/sol_x2_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b2.mtx vs parallel/sol_x2_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a2_b3.mtx vs parallel/sol_x2_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b1.mtx vs parallel/sol_x2_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b2.mtx vs parallel/sol_x2_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y3_a3_b3.mtx vs parallel/sol_x2_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b1.mtx vs parallel/sol_x2_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b2.mtx vs parallel/sol_x2_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a1_b3.mtx vs parallel/sol_x2_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b1.mtx vs parallel/sol_x2_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b2.mtx vs parallel/sol_x2_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a2_b3.mtx vs parallel/sol_x2_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b1.mtx vs parallel/sol_x2_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b2.mtx vs parallel/sol_x2_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x2_y4_a3_b3.mtx vs parallel/sol_x2_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b1.mtx vs parallel/sol_x3_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b2.mtx vs parallel/sol_x3_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a1_b3.mtx vs parallel/sol_x3_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b1.mtx vs parallel/sol_x3_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b2.mtx vs parallel/sol_x3_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a2_b3.mtx vs parallel/sol_x3_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b1.mtx vs parallel/sol_x3_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b2.mtx vs parallel/sol_x3_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y1_a3_b3.mtx vs parallel/sol_x3_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b1.mtx vs parallel/sol_x3_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b2.mtx vs parallel/sol_x3_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a1_b3.mtx vs parallel/sol_x3_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b1.mtx vs parallel/sol_x3_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b2.mtx vs parallel/sol_x3_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a2_b3.mtx vs parallel/sol_x3_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b1.mtx vs parallel/sol_x3_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b2.mtx vs parallel/sol_x3_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y2_a3_b3.mtx vs parallel/sol_x3_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b1.mtx vs parallel/sol_x3_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b2.mtx vs parallel/sol_x3_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a1_b3.mtx vs parallel/sol_x3_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b1.mtx vs parallel/sol_x3_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b2.mtx vs parallel/sol_x3_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a2_b3.mtx vs parallel/sol_x3_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b1.mtx vs parallel/sol_x3_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b2.mtx vs parallel/sol_x3_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y3_a3_b3.mtx vs parallel/sol_x3_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b1.mtx vs parallel/sol_x3_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b2.mtx vs parallel/sol_x3_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a1_b3.mtx vs parallel/sol_x3_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b1.mtx vs parallel/sol_x3_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b2.mtx vs parallel/sol_x3_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a2_b3.mtx vs parallel/sol_x3_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b1.mtx vs parallel/sol_x3_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b2.mtx vs parallel/sol_x3_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x3_y4_a3_b3.mtx vs parallel/sol_x3_y4_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b1.mtx vs parallel/sol_x4_y1_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b2.mtx vs parallel/sol_x4_y1_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a1_b3.mtx vs parallel/sol_x4_y1_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b1.mtx vs parallel/sol_x4_y1_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b2.mtx vs parallel/sol_x4_y1_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a2_b3.mtx vs parallel/sol_x4_y1_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b1.mtx vs parallel/sol_x4_y1_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b2.mtx vs parallel/sol_x4_y1_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y1_a3_b3.mtx vs parallel/sol_x4_y1_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b1.mtx vs parallel/sol_x4_y2_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b2.mtx vs parallel/sol_x4_y2_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a1_b3.mtx vs parallel/sol_x4_y2_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b1.mtx vs parallel/sol_x4_y2_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b2.mtx vs parallel/sol_x4_y2_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a2_b3.mtx vs parallel/sol_x4_y2_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b1.mtx vs parallel/sol_x4_y2_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b2.mtx vs parallel/sol_x4_y2_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y2_a3_b3.mtx vs parallel/sol_x4_y2_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b1.mtx vs parallel/sol_x4_y3_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b2.mtx vs parallel/sol_x4_y3_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a1_b3.mtx vs parallel/sol_x4_y3_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b1.mtx vs parallel/sol_x4_y3_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b2.mtx vs parallel/sol_x4_y3_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a2_b3.mtx vs parallel/sol_x4_y3_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b1.mtx vs parallel/sol_x4_y3_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b2.mtx vs parallel/sol_x4_y3_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y3_a3_b3.mtx vs parallel/sol_x4_y3_a3_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b1.mtx vs parallel/sol_x4_y4_a1_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b2.mtx vs parallel/sol_x4_y4_a1_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a1_b3.mtx vs parallel/sol_x4_y4_a1_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b1.mtx vs parallel/sol_x4_y4_a2_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b2.mtx vs parallel/sol_x4_y4_a2_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a2_b3.mtx vs parallel/sol_x4_y4_a2_b3.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b1.mtx vs parallel/sol_x4_y4_a3_b1.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b2.mtx vs parallel/sol_x4_y4_a3_b2.mtx: 0 differences +[DIFF] serial/sol_x4_y4_a3_b3.mtx vs parallel/sol_x4_y4_a3_b3.mtx: 0 differences diff --git a/test/computational_routines/spmm/psb_spmm_test.f90 b/test/computational_routines/spmm/psb_spmm_test.f90 index 3d909d247..6702f4571 100644 --- a/test/computational_routines/spmm/psb_spmm_test.f90 +++ b/test/computational_routines/spmm/psb_spmm_test.f90 @@ -3,43 +3,34 @@ !! !! Author: Luca Pepé Sciarria, Staccone Simone (Tor Vergata University) module psb_spmm_test - implicit none - + contains - subroutine psb_spmm_kernel(mtx_file,x_file, y_file, alpha, beta, ctxt) + subroutine psb_spmm_kernel(a, desc_a, rows, cols, x_file, y_file, alpha, beta, ctxt) use psb_base_mod use psb_util_mod implicit none ! input parameters - character(len = *), intent(in) :: mtx_file, x_file, y_file - real(psb_spk_), intent(in) :: alpha, beta - - character(len=:), allocatable :: output_file_name + character(len = *), intent(in) :: x_file, y_file + real(psb_spk_), intent(in) :: alpha, beta + type(psb_sspmat_type), intent(inout) :: a + type(psb_desc_type), intent(inout) :: desc_a + integer(psb_ipk_), intent(in) :: rows, cols - ! sparse matrices - type(psb_sspmat_type) :: a - type(psb_lsspmat_type) :: aux_a + character(len=:), allocatable :: output_file_name ! vectors - type(psb_s_vect_type) :: x, y - - ! matrix descriptor data structure - type(psb_desc_type) :: desc_a + type(psb_s_vect_type) :: x, y ! communication context - type(psb_ctxt_type), intent(in) :: ctxt - integer(psb_ipk_) :: my_rank, np, info, err_act - - ! matrix parameters - integer(psb_ipk_) :: rows, cols, nnz - integer(psb_ipk_) :: nr, nt ! In BLOCK ROWS distributin, the number of rows + type(psb_ctxt_type), intent(in) :: ctxt + integer(psb_ipk_) :: my_rank, np, info, err_act ! variables outside PSLBALS data structures - real(psb_spk_), allocatable :: x_global(:), y_global(:) - integer(psb_ipk_) :: i + real(psb_spk_), allocatable :: x_global(:), y_global(:) + logical :: exists info = psb_success_ @@ -50,26 +41,7 @@ module psb_spmm_test call psb_error(ctxt) endif - call mm_mat_read(aux_a,info,filename=mtx_file) - if(info /= psb_success_) then - write(psb_out_unit,*) "Error while reading matric ", mtx_file - goto 9999 - end if - - - ! part_block it's a macro defined in psb_blockpart_mod to identify BLOCK ROWS distribution - call psb_matdist(aux_a, a, ctxt,desc_a,info,fmt="COO",parts=part_block) - - - rows = aux_a%get_nrows() - cols = aux_a%get_ncols() - nnz = aux_a%get_nzeros() - - call psb_bcast(ctxt,rows) - call psb_bcast(ctxt,cols) - call psb_bcast(ctxt,nnz) - - ! Generate random array for b using always the same seed + ! Prepare input buffers on all ranks; root reads from disk if(my_rank == psb_root_) then allocate(x_global(cols)) allocate(y_global(rows)) @@ -105,6 +77,7 @@ module psb_spmm_test end if + ! y = alpha * A * x + beta * y call psb_spmm(alpha,a,x,beta,y,desc_a,info) if(info /= psb_success_) then @@ -113,9 +86,17 @@ module psb_spmm_test end if ! Make the root process be the one that saves everything on file - if(np == 1) then + if(np == 1) then + inquire(file='serial/', exist=exists) + if (.not.exists) then + call system('mkdir serial/') + end if output_file_name = "serial/" - else + else + inquire(file='parallel/', exist=exists) + if (.not.exists) then + call system('mkdir parallel/') + end if output_file_name = "parallel/" end if @@ -138,31 +119,27 @@ module psb_spmm_test output_file_name = output_file_name // "_b3.mtx" end if - ! Save result to output file - call mm_array_write(y,"Result vector",info,filename=output_file_name) - - ! Deallocate - call psb_gefree(x, desc_a,info) + ! Gather result on root and save to output file + call psb_gather(y_global,y,desc_a,info,root=psb_root_) if(info /= psb_success_) then - write(psb_out_unit,*) "Error in vector x free routine" + write(psb_out_unit,*) "Error in psb_gather to collect y result" goto 9999 end if - call psb_gefree(y, desc_a,info) - if(info /= psb_success_) then - write(psb_out_unit,*) "Error in vector y free routine" - goto 9999 + if (my_rank == psb_root_) then + call mm_array_write(y_global,"Result vector",info,filename=output_file_name) end if - call psb_spfree(a, desc_a,info) + ! Deallocate + call psb_gefree(x, desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,*) "Error in matrix A free routine" + write(psb_out_unit,*) "Error in vector x free routine" goto 9999 end if - call psb_cdfree(desc_a,info) + call psb_gefree(y, desc_a,info) if(info /= psb_success_) then - write(psb_out_unit,*) "Error in matrix descriptor free routine" + write(psb_out_unit,*) "Error in vector y free routine" goto 9999 end if @@ -181,6 +158,7 @@ module psb_spmm_test stop end subroutine + !> @brief Function to randomly generate x and y vectors !! and save them on multiple files based on their !! coefficients values. @@ -193,12 +171,22 @@ module psb_spmm_test integer(psb_ipk_), intent(in) :: rows, cols real(psb_spk_), allocatable :: x(:), y(:) - integer(psb_ipk_) :: i, info + integer(psb_ipk_) :: i, info, nseed + integer, allocatable :: seed(:) + logical :: exists + + inquire(file='vectors/', exist=exists) + if (.not.exists) then + call system('mkdir vectors/') + end if - allocate(x(rows)) - allocate(y(cols)) + allocate(x(cols)) + 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(y) @@ -207,11 +195,11 @@ module psb_spmm_test call mm_array_write(y,"Positive vector",info,filename="vectors/y1.mtx") ! Write only negative in x_2 - do i=1,rows + do i=1,cols x(i) = -x(i) end do - do i=1,cols + do i=1,rows y(i) = -y(i) end do @@ -220,12 +208,12 @@ module psb_spmm_test ! Since numbers are less than one and always positive, we have to generate negative ones subtractiong 50 - do i=1,rows + do i=1,cols x(i) = -x(i) ! Make the values positive again x(i) = x(i) - 0.5 end do - do i=1,cols + do i=1,rows y(i) = -y(i) ! Make the values positive again y(i) = y(i) - 0.5 end do @@ -235,17 +223,18 @@ module psb_spmm_test call mm_array_write(y,"Random vector",info,filename="vectors/y3.mtx") ! Write zero in x_4 - do i=1,rows + do i=1,cols x(i) = 0 end do - do i=1,cols + do i=1,rows y(i) = 0 end do call mm_array_write(x,"Null vector",info,filename="vectors/x4.mtx") call mm_array_write(y,"Null vector",info,filename="vectors/y4.mtx") + deallocate(seed) deallocate(x) deallocate(y) @@ -273,7 +262,10 @@ module psb_spmm_test ! Skip comment lines (starting with %) do 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 read(line, *) rows, cols, nnz found = .true. diff --git a/test/computational_routines/spmm/spmm.f90 b/test/computational_routines/spmm/spmm.f90 index 88f2a7489..4b0423c73 100644 --- a/test/computational_routines/spmm/spmm.f90 +++ b/test/computational_routines/spmm/spmm.f90 @@ -1,6 +1,7 @@ program main use psb_spmm_test use psb_base_mod + use psb_util_mod implicit none @@ -12,10 +13,21 @@ program main ! parameters array character(len=64) :: x(4),y(4) - real(psb_ipk_) :: alpha(3), beta(3) + real(psb_spk_) :: alpha(3), beta(3) ! cycle indexes variables integer(psb_ipk_) :: i,j,k,h,l + character(len=256) :: matrix_file + logical :: matrix_exists + integer(psb_ipk_) :: info + integer(psb_ipk_) :: tests_number, count, last_percent + + ! sparse matrices + type(psb_sspmat_type) :: a + type(psb_lsspmat_type) :: aux_a + + ! matrix descriptor data structure + type(psb_desc_type) :: desc_a ! Communicator variable type(psb_ctxt_type) :: ctxt @@ -39,36 +51,118 @@ program main beta(2) = -sone beta(3) = szero + tests_number = size(x) * size(y) * size(alpha) * size(beta) + count = 0 + last_percent = -1 + call psb_init(ctxt) call psb_info(ctxt,my_rank,np) + matrix_file = "matrix/1138_bus.mtx" + inquire(file=matrix_file, exist=matrix_exists) + if (.not.matrix_exists) then + if (my_rank == psb_root_) then + write(psb_out_unit,*) 'Matrix file not found. Expected matrix/1138_bus.mtx' + end if + call psb_abort(ctxt) + end if + if(my_rank == psb_root_) then write(psb_out_unit,*) 'Welcome to PSBLAS version: ',psb_version_string_ write(psb_out_unit,*) 'This is the psb_spmm_test sample program' - call read_matrix_market_size("matrix/1138_bus.mtx", rows, cols) + call read_matrix_market_size(matrix_file, rows, cols) call generate_vectors(rows,cols) end if + call psb_bcast(ctxt,rows) + call psb_bcast(ctxt,cols) + call psb_barrier(ctxt) + !! Read and distribute matrix once + call mm_mat_read(aux_a,info,filename=matrix_file) + if(info /= psb_success_) then + write(psb_out_unit,*) "Error while reading matrix ", matrix_file + call psb_abort(ctxt) + end if + + rows = aux_a%get_nrows() + cols = aux_a%get_ncols() + call psb_matdist(aux_a, a, ctxt, desc_a, info, fmt="COO", parts=part_block) + if(info /= psb_success_) then + write(psb_out_unit,*) "Error while distributing matrix" + call psb_abort(ctxt) + end if - !! 1138_bus matrix (sparse) + !! bcsstk29 matrix (sparse) - reuse distributed matrix across all parameter combinations do i=1,size(x) do j=1,size(y) do k=1,size(alpha) do h=1,size(beta) - call psb_spmm_kernel(mtx_file="matrix/1138_bus.mtx",x_file=x(i), y_file=y(j), & - & alpha = alpha(k), beta = beta(h), ctxt = ctxt) + call psb_spmm_kernel(a=a, desc_a=desc_a, rows=rows, cols=cols, & + & x_file=x(i), y_file=y(j), alpha=alpha(k), beta=beta(h), ctxt=ctxt) + if (my_rank == psb_root_) then + count = count + 1 + call print_progress(count, tests_number, last_percent, "spmm testcases") + end if end do end do end do end do + !! Deallocate matrix structures + call psb_spfree(a, desc_a, info) + call psb_cdfree(desc_a, info) + call psb_exit(ctxt) return +contains + + subroutine print_progress(current, total, last_percent, label) + use iso_fortran_env, only: error_unit + implicit none + integer(psb_ipk_), intent(in) :: current, total + integer(psb_ipk_), intent(inout) :: last_percent + character(len=*), intent(in) :: label + integer(psb_ipk_) :: percent, filled, width, i + character(len=160) :: line + + if (total <= 0) return + percent = int(real(current) / real(total) * 100.0) + if (percent == last_percent) return + last_percent = percent + + width = 30 + filled = int(real(percent) / 100.0 * width) + + line = "[INFO] Progress " // trim(label) // ": [" + do i = 1, filled + line = trim(line) // "#" + end do + do i = filled + 1, width + line = trim(line) // "-" + end do + 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 + + 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 \ No newline at end of file diff --git a/test/computational_routines/spmm/spmm_checker b/test/computational_routines/spmm/spmm_checker deleted file mode 100755 index 24bb929bc..000000000 Binary files a/test/computational_routines/spmm/spmm_checker and /dev/null differ diff --git a/test/computational_routines/spmm/spmm_checker.c b/test/computational_routines/spmm/spmm_checker.c deleted file mode 100644 index 148e1dc30..000000000 --- a/test/computational_routines/spmm/spmm_checker.c +++ /dev/null @@ -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 -#include -#include - -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 \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; -} diff --git a/test/computational_routines/test.sh b/test/computational_routines/test.sh old mode 100755 new mode 100644 index 4b515a4d5..e9ba2758e --- a/test/computational_routines/test.sh +++ b/test/computational_routines/test.sh @@ -6,7 +6,7 @@ separator=$(printf "%0.s=" $(seq 1 $terminal_width)) # Generate separator of cor flag=0 log_file_name="psblas_test_results.log" base_dir=$(pwd) -skip=true +failed_tests="" # Define color codes GREEN="\033[0;32m" @@ -15,6 +15,7 @@ BLUE="\033[0;34m" YELLOW="\033[33m" RESET="\033[0m" + # Function to center text center_text() { local text="$1" @@ -40,54 +41,40 @@ echo -e "${BLUE}[INFO]\t Starting environment check for required modules...${RE # Check and load required modules -required_modules=("gnu/12.2.1-sys" "mpich/4.2.2" "cuda/12.5") - -for module in "${required_modules[@]}"; do - if ! module list 2>&1 | grep -q "$module"; then - echo -e "${YELLOW}[WARNING] Module not found, loading $module${RESET}" - module load "$module" - flag=1 - if ! grep -q "module load $module" "$HOME/.bashrc"; then - echo -e "[INFO]\t Adding 'module load $module' to $bashrc..." - echo "module load $module" >> "$HOME/.bashrc" - # else - # echo "'module load $module' is already present in $bashrc." - fi - else - echo -e "[INFO]\t Found module $module." - fi -done - -# Update .bashrc if necessary -if [ $flag -eq 1 ]; then - echo -e "[INFO]\t Reloading $HOME/.bashrc..." - source ~/.bashrc -fi - -# Inform the user about environment persistence -if [ "$$" -eq "$PPID" ]; then - echo -e "${YELLOW}[WARNING] Modules loaded in this script will not persist after the script finishes.${RESET}" - echo -e "${YELLOW}[WARNING] Run the script using 'source autotest.sh' to make the changes persist.${RESET}" -fi +# required_modules=("gnu/12.2.1-sys" "mpich/4.2.2" "cuda/12.5") + +# for module in "${required_modules[@]}"; do +# if ! module list 2>&1 | grep -q "$module"; then +# echo -e "${YELLOW}[WARNING] Module not found, loading $module${RESET}" +# module load "$module" +# flag=1 +# if ! grep -q "module load $module" "$HOME/.bashrc"; then +# echo -e "[INFO]\t Adding 'module load $module' to $bashrc..." +# echo "module load $module" >> "$HOME/.bashrc" +# # else +# # echo "'module load $module' is already present in $bashrc." +# fi +# else +# echo -e "[INFO]\t Found module $module." +# fi +# done +# +# # Update .bashrc if necessary +# if [ $flag -eq 1 ]; then +# echo -e "[INFO]\t Reloading $HOME/.bashrc..." +# source ~/.bashrc +# fi +# +# # Inform the user about environment persistence +# if [ "$$" -eq "$PPID" ]; then +# echo -e "${YELLOW}[WARNING] Modules loaded in this script will not persist after the script finishes.${RESET}" +# echo -e "${YELLOW}[WARNING] Run the script using 'source autotest.sh' to make the changes persist.${RESET}" +# fi echo -e "${BLUE}[INFO]\t Environment check for required modules completed.${RESET}" echo "" -if [ ! -f "./utils/psb_test_utils.o" ]; then - echo -e "${YELLOW}[WARNING] Executable not found. Compiling utils...${RESET}" - cd utils/ - make - cd .. -else - if [ $skip = false ]; then - echo -e "${BLUE}[INFO]\t The executable already exists, but recompilation was forced.${RESET}" - cd utils/ - make - cd .. - else - echo -e "${BLUE}[INFO]\t The executable already exists. Skipping the make process.${RESET}" - fi -fi + # Iterate through first-layer subdirectories for dir in "$base_dir"/*/; do @@ -95,35 +82,47 @@ for dir in "$base_dir"/*/; do if [ "$dir" = "." ]; then continue fi - # Skip 'utils' subdirectory - if [[ "$(basename "$dir")" == "utils" ]]; then - continue - fi echo -e "${BLUE}${separator}${RESET}" - echo -e "${BLUE}[INFO]\t Entering directory: $(pwd)/$(basename "$dir")${RESET}" + base_name=$(basename "$dir") + if [ "$base_name" = "common" ]; then + continue + fi + + echo -e "${BLUE}[INFO]\t Entering directory: $(pwd)/${base_name}${RESET}" ( # excecute script in a subshell, otherwise the dir search will stop cd "$dir" + autotest_status=0 # Check if autotest.sh exists before executing it if [ -f autotest.sh ]; then chmod +x autotest.sh - ./autotest.sh + ./autotest.sh + autotest_status=$? else echo -e "${YELLOW}[WARNING] autotest.sh not found in $(pwd). Skipping $(basename "$dir") kernel${RESET}" fi - # Append contents of any .log file in the subdirectory to the main log file - #log_files=$(find . -maxdepth 1 -type f -name "*.log") - #if [ -n "$log_files" ]; then - #for log_file in $log_files; do - # cat "$log_file" >> "../${log_file_name}" - # echo ' ' >> "../${log_file_name}" - #done - #else - # echo -e "${YELLOW}[WARNING] No .log files found in $(pwd). Skipping log append.${RESET}" - #fi + # Append contents of any .log file in the standardized logs/ directory (fallback to local *.log) + log_files=$(find ./logs -maxdepth 1 -type f -name "*.log" 2>/dev/null) + if [ -z "$log_files" ]; then + log_files=$(find . -maxdepth 1 -type f -name "*.log") + fi + if [ -n "$log_files" ]; then + for log_file in $log_files; do + cat "$log_file" >> "../${log_file_name}" + echo ' ' >> "../${log_file_name}" + done + else + echo -e "${YELLOW}[WARNING] No .log files found in $(pwd). Skipping log append.${RESET}" + 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 echo -e "${BLUE}[INFO]\t Leaving directory: $(pwd)/$(basename "$dir")${RESET}" @@ -134,4 +133,10 @@ done 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}" \ No newline at end of file +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 \ No newline at end of file diff --git a/test/computational_routines/utils/CMakeLists.txt b/test/computational_routines/utils/CMakeLists.txt deleted file mode 100644 index 0be149df2..000000000 --- a/test/computational_routines/utils/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -set(PSB_utils_source_files - psb_test_utils.f90 -) -foreach(file IN LISTS PSB_utils_source_files) - list(APPEND utils_source_files ${CMAKE_CURRENT_LIST_DIR}/${file}) -endforeach() - diff --git a/test/computational_routines/utils/Makefile b/test/computational_routines/utils/Makefile deleted file mode 100644 index bb802f4e3..000000000 --- a/test/computational_routines/utils/Makefile +++ /dev/null @@ -1,31 +0,0 @@ -INSTALLDIR=../../.. -INCDIR=$(INSTALLDIR)/include/ -MODDIR=$(INSTALLDIR)/modules/ -include $(INCDIR)/Make.inc.psblas -# -# Libraries used -# -LIBDIR = $(INSTALLDIR)/lib/ -PSBLAS_LIB = -L$(LIBDIR) -lpsb_util -lpsb_base -LDLIBS = $(PSBLDLIBS) - -FINCLUDES=$(FMFLAG)$(MODDIR) $(FMFLAG). - - -GREEN=\033[0;32m -RED=\033[0;31m -BLUE=\033[0;34m -YELLOW=\033[33m -END_COLOUR=\033[0m - - -all: - @$(FLINK) $(LOPT) -c psb_test_utils.f90 -o psb_test_utils.o -I$(MODDIR) -I. $(PSBLAS_LIB) $(LDLIBS) - @printf "$(BLUE)[INFO]\t Utilities for testing files generated correctly$(END_COLOUR)\n" - @printf "$(GREEN)[INFO]\t Compilation success!$(END_COLOUR)\n" - - -clean: - @rm -f *.o *$(.mod) - -.PHONY: all clean \ No newline at end of file diff --git a/test/computational_routines/utils/psb_test_env.inc b/test/computational_routines/utils/psb_test_env.inc deleted file mode 100644 index 938a6d96c..000000000 --- a/test/computational_routines/utils/psb_test_env.inc +++ /dev/null @@ -1,107 +0,0 @@ -!> @brief Function to initialize the test environment. -!! It is used to set the output unit and the kernel name. -!! -!! @param test_info The test information structure to be initialized. -!! -subroutine psb_test_init(test_info) - type(psb_test_info), intent(inout) :: test_info - integer(psb_ipk_) :: output_unit, info - ! MPI variables - integer(psb_ipk_) :: my_rank - - - call psb_init(test_info%ctxt) - call psb_info(test_info%ctxt,test_info%my_rank,test_info%np) - - ! Check if the kernel name is set - if (trim(test_info%kernel_name) == "default") then - write(*, '(A)') "Error: Kernel name is not set. Please set the kernel name before running the test." - call psb_exit(test_info%ctxt) - end if - - ! Set the output unit to stdout by default - if(test_info%np == 1) then - open(newunit=output_unit, file=trim(test_info%kernel_name)//'_test.log', & - & status='replace', action='write', iostat=info) - else - open(newunit=output_unit, file=trim(test_info%kernel_name)//'_test.log', & - & status='old', action='write', position='append', iostat=info) - end if - - ! Check if the file was opened successfully - if (info /= 0) then - write(*, '(A,I0)') "Error opening log file for kernel ", test_info%kernel_name - write(*, '(A,I0)') "I-O Status Code: ", info - write(*, '(A)') "Please check if the file is accessible and writable." - call psb_test_exit(test_info) - end if - - test_info%output_unit = output_unit - - write(test_info%output_unit,'(A,A)') 'Welcome to PSBLAS version: ',psb_version_string_ - write(test_info%output_unit,'(A)') 'This is the psb_gedot_test sample program' - write(test_info%output_unit,'(A,I0)') 'Number of processes used in this computation: ', test_info%np - write(test_info%output_unit,'(A)') '' - -end subroutine - -!> @brief Function to finalize the test environment, it is used to close the output unit -!! and finalize the PSBLAS context. -!! -!! @param test_info The test information structure to be finalized. -!! -subroutine psb_test_exit(test_info) - type(psb_test_info), intent(inout) :: test_info - integer(psb_ipk_) :: info - - ! Finalize test - if(test_info%my_rank == psb_root_) then - write(test_info%output_unit, *) "" - - ! Check if the kernel name is set to default - if(test_info%kernel_name == "default") then - write(test_info%output_unit,'(A)') "Warning: Kernel name is not set. Using default kernel name 'default'." - else - write(test_info%output_unit,'(A)') "Kernel name set to: " // trim(test_info%kernel_name) - end if - - ! Check the threshold type and value - if(test_info%mat_dist == DEFAULT) then - write(test_info%output_unit,'(A)') "Matrix distribution set to default (block row distribution)." - else - write(test_info%output_unit,'(A,I0)') "Matrix distribution set to: ", test_info%mat_dist - end if - - ! Check the threshold type and value - if(test_info%threshold_type == DEFAULT) then - write(test_info%output_unit,'(A,G20.10)') "Threshold type is set to default& - & using single precision IEEE unit roundoff as threshould ", 5.96D-08 - else if(test_info%threshold_type == VALUE) then - write(test_info%output_unit,'(A,G20.10)') "Threshold type is set to VALUE, so absolute error will be checked& - & using threshold: ", test_info%threshold - else if(test_info%threshold_type == GAMMA) then - write(test_info%output_unit,'(A, G20.10)') "Threshold type is set to GAMMA, so relative error will& - & be checked using threshold: ", test_info%threshold - end if - write(test_info%output_unit,'(A)') '' - - write(*,'(A)') "[INFO] Tests completed successfully!" - write(*,'(A,I0)') " Passed: ", test_info%success - write(*,'(A,I0)') " Failed: ", test_info%failure - write(*,'(A,I0)') " Total: ", test_info%total_tests - write(*,'(A)') "[INFO] Check " // trim(test_info%kernel_name) // "_test.log for a full description" - - ! Close the output unit - if (test_info%output_unit /= 0) then - close(test_info%output_unit, iostat=info) - if (info /= 0) then - write(*, '(A,I0,A,I0)') "[ERROR] Error closing log file for kernel ", & - & test_info%kernel_name, " I/O Status Code ", info - write(*,'(A)') '' - end if - end if - end if - - ! Finalize PSBLAS context - call psb_exit(test_info%ctxt) -end subroutine \ No newline at end of file diff --git a/test/computational_routines/utils/psb_test_log.inc b/test/computational_routines/utils/psb_test_log.inc deleted file mode 100644 index 9257e3e25..000000000 --- a/test/computational_routines/utils/psb_test_log.inc +++ /dev/null @@ -1,89 +0,0 @@ -!! Logger of the PSBLAS test suite. THis module should expose all the features -!! usefull for the PSBLAS test developers, in order to generate an automatic log of all the tests. -!! This has been implemented as a .inc file so that it is possible to use only -!! use psb_test_utils in other files instead of multiple includes. -!! -!! Authors: Luca Pepé Sciarria, Staccone Simone (Tor Vergata University) -!! - - -!> @brief Subroutine used to foramt correctly the message in the log about a test that has paseed -!! -!! @param test_info is a data structure containing all the metadata usefull for test output -!! @param out_string is the string to be printed in the log -!! -subroutine psb_test_log_passed(test_info, out_string) - type(psb_test_info), intent(in) :: test_info - character(len=*), intent(in) :: out_string - ! time stats variables - character(len=8) :: date - character(len=10) :: time - character(len=5) :: zones - integer :: values(8) - - call date_and_time(date, time, zones, values) - - write(test_info%output_unit,'("[", I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2,"] ",& - & A,I0,A,I0,T110,A)') & - & values(1), values(2), values(3), values(5), values(6), values(7), & - & out_string, & - & test_info%current_test , "/", test_info%total_tests, "[OK]" - -end subroutine - -!> @brief Subroutine used to format correctly the message in the log about a test that has failed -!! -!! @param test_info is a data structure containing all the metadata useful for test output -!! @param out_string is a string containing the error message to be printed -!! -subroutine psb_test_log_failed(test_info, out_string) - type(psb_test_info), intent(in) :: test_info - character(len=*), intent(in) :: out_string - ! time stats variables - character(len=8) :: date - character(len=10) :: time - character(len=5) :: zones - integer(psb_ipk_) :: values(8) - - call date_and_time(date, time, zones, values) - - write(test_info%output_unit,'("[", I4.4,"-",I2.2,"-",I2.2," ",I2.2,":",I2.2,":",I2.2,"] ",& - & A,I0,A,I0,T110,A)') & - & values(1), values(2), values(3), values(5), values(6), values(7), & - & out_string, & - & test_info%current_test , "/", test_info%total_tests, "[FAIL]" - -end subroutine - -!> @brief Subroutine used to show the advancement of the test excecution as a progress bar. -!! No output unit is specified since it is intended to be shown on the stdout. -!! -!! @param test_info is a data structure containing all the metadata usefull for test output -!! -subroutine psb_test_progress_bar(test_info) - type(psb_test_info), intent(in) :: test_info - integer(psb_ipk_) :: percent, bar_width, num_hashes, num_spaces - character(len=100) :: bar - - bar_width = 40 - - ! Calculate percentage - percent = int(real(test_info%current_test) / real(test_info%total_tests) * 100.0) - - ! Calculate how many '#' and '-' characters - num_hashes = int(real(bar_width) * percent / 100.0) - num_spaces = bar_width - num_hashes - - bar = '[' // repeat('#', num_hashes) // repeat('-', num_spaces) // ']' - write(*,'(A,A,I3,A)', advance='no') char(13), 'Progress: '//bar//' ', percent, '%' - call flush(6) - - ! Update stdout to get it back in normal mode when reaching the 100% - if(test_info%current_test == test_info%total_tests) then - write(*,'(A)', advance='no') char(13)//repeat(' ', 120) - write(*,*) - call flush(6) - end if -end subroutine - - diff --git a/test/computational_routines/utils/psb_test_utils.f90 b/test/computational_routines/utils/psb_test_utils.f90 deleted file mode 100644 index 6b4a5bec2..000000000 --- a/test/computational_routines/utils/psb_test_utils.f90 +++ /dev/null @@ -1,575 +0,0 @@ -!> @file psb_test_utils.f90ù -!! -!! @brief PSBLAS Test Utilities Module: -!! This module provides utility functions for testing PSBLAS computational routines. -!! It includes functions for initializing test environments, generating input vectors, -!! checking results, and logging test outcomes. It also implements validation criteria -!! for single and double precision computations. -!! -!! @date 2023-10-01 -!! @author Luca Pepé Sciarria, Simone Staccone -!! @university Tor Vergata, Rome, Italy -!! @version 1.0 -!! -module psb_test_utils - use psb_base_mod - use psb_util_mod - use, intrinsic :: ieee_arithmetic - - implicit none - - ! Define the enumeration values to represent testing criteria - integer, parameter :: DEFAULT = -1 - integer, parameter :: VALUE = 1 - integer, parameter :: GAMMA = 2 - - ! Define test metadata struct - type :: psb_test_info - integer(psb_ipk_) :: current_test = 1 !> The test that is currently beeing run - integer(psb_ipk_) :: total_tests = 1 !> The number of the total tests to run - integer(psb_ipk_) :: success = 0 !> the number of tests that succeded - integer(psb_ipk_) :: failure = 0 !> The number of tests that failed - integer(psb_ipk_) :: output_unit = 6 !> The output file handles (stdout by default) - character(len=32) :: kernel_name = "default" !> The PSBLAS kernel that is beeing tested - integer(psb_ipk_) :: threshold_type = DEFAULT !> The criteria used to pass a test (VAL,...) - real(psb_dpk_) :: threshold = 0.0 !> The threashold value used for acceptance - type(psb_ctxt_type) :: ctxt !> The PSBLAS context (Used for MPI communications) - integer(psb_ipk_) :: my_rank = 0 !> The rank of the current process in the MPI communicator - integer(psb_ipk_) :: np = 1 !> The number of processes in the MPI communicator - integer(psb_ipk_) :: mat_dist = DEFAULT !> The distribution of the matrix (default is block row distribution) - end type psb_test_info - - -contains - - include 'psb_test_log.inc' - include "psb_test_env.inc" - - - !> @brief Function to randomly generate x and y vectors - !! and save them on multiple files based on their - !! coefficients values. - !! - !! @param arr_size The size of the vectors to be generated. - !! - subroutine psb_test_generate_input_vectors(arr_size) - integer(psb_ipk_) :: arr_size - real(psb_dpk_), allocatable :: x(:), y(:) - integer(psb_ipk_) :: i, info - logical :: exists - - - ! Check if output directory exists - inquire(file='vectors/', exist=exists) - if (.not.exists) then - call system('mkdir vectors/') - end if - - allocate(x(arr_size)) - allocate(y(arr_size)) - - call random_init(repeatable=.true.,image_distinct=.true.) - call random_number(x) - call random_number(y) - - ! Write only positive in x_1 - call mm_array_write(x,"Positive vector",info,filename="vectors/x1.mtx") - call mm_array_write(y,"Positive vector",info,filename="vectors/y1.mtx") - - ! Write only negative in x_2 - do i=1,arr_size - x(i) = -x(i) - end do - - do i=1,arr_size - y(i) = -y(i) - end do - - call mm_array_write(x,"Negative vector",info,filename="vectors/x2.mtx") - call mm_array_write(y,"Negative vector",info,filename="vectors/y2.mtx") - - - ! Since numbers are less than one and always positive, we have to generate negative ones subtractiong 50 - do i=1,arr_size - x(i) = -x(i) ! Make the values positive again - x(i) = x(i) - 0.5 - end do - - do i=1,arr_size - y(i) = -y(i) ! Make the values positive again - y(i) = y(i) - 0.5 - end do - - ! Write random in x_3 - call mm_array_write(x,"Random vector",info,filename="vectors/x3.mtx") - call mm_array_write(y,"Random vector",info,filename="vectors/y3.mtx") - - ! Write zero in x_4 - do i=1,arr_size - x(i) = 0 - end do - - do i=1,arr_size - y(i) = 0 - end do - - call mm_array_write(x,"Null vector",info,filename="vectors/x4.mtx") - call mm_array_write(y,"Null vector",info,filename="vectors/y4.mtx") - - deallocate(x) - deallocate(y) - - end subroutine - - !> @brief Subroutine to save the result of a single precision computation - !! to a file in the results directory. - !! - !! @param result_single The single precision result to be saved. - !! @param test_info The test information structure containing the current test count. - !! - subroutine psb_test_save_result(result_single, test_info) - type(psb_test_info), intent(inout) :: test_info - real(psb_spk_), intent(in) :: result_single - integer(psb_ipk_) :: info, unit - character(len=32) :: filename - logical :: exists - - ! Check if results directory exists - inquire(file='results/', exist=exists) - if (.not.exists) then - call system('mkdir results/') - end if - - ! Set the filename based on the test count - write(filename, '(A,I0,A)') 'results/result_', test_info%current_test, '.txt' - - ! Open the file for writing - open(newunit=unit, file=trim(filename), status='replace', action='write', iostat=info) - - ! Check if the file was opened successfully - if (info /= 0) then - write(*, '(A,I0)') "Error opening result file: ", info - return - end if - - ! Write the result to the file - write(unit, '(F20.10)') result_single - - ! Close the file - close(unit, iostat=info) - end subroutine - - !> @brief Subroutine to save the result of a single precision vector computation - !! to a file in the results directory. - !! @param result_single The single precision vector result to be saved. - !! @param test_info The test information structure containing the current test count. - !! - subroutine psb_test_save_vector_result(result_single, test_info) - type(psb_test_info), intent(inout) :: test_info - real(psb_spk_), allocatable,intent(in) :: result_single(:) - integer(psb_ipk_) :: info, unit - character(len=32) :: filename - logical :: exists - - ! Check if results directory exists - inquire(file='results/', exist=exists) - if (.not.exists) then - call system('mkdir results/') - end if - - ! Set the filename based on the test count - write(filename, '(A,I0,A)') 'results/result_', test_info%current_test, '.txt' - - ! Open the file for writing - open(newunit=unit, file=trim(filename), status='replace', action='write', iostat=info) - - ! Check if the file was opened successfully - if (info /= 0) then - write(*, '(A,I0)') "Error opening result file: ", info - return - end if - - ! Close the file - close(unit, iostat=info) - - ! Write the result to the file - call mm_array_write(result_single,"",info,filename=filename) - if (info /= 0) then - write(*, '(A,I0)') "Error writing result file: ", info - return - end if - - - end subroutine - - - !> @brief Subroutine to shift the decimal point of a single precision number - !! and count the number of digits in the integer part. - !! - !! @param num The single precision number whose decimal point is to be shifted. - !! - !! @return shifted_num The single precision number with the decimal point shifted. - !! - function shift_decimal_double(num) result(shifted_num) - real(psb_dpk_) :: num, shifted_num - integer(psb_ipk_) :: n_digits - character(len=20) :: int_str - - - ! Convert the absolute value of the integer part to string - write(int_str, '(I0)') int(abs(num)) - - ! Count number of digits - ! int_digits = int(floor(log10(abs(num)))) + 1 - n_digits = len_trim(adjustl(int_str)) - - ! Shift the decimal point - shifted_num = abs(num) / 10.0**n_digits - - end function shift_decimal_double - - !> @brief Function to shift the decimal point of a single precision number. - !! - !! @param num The single precision number whose decimal point is to be shifted. - !! - !! @return shifted_num The single precision number with the decimal point shifted. - !! - function shift_decimal_single(num) result(shifted_num) - real(psb_spk_) :: num, shifted_num - integer(psb_ipk_) :: n_digits - character(len=20) :: int_str - - - ! Convert the absolute value of the integer part to string - write(int_str, '(I0)') int(abs(num)) - - ! Count number of digits - ! int_digits = int(floor(log10(abs(num)))) + 1 - n_digits = len_trim(adjustl(int_str)) - - ! Shift the decimal point - shifted_num = abs(num) / 10.0**n_digits - - end function shift_decimal_single - - - !> @brief Function to validate the test information structure. - !! It sets the threshold value based on the threshold type. - !! - !! @param result_single The single precision result to be validated. - !! @param result_double The double precision result to be validated. - !! @param test_info The test information structure to be validated. - !! @param arr_size The size of the array to be used for validation. - !! - subroutine psb_test_validate(result_single, result_double, test_info, arr_size, pass) - type(psb_test_info), intent(inout) :: test_info - real(psb_spk_), intent(in) :: result_single - real(psb_dpk_), intent(in) :: result_double - integer(psb_ipk_), intent(in) :: arr_size - logical, intent(inout) :: pass - - real(psb_spk_) :: local_single - real(psb_dpk_) :: local_double - integer(psb_ipk_) :: n - real(psb_dpk_) :: gamma_n, unit_roundoff, delta, rel_err - - unit_roundoff = 5.96D-08 !! 1.11D-16 - - delta = abs(result_double - real(result_single,psb_dpk_)) - rel_err = delta / abs(real(result_single,psb_dpk_)) - n = (arr_size / test_info%np) + (test_info%np - 1) - - - ! write(psb_out_unit,'(A,F20.10)') "Computed delta: ", delta - - if(test_info%threshold_type == VALUE) then - ! Lower down values in order to match threshold for absolute error check - local_single = shift_decimal_single(result_single) - local_double = shift_decimal_double(result_double) - - delta = abs(result_double - real(result_single,psb_dpk_)) - - if(delta < test_info%threshold) then - pass = .true. - else - pass = .false. - end if - else if(test_info%threshold_type == GAMMA) then - - if(n * unit_roundoff >= 1) then - write(test_info%output_unit,'(A)') "Error: Invalid GAMMA computation, n * U is greater than 1" - write(*,*) - call psb_test_exit(test_info) - end if - - gamma_n = (n * unit_roundoff) / (1.0D0 - real(n * unit_roundoff, psb_dpk_) ) - test_info%threshold = gamma_n - - !! Handle case when result_single is zero - if ((ieee_is_nan(rel_err)).and.(result_single == 0.0D0)) then - rel_err = 0.0D0 - end if - - if( rel_err < gamma_n) then - pass = .true. - else - pass = .false. - end if - - else - write(test_info%output_unit,'(A,I0)') "Error: Invalid threshold type: ", test_info%threshold_type - write(*,*) - call psb_test_exit(test_info) - end if - - end subroutine - - - !> @brief Subroutine to check the results of a single and double precision computation. - !! It compares the results and logs the outcome. - !! - !! @param result_single The single precision result to be checked. - !! @param result_double The double precision result to be checked. - !! @param test_info The test information structure containing the threshold and logging details. - !! @param arr_size The size of the array used in the computation. - !! - subroutine psb_test_single_double_scalar_check(result_single, result_double, test_info, arr_size) - type(psb_test_info), intent(inout) :: test_info - real(psb_spk_), intent(inout) :: result_single - real(psb_dpk_), intent(inout) :: result_double - real(psb_dpk_) :: delta - integer(psb_ipk_) :: int_digits, arr_size - logical :: pass - character(len=64) :: out_string - - out_string = "Double precision check: " - - - call psb_test_progress_bar(test_info) - call psb_test_validate(result_single, result_double, test_info, arr_size, pass) - - if(pass .eqv. .true.) then - call psb_test_log_passed(test_info, out_string) - test_info%success = test_info%success + 1 - else - call psb_test_log_failed(test_info, out_string) - test_info%failure = test_info%failure + 1 - write(psb_out_unit,'(A,F20.10)') "Threshold used: ", test_info%threshold - end if - write(psb_out_unit,'(A,F20.10)') "Single precision result: ", result_single - write(psb_out_unit,'(A,F20.10)') "Double precision result: ", result_double - end subroutine - - !> @brief Subroutine to check the results of a single and double precision vector computation. - !! It compares the results element-wise and logs the outcome. - !! @param result_single The single precision vector result to be checked. - !! @param result_double The double precision vector result to be checked. - !! @param test_info The test information structure containing the threshold and logging details. - !! @param arr_size The size of the array used in the computation. - !! - subroutine psb_test_single_double_vector_check(result_single, result_double, test_info, arr_size) - type(psb_test_info), intent(inout) :: test_info - real(psb_spk_), allocatable, intent(inout) :: result_single(:) - real(psb_dpk_), allocatable, intent(inout) :: result_double(:) - real(psb_dpk_) :: delta - integer(psb_ipk_) :: int_digits, arr_size, i - logical :: pass - character(len=64) :: out_string - - out_string = "Double precision check: " - pass = .true. - - call psb_test_progress_bar(test_info) - do i = 1, size(result_single) - call psb_test_validate(result_single(i), result_double(i), test_info, arr_size, pass) - if(pass .eqv. .false. ) exit - end do - - if(pass .eqv. .true.) then - call psb_test_log_passed(test_info, out_string) - test_info%success = test_info%success + 1 - else - call psb_test_log_failed(test_info, out_string) - test_info%failure = test_info%failure + 1 - write(psb_out_unit,'(A,I0)') "Comparison error occurred at index: ", i - write(psb_out_unit,'(A,F20.10)') "Single precision result: ", result_single(i) - write(psb_out_unit,'(A,F20.10)') "Double precision result: ", result_double(i) - end if - - ! write(psb_out_unit,'(A,F20.10)') "Threshold used: ", test_info%threshold - end subroutine - - - !> @brief Subroutine to check the global and local results of a single precision computation. - !! It compares the global result with the local result and logs the outcome. - !! - !! @param global_result_single The global single precision result to be checked. - !! @param result_single The local single precision result to be checked. - !! @param test_info The test information structure containing the logging details. - !! - subroutine psb_test_check_global_local(global_result_single, result_single, test_info) - real(psb_spk_), intent(in) :: global_result_single,result_single - type(psb_test_info) :: test_info - character(len=64) :: out_string - - out_string = "Global vs Local check: " - - call psb_test_progress_bar(test_info) - - ! Check if the global result is equal to the local result - if (global_result_single == result_single) then - call psb_test_log_passed(test_info, out_string) - test_info%success = test_info%success + 1 - else - call psb_test_log_failed(test_info, out_string) - test_info%failure = test_info%failure + 1 - end if - write(test_info%output_unit,'(A,F20.10)') "Global single precision result: ", global_result_single - write(test_info%output_unit,'(A,F20.10)') "Local single precision result: ", result_single - end subroutine - - - !> @brief Subroutine to check the result of a single precision computation - !! against a previously saved result from a single process test. - !! - !! @param result_single The single precision result to be checked. - !! @param test_info The test information structure containing the current test count. - !! - subroutine psb_test_process_check(result_single, test_info) - real(psb_spk_), intent(inout) :: result_single - type(psb_test_info), intent(inout) :: test_info - real(psb_spk_) :: saved_result, local_saved, local_single - integer(psb_ipk_) :: unit, info, file_size - character(len=32) :: filename - logical :: exists - character(len=64) :: out_string - - out_string = "Multiprocess check: " - call psb_test_progress_bar(test_info) - - ! Set the filename based on the test count - write(filename, '(A,I0,A)') 'results/result_', test_info%current_test, '.txt' - - ! Check if the file exists - inquire(file=trim(filename), exist=exists) - if (.not.exists) then - write(test_info%output_unit, '(A)') "Error: Result file does not exist." - write(test_info%output_unit, '(A)') "Please ensure the single process test is run first to generate the result file." - call psb_test_exit(test_info) - end if - - ! Open the file for reading - open(newunit=unit, file=trim(filename), status='old', action='read', iostat=info) - - ! Check if the file was opened successfully - if (info /= 0) then - write(*, '(A,I0)') "Error opening result file: ", info - call psb_test_exit(test_info) - end if - - ! Read the saved result - read(unit, '(F20.10)') saved_result - - ! Close the file - close(unit, iostat=info) - - local_saved = shift_decimal_single(saved_result) - local_single = shift_decimal_single(result_single) - - ! Compare the saved result with the new result_single - if (abs(local_saved - local_single) <= test_info%threshold) then - call psb_test_log_passed(test_info, out_string) - test_info%success = test_info%success + 1 - else - call psb_test_log_failed(test_info, out_string) - test_info%failure = test_info%failure + 1 - write(test_info%output_unit, '(A,F20.10)') "Delta: ", abs(saved_result - result_single) - end if - - write(test_info%output_unit, '(A,F20.10)') "Multi-process result: ", result_single - write(test_info%output_unit, '(A,F20.10)') "Single process result: ", saved_result - - end subroutine - - - subroutine psb_test_process_vector_check(result_single, test_info) - real(psb_spk_), allocatable, intent(inout) :: result_single(:) - type(psb_test_info), intent(inout) :: test_info - real(psb_spk_), allocatable :: saved_result(:) - integer(psb_ipk_) :: unit, info, file_size, int_digits, i - character(len=32) :: filename - logical :: exists, pass - character(len=64) :: out_string - - out_string = "Multiprocess check: " - pass = .true. - call psb_test_progress_bar(test_info) - - - ! Set the filename based on the test count - write(filename, '(A,I0,A)') 'results/result_', test_info%current_test, '.txt' - - ! Check if the file exists - inquire(file=trim(filename), exist=exists) - if (.not.exists) then - write(test_info%output_unit, '(A)') "Error: Result file does not exist." - write(test_info%output_unit, '(A)') "Please ensure the single process test is run first to generate the result file." - call psb_test_exit(test_info) - end if - - ! Open the file for reading - open(newunit=unit, file=trim(filename), status='old', action='read', iostat=info) - - ! Check if the file was opened successfully - if (info /= 0) then - write(*, '(A,I0)') "Error opening result file: ", info - call psb_test_exit(test_info) - end if - - ! Close the file - close(unit, iostat=info) - - ! Read the saved result - call mm_array_read(saved_result, info, filename=trim(filename)) - if (info /= 0) then - write(*, '(A,I0)') "Error reading result file: ", info - call psb_test_exit(test_info) - end if - - do i = 1, size(result_single) - ! call shift_decimal_single(saved_result(i),int_digits) - ! call shift_decimal_single(result_single(i),int_digits) - - ! Compare the saved result with the new result_single - if (abs(saved_result(i) - result_single(i)) > test_info%threshold) then - pass = .false. - - write(psb_out_unit,'(A,I0)') "Comparison error occurred at index: ", i - write(test_info%output_unit, '(F20.10,F20.10,A,L,A,L)') & - & saved_result(i) - result_single(i), result_single(i) - saved_result(i), " ", & - & saved_result(i) - result_single(i) == 0, " ", result_single(i) - saved_result(i) == 0 - write(test_info%output_unit, '(A,F20.10)') "Multi-process result: ", result_single(i) - write(test_info%output_unit, '(A,F20.10)') "Single process result: ", saved_result(i) - exit - end if - end do - - if(pass .eqv. .true.) then - call psb_test_log_passed(test_info, out_string) - test_info%success = test_info%success + 1 - else - call psb_test_log_failed(test_info, out_string) - test_info%failure = test_info%failure + 1 - - - - end if - - - - - end subroutine - - - -end module psb_test_utils \ No newline at end of file diff --git a/test/cudakern/Makefile b/test/cudakern/Makefile old mode 100755 new mode 100644 index e1c3b78dc..34e5bed66 --- a/test/cudakern/Makefile +++ b/test/cudakern/Makefile @@ -8,7 +8,7 @@ PSBLIBDIR=$(TOPDIR)/lib/ OPTDIR=$(LIBDIR) PSBINCDIR=$(TOPDIR)/include PSBMODDIR=$(TOPDIR)/modules -PSBLAS_LIB= -L$(LIBDIR) -L$(PSBLIBDIR) $(LCUDA) -lpsb_ext -lpsb_util -lpsb_base +PSBLAS_LIB= -L$(LIBDIR) -L$(PSBLIBDIR) $(LPSB_CUDA) -lpsb_ext -lpsb_util -lpsb_base INCDIR=$(TOPDIR)/include MODDIR=$(TOPDIR)/modules @@ -27,7 +27,7 @@ dir: (if test ! -d $(EXEDIR); then mkdir $(EXEDIR); fi) dpdegenmv.o spdegenmv.o: data_input.o dpdegenmv: $(DPGOBJS) - $(FLINK) $(LOPT) $(DPGOBJS) -o dpdegenmv $(FINCLUDES) $(PSBLAS_LIB) $(LDLIBS) + $(FLINK) $(LOPT) $(DPGOBJS) -o dpdegenmv $(FINCLUDES) $(PSBLAS_LIB) $(LDLIBS) -lstdc++ /bin/mv dpdegenmv $(EXEDIR) spdegenmv: $(SPGOBJS) $(FLINK) $(LOPT) $(SPGOBJS) -o spdegenmv $(PSBLAS_LIB) $(LDLIBS) diff --git a/test/cudakern/data_input.f90 b/test/cudakern/data_input.f90 index 274cb7ad5..b63792c39 100644 --- a/test/cudakern/data_input.f90 +++ b/test/cudakern/data_input.f90 @@ -21,7 +21,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the MLD2P4 group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/cudakern/dpdegenmv.F90 b/test/cudakern/dpdegenmv.F90 index d97a06aae..bd700012d 100644 --- a/test/cudakern/dpdegenmv.F90 +++ b/test/cudakern/dpdegenmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/cudakern/spdegenmv.F90 b/test/cudakern/spdegenmv.F90 index 7e8280111..7e7c4384a 100644 --- a/test/cudakern/spdegenmv.F90 +++ b/test/cudakern/spdegenmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/fileread/getp.f90 b/test/fileread/getp.f90 index db8207b60..32cb3de11 100644 --- a/test/fileread/getp.f90 +++ b/test/fileread/getp.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -67,7 +67,9 @@ contains write(psb_err_unit,*) 'Opened file ',trim(filename),' for input' end if else - inp_unit=psb_inp_unit + write(psb_err_unit,*) 'Usage: psb_d_fileread ctrl-file ' + call psb_abort(ctxt) + stop end if ! Read Input Parameters read(inp_unit,*) ip @@ -187,7 +189,9 @@ contains write(psb_err_unit,*) 'Opened file ',trim(filename),' for input' end if else - inp_unit=inp_unit + write(psb_err_unit,*) 'Usage: psb_s_fileread ctrl-file ' + call psb_abort(ctxt) + stop end if ! Read Input Parameters read(inp_unit,*) ip diff --git a/test/fileread/psb_cf_sample.f90 b/test/fileread/psb_cf_sample.f90 index 9fd965aea..426d03d22 100644 --- a/test/fileread/psb_cf_sample.f90 +++ b/test/fileread/psb_cf_sample.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/fileread/psb_df_sample.f90 b/test/fileread/psb_df_sample.f90 index b07e4ede5..f2c5257dc 100644 --- a/test/fileread/psb_df_sample.f90 +++ b/test/fileread/psb_df_sample.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/fileread/psb_sf_sample.f90 b/test/fileread/psb_sf_sample.f90 index 289df307c..5b5327567 100644 --- a/test/fileread/psb_sf_sample.f90 +++ b/test/fileread/psb_sf_sample.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/fileread/psb_zf_sample.f90 b/test/fileread/psb_zf_sample.f90 index b8385922d..91af6a425 100644 --- a/test/fileread/psb_zf_sample.f90 +++ b/test/fileread/psb_zf_sample.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/kernel/d_file_spmv.f90 b/test/kernel/d_file_spmv.f90 index 40a799828..e4b4bd4e0 100644 --- a/test/kernel/d_file_spmv.f90 +++ b/test/kernel/d_file_spmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/kernel/pdgenspmv.F90 b/test/kernel/pdgenspmv.F90 index 736c1eeee..fa8bd0d40 100644 --- a/test/kernel/pdgenspmv.F90 +++ b/test/kernel/pdgenspmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/kernel/s_file_spmv.f90 b/test/kernel/s_file_spmv.f90 index ebbb85cde..4843bd21e 100644 --- a/test/kernel/s_file_spmv.f90 +++ b/test/kernel/s_file_spmv.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/kernel/vecoperation.f90 b/test/kernel/vecoperation.f90 index 3860a3c39..56f959fbb 100644 --- a/test/kernel/vecoperation.f90 +++ b/test/kernel/vecoperation.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/omp/psb_tomp.F90 b/test/omp/psb_tomp.F90 index 45136ad00..c7274f670 100644 --- a/test/omp/psb_tomp.F90 +++ b/test/omp/psb_tomp.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/openacc/Makefile b/test/openacc/Makefile index 5b69c2d65..891789f44 100644 --- a/test/openacc/Makefile +++ b/test/openacc/Makefile @@ -12,9 +12,9 @@ EXEDIR=./runs PSBLAS_LIB= -L$(LIBDIR) -L$(PSBLIBDIR) -lpsb_openacc -lpsb_ext -lpsb_util -lpsb_linsolve -lpsb_prec -lpsb_base LDLIBS=$(PSBGPULDLIBS) -FINCLUDES=$(FMFLAG)$(MODDIR) $(FMFLAG)$(INCDIR) $(FMFLAG). $(FMFLAG)$(PSBMODDIR) $(FMFLAG)$(PSBINCDIR) $(LIBRSB_DEFINES) +FINCLUDES= $(FMFLAG). $(FMFLAG)$(MODDIR) $(FMFLAG)$(INCDIR) $(FMFLAG)$(PSBMODDIR) $(FMFLAG)$(PSBINCDIR) $(LIBRSB_DEFINES) -FFLAGS=-O3 -march=native -fopenacc -foffload=nvptx-none="-march=sm_75" +FFLAGS=-O3 -march=native $(FCOPENACC) -DPSB_OPENACC -DPSB_HAVE_CUDA CFLAGS=-O3 -march=native VTC=vectoacc.o @@ -23,7 +23,7 @@ CSRC=timers.c OBJS=$(SRCS:.F90=.o) $(CSRC:.c=.o) -all: dir psb_d_oacc_pde3d dpdegenmv +all: dir dpdegenmv #$(OBJS) # $(FC) $(FFLAGS) $(OBJS) -o datavect $(FINCLUDES) $(PSBLAS_LIB) $(LDLIBS) @@ -42,14 +42,10 @@ dir: %.o: %.c $(CC) $(CFLAGS) $(FINCLUDES) -c $< -o $@ -psb_d_oacc_pde3d: - mpifort -fallow-argument-mismatch -frecursive -g -O3 -frecursive -I../../modules/ -I. -DOPENACC -DHAVE_LAPACK -DHAVE_FLUSH_STMT -DLPK8 -DIPK4 -DMPI_MOD -c psb_d_oacc_pde3d.F90 -o psb_d_oacc_pde3d.o - $(FLINK) -fopenacc -DOPENACC psb_d_oacc_pde3d.o -o psb_d_oacc_pde3d $(PSBLAS_LIB) $(LDLIBS) - /bin/mv psb_d_oacc_pde3d $(EXEDIR) -dpdegenmv: - mpifort -fallow-argument-mismatch -frecursive -g -O3 -frecursive -I../../modules/ -I. -DOPENACC -DHAVE_LAPACK -DHAVE_FLUSH_STMT -DLPK8 -DIPK4 -DMPI_MOD -c dpdegenmv.F90 -o dpdegenmv.o - $(FLINK) -fopenacc -DOPENACC dpdegenmv.o -o dpdegenmv $(PSBLAS_LIB) $(LDLIBS) +dpdegenmv.o: psb_d_pde3d_mod.o +dpdegenmv: dpdegenmv.o psb_d_pde3d_mod.o + $(FLINK) $(FCOPENACC) dpdegenmv.o psb_d_pde3d_mod.o -o dpdegenmv -fuse-ld=mold $(PSBLAS_LIB) $(LDLIBS) /bin/mv dpdegenmv $(EXEDIR) clean: diff --git a/test/openacc/dpdegenmv.F90 b/test/openacc/dpdegenmv.F90 index 3342c6dcc..1bf62b336 100644 --- a/test/openacc/dpdegenmv.F90 +++ b/test/openacc/dpdegenmv.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -37,531 +37,17 @@ ! the main PSBLAS library. ! ! -module psb_d_pde3d_mod - - - use psb_base_mod, only : psb_dpk_, psb_ipk_, psb_lpk_, psb_desc_type,& - & psb_dspmat_type, psb_d_vect_type, dzero,& - & psb_d_base_sparse_mat, psb_d_base_vect_type, & - & psb_i_base_vect_type, psb_l_base_vect_type - - interface - function d_func_3d(x,y,z) result(val) - import :: psb_dpk_ - real(psb_dpk_), intent(in) :: x,y,z - real(psb_dpk_) :: val - end function d_func_3d - end interface - - interface psb_gen_pde3d - module procedure psb_d_gen_pde3d - end interface psb_gen_pde3d - -contains - - function d_null_func_3d(x,y,z) result(val) - - real(psb_dpk_), intent(in) :: x,y,z - real(psb_dpk_) :: val - - val = dzero - - end function d_null_func_3d - ! - ! functions parametrizing the differential equation - ! - - ! - ! Note: b1, b2 and b3 are the coefficients of the first - ! derivative of the unknown function. The default - ! we apply here is to have them zero, so that the resulting - ! matrix is symmetric/hermitian and suitable for - ! testing with CG and FCG. - ! When testing methods for non-hermitian matrices you can - ! change the B1/B2/B3 functions to e.g. done/sqrt((3*done)) - ! - function b1(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: b1 - real(psb_dpk_), intent(in) :: x,y,z - b1=done/sqrt((3*done)) - end function b1 - function b2(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: b2 - real(psb_dpk_), intent(in) :: x,y,z - b2=done/sqrt((3*done)) - end function b2 - function b3(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: b3 - real(psb_dpk_), intent(in) :: x,y,z - b3=done/sqrt((3*done)) - end function b3 - function c(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: c - real(psb_dpk_), intent(in) :: x,y,z - c=dzero - end function c - function a1(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: a1 - real(psb_dpk_), intent(in) :: x,y,z - a1=done/80 - end function a1 - function a2(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: a2 - real(psb_dpk_), intent(in) :: x,y,z - a2=done/80 - end function a2 - function a3(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: a3 - real(psb_dpk_), intent(in) :: x,y,z - a3=done/80 - end function a3 - function g(x,y,z) - use psb_base_mod, only : psb_dpk_, done, dzero - implicit none - real(psb_dpk_) :: g - real(psb_dpk_), intent(in) :: x,y,z - g = dzero - if (x == done) then - g = done - else if (x == dzero) then - g = exp(y**2-z**2) - end if - end function g - - - ! - ! subroutine to allocate and fill in the coefficient matrix and - ! the rhs. - ! - subroutine psb_d_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info,& - & f,amold,vmold,imold,partition,nrl,iv,tnd) - use psb_base_mod - use psb_util_mod - ! - ! Discretizes the partial differential equation - ! - ! a1 dd(u) a2 dd(u) a3 dd(u) b1 d(u) b2 d(u) b3 d(u) - ! - ------ - ------ - ------ + ----- + ------ + ------ + c u = f - ! dxdx dydy dzdz dx dy dz - ! - ! with Dirichlet boundary conditions - ! u = g - ! - ! on the unit cube 0<=x,y,z<=1. - ! - ! - ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. - ! - implicit none - integer(psb_ipk_) :: idim - type(psb_dspmat_type) :: a - type(psb_d_vect_type) :: xv,bv - type(psb_desc_type) :: desc_a - type(psb_ctxt_type) :: ctxt - integer(psb_ipk_) :: info - character(len=*) :: afmt - procedure(d_func_3d), optional :: f - class(psb_d_base_sparse_mat), optional :: amold - class(psb_d_base_vect_type), optional :: vmold - class(psb_i_base_vect_type), optional :: imold - integer(psb_ipk_), optional :: partition, nrl,iv(:) - logical, optional :: tnd - ! Local variables. - - integer(psb_ipk_), parameter :: nb=20 - type(psb_d_csc_sparse_mat) :: acsc - type(psb_d_coo_sparse_mat) :: acoo - type(psb_d_csr_sparse_mat) :: acsr - real(psb_dpk_) :: zt(nb),x,y,z - integer(psb_ipk_) :: nnz,nr,nlr,i,j,ii,ib,k, partition_ - integer(psb_lpk_) :: m,n,glob_row,nt - integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner - ! For 3D partition - ! Note: integer control variables going directly into an MPI call - ! must be 4 bytes, i.e. psb_mpk_ - integer(psb_mpk_) :: npdims(3), npp, minfo - integer(psb_ipk_) :: npx,npy,npz, iamx,iamy,iamz,mynx,myny,mynz - integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) - ! Process grid - integer(psb_ipk_) :: np, iam - integer(psb_ipk_) :: icoeff - integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) - real(psb_dpk_), allocatable :: val(:) - ! deltah dimension of each grid cell - ! deltat discretization time - real(psb_dpk_) :: deltah, sqdeltah, deltah2 - real(psb_dpk_), parameter :: rhs=dzero,one=done,zero=dzero - real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb - integer(psb_ipk_) :: err_act - procedure(d_func_3d), pointer :: f_ - logical :: tnd_ - character(len=20) :: name, ch_err,tmpfmt - - info = psb_success_ - name = 'create_matrix' - call psb_erractionsave(err_act) - - call psb_info(ctxt, iam, np) - - - if (present(f)) then - f_ => f - else - f_ => d_null_func_3d - end if - - deltah = done/(idim+2) - sqdeltah = deltah*deltah - deltah2 = (2*done)* deltah - - if (present(partition)) then - if ((1<= partition).and.(partition <= 3)) then - partition_ = partition - else - write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' - partition_ = 3 - end if - else - partition_ = 3 - end if - - ! initialize array descriptor and sparse matrix storage. provide an - ! estimate of the number of non zeroes - - m = (1_psb_lpk_*idim)*idim*idim - n = m - nnz = ((n*7)/(np)) - if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n - t0 = psb_wtime() - select case(partition_) - case(1) - ! A BLOCK partition - if (present(nrl)) then - nr = nrl - else - ! - ! Using a simple BLOCK distribution. - ! - nt = (m+np-1)/np - nr = max(0,min(nt,m-(iam*nt))) - end if - - nt = nr - call psb_sum(ctxt,nt) - if (nt /= m) then - write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - return - end if - - ! - ! First example of use of CDALL: specify for each process a number of - ! contiguous rows - ! - call psb_cdall(ctxt,desc_a,info,nl=nr) - myidx = desc_a%get_global_indices() - nlr = size(myidx) - - case(2) - ! A partition defined by the user through IV - - if (present(iv)) then - if (size(iv) /= m) then - write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - return - end if - else - write(psb_err_unit,*) iam, 'Initialization error: IV not present' - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - return - end if - - ! - ! Second example of use of CDALL: specify for each row the - ! process that owns it - ! - call psb_cdall(ctxt,desc_a,info,vg=iv) - myidx = desc_a%get_global_indices() - nlr = size(myidx) - - case(3) - ! A 3-dimensional partition - - ! A nifty MPI function will split the process list - npdims = 0 - call mpi_dims_create(np,3,npdims,info) - npx = npdims(1) - npy = npdims(2) - npz = npdims(3) - - allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) - ! We can reuse idx2ijk for process indices as well. - call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) - ! Now let's split the 3D cube in hexahedra - call dist1Didx(bndx,idim,npx) - mynx = bndx(iamx+1)-bndx(iamx) - call dist1Didx(bndy,idim,npy) - myny = bndy(iamy+1)-bndy(iamy) - call dist1Didx(bndz,idim,npz) - mynz = bndz(iamz+1)-bndz(iamz) - - ! How many indices do I own? - nlr = mynx*myny*mynz - allocate(myidx(nlr)) - ! Now, let's generate the list of indices I own - nr = 0 - do i=bndx(iamx),bndx(iamx+1)-1 - do j=bndy(iamy),bndy(iamy+1)-1 - do k=bndz(iamz),bndz(iamz+1)-1 - nr = nr + 1 - call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) - end do - end do - end do - if (nr /= nlr) then - write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& - & nr,nlr,mynx,myny,mynz - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - end if - - ! - ! Third example of use of CDALL: specify for each process - ! the set of global indices it owns. - ! - call psb_cdall(ctxt,desc_a,info,vl=myidx) - - case default - write(psb_err_unit,*) iam, 'Initialization error: should not get here' - info = -1 - call psb_barrier(ctxt) - call psb_abort(ctxt) - return - end select - - - if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz,& - & dupl=psb_dupl_err_) - ! define rhs from boundary conditions; also build initial guess - if (info == psb_success_) call psb_geall(xv,desc_a,info) - if (info == psb_success_) call psb_geall(bv,desc_a,info) - - call psb_barrier(ctxt) - talc = psb_wtime()-t0 - - if (info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='allocation rout.' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - - ! we build an auxiliary matrix consisting of one row at a - ! time; just a small matrix. might be extended to generate - ! a bunch of rows per call. - ! - allocate(val(20*nb),irow(20*nb),& - &icol(20*nb),stat=info) - if (info /= psb_success_ ) then - info=psb_err_alloc_dealloc_ - call psb_errpush(info,name) - goto 9999 - endif - - - ! loop over rows belonging to current process in a block - ! distribution. - - call psb_barrier(ctxt) - t1 = psb_wtime() - do ii=1, nlr,nb - ib = min(nb,nlr-ii+1) - icoeff = 1 - do k=1,ib - i=ii+k-1 - ! local matrix pointer - glob_row=myidx(i) - ! compute gridpoint coordinates - call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) - ! x, y, z coordinates - x = (ix-1)*deltah - y = (iy-1)*deltah - z = (iz-1)*deltah - zt(k) = f_(x,y,z) - ! internal point: build discretization - ! - ! term depending on (x-1,y,z) - ! - val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 - if (ix == 1) then - zt(k) = g(dzero,y,z)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - ! term depending on (x,y-1,z) - val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 - if (iy == 1) then - zt(k) = g(x,dzero,z)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - ! term depending on (x,y,z-1) - val(icoeff)=-a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 - if (iz == 1) then - zt(k) = g(x,y,dzero)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - - ! term depending on (x,y,z) - val(icoeff)=(2*done)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & - & + c(x,y,z) - call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - ! term depending on (x,y,z+1) - val(icoeff)=-a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 - if (iz == idim) then - zt(k) = g(x,y,done)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - ! term depending on (x,y+1,z) - val(icoeff)=-a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 - if (iy == idim) then - zt(k) = g(x,done,z)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - ! term depending on (x+1,y,z) - val(icoeff)=-a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 - if (ix==idim) then - zt(k) = g(done,y,z)*(-val(icoeff)) + zt(k) - else - call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) - irow(icoeff) = glob_row - icoeff = icoeff+1 - endif - - end do - call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) - if(info /= psb_success_) exit - call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) - if(info /= psb_success_) exit - zt(:)=dzero - call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) - if(info /= psb_success_) exit - end do - - tgen = psb_wtime()-t1 - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='insert rout.' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - - deallocate(val,irow,icol) - - call psb_barrier(ctxt) - t1 = psb_wtime() - call psb_cdasb(desc_a,info,mold=imold) - tcdasb = psb_wtime()-t1 - call psb_barrier(ctxt) - t1 = psb_wtime() - if (info == psb_success_) then - if (present(amold)) then - call psb_spasb(a,desc_a,info,mold=amold,bld_and=tnd) - else - call psb_spasb(a,desc_a,info,afmt=afmt,bld_and=tnd) - end if - end if - call psb_barrier(ctxt) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='asb rout.' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold) - if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) - if(info /= psb_success_) then - info=psb_err_from_subroutine_ - ch_err='asb rout.' - call psb_errpush(info,name,a_err=ch_err) - goto 9999 - end if - tasb = psb_wtime()-t1 - call psb_barrier(ctxt) - ttot = psb_wtime() - t0 - - call psb_amx(ctxt,talc) - call psb_amx(ctxt,tgen) - call psb_amx(ctxt,tasb) - call psb_amx(ctxt,ttot) - if(iam == psb_root_) then - tmpfmt = a%get_fmt() - write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")')& - & tmpfmt - write(psb_out_unit,'("-allocation time : ",es12.5)') talc - write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen - write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb - write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb - write(psb_out_unit,'("-total time : ",es12.5)') ttot - - end if - call psb_erractionrestore(err_act) - return - -9999 call psb_error_handler(ctxt,err_act) - - return - end subroutine psb_d_gen_pde3d - - -end module psb_d_pde3d_mod - - program pdgenmv use psb_base_mod use psb_util_mod use psb_ext_mod -#ifdef OPENACC + use psb_d_pde3d_mod +#ifdef PSB_OPENACC use psb_oacc_mod #endif - use psb_d_pde3d_mod +#ifdef PSB_HAVE_CUDA + use psb_cuda_mod +#endif implicit none ! input parameters @@ -580,10 +66,6 @@ program pdgenmv type(psb_desc_type) :: desc_a ! dense matrices type(psb_d_vect_type), target :: xv, bv, xg, bg -#ifdef OPENACC - type(psb_d_vect_oacc) :: vmold - type(psb_i_vect_oacc) :: imold -#endif real(psb_dpk_), allocatable :: x1(:), x2(:), x0(:) ! blacs parameters type(psb_ctxt_type) :: ctxt @@ -599,12 +81,29 @@ program pdgenmv type(psb_d_hll_sparse_mat), target :: ahll type(psb_d_dia_sparse_mat), target :: adia type(psb_d_hdia_sparse_mat), target :: ahdia -#ifdef OPENACC - type(psb_d_oacc_ell_sparse_mat), target :: aelg - type(psb_d_oacc_csr_sparse_mat), target :: acsrg - type(psb_d_oacc_hll_sparse_mat), target :: ahlg + type(psb_d_base_vect_type), target :: dvect + type(psb_i_base_vect_type), target :: ivect + class(psb_d_base_sparse_mat), pointer :: acmold => acsr + class(psb_d_base_vect_type), pointer :: vmold => dvect + class(psb_i_base_vect_type), pointer :: imold => ivect + class(psb_d_base_vect_type), pointer :: vgmold => dvect + class(psb_i_base_vect_type), pointer :: igmold => ivect +#if defined(PSB_HAVE_CUDA) + type(psb_d_cuda_hlg_sparse_mat), target :: ahlg + type(psb_d_cuda_hdiag_sparse_mat), target :: ahdiag + type(psb_d_cuda_csrg_sparse_mat), target :: acsrg + type(psb_d_cuda_elg_sparse_mat), target :: aelg + type(psb_d_vect_cuda), target :: dvgpu + type(psb_i_vect_cuda), target :: ivgpu #endif - class(psb_d_base_sparse_mat), pointer :: agmold, acmold +#if defined(PSB_OPENACC) + type(psb_d_oacc_hll_sparse_mat), target :: ahlo + type(psb_d_oacc_csr_sparse_mat), target :: acsro + type(psb_d_oacc_ell_sparse_mat), target :: aelo + type(psb_d_vect_oacc), target :: dvoac + type(psb_i_vect_oacc), target :: ivoac +#endif + class(psb_d_base_sparse_mat), pointer :: agmold ! other variables logical, parameter :: dump=.false. integer(psb_ipk_) :: info, i, j, nr, nrg @@ -618,9 +117,12 @@ program pdgenmv call psb_init(ctxt) call psb_info(ctxt,iam,np) -#ifdef OPENACC +#ifdef PSB_OPENACC call psb_oacc_init(ctxt) #endif +#ifdef PSB_HAVE_CUDA + call psb_cuda_init(ctxt) +#endif if (iam < 0) then ! This should not happen, but just in case @@ -636,9 +138,13 @@ program pdgenmv write(*,*) 'Welcome to PSBLAS version: ',psb_version_string_ write(*,*) 'This is the ',trim(name),' sample program' end if -#ifdef OPENACC +#ifdef PSB_OPENACC !!$ write(*,*) 'Process ',iam,' running on device: ', psb_oacc_getDevice(),' out of', psb_oacc_getDeviceCount() !!$ write(*,*) 'Process ',iam,' device ', psb_oacc_getDevice(),' is a: ', trim(psb_oacc_DeviceName()) +#endif +#if defined(PSB_HAVE_CUDA) + write(*,*) 'Process ',iam,' running on device: ', psb_cuda_getDevice(),' out of', psb_cuda_getDeviceCount() + write(*,*) 'Process ',iam,' device ', psb_cuda_getDevice(),' is a: ', trim(psb_cuda_DeviceName()) #endif ! ! get parameters @@ -650,7 +156,7 @@ program pdgenmv ! call psb_barrier(ctxt) t1 = psb_wtime() - call psb_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,'CSR ',info,partition=3,tnd=tnd) + call psb_d_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,'CSR ',info,partition=3,tnd=tnd) call psb_barrier(ctxt) t2 = psb_wtime() - t1 if(info /= psb_success_) then @@ -691,29 +197,54 @@ program pdgenmv stop end if -#ifdef OPENACC select case(psb_toupper(agfmt)) +#if defined(PSB_HAVE_CUDA) case('ELG') agmold => aelg + vgmold => dvgpu + igmold => ivgpu case('HLG') + call psi_set_hksz(32) agmold => ahlg + vgmold => dvgpu + igmold => ivgpu + case('HDIAG') + agmold => ahdiag + vgmold => dvgpu + igmold => ivgpu case('CSRG') agmold => acsrg - case default - write(*,*) 'Unknown format defaulting to HLG' - agmold => ahlg - end select + vgmold => dvgpu + igmold => ivgpu +#endif +#if defined(PSB_OPENACC) + case('ELO') + agmold => aelo + vgmold => dvoac + igmold => ivoac + case('HLO') + call psi_set_hksz(32) + agmold => ahlo + vgmold => dvoac + igmold => ivoac +!!$ case('HDIAG') +!!$ amold => ahdiag + case('CSRO') + agmold => acsro + vgmold => dvoac + igmold => ivoac #endif + end select call a%cscnv(agpu,info,mold=agmold) if ((info /= 0).or.(psb_get_errstatus()/=0)) then write(0,*) 'From cscnv ',info call psb_error() stop end if - call desc_a%cnv(mold=imold) + call desc_a%cnv(mold=igmold) - call psb_geasb(bg,desc_a,info,scratch=.true.,mold=vmold) - call psb_geasb(xg,desc_a,info,scratch=.true.,mold=vmold) + call psb_geasb(bg,desc_a,info,scratch=.true.,mold=vgmold) + call psb_geasb(xg,desc_a,info,scratch=.true.,mold=vgmold) nr = desc_a%get_local_rows() nrg = desc_a%get_global_rows() call psb_geall(x0,desc_a,info) @@ -738,11 +269,10 @@ program pdgenmv call xv%bld(x0) call psb_geasb(bv,desc_a,info,scratch=.true.) -#ifdef OPENACC - +#if defined(PSB_OPENACC)||defined(PSB_HAVE_CUDA) call aux_a%cscnv(agpu,info,mold=acoo) - call xg%bld(x0,mold=vmold) - call psb_geasb(bg,desc_a,info,scratch=.true.,mold=vmold) + call xg%bld(x0,mold=vgmold) + call psb_geasb(bg,desc_a,info,scratch=.true.,mold=vgmold) call psb_barrier(ctxt) t1 = psb_wtime() call agpu%cscnv(info,mold=agmold) @@ -765,7 +295,7 @@ program pdgenmv t2 = psb_wtime() - t1 call psb_amx(ctxt,t2) -#ifdef OPENACC +#if defined(PSB_OPENACC)||defined(PSB_HAVE_CUDA) call xg%set(x0) ! FIXME: cache flush needed here @@ -861,7 +391,7 @@ program pdgenmv tflops = flops gflops = flops * ngpu write(psb_out_unit,'("Storage type for A: ",a)') a%get_fmt() -#ifdef OPENACC +#if defined(PSB_OPENACC)||defined(PSB_HAVE_CUDA) write(psb_out_unit,'("Storage type for AGPU: ",a)') agpu%get_fmt() write(psb_out_unit,'("Time to convert A from COO to CPU (1): ",F20.9)')& & tcnvc1 @@ -891,7 +421,7 @@ program pdgenmv & t2*1.d3/(1.d0*ntests) write(psb_out_unit,'("MFLOPS (CPU) : ",F20.3)')& & flops/1.d6 -#ifdef OPENACC +#if defined(PSB_OPENACC)||defined(PSB_HAVE_CUDA) write(psb_out_unit,'("Time for ",i6," products (s) (xGPU) : ",F20.3)')& & ntests, tt2 write(psb_out_unit,'("Time per product (ms) (xGPU) : ",F20.3)')& @@ -916,7 +446,7 @@ program pdgenmv bdwdth = ntests*nbytes/(t2*1.d6) write(psb_out_unit,*) write(psb_out_unit,'("MBYTES/S sust. effective bandwidth (CPU) : ",F20.3)') bdwdth -#ifdef OPENACC +#if defined(PSB_OPENACC)||defined(PSB_HAVE_CUDA) bdwdth = ngpu*ntests*nbytes/(gt2*1.d6) write(psb_out_unit,'("MBYTES/S sust. effective bandwidth (GPU) : ",F20.3)') bdwdth !!$ bdwdth = psb_oacc_MemoryPeakBandwidth() @@ -941,8 +471,11 @@ program pdgenmv call psb_errpush(info,name,a_err=ch_err) goto 9999 end if -#ifdef OPENACC +#ifdef PSB_OPENACC call psb_oacc_exit() +#endif +#ifdef PSB_HAVE_CUDA + call psb_cuda_exit() #endif call psb_exit(ctxt) stop @@ -967,7 +500,7 @@ contains if (iam == 0) then write(*,*) 'CPU side format?' read(psb_inp_unit,*) acfmt - write(*,*) 'OACC side format?' + write(*,*) 'DEVICE side format?' read(psb_inp_unit,*) agfmt write(*,*) 'Size of discretization cube?' read(psb_inp_unit,*) idim diff --git a/test/openacc/psb_d_oacc_pde3d.F90 b/test/openacc/psb_d_oacc_pde3d.F90 index 841da878e..d4bf35989 100644 --- a/test/openacc/psb_d_oacc_pde3d.F90 +++ b/test/openacc/psb_d_oacc_pde3d.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/openacc/psb_d_pde3d_mod.F90 b/test/openacc/psb_d_pde3d_mod.F90 new file mode 100644 index 000000000..0fc75c301 --- /dev/null +++ b/test/openacc/psb_d_pde3d_mod.F90 @@ -0,0 +1,517 @@ +module psb_d_pde3d_mod + + + use psb_base_mod, only : psb_dpk_, psb_ipk_, psb_lpk_, psb_desc_type,& + & psb_dspmat_type, psb_d_vect_type, dzero,& + & psb_d_base_sparse_mat, psb_d_base_vect_type, & + & psb_i_base_vect_type, psb_l_base_vect_type + + interface + function d_func_3d(x,y,z) result(val) + import :: psb_dpk_ + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + end function d_func_3d + end interface + + interface psb_gen_pde3d + module procedure psb_d_gen_pde3d + end interface psb_gen_pde3d + +contains + + function d_null_func_3d(x,y,z) result(val) + + real(psb_dpk_), intent(in) :: x,y,z + real(psb_dpk_) :: val + + val = dzero + + end function d_null_func_3d + ! + ! functions parametrizing the differential equation + ! + + ! + ! Note: b1, b2 and b3 are the coefficients of the first + ! derivative of the unknown function. The default + ! we apply here is to have them zero, so that the resulting + ! matrix is symmetric/hermitian and suitable for + ! testing with CG and FCG. + ! When testing methods for non-hermitian matrices you can + ! change the B1/B2/B3 functions to e.g. done/sqrt((3*done)) + ! + function b1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b1 + real(psb_dpk_), intent(in) :: x,y,z + b1=done/sqrt((3*done)) + end function b1 + function b2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b2 + real(psb_dpk_), intent(in) :: x,y,z + b2=done/sqrt((3*done)) + end function b2 + function b3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: b3 + real(psb_dpk_), intent(in) :: x,y,z + b3=done/sqrt((3*done)) + end function b3 + function c(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: c + real(psb_dpk_), intent(in) :: x,y,z + c=dzero + end function c + function a1(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a1 + real(psb_dpk_), intent(in) :: x,y,z + a1=done/80 + end function a1 + function a2(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a2 + real(psb_dpk_), intent(in) :: x,y,z + a2=done/80 + end function a2 + function a3(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: a3 + real(psb_dpk_), intent(in) :: x,y,z + a3=done/80 + end function a3 + function g(x,y,z) + use psb_base_mod, only : psb_dpk_, done, dzero + implicit none + real(psb_dpk_) :: g + real(psb_dpk_), intent(in) :: x,y,z + g = dzero + if (x == done) then + g = done + else if (x == dzero) then + g = exp(y**2-z**2) + end if + end function g + + + ! + ! subroutine to allocate and fill in the coefficient matrix and + ! the rhs. + ! + subroutine psb_d_gen_pde3d(ctxt,idim,a,bv,xv,desc_a,afmt,info,& + & f,amold,vmold,imold,partition,nrl,iv,tnd) + use psb_base_mod + use psb_util_mod + ! + ! Discretizes the partial differential equation + ! + ! a1 dd(u) a2 dd(u) a3 dd(u) b1 d(u) b2 d(u) b3 d(u) + ! - ------ - ------ - ------ + ----- + ------ + ------ + c u = f + ! dxdx dydy dzdz dx dy dz + ! + ! with Dirichlet boundary conditions + ! u = g + ! + ! on the unit cube 0<=x,y,z<=1. + ! + ! + ! Note that if b1=b2=b3=c=0., the PDE is the Laplace equation. + ! + implicit none + integer(psb_ipk_) :: idim + type(psb_dspmat_type) :: a + type(psb_d_vect_type) :: xv,bv + type(psb_desc_type) :: desc_a + type(psb_ctxt_type) :: ctxt + integer(psb_ipk_) :: info + character(len=*) :: afmt + procedure(d_func_3d), optional :: f + class(psb_d_base_sparse_mat), optional :: amold + class(psb_d_base_vect_type), optional :: vmold + class(psb_i_base_vect_type), optional :: imold + integer(psb_ipk_), optional :: partition, nrl,iv(:) + logical, optional :: tnd + ! Local variables. + + integer(psb_ipk_), parameter :: nb=20 + type(psb_d_csc_sparse_mat) :: acsc + type(psb_d_coo_sparse_mat) :: acoo + type(psb_d_csr_sparse_mat) :: acsr + real(psb_dpk_) :: zt(nb),x,y,z + integer(psb_ipk_) :: nnz,nr,nlr,i,j,ii,ib,k, partition_ + integer(psb_lpk_) :: m,n,glob_row,nt + integer(psb_ipk_) :: ix,iy,iz,ia,indx_owner + ! For 3D partition + ! Note: integer control variables going directly into an MPI call + ! must be 4 bytes, i.e. psb_mpk_ + integer(psb_mpk_) :: npdims(3), npp, minfo + integer(psb_ipk_) :: npx,npy,npz, iamx,iamy,iamz,mynx,myny,mynz + integer(psb_ipk_), allocatable :: bndx(:),bndy(:),bndz(:) + ! Process grid + integer(psb_ipk_) :: np, iam + integer(psb_ipk_) :: icoeff + integer(psb_lpk_), allocatable :: irow(:),icol(:),myidx(:) + real(psb_dpk_), allocatable :: val(:) + ! deltah dimension of each grid cell + ! deltat discretization time + real(psb_dpk_) :: deltah, sqdeltah, deltah2 + real(psb_dpk_), parameter :: rhs=dzero,one=done,zero=dzero + real(psb_dpk_) :: t0, t1, t2, t3, tasb, talc, ttot, tgen, tcdasb + integer(psb_ipk_) :: err_act + procedure(d_func_3d), pointer :: f_ + logical :: tnd_ + character(len=20) :: name, ch_err,tmpfmt + + info = psb_success_ + name = 'create_matrix' + call psb_erractionsave(err_act) + + call psb_info(ctxt, iam, np) + + + if (present(f)) then + f_ => f + else + f_ => d_null_func_3d + end if + + deltah = done/(idim+2) + sqdeltah = deltah*deltah + deltah2 = (2*done)* deltah + + if (present(partition)) then + if ((1<= partition).and.(partition <= 3)) then + partition_ = partition + else + write(*,*) 'Invalid partition choice ',partition,' defaulting to 3' + partition_ = 3 + end if + else + partition_ = 3 + end if + + ! initialize array descriptor and sparse matrix storage. provide an + ! estimate of the number of non zeroes + + m = (1_psb_lpk_*idim)*idim*idim + n = m + nnz = ((n*7)/(np)) + if(iam == psb_root_) write(psb_out_unit,'("Generating Matrix (size=",i0,")...")')n + t0 = psb_wtime() + select case(partition_) + case(1) + ! A BLOCK partition + if (present(nrl)) then + nr = nrl + else + ! + ! Using a simple BLOCK distribution. + ! + nt = (m+np-1)/np + nr = max(0,min(nt,m-(iam*nt))) + end if + + nt = nr + call psb_sum(ctxt,nt) + if (nt /= m) then + write(psb_err_unit,*) iam, 'Initialization error ',nr,nt,m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! First example of use of CDALL: specify for each process a number of + ! contiguous rows + ! + call psb_cdall(ctxt,desc_a,info,nl=nr) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(2) + ! A partition defined by the user through IV + + if (present(iv)) then + if (size(iv) /= m) then + write(psb_err_unit,*) iam, 'Initialization error: wrong IV size',size(iv),m + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + else + write(psb_err_unit,*) iam, 'Initialization error: IV not present' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end if + + ! + ! Second example of use of CDALL: specify for each row the + ! process that owns it + ! + call psb_cdall(ctxt,desc_a,info,vg=iv) + myidx = desc_a%get_global_indices() + nlr = size(myidx) + + case(3) + ! A 3-dimensional partition + + ! A nifty MPI function will split the process list + npdims = 0 + call mpi_dims_create(np,3,npdims,info) + npx = npdims(1) + npy = npdims(2) + npz = npdims(3) + + allocate(bndx(0:npx),bndy(0:npy),bndz(0:npz)) + ! We can reuse idx2ijk for process indices as well. + call idx2ijk(iamx,iamy,iamz,iam,npx,npy,npz,base=0) + ! Now let's split the 3D cube in hexahedra + call dist1Didx(bndx,idim,npx) + mynx = bndx(iamx+1)-bndx(iamx) + call dist1Didx(bndy,idim,npy) + myny = bndy(iamy+1)-bndy(iamy) + call dist1Didx(bndz,idim,npz) + mynz = bndz(iamz+1)-bndz(iamz) + + ! How many indices do I own? + nlr = mynx*myny*mynz + allocate(myidx(nlr)) + ! Now, let's generate the list of indices I own + nr = 0 + do i=bndx(iamx),bndx(iamx+1)-1 + do j=bndy(iamy),bndy(iamy+1)-1 + do k=bndz(iamz),bndz(iamz+1)-1 + nr = nr + 1 + call ijk2idx(myidx(nr),i,j,k,idim,idim,idim) + end do + end do + end do + if (nr /= nlr) then + write(psb_err_unit,*) iam,iamx,iamy,iamz, 'Initialization error: NR vs NLR ',& + & nr,nlr,mynx,myny,mynz + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + end if + + ! + ! Third example of use of CDALL: specify for each process + ! the set of global indices it owns. + ! + call psb_cdall(ctxt,desc_a,info,vl=myidx) + + case default + write(psb_err_unit,*) iam, 'Initialization error: should not get here' + info = -1 + call psb_barrier(ctxt) + call psb_abort(ctxt) + return + end select + + + if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz,& + & dupl=psb_dupl_err_) + ! define rhs from boundary conditions; also build initial guess + if (info == psb_success_) call psb_geall(xv,desc_a,info) + if (info == psb_success_) call psb_geall(bv,desc_a,info) + + call psb_barrier(ctxt) + talc = psb_wtime()-t0 + + if (info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='allocation rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + ! we build an auxiliary matrix consisting of one row at a + ! time; just a small matrix. might be extended to generate + ! a bunch of rows per call. + ! + allocate(val(20*nb),irow(20*nb),& + &icol(20*nb),stat=info) + if (info /= psb_success_ ) then + info=psb_err_alloc_dealloc_ + call psb_errpush(info,name) + goto 9999 + endif + + + ! loop over rows belonging to current process in a block + ! distribution. + + call psb_barrier(ctxt) + t1 = psb_wtime() + do ii=1, nlr,nb + ib = min(nb,nlr-ii+1) + icoeff = 1 + do k=1,ib + i=ii+k-1 + ! local matrix pointer + glob_row=myidx(i) + ! compute gridpoint coordinates + call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) + ! x, y, z coordinates + x = (ix-1)*deltah + y = (iy-1)*deltah + z = (iz-1)*deltah + zt(k) = f_(x,y,z) + ! internal point: build discretization + ! + ! term depending on (x-1,y,z) + ! + val(icoeff) = -a1(x,y,z)/sqdeltah-b1(x,y,z)/deltah2 + if (ix == 1) then + zt(k) = g(dzero,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix-1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y-1,z) + val(icoeff) = -a2(x,y,z)/sqdeltah-b2(x,y,z)/deltah2 + if (iy == 1) then + zt(k) = g(x,dzero,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy-1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y,z-1) + val(icoeff)=-a3(x,y,z)/sqdeltah-b3(x,y,z)/deltah2 + if (iz == 1) then + zt(k) = g(x,y,dzero)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz-1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + ! term depending on (x,y,z) + val(icoeff)=(2*done)*(a1(x,y,z)+a2(x,y,z)+a3(x,y,z))/sqdeltah & + & + c(x,y,z) + call ijk2idx(icol(icoeff),ix,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + ! term depending on (x,y,z+1) + val(icoeff)=-a3(x,y,z)/sqdeltah+b3(x,y,z)/deltah2 + if (iz == idim) then + zt(k) = g(x,y,done)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy,iz+1,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x,y+1,z) + val(icoeff)=-a2(x,y,z)/sqdeltah+b2(x,y,z)/deltah2 + if (iy == idim) then + zt(k) = g(x,done,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix,iy+1,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + ! term depending on (x+1,y,z) + val(icoeff)=-a1(x,y,z)/sqdeltah+b1(x,y,z)/deltah2 + if (ix==idim) then + zt(k) = g(done,y,z)*(-val(icoeff)) + zt(k) + else + call ijk2idx(icol(icoeff),ix+1,iy,iz,idim,idim,idim) + irow(icoeff) = glob_row + icoeff = icoeff+1 + endif + + end do + call psb_spins(icoeff-1,irow,icol,val,a,desc_a,info) + if(info /= psb_success_) exit + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),bv,desc_a,info) + if(info /= psb_success_) exit + zt(:)=dzero + call psb_geins(ib,myidx(ii:ii+ib-1),zt(1:ib),xv,desc_a,info) + if(info /= psb_success_) exit + end do + + tgen = psb_wtime()-t1 + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='insert rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + + deallocate(val,irow,icol) + + call psb_barrier(ctxt) + t1 = psb_wtime() + call psb_cdasb(desc_a,info,mold=imold) + tcdasb = psb_wtime()-t1 + call psb_barrier(ctxt) + t1 = psb_wtime() + if (info == psb_success_) then + if (present(amold)) then + call psb_spasb(a,desc_a,info,mold=amold,bld_and=tnd) + else + call psb_spasb(a,desc_a,info,afmt=afmt,bld_and=tnd) + end if + end if + call psb_barrier(ctxt) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold) + if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) + if(info /= psb_success_) then + info=psb_err_from_subroutine_ + ch_err='asb rout.' + call psb_errpush(info,name,a_err=ch_err) + goto 9999 + end if + tasb = psb_wtime()-t1 + call psb_barrier(ctxt) + ttot = psb_wtime() - t0 + + call psb_amx(ctxt,talc) + call psb_amx(ctxt,tgen) + call psb_amx(ctxt,tasb) + call psb_amx(ctxt,ttot) + if(iam == psb_root_) then + tmpfmt = a%get_fmt() + write(psb_out_unit,'("The matrix has been generated and assembled in ",a3," format.")')& + & tmpfmt + write(psb_out_unit,'("-allocation time : ",es12.5)') talc + write(psb_out_unit,'("-coeff. gen. time : ",es12.5)') tgen + write(psb_out_unit,'("-desc asbly time : ",es12.5)') tcdasb + write(psb_out_unit,'("- mat asbly time : ",es12.5)') tasb + write(psb_out_unit,'("-total time : ",es12.5)') ttot + + end if + call psb_erractionrestore(err_act) + return + +9999 call psb_error_handler(ctxt,err_act) + + return + end subroutine psb_d_gen_pde3d + + +end module psb_d_pde3d_mod + + diff --git a/test/openacc/runs/ppde.inp b/test/openacc/runs/ppde.inp deleted file mode 100644 index f6a0cff39..000000000 --- a/test/openacc/runs/ppde.inp +++ /dev/null @@ -1,19 +0,0 @@ -17 Number of entries below this -BICGSTAB Iterative method BICGSTAB CGS BICG BICGSTABL RGMRES FCG CGR RICHARDSON -BJAC Preconditioner NONE DIAG BJAC -CSR Storage format for matrix A: CSR COO -HLL Storage format for matrix A: CSR COO -140 Domain size (acutal system is this**3 (pde3d) or **2 (pde2d) ) -3 Partition: 1 BLOCK 3 3D -2 Stopping criterion 1 2 -0200 MAXIT -10 ITRACE -002 IRST restart for RGMRES and BiCGSTABL -INVK Block Solver ILU,ILUT,INVK,INVT,AINV -NONE If ILU : MILU or NONE othewise ignored -NONE Scaling if ILUT: NONE, MAXVAL otherwise ignored -0 Level of fill for forward factorization -1 Level of fill for inverse factorization (only INVK,INVT) -1E-1 Threshold for forward factorization -1E-1 Threshold for inverse factorization (Only INVK, INVT) -LLK What orthogonalization algorithm? (Only AINV) diff --git a/test/pdegen/psb_d_pde2d.F90 b/test/pdegen/psb_d_pde2d.F90 index e04ec6780..183b8d160 100644 --- a/test/pdegen/psb_d_pde2d.F90 +++ b/test/pdegen/psb_d_pde2d.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -406,11 +406,11 @@ contains if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz,& - & bldmode=psb_matbld_remote_,dupl=psb_dupl_add_) + & bldmode=psb_matbld_remote_) ! define rhs from boundary conditions; also build initial guess if (info == psb_success_) call psb_geall(xv,desc_a,info) if (info == psb_success_) call psb_geall(bv,desc_a,info,& - & bldmode=psb_matbld_remote_,dupl=psb_dupl_add_) + & bldmode=psb_matbld_remote_) call psb_barrier(ctxt) talc = psb_wtime()-t0 @@ -467,8 +467,8 @@ contains ! compute gridpoint coordinates call idx2ijk(ix,iy,glob_row,idim,idim) ! x, y coordinates - x = (ix-1)*deltah - y = (iy-1)*deltah + x = (ix)*deltah + y = (iy)*deltah zt(k) = f_(x,y) ! internal point: build discretization @@ -558,9 +558,9 @@ contains t1 = psb_wtime() if (info == psb_success_) then if (present(amold)) then - call psb_spasb(a,desc_a,info,mold=amold) + call psb_spasb(a,desc_a,info,mold=amold,dupl=psb_dupl_add_) else - call psb_spasb(a,desc_a,info,afmt=afmt) + call psb_spasb(a,desc_a,info,afmt=afmt,dupl=psb_dupl_add_) end if end if call psb_barrier(ctxt) @@ -570,8 +570,8 @@ contains call psb_errpush(info,name,a_err=ch_err) goto 9999 end if - if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold) - if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) + if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold,dupl=psb_dupl_add_) + if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold,dupl=psb_dupl_add_) if(info /= psb_success_) then info=psb_err_from_subroutine_ ch_err='asb rout.' @@ -877,7 +877,9 @@ contains write(psb_err_unit,*) 'Opened file ',trim(filename),' for input' end if else - inp_unit=psb_inp_unit + call pr_usage(psb_err_unit) + call psb_abort(ctxt) + stop end if read(inp_unit,*) ip if (ip >= 3) then @@ -1012,12 +1014,10 @@ contains ! subroutine pr_usage(iout) integer(psb_ipk_) :: iout - write(iout,*)'incorrect parameter(s) found' - write(iout,*)' usage: pde2d90 methd prec dim & - &[ipart istop itmax itrace]' - write(iout,*)' where:' - write(iout,*)' methd: cgstab cgs rgmres bicgstabl' - write(iout,*)' prec : bjac diag none' + write(iout,*)' usage: psb_d_pde2d cntrl-file ' + write(iout,*)' where ctrl-file contains the following:' + write(iout,*)' methd BICGSTAB CGS BICG BICGSTABL RGMRES FCG CGR RICHARDSON' + write(iout,*)' prec bjac diag none' write(iout,*)' dim number of points along each axis' write(iout,*)' the size of the resulting linear ' write(iout,*)' system is dim**2' diff --git a/test/pdegen/psb_d_pde3d.F90 b/test/pdegen/psb_d_pde3d.F90 index cac1c413b..b0e692565 100644 --- a/test/pdegen/psb_d_pde3d.F90 +++ b/test/pdegen/psb_d_pde3d.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -435,11 +435,11 @@ contains if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz, & - & bldmode=psb_matbld_remote_,dupl=psb_dupl_add_) + & bldmode=psb_matbld_remote_) ! define rhs from boundary conditions; also build initial guess if (info == psb_success_) call psb_geall(xv,desc_a,info) if (info == psb_success_) call psb_geall(bv,desc_a,info,& - & bldmode=psb_matbld_remote_,dupl=psb_dupl_add_) + & bldmode=psb_matbld_remote_) call psb_barrier(ctxt) talc = psb_wtime()-t0 @@ -496,9 +496,9 @@ contains ! compute gridpoint coordinates call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) ! x, y, z coordinates - x = (ix-1)*deltah - y = (iy-1)*deltah - z = (iz-1)*deltah + x = (ix)*deltah + y = (iy)*deltah + z = (iz)*deltah zt(k) = f_(x,y,z) ! internal point: build discretization ! @@ -606,9 +606,9 @@ contains t1 = psb_wtime() if (info == psb_success_) then if (present(amold)) then - call psb_spasb(a,desc_a,info,mold=amold) + call psb_spasb(a,desc_a,info,mold=amold,dupl=psb_dupl_add_) else - call psb_spasb(a,desc_a,info,afmt=afmt) + call psb_spasb(a,desc_a,info,afmt=afmt,dupl=psb_dupl_add_) end if end if call psb_barrier(ctxt) @@ -618,8 +618,8 @@ contains call psb_errpush(info,name,a_err=ch_err) goto 9999 end if - if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold) - if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) + if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold,dupl=psb_dupl_add_) + if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold,dupl=psb_dupl_add_) if(info /= psb_success_) then info=psb_err_from_subroutine_ ch_err='asb rout.' @@ -933,7 +933,9 @@ contains write(psb_err_unit,*) 'Opened file ',trim(filename),' for input' end if else - inp_unit=psb_inp_unit + call pr_usage(psb_err_unit) + call psb_abort(ctxt) + stop end if read(inp_unit,*) ip if (ip >= 3) then @@ -1070,12 +1072,10 @@ contains ! subroutine pr_usage(iout) integer(psb_ipk_) :: iout - write(iout,*)'incorrect parameter(s) found' - write(iout,*)' usage: pde3d90 methd prec dim & - &[istop itmax itrace]' - write(iout,*)' where:' - write(iout,*)' methd: cgstab cgs rgmres bicgstabl' - write(iout,*)' prec : bjac diag none' + write(iout,*)' usage: psb_d_pde3d cntrl-file ' + write(iout,*)' where ctrl-file contains the following:' + write(iout,*)' methd BICGSTAB CGS BICG BICGSTABL RGMRES FCG CGR RICHARDSON' + write(iout,*)' prec bjac diag none' write(iout,*)' dim number of points along each axis' write(iout,*)' the size of the resulting linear ' write(iout,*)' system is dim**3' diff --git a/test/pdegen/psb_s_pde2d.F90 b/test/pdegen/psb_s_pde2d.F90 index 121980bf1..a4d724cab 100644 --- a/test/pdegen/psb_s_pde2d.F90 +++ b/test/pdegen/psb_s_pde2d.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -406,11 +406,11 @@ contains if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz,& - & bldmode=psb_matbld_remote_,dupl=psb_dupl_add_) + & bldmode=psb_matbld_remote_) ! define rhs from boundary conditions; also build initial guess if (info == psb_success_) call psb_geall(xv,desc_a,info) if (info == psb_success_) call psb_geall(bv,desc_a,info,& - & bldmode=psb_matbld_remote_,dupl=psb_dupl_add_) + & bldmode=psb_matbld_remote_) call psb_barrier(ctxt) talc = psb_wtime()-t0 @@ -467,8 +467,8 @@ contains ! compute gridpoint coordinates call idx2ijk(ix,iy,glob_row,idim,idim) ! x, y coordinates - x = (ix-1)*deltah - y = (iy-1)*deltah + x = (ix)*deltah + y = (iy)*deltah zt(k) = f_(x,y) ! internal point: build discretization @@ -558,9 +558,9 @@ contains t1 = psb_wtime() if (info == psb_success_) then if (present(amold)) then - call psb_spasb(a,desc_a,info,mold=amold) + call psb_spasb(a,desc_a,info,mold=amold,dupl=psb_dupl_add_) else - call psb_spasb(a,desc_a,info,afmt=afmt) + call psb_spasb(a,desc_a,info,afmt=afmt,dupl=psb_dupl_add_) end if end if call psb_barrier(ctxt) @@ -570,8 +570,8 @@ contains call psb_errpush(info,name,a_err=ch_err) goto 9999 end if - if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold) - if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) + if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold,dupl=psb_dupl_add_) + if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold,dupl=psb_dupl_add_) if(info /= psb_success_) then info=psb_err_from_subroutine_ ch_err='asb rout.' @@ -877,7 +877,9 @@ contains write(psb_err_unit,*) 'Opened file ',trim(filename),' for input' end if else - inp_unit=psb_inp_unit + call pr_usage(psb_err_unit) + call psb_abort(ctxt) + stop end if read(inp_unit,*) ip if (ip >= 3) then @@ -1012,12 +1014,10 @@ contains ! subroutine pr_usage(iout) integer(psb_ipk_) :: iout - write(iout,*)'incorrect parameter(s) found' - write(iout,*)' usage: pde2d90 methd prec dim & - &[ipart istop itmax itrace]' - write(iout,*)' where:' - write(iout,*)' methd: cgstab cgs rgmres bicgstabl' - write(iout,*)' prec : bjac diag none' + write(iout,*)' usage: psb_s_pde2d cntrl-file ' + write(iout,*)' where ctrl-file contains the following:' + write(iout,*)' methd BICGSTAB CGS BICG BICGSTABL RGMRES FCG CGR RICHARDSON' + write(iout,*)' prec bjac diag none' write(iout,*)' dim number of points along each axis' write(iout,*)' the size of the resulting linear ' write(iout,*)' system is dim**2' diff --git a/test/pdegen/psb_s_pde3d.F90 b/test/pdegen/psb_s_pde3d.F90 index 49b7e9796..87e631c72 100644 --- a/test/pdegen/psb_s_pde3d.F90 +++ b/test/pdegen/psb_s_pde3d.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -435,11 +435,11 @@ contains if (info == psb_success_) call psb_spall(a,desc_a,info,nnz=nnz, & - & bldmode=psb_matbld_remote_,dupl=psb_dupl_add_) + & bldmode=psb_matbld_remote_) ! define rhs from boundary conditions; also build initial guess if (info == psb_success_) call psb_geall(xv,desc_a,info) if (info == psb_success_) call psb_geall(bv,desc_a,info,& - & bldmode=psb_matbld_remote_,dupl=psb_dupl_add_) + & bldmode=psb_matbld_remote_) call psb_barrier(ctxt) talc = psb_wtime()-t0 @@ -496,9 +496,9 @@ contains ! compute gridpoint coordinates call idx2ijk(ix,iy,iz,glob_row,idim,idim,idim) ! x, y, z coordinates - x = (ix-1)*deltah - y = (iy-1)*deltah - z = (iz-1)*deltah + x = (ix)*deltah + y = (iy)*deltah + z = (iz)*deltah zt(k) = f_(x,y,z) ! internal point: build discretization ! @@ -606,9 +606,9 @@ contains t1 = psb_wtime() if (info == psb_success_) then if (present(amold)) then - call psb_spasb(a,desc_a,info,mold=amold) + call psb_spasb(a,desc_a,info,mold=amold,dupl=psb_dupl_add_) else - call psb_spasb(a,desc_a,info,afmt=afmt) + call psb_spasb(a,desc_a,info,afmt=afmt,dupl=psb_dupl_add_) end if end if call psb_barrier(ctxt) @@ -618,8 +618,8 @@ contains call psb_errpush(info,name,a_err=ch_err) goto 9999 end if - if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold) - if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold) + if (info == psb_success_) call psb_geasb(xv,desc_a,info,mold=vmold,dupl=psb_dupl_add_) + if (info == psb_success_) call psb_geasb(bv,desc_a,info,mold=vmold,dupl=psb_dupl_add_) if(info /= psb_success_) then info=psb_err_from_subroutine_ ch_err='asb rout.' @@ -933,7 +933,9 @@ contains write(psb_err_unit,*) 'Opened file ',trim(filename),' for input' end if else - inp_unit=psb_inp_unit + call pr_usage(psb_err_unit) + call psb_abort(ctxt) + stop end if read(inp_unit,*) ip if (ip >= 3) then @@ -1070,12 +1072,10 @@ contains ! subroutine pr_usage(iout) integer(psb_ipk_) :: iout - write(iout,*)'incorrect parameter(s) found' - write(iout,*)' usage: pde3d90 methd prec dim & - &[istop itmax itrace]' - write(iout,*)' where:' - write(iout,*)' methd: cgstab cgs rgmres bicgstabl' - write(iout,*)' prec : bjac diag none' + write(iout,*)' usage: psb_s_pde3d cntrl-file ' + write(iout,*)' where ctrl-file contains the following:' + write(iout,*)' methd BICGSTAB CGS BICG BICGSTABL RGMRES FCG CGR RICHARDSON' + write(iout,*)' prec bjac diag none' write(iout,*)' dim number of points along each axis' write(iout,*)' the size of the resulting linear ' write(iout,*)' system is dim**3' diff --git a/test/pdegen/runs/psb_pde3d.inp b/test/pdegen/runs/psb_pde3d.inp index a924677ae..e4f8b6c79 100644 --- a/test/pdegen/runs/psb_pde3d.inp +++ b/test/pdegen/runs/psb_pde3d.inp @@ -1,6 +1,6 @@ 17 Number of entries below this BICGSTAB Iterative method BICGSTAB CGS BICG BICGSTABL RGMRES FCG CGR RICHARDSON -BJAC Preconditioner NONE DIAG BJAC +DIAG Preconditioner NONE DIAG BJAC CSR Storage format for matrix A: CSR COO 100 Domain size (acutal system is this**3 (pde3d) ) 3 Partition: 1 BLOCK 3 3D diff --git a/test/serial/psb_d_xyz_impl.f90 b/test/serial/psb_d_xyz_impl.f90 index 8796a3524..a91902358 100644 --- a/test/serial/psb_d_xyz_impl.f90 +++ b/test/serial/psb_d_xyz_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/serial/psb_d_xyz_mat_mod.f90 b/test/serial/psb_d_xyz_mat_mod.f90 index 009ddab07..f2f45dded 100644 --- a/test/serial/psb_d_xyz_mat_mod.f90 +++ b/test/serial/psb_d_xyz_mat_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/torture/psb_s_mvsv_tester.f90 b/test/torture/psb_s_mvsv_tester.f90 index cfa3388a6..0f1a7a756 100644 --- a/test/torture/psb_s_mvsv_tester.f90 +++ b/test/torture/psb_s_mvsv_tester.f90 @@ -23,8 +23,8 @@ contains integer(psb_ipk_) :: nnz=3 integer(psb_ipk_) :: m=2 integer(psb_ipk_) :: k=2 - integer(psb_ipk_) :: IA(3)=(/1, 1, 2/) - integer(psb_ipk_) :: JA(3)=(/1, 2, 2/) + integer(psb_lpk_) :: IA(3)=(/1, 1, 2/) + integer(psb_lpk_) :: JA(3)=(/1, 2, 2/) real*4 :: VA(3)=(/1, 1, 1/) real*4 :: x(2)=(/1, 1/)! reference x real*4 :: cy(2)=(/9, 6/)! reference cy after @@ -100,8 +100,8 @@ contains integer(psb_ipk_) :: nnz=2 integer(psb_ipk_) :: m=2 integer(psb_ipk_) :: k=2 - integer(psb_ipk_) :: IA(2)=(/1, 2/) - integer(psb_ipk_) :: JA(2)=(/1, 1/) + integer(psb_lpk_) :: IA(2)=(/1, 2/) + integer(psb_lpk_) :: JA(2)=(/1, 1/) real*4 :: VA(2)=(/1, 1/) real*4 :: x(2)=(/1, 1/)! reference x real*4 :: cy(2)=(/9, 3/)! reference cy after @@ -177,8 +177,8 @@ contains integer(psb_ipk_) :: nnz=3 integer(psb_ipk_) :: m=2 integer(psb_ipk_) :: k=2 - integer(psb_ipk_) :: IA(3)=(/1, 1, 2/) - integer(psb_ipk_) :: JA(3)=(/1, 2, 2/) + integer(psb_lpk_) :: IA(3)=(/1, 1, 2/) + integer(psb_lpk_) :: JA(3)=(/1, 2, 2/) real*4 :: VA(3)=(/1, 2, 6/) real*4 :: x(2)=(/1, 1/)! reference x real*4 :: cy(2)=(/6, 27/)! reference cy after @@ -254,8 +254,8 @@ contains integer(psb_ipk_) :: nnz=2 integer(psb_ipk_) :: m=2 integer(psb_ipk_) :: k=2 - integer(psb_ipk_) :: IA(2)=(/1, 1/) - integer(psb_ipk_) :: JA(2)=(/1, 2/) + integer(psb_lpk_) :: IA(2)=(/1, 1/) + integer(psb_lpk_) :: JA(2)=(/1, 2/) real*4 :: VA(2)=(/1, 2/) real*4 :: x(2)=(/1, 1/)! reference x real*4 :: cy(2)=(/9, 0/)! reference cy after @@ -331,8 +331,8 @@ contains integer(psb_ipk_) :: nnz=3 integer(psb_ipk_) :: m=2 integer(psb_ipk_) :: k=2 - integer(psb_ipk_) :: IA(3)=(/1, 1, 2/) - integer(psb_ipk_) :: JA(3)=(/1, 2, 1/) + integer(psb_lpk_) :: IA(3)=(/1, 1, 2/) + integer(psb_lpk_) :: JA(3)=(/1, 2, 1/) real*4 :: VA(3)=(/1, 3, 2/) real*4 :: x(2)=(/1, 1/)! reference x real*4 :: cy(2)=(/9, 9/)! reference cy after @@ -408,8 +408,8 @@ contains integer(psb_ipk_) :: nnz=2 integer(psb_ipk_) :: m=2 integer(psb_ipk_) :: k=2 - integer(psb_ipk_) :: IA(2)=(/1, 2/) - integer(psb_ipk_) :: JA(2)=(/1, 1/) + integer(psb_lpk_) :: IA(2)=(/1, 2/) + integer(psb_lpk_) :: JA(2)=(/1, 1/) real*4 :: VA(2)=(/1, 1/) real*4 :: x(2)=(/1, 1/)! reference x real*4 :: cy(2)=(/6, 0/)! reference cy after @@ -485,8 +485,8 @@ contains integer(psb_ipk_) :: nnz=1 integer(psb_ipk_) :: m=2 integer(psb_ipk_) :: k=2 - integer(psb_ipk_) :: IA(1)=(/1/) - integer(psb_ipk_) :: JA(1)=(/1/) + integer(psb_lpk_) :: IA(1)=(/1/) + integer(psb_lpk_) :: JA(1)=(/1/) real*4 :: VA(1)=(/1/) real*4 :: x(2)=(/1, 1/)! reference x real*4 :: cy(2)=(/4, 3/)! reference cy after @@ -562,8 +562,8 @@ contains integer(psb_ipk_) :: nnz=2 integer(psb_ipk_) :: m=2 integer(psb_ipk_) :: k=2 - integer(psb_ipk_) :: IA(2)=(/1, 2/) - integer(psb_ipk_) :: JA(2)=(/1, 1/) + integer(psb_lpk_) :: IA(2)=(/1, 2/) + integer(psb_lpk_) :: JA(2)=(/1, 1/) real*4 :: VA(2)=(/1, 1/) real*4 :: x(2)=(/1, 1/)! reference x real*4 :: cy(2)=(/5, 3/)! reference cy after @@ -639,8 +639,8 @@ contains integer(psb_ipk_) :: nnz=4 integer(psb_ipk_) :: m=2 integer(psb_ipk_) :: k=2 - integer(psb_ipk_) :: IA(4)=(/1, 1, 2, 2/) - integer(psb_ipk_) :: JA(4)=(/1, 2, 1, 2/) + integer(psb_lpk_) :: IA(4)=(/1, 1, 2, 2/) + integer(psb_lpk_) :: JA(4)=(/1, 2, 1, 2/) real*4 :: VA(4)=(/1, 2, 5, 1/) real*4 :: x(2)=(/1, 1/)! reference x real*4 :: cy(2)=(/9, 6/)! reference cy after @@ -716,8 +716,8 @@ contains integer(psb_ipk_) :: nnz=3 integer(psb_ipk_) :: m=2 integer(psb_ipk_) :: k=2 - integer(psb_ipk_) :: IA(3)=(/1, 1, 2/) - integer(psb_ipk_) :: JA(3)=(/1, 2, 1/) + integer(psb_lpk_) :: IA(3)=(/1, 1, 2/) + integer(psb_lpk_) :: JA(3)=(/1, 2, 1/) real*4 :: VA(3)=(/1, 1, 2/) real*4 :: x(2)=(/1, 1/)! reference x real*4 :: cy(2)=(/2, 2/)! reference cy after diff --git a/test/util/dhb2mm.f90 b/test/util/dhb2mm.f90 index adc0e2385..18beb126a 100644 --- a/test/util/dhb2mm.f90 +++ b/test/util/dhb2mm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/util/dmm2hb.f90 b/test/util/dmm2hb.f90 index e567471d8..6c2637cc1 100644 --- a/test/util/dmm2hb.f90 +++ b/test/util/dmm2hb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/util/zhb2mm.f90 b/test/util/zhb2mm.f90 index 1981c6cce..cf57fc002 100644 --- a/test/util/zhb2mm.f90 +++ b/test/util/zhb2mm.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/test/util/zmm2hb.f90 b/test/util/zmm2hb.f90 index e6993f3e3..e5c44d1de 100644 --- a/test/util/zmm2hb.f90 +++ b/test/util/zmm2hb.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/Makefile b/util/Makefile index 968208997..f19650899 100644 --- a/util/Makefile +++ b/util/Makefile @@ -29,8 +29,11 @@ LIBNAME=$(UTILLIBNAME) FINCLUDES=$(FMFLAG). $(FMFLAG)$(MODDIR) CINCLUDES=-I. -I$(INCDIR) -objs: $(OBJS) - /bin/cp -p $(CPUPDFLAG) *$(.mod) $(MODDIR) +objs: mods $(OBJS) + +mods: $(MODOBJS) + $(INSTALL) -p $(CPUPDFLAG) *$(.mod) $(MODDIR) + lib: $(HERE)/$(LIBNAME) /bin/cp -p $(CPUPDFLAG) $(HERE)/$(LIBNAME) $(LIBDIR) diff --git a/util/psb_amd_order.c b/util/psb_amd_order.c index 131303961..f13610831 100644 --- a/util/psb_amd_order.c +++ b/util/psb_amd_order.c @@ -14,7 +14,7 @@ documentation and/or other materials provided with the distribution. 3. The name of the PSBLAS group or the names of its contributors may not be used to endorse or promote products derived from this - software without specific written permission. + software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_blockpart_mod.f90 b/util/psb_blockpart_mod.f90 index 08eacb43e..321577433 100644 --- a/util/psb_blockpart_mod.f90 +++ b/util/psb_blockpart_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_c_hbio_impl.f90 b/util/psb_c_hbio_impl.f90 index 06c327c56..d105f0874 100644 --- a/util/psb_c_hbio_impl.f90 +++ b/util/psb_c_hbio_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_c_mat_dist_impl.f90 b/util/psb_c_mat_dist_impl.f90 index d28ce0ff3..96ea70099 100644 --- a/util/psb_c_mat_dist_impl.f90 +++ b/util/psb_c_mat_dist_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -152,10 +152,10 @@ subroutine psb_cmatdist(a_glob, a, ctxt, desc_a,& call psb_errpush(info,name,i_err=(/liwork/),a_err='integer') goto 9999 endif - !! if (iam == root) then - !! write (*, fmt = *) 'start matdist',root, size(iwork),& - !! &nrow, ncol, nnzero,nrhs - !! endif + if (iam == root) then + write (*, fmt = *) 'start matdist',root, size(iwork),& + &nrow, ncol, nnzero,nrhs + endif if (use_parts) then call psb_cdall(ctxt,desc_a,info,mg=nrow,parts=parts) else if (use_vg) then @@ -238,6 +238,10 @@ subroutine psb_cmatdist(a_glob, a, ctxt, desc_a,& if (j_count > nrow) exit if (j_count > lastigp) exit end do + if (j_count > lastigp) then + iproc = iproc + 1 + lastigp = lastigp + vsz(iproc+1) + end if end if ! now we should insert rows i_count..j_count-1 @@ -313,12 +317,6 @@ subroutine psb_cmatdist(a_glob, a, ctxt, desc_a,& end do endif i_count = j_count - if ((use_vsz).and.(j_count <= nrow)) then - if (j_count > lastigp) then - iproc = iproc + 1 - lastigp = lastigp + vsz(iproc+1) - end if - end if end do call psb_barrier(ctxt) @@ -359,7 +357,7 @@ subroutine psb_cmatdist(a_glob, a, ctxt, desc_a,& goto 9999 end if - !! if (iam == root) write (*, fmt = *) 'end matdist' + if (iam == root) write (*, fmt = *) 'end matdist' call psb_erractionrestore(err_act) return @@ -490,10 +488,10 @@ subroutine psb_lcmatdist(a_glob, a, ctxt, desc_a,& call psb_errpush(info,name,l_err=(/liwork/),a_err='integer') goto 9999 endif - !! if (iam == root) then - !! write (*, fmt = *) 'start matdist',root, size(iwork),& - !! &nrow, ncol, nnzero,nrhs - !! endif + if (iam == root) then + write (*, fmt = *) 'start matdist',root, size(iwork),& + &nrow, ncol, nnzero,nrhs + endif if (use_parts) then call psb_cdall(ctxt,desc_a,info,mg=nrow,parts=parts) else if (use_vg) then @@ -700,7 +698,7 @@ subroutine psb_lcmatdist(a_glob, a, ctxt, desc_a,& goto 9999 end if - !! if (iam == root) write (*, fmt = *) 'end matdist' + if (iam == root) write (*, fmt = *) 'end matdist' call psb_erractionrestore(err_act) return diff --git a/util/psb_c_mat_dist_mod.f90 b/util/psb_c_mat_dist_mod.f90 index c0fa00317..bc67afefa 100644 --- a/util/psb_c_mat_dist_mod.f90 +++ b/util/psb_c_mat_dist_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_c_mmio_impl.f90 b/util/psb_c_mmio_impl.f90 index 222fab82c..68690d06c 100644 --- a/util/psb_c_mmio_impl.f90 +++ b/util/psb_c_mmio_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_c_renum_impl.F90 b/util/psb_c_renum_impl.F90 index 9b342d6bf..2cb3ef449 100644 --- a/util/psb_c_renum_impl.F90 +++ b/util/psb_c_renum_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_c_renum_mod.f90 b/util/psb_c_renum_mod.f90 index 113354843..3a79f0c63 100644 --- a/util/psb_c_renum_mod.f90 +++ b/util/psb_c_renum_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_d_hbio_impl.f90 b/util/psb_d_hbio_impl.f90 index cca909952..900609977 100644 --- a/util/psb_d_hbio_impl.f90 +++ b/util/psb_d_hbio_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_d_mat_dist_impl.f90 b/util/psb_d_mat_dist_impl.f90 index 286dcaf6d..5e172b249 100644 --- a/util/psb_d_mat_dist_impl.f90 +++ b/util/psb_d_mat_dist_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -152,10 +152,10 @@ subroutine psb_dmatdist(a_glob, a, ctxt, desc_a,& call psb_errpush(info,name,i_err=(/liwork/),a_err='integer') goto 9999 endif - !! if (iam == root) then - !! write (*, fmt = *) 'start matdist',root, size(iwork),& - !! &nrow, ncol, nnzero,nrhs - !! endif + if (iam == root) then + write (*, fmt = *) 'start matdist',root, size(iwork),& + &nrow, ncol, nnzero,nrhs + endif if (use_parts) then call psb_cdall(ctxt,desc_a,info,mg=nrow,parts=parts) else if (use_vg) then @@ -238,6 +238,10 @@ subroutine psb_dmatdist(a_glob, a, ctxt, desc_a,& if (j_count > nrow) exit if (j_count > lastigp) exit end do + if (j_count > lastigp) then + iproc = iproc + 1 + lastigp = lastigp + vsz(iproc+1) + end if end if ! now we should insert rows i_count..j_count-1 @@ -313,12 +317,6 @@ subroutine psb_dmatdist(a_glob, a, ctxt, desc_a,& end do endif i_count = j_count - if ((use_vsz).and.(j_count <= nrow)) then - if (j_count > lastigp) then - iproc = iproc + 1 - lastigp = lastigp + vsz(iproc+1) - end if - end if end do call psb_barrier(ctxt) @@ -359,7 +357,7 @@ subroutine psb_dmatdist(a_glob, a, ctxt, desc_a,& goto 9999 end if - !! if (iam == root) write (*, fmt = *) 'end matdist' + if (iam == root) write (*, fmt = *) 'end matdist' call psb_erractionrestore(err_act) return @@ -490,10 +488,10 @@ subroutine psb_ldmatdist(a_glob, a, ctxt, desc_a,& call psb_errpush(info,name,l_err=(/liwork/),a_err='integer') goto 9999 endif - !! if (iam == root) then - !! write (*, fmt = *) 'start matdist',root, size(iwork),& - !! &nrow, ncol, nnzero,nrhs - !! endif + if (iam == root) then + write (*, fmt = *) 'start matdist',root, size(iwork),& + &nrow, ncol, nnzero,nrhs + endif if (use_parts) then call psb_cdall(ctxt,desc_a,info,mg=nrow,parts=parts) else if (use_vg) then @@ -700,7 +698,7 @@ subroutine psb_ldmatdist(a_glob, a, ctxt, desc_a,& goto 9999 end if - !! if (iam == root) write (*, fmt = *) 'end matdist' + if (iam == root) write (*, fmt = *) 'end matdist' call psb_erractionrestore(err_act) return diff --git a/util/psb_d_mat_dist_mod.f90 b/util/psb_d_mat_dist_mod.f90 index 978c62dd8..846cc26c6 100644 --- a/util/psb_d_mat_dist_mod.f90 +++ b/util/psb_d_mat_dist_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_d_mmio_impl.f90 b/util/psb_d_mmio_impl.f90 index 39dc501a5..374eeed92 100644 --- a/util/psb_d_mmio_impl.f90 +++ b/util/psb_d_mmio_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_d_renum_impl.F90 b/util/psb_d_renum_impl.F90 index 08999fc94..03e2458ae 100644 --- a/util/psb_d_renum_impl.F90 +++ b/util/psb_d_renum_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_d_renum_mod.f90 b/util/psb_d_renum_mod.f90 index 8e4b4e03e..22c5d868f 100644 --- a/util/psb_d_renum_mod.f90 +++ b/util/psb_d_renum_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_gps_mod.f90 b/util/psb_gps_mod.f90 index 7c42d990f..f031096f5 100644 --- a/util/psb_gps_mod.f90 +++ b/util/psb_gps_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_hbio_mod.f90 b/util/psb_hbio_mod.f90 index 01fa4daa3..799c085a2 100644 --- a/util/psb_hbio_mod.f90 +++ b/util/psb_hbio_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_i_mmio_impl.F90 b/util/psb_i_mmio_impl.F90 index c19989970..941559d91 100644 --- a/util/psb_i_mmio_impl.F90 +++ b/util/psb_i_mmio_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_mat_dist_mod.f90 b/util/psb_mat_dist_mod.f90 index e1532a2fc..9f99d51d1 100644 --- a/util/psb_mat_dist_mod.f90 +++ b/util/psb_mat_dist_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_metispart_mod.F90 b/util/psb_metispart_mod.F90 index 413bbdff4..3db8c85ed 100644 --- a/util/psb_metispart_mod.F90 +++ b/util/psb_metispart_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_mmio_mod.F90 b/util/psb_mmio_mod.F90 index 533312bbf..bc0630c28 100644 --- a/util/psb_mmio_mod.F90 +++ b/util/psb_mmio_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_partidx_mod.F90 b/util/psb_partidx_mod.F90 index de025fb0f..98aea50de 100644 --- a/util/psb_partidx_mod.F90 +++ b/util/psb_partidx_mod.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_renum_mod.f90 b/util/psb_renum_mod.f90 index 9a060cc6d..cfa4aa8ce 100644 --- a/util/psb_renum_mod.f90 +++ b/util/psb_renum_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_s_hbio_impl.f90 b/util/psb_s_hbio_impl.f90 index 522f8334c..10e9da1c9 100644 --- a/util/psb_s_hbio_impl.f90 +++ b/util/psb_s_hbio_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_s_mat_dist_impl.f90 b/util/psb_s_mat_dist_impl.f90 index 39575144b..9737b3c65 100644 --- a/util/psb_s_mat_dist_impl.f90 +++ b/util/psb_s_mat_dist_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -152,10 +152,10 @@ subroutine psb_smatdist(a_glob, a, ctxt, desc_a,& call psb_errpush(info,name,i_err=(/liwork/),a_err='integer') goto 9999 endif - !! if (iam == root) then - !! write (*, fmt = *) 'start matdist',root, size(iwork),& - !! &nrow, ncol, nnzero,nrhs - !! endif + if (iam == root) then + write (*, fmt = *) 'start matdist',root, size(iwork),& + &nrow, ncol, nnzero,nrhs + endif if (use_parts) then call psb_cdall(ctxt,desc_a,info,mg=nrow,parts=parts) else if (use_vg) then @@ -238,6 +238,10 @@ subroutine psb_smatdist(a_glob, a, ctxt, desc_a,& if (j_count > nrow) exit if (j_count > lastigp) exit end do + if (j_count > lastigp) then + iproc = iproc + 1 + lastigp = lastigp + vsz(iproc+1) + end if end if ! now we should insert rows i_count..j_count-1 @@ -313,12 +317,6 @@ subroutine psb_smatdist(a_glob, a, ctxt, desc_a,& end do endif i_count = j_count - if ((use_vsz).and.(j_count <= nrow)) then - if (j_count > lastigp) then - iproc = iproc + 1 - lastigp = lastigp + vsz(iproc+1) - end if - end if end do call psb_barrier(ctxt) @@ -359,7 +357,7 @@ subroutine psb_smatdist(a_glob, a, ctxt, desc_a,& goto 9999 end if - !! if (iam == root) write (*, fmt = *) 'end matdist' + if (iam == root) write (*, fmt = *) 'end matdist' call psb_erractionrestore(err_act) return @@ -490,10 +488,10 @@ subroutine psb_lsmatdist(a_glob, a, ctxt, desc_a,& call psb_errpush(info,name,l_err=(/liwork/),a_err='integer') goto 9999 endif - !! if (iam == root) then - !! write (*, fmt = *) 'start matdist',root, size(iwork),& - !! &nrow, ncol, nnzero,nrhs - !! endif + if (iam == root) then + write (*, fmt = *) 'start matdist',root, size(iwork),& + &nrow, ncol, nnzero,nrhs + endif if (use_parts) then call psb_cdall(ctxt,desc_a,info,mg=nrow,parts=parts) else if (use_vg) then @@ -700,7 +698,7 @@ subroutine psb_lsmatdist(a_glob, a, ctxt, desc_a,& goto 9999 end if - !! if (iam == root) write (*, fmt = *) 'end matdist' + if (iam == root) write (*, fmt = *) 'end matdist' call psb_erractionrestore(err_act) return diff --git a/util/psb_s_mat_dist_mod.f90 b/util/psb_s_mat_dist_mod.f90 index 9cb48058a..427298287 100644 --- a/util/psb_s_mat_dist_mod.f90 +++ b/util/psb_s_mat_dist_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_s_mmio_impl.f90 b/util/psb_s_mmio_impl.f90 index 1e50adf2f..94e886849 100644 --- a/util/psb_s_mmio_impl.f90 +++ b/util/psb_s_mmio_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_s_renum_impl.F90 b/util/psb_s_renum_impl.F90 index f60e33a87..1811ea1bd 100644 --- a/util/psb_s_renum_impl.F90 +++ b/util/psb_s_renum_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_s_renum_mod.f90 b/util/psb_s_renum_mod.f90 index 1e048df53..05a2ceba3 100644 --- a/util/psb_s_renum_mod.f90 +++ b/util/psb_s_renum_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_util_mod.f90 b/util/psb_util_mod.f90 index 6743a2d46..86c9b8727 100644 --- a/util/psb_util_mod.f90 +++ b/util/psb_util_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_z_hbio_impl.f90 b/util/psb_z_hbio_impl.f90 index eacf427dc..84c7f6ab0 100644 --- a/util/psb_z_hbio_impl.f90 +++ b/util/psb_z_hbio_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_z_mat_dist_impl.f90 b/util/psb_z_mat_dist_impl.f90 index 58e1b6e2b..f8acd84fb 100644 --- a/util/psb_z_mat_dist_impl.f90 +++ b/util/psb_z_mat_dist_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED @@ -152,10 +152,10 @@ subroutine psb_zmatdist(a_glob, a, ctxt, desc_a,& call psb_errpush(info,name,i_err=(/liwork/),a_err='integer') goto 9999 endif - !! if (iam == root) then - !! write (*, fmt = *) 'start matdist',root, size(iwork),& - !! &nrow, ncol, nnzero,nrhs - !! endif + if (iam == root) then + write (*, fmt = *) 'start matdist',root, size(iwork),& + &nrow, ncol, nnzero,nrhs + endif if (use_parts) then call psb_cdall(ctxt,desc_a,info,mg=nrow,parts=parts) else if (use_vg) then @@ -238,6 +238,10 @@ subroutine psb_zmatdist(a_glob, a, ctxt, desc_a,& if (j_count > nrow) exit if (j_count > lastigp) exit end do + if (j_count > lastigp) then + iproc = iproc + 1 + lastigp = lastigp + vsz(iproc+1) + end if end if ! now we should insert rows i_count..j_count-1 @@ -313,12 +317,6 @@ subroutine psb_zmatdist(a_glob, a, ctxt, desc_a,& end do endif i_count = j_count - if ((use_vsz).and.(j_count <= nrow)) then - if (j_count > lastigp) then - iproc = iproc + 1 - lastigp = lastigp + vsz(iproc+1) - end if - end if end do call psb_barrier(ctxt) @@ -359,7 +357,7 @@ subroutine psb_zmatdist(a_glob, a, ctxt, desc_a,& goto 9999 end if - !! if (iam == root) write (*, fmt = *) 'end matdist' + if (iam == root) write (*, fmt = *) 'end matdist' call psb_erractionrestore(err_act) return @@ -490,10 +488,10 @@ subroutine psb_lzmatdist(a_glob, a, ctxt, desc_a,& call psb_errpush(info,name,l_err=(/liwork/),a_err='integer') goto 9999 endif - !! if (iam == root) then - !! write (*, fmt = *) 'start matdist',root, size(iwork),& - !! &nrow, ncol, nnzero,nrhs - !! endif + if (iam == root) then + write (*, fmt = *) 'start matdist',root, size(iwork),& + &nrow, ncol, nnzero,nrhs + endif if (use_parts) then call psb_cdall(ctxt,desc_a,info,mg=nrow,parts=parts) else if (use_vg) then @@ -700,7 +698,7 @@ subroutine psb_lzmatdist(a_glob, a, ctxt, desc_a,& goto 9999 end if - !! if (iam == root) write (*, fmt = *) 'end matdist' + if (iam == root) write (*, fmt = *) 'end matdist' call psb_erractionrestore(err_act) return diff --git a/util/psb_z_mat_dist_mod.f90 b/util/psb_z_mat_dist_mod.f90 index 3be4f9471..3322a3448 100644 --- a/util/psb_z_mat_dist_mod.f90 +++ b/util/psb_z_mat_dist_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_z_mmio_impl.f90 b/util/psb_z_mmio_impl.f90 index 406bdd0c6..948de2833 100644 --- a/util/psb_z_mmio_impl.f90 +++ b/util/psb_z_mmio_impl.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_z_renum_impl.F90 b/util/psb_z_renum_impl.F90 index ac6517fec..624bacd99 100644 --- a/util/psb_z_renum_impl.F90 +++ b/util/psb_z_renum_impl.F90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED diff --git a/util/psb_z_renum_mod.f90 b/util/psb_z_renum_mod.f90 index 0bb56c355..c91cbe4a1 100644 --- a/util/psb_z_renum_mod.f90 +++ b/util/psb_z_renum_mod.f90 @@ -14,7 +14,7 @@ ! documentation and/or other materials provided with the distribution. ! 3. The name of the PSBLAS group or the names of its contributors may ! not be used to endorse or promote products derived from this -! software without specific written permission. +! software without specific prior written permission. ! ! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ! ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED